aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHisham Muhammad <hisham@gobolinux.org>2023-12-12 20:40:14 -0300
committerGitHub <noreply@github.com>2023-12-12 20:40:14 -0300
commitd81020338c99ff4116431ee496a7db516eb91f00 (patch)
tree0717c9a5e762ed84b4949222f9730b0fbf347dc1
parent780d5e7828fef17b79a421ce4a6e131514e6a288 (diff)
downloadluarocks-d81020338c99ff4116431ee496a7db516eb91f00.tar.gz
luarocks-d81020338c99ff4116431ee496a7db516eb91f00.tar.bz2
luarocks-d81020338c99ff4116431ee496a7db516eb91f00.zip
improve rockspec.source.dir detection by moving it later (#1555)
-rw-r--r--src/luarocks/build.lua10
-rw-r--r--src/luarocks/cmd/new_version.lua16
-rw-r--r--src/luarocks/cmd/unpack.lua7
-rw-r--r--src/luarocks/fetch.lua88
-rw-r--r--src/luarocks/rockspecs.lua10
5 files changed, 88 insertions, 43 deletions
diff --git a/src/luarocks/build.lua b/src/luarocks/build.lua
index 0b82174b..42ae4591 100644
--- a/src/luarocks/build.lua
+++ b/src/luarocks/build.lua
@@ -159,8 +159,14 @@ local function fetch_and_change_to_source_dir(rockspec, opts)
159 if not ok then 159 if not ok then
160 return nil, err 160 return nil, err
161 end 161 end
162 elseif rockspec.source.file then 162 else
163 local ok, err = fs.unpack_archive(rockspec.source.file) 163 if rockspec.source.file then
164 local ok, err = fs.unpack_archive(rockspec.source.file)
165 if not ok then
166 return nil, err
167 end
168 end
169 local ok, err = fetch.find_rockspec_source_dir(rockspec, ".")
164 if not ok then 170 if not ok then
165 return nil, err 171 return nil, err
166 end 172 end
diff --git a/src/luarocks/cmd/new_version.lua b/src/luarocks/cmd/new_version.lua
index 49479910..ccba9335 100644
--- a/src/luarocks/cmd/new_version.lua
+++ b/src/luarocks/cmd/new_version.lua
@@ -78,16 +78,16 @@ local function check_url_and_update_md5(out_rs, invalid_is_error)
78 util.warning("invalid URL - "..temp_dir) 78 util.warning("invalid URL - "..temp_dir)
79 return true, false 79 return true, false
80 end 80 end
81 do
82 local inferred_dir, found_dir = fetch.find_base_dir(file, temp_dir, out_rs.source.url, out_rs.source.dir)
83 if not inferred_dir then
84 return nil, found_dir
85 end
81 86
82 local inferred_dir, found_dir = fetch.find_base_dir(file, temp_dir, out_rs.source.url, out_rs.source.dir) 87 if found_dir and found_dir ~= inferred_dir then
83 if not inferred_dir then 88 out_rs.source.dir = found_dir
84 return nil, found_dir 89 end
85 end
86
87 if found_dir and found_dir ~= inferred_dir then
88 out_rs.source.dir = found_dir
89 end 90 end
90
91 if file then 91 if file then
92 if out_rs.source.md5 then 92 if out_rs.source.md5 then
93 util.printout("File successfully downloaded. Updating MD5 checksum...") 93 util.printout("File successfully downloaded. Updating MD5 checksum...")
diff --git a/src/luarocks/cmd/unpack.lua b/src/luarocks/cmd/unpack.lua
index 94da2c9f..a0ade4f3 100644
--- a/src/luarocks/cmd/unpack.lua
+++ b/src/luarocks/cmd/unpack.lua
@@ -81,9 +81,9 @@ local function unpack_rock(rock_file, dir_name, kind)
81 if kind == "src" then 81 if kind == "src" then
82 if rockspec.source.file then 82 if rockspec.source.file then
83 local ok, err = fs.unpack_archive(rockspec.source.file) 83 local ok, err = fs.unpack_archive(rockspec.source.file)
84 if not ok then 84 if not ok then return nil, err end
85 return nil, err 85 ok, err = fetch.find_rockspec_source_dir(rockspec, ".")
86 end 86 if not ok then return nil, err end
87 ok, err = fs.change_dir(rockspec.source.dir) 87 ok, err = fs.change_dir(rockspec.source.dir)
88 if not ok then return nil, err end 88 if not ok then return nil, err end
89 ok, err = build.apply_patches(rockspec) 89 ok, err = build.apply_patches(rockspec)
@@ -133,6 +133,7 @@ local function run_unpacker(file, force)
133 return nil, err 133 return nil, err
134 end 134 end
135 if kind == "src" or kind == "rockspec" then 135 if kind == "src" or kind == "rockspec" then
136 fetch.find_rockspec_source_dir(rockspec, ".")
136 if rockspec.source.dir ~= "." then 137 if rockspec.source.dir ~= "." then
137 local ok = fs.copy(rockspec.local_abs_filename, rockspec.source.dir, "read") 138 local ok = fs.copy(rockspec.local_abs_filename, rockspec.source.dir, "read")
138 if not ok then 139 if not ok then
diff --git a/src/luarocks/fetch.lua b/src/luarocks/fetch.lua
index 90e7c79e..723af8b5 100644
--- a/src/luarocks/fetch.lua
+++ b/src/luarocks/fetch.lua
@@ -234,6 +234,21 @@ function fetch.find_base_dir(file, temp_dir, src_url, src_dir)
234 local ok, err = fs.change_dir(temp_dir) 234 local ok, err = fs.change_dir(temp_dir)
235 if not ok then return nil, err end 235 if not ok then return nil, err end
236 fs.unpack_archive(file) 236 fs.unpack_archive(file)
237
238 if not src_dir then
239 local rockspec = {
240 source = {
241 file = file,
242 dir = src_dir,
243 url = src_url,
244 }
245 }
246 ok, err = fetch.find_rockspec_source_dir(rockspec, ".")
247 if ok then
248 src_dir = rockspec.source.dir
249 end
250 end
251
237 local inferred_dir = src_dir or dir.deduce_base_dir(src_url) 252 local inferred_dir = src_dir or dir.deduce_base_dir(src_url)
238 local found_dir = nil 253 local found_dir = nil
239 if fs.exists(inferred_dir) then 254 if fs.exists(inferred_dir) then
@@ -459,33 +474,58 @@ function fetch.get_sources(rockspec, extract, dest_dir)
459 if not ok then return nil, err end 474 if not ok then return nil, err end
460 ok, err = fs.unpack_archive(rockspec.source.file) 475 ok, err = fs.unpack_archive(rockspec.source.file)
461 if not ok then return nil, err end 476 if not ok then return nil, err end
462 if not fs.exists(rockspec.source.dir) then 477 ok, err = fetch.find_rockspec_source_dir(rockspec, ".")
463 478 if not ok then return nil, err end
464 -- If rockspec.source.dir can't be found, see if we only have one 479 fs.pop_dir()
465 -- directory in store_dir. If that's the case, assume it's what 480 end
466 -- we're looking for. 481 return source_file, store_dir
467 -- We only do this if the rockspec source.dir was not set, and only 482end
468 -- with rockspecs newer than 3.0. 483
469 local file_count, found_dir = 0 484function fetch.find_rockspec_source_dir(rockspec, store_dir)
470 485 local ok, err = fs.change_dir(store_dir)
471 if not rockspec.source.dir_set and rockspec:format_is_at_least("3.0") then 486 if not ok then return nil, err end
472 for file in fs.dir() do 487
473 file_count = file_count + 1 488 local file_count, dir_count, found_dir = 0, 0, 0
474 if fs.is_dir(file) then 489
475 found_dir = file 490 if rockspec.source.dir and fs.exists(rockspec.source.dir) then
476 end 491 ok, err = true, nil
492 elseif rockspec.source.file and rockspec.source.dir then
493 ok, err = nil, "Directory "..rockspec.source.dir.." not found inside archive "..rockspec.source.file
494 elseif not rockspec.source.dir_set then -- and rockspec:format_is_at_least("3.0") then
495
496 local name = dir.base_name(rockspec.source.file or rockspec.source.url or "")
497
498 if name:match("%.lua$") or name:match("%.c$") then
499 if fs.is_file(name) then
500 rockspec.source.dir = "."
501 ok, err = true, nil
502 end
503 end
504
505 if not rockspec.source.dir then
506 for file in fs.dir() do
507 file_count = file_count + 1
508 if fs.is_dir(file) then
509 dir_count = dir_count + 1
510 found_dir = file
477 end 511 end
478 end 512 end
479 513
480 if file_count == 1 and found_dir then 514 if dir_count == 1 then
481 rockspec.source.dir = found_dir 515 rockspec.source.dir = found_dir
516 ok, err = true, nil
482 else 517 else
483 return nil, "Directory "..rockspec.source.dir.." not found inside archive "..rockspec.source.file, "source.dir", source_file, store_dir 518 ok, err = nil, "Could not determine source directory from rock contents (" .. tostring(file_count).." file(s), "..tostring(dir_count).." dir(s))"
484 end 519 end
485 end 520 end
486 fs.pop_dir() 521 else
522 ok, err = nil, "Could not determine source directory, please set source.dir in rockspec."
487 end 523 end
488 return source_file, store_dir 524
525 fs.pop_dir()
526
527 assert(rockspec.source.dir or not ok)
528 return ok, err
489end 529end
490 530
491--- Download sources for building a rock, calling the appropriate protocol method. 531--- Download sources for building a rock, calling the appropriate protocol method.
@@ -511,7 +551,7 @@ function fetch.fetch_sources(rockspec, extract, dest_dir)
511 end 551 end
512 552
513 local protocol = rockspec.source.protocol 553 local protocol = rockspec.source.protocol
514 local ok, proto 554 local ok, err, proto
515 if dir.is_basic_protocol(protocol) then 555 if dir.is_basic_protocol(protocol) then
516 proto = fetch 556 proto = fetch
517 else 557 else
@@ -531,7 +571,13 @@ function fetch.fetch_sources(rockspec, extract, dest_dir)
531 end 571 end
532 end 572 end
533 573
534 return proto.get_sources(rockspec, extract, dest_dir) 574 local source_file, store_dir = proto.get_sources(rockspec, extract, dest_dir)
575 if not source_file then return nil, store_dir end
576
577 ok, err = fetch.find_rockspec_source_dir(rockspec, store_dir)
578 if not ok then return nil, err, "source.dir", source_file, store_dir end
579
580 return source_file, store_dir
535end 581end
536 582
537return fetch 583return fetch
diff --git a/src/luarocks/rockspecs.lua b/src/luarocks/rockspecs.lua
index c9e17530..454bab77 100644
--- a/src/luarocks/rockspecs.lua
+++ b/src/luarocks/rockspecs.lua
@@ -140,16 +140,8 @@ function rockspecs.from_persisted_table(filename, rockspec, globals, quick)
140 if rockspec.source.cvs_tag then rockspec.source.tag = rockspec.source.cvs_tag end 140 if rockspec.source.cvs_tag then rockspec.source.tag = rockspec.source.cvs_tag end
141 141
142 rockspec.local_abs_filename = filename 142 rockspec.local_abs_filename = filename
143 local filebase = rockspec.source.file or rockspec.source.url
144 local base = dir.deduce_base_dir(filebase)
145 rockspec.source.dir_set = rockspec.source.dir ~= nil 143 rockspec.source.dir_set = rockspec.source.dir ~= nil
146 rockspec.source.dir = rockspec.source.dir 144 rockspec.source.dir = rockspec.source.dir or rockspec.source.module
147 or rockspec.source.module
148 or ( (filebase:match("%.lua$") or filebase:match("%.c$"))
149 and (rockspec:format_is_at_least("3.0")
150 and (dir.is_basic_protocol(protocol) and "." or base)
151 or ".") )
152 or base
153 145
154 rockspec.rocks_provided = util.get_rocks_provided(rockspec) 146 rockspec.rocks_provided = util.get_rocks_provided(rockspec)
155 147