aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/luarocks/fetch.lua50
-rw-r--r--src/luarocks/fs/tools.lua7
-rw-r--r--src/luarocks/manif.lua23
3 files changed, 52 insertions, 28 deletions
diff --git a/src/luarocks/fetch.lua b/src/luarocks/fetch.lua
index 6835462a..0fc3f506 100644
--- a/src/luarocks/fetch.lua
+++ b/src/luarocks/fetch.lua
@@ -10,6 +10,33 @@ local persist = require("luarocks.persist")
10local util = require("luarocks.util") 10local util = require("luarocks.util")
11local cfg = require("luarocks.core.cfg") 11local cfg = require("luarocks.core.cfg")
12 12
13function fetch.fetch_caching(url)
14 local repo_url, filename = url:match("^(.*)/([^/]+)$")
15 local name = repo_url:gsub("[/:]","_")
16 local cache_dir = dir.path(cfg.local_cache, name)
17 local ok = fs.make_dir(cache_dir)
18 if not ok then
19 cfg.local_cache = fs.make_temp_dir("local_cache")
20 cache_dir = dir.path(cfg.local_cache, name)
21 ok = fs.make_dir(cache_dir)
22 if not ok then
23 return nil, "Failed creating temporary cache directory "..cache_dir
24 end
25 end
26
27 local cachefile = dir.path(cache_dir, filename)
28 if cfg.aggressive_cache and (not name:match("^manifest")) and fs.exists(cachefile) then
29 print("FAST TRACK!", cfg.aggressive_cache)
30 return cachefile, nil, nil, true
31 end
32
33 local file, err, errcode, from_cache = fetch.fetch_url(url, cachefile, true)
34 if not file then
35 return nil, "Failed downloading "..repo_url..(err and " - "..err or ""), errcode
36 end
37 return file, nil, nil, from_cache
38end
39
13--- Fetch a local or remote file. 40--- Fetch a local or remote file.
14-- Make a remote or local URL/pathname local, fetching the file if necessary. 41-- Make a remote or local URL/pathname local, fetching the file if necessary.
15-- Other "fetch" and "load" functions use this function to obtain files. 42-- Other "fetch" and "load" functions use this function to obtain files.
@@ -60,7 +87,7 @@ end
60-- @return (string, string) or (nil, string, [string]): absolute local pathname of 87-- @return (string, string) or (nil, string, [string]): absolute local pathname of
61-- the fetched file and temporary directory name; or nil and an error message 88-- the fetched file and temporary directory name; or nil and an error message
62-- followed by an optional error code 89-- followed by an optional error code
63function fetch.fetch_url_at_temp_dir(url, tmpname, filename) 90function fetch.fetch_url_at_temp_dir(url, tmpname, filename, cache)
64 assert(type(url) == "string") 91 assert(type(url) == "string")
65 assert(type(tmpname) == "string") 92 assert(type(tmpname) == "string")
66 assert(type(filename) == "string" or not filename) 93 assert(type(filename) == "string" or not filename)
@@ -81,11 +108,26 @@ function fetch.fetch_url_at_temp_dir(url, tmpname, filename)
81 util.schedule_function(fs.delete, temp_dir) 108 util.schedule_function(fs.delete, temp_dir)
82 local ok, err = fs.change_dir(temp_dir) 109 local ok, err = fs.change_dir(temp_dir)
83 if not ok then return nil, err end 110 if not ok then return nil, err end
84 local file, err, errcode = fetch.fetch_url(url, filename) 111
112 local file, err, errcode
113
114 if cache then
115 local cachefile
116 cachefile, err, errcode = fetch.fetch_caching(url)
117
118 if cachefile then
119 file = dir.path(temp_dir, filename)
120 fs.copy(cachefile, file)
121 end
122 else
123 file, err, errcode = fetch.fetch_url(url, filename, cache)
124 end
125
85 fs.pop_dir() 126 fs.pop_dir()
86 if not file then 127 if not file then
87 return nil, "Error fetching file: "..err, errcode 128 return nil, "Error fetching file: "..err, errcode
88 end 129 end
130
89 return file, temp_dir 131 return file, temp_dir
90 end 132 end
91end 133end
@@ -159,7 +201,7 @@ function fetch.fetch_and_unpack_rock(url, dest, verify)
159 local name = dir.base_name(url):match("(.*)%.[^.]*%.rock") 201 local name = dir.base_name(url):match("(.*)%.[^.]*%.rock")
160 local tmpname = "luarocks-rock-" .. name 202 local tmpname = "luarocks-rock-" .. name
161 203
162 local rock_file, err, errcode = fetch.fetch_url_at_temp_dir(url, tmpname) 204 local rock_file, err, errcode = fetch.fetch_url_at_temp_dir(url, tmpname, nil, true)
163 if not rock_file then 205 if not rock_file then
164 return nil, "Could not fetch rock file: " .. err, errcode 206 return nil, "Could not fetch rock file: " .. err, errcode
165 end 207 end
@@ -274,7 +316,7 @@ function fetch.load_rockspec(url, location, verify)
274 filename, err = fetch.fetch_url(url) 316 filename, err = fetch.fetch_url(url)
275 fs.pop_dir() 317 fs.pop_dir()
276 else 318 else
277 filename, err, errcode = fetch.fetch_url_at_temp_dir(url, tmpname) 319 filename, err, errcode = fetch.fetch_url_at_temp_dir(url, tmpname, nil, true)
278 end 320 end
279 if not filename then 321 if not filename then
280 return nil, err, errcode 322 return nil, err, errcode
diff --git a/src/luarocks/fs/tools.lua b/src/luarocks/fs/tools.lua
index ef5abe63..541352c2 100644
--- a/src/luarocks/fs/tools.lua
+++ b/src/luarocks/fs/tools.lua
@@ -15,8 +15,8 @@ do
15 15
16 local tool_options = { 16 local tool_options = {
17 downloader = { 17 downloader = {
18 { var = "CURL", name = "curl" },
19 { var = "WGET", name = "wget" }, 18 { var = "WGET", name = "wget" },
19 { var = "CURL", name = "curl" },
20 }, 20 },
21 md5checker = { 21 md5checker = {
22 { var = "MD5SUM", name = "md5sum" }, 22 { var = "MD5SUM", name = "md5sum" },
@@ -168,7 +168,10 @@ function tools.use_downloader(url, filename, cache)
168 if cfg.connection_timeout and cfg.connection_timeout > 0 then 168 if cfg.connection_timeout and cfg.connection_timeout > 0 then
169 curl_cmd = curl_cmd .. "--connect-timeout "..tostring(cfg.connection_timeout).." " 169 curl_cmd = curl_cmd .. "--connect-timeout "..tostring(cfg.connection_timeout).." "
170 end 170 end
171 ok = fs.execute_string(fs.quiet_stderr(curl_cmd..fs.Q(url).." > "..fs.Q(filename))) 171 if cache then
172 curl_cmd = curl_cmd .. " -R -z \"" .. filename .. "\" "
173 end
174 ok = fs.execute_string(fs.quiet_stderr(curl_cmd..fs.Q(url).." --output "..fs.Q(filename)))
172 else 175 else
173 return false, "No downloader tool available -- please install 'wget' or 'curl' in your system" 176 return false, "No downloader tool available -- please install 'wget' or 'curl' in your system"
174 end 177 end
diff --git a/src/luarocks/manif.lua b/src/luarocks/manif.lua
index b32df971..1337cab3 100644
--- a/src/luarocks/manif.lua
+++ b/src/luarocks/manif.lua
@@ -65,27 +65,6 @@ function manif.load_rock_manifest(name, version, root)
65 return rock_manifest.rock_manifest 65 return rock_manifest.rock_manifest
66end 66end
67 67
68
69local function fetch_manifest_from(repo_url, filename)
70 local url = dir.path(repo_url, filename)
71 local name = repo_url:gsub("[/:]","_")
72 local cache_dir = dir.path(cfg.local_cache, name)
73 local ok = fs.make_dir(cache_dir)
74 if not ok then
75 cfg.local_cache = fs.make_temp_dir("local_cache")
76 cache_dir = dir.path(cfg.local_cache, name)
77 ok = fs.make_dir(cache_dir)
78 if not ok then
79 return nil, "Failed creating temporary cache directory "..cache_dir
80 end
81 end
82 local file, err, errcode, from_cache = fetch.fetch_url(url, dir.path(cache_dir, filename), true)
83 if not file then
84 return nil, "Failed fetching manifest for "..repo_url..(err and " - "..err or ""), errcode
85 end
86 return file, nil, nil, from_cache
87end
88
89--- Load a local or remote manifest describing a repository. 68--- Load a local or remote manifest describing a repository.
90-- All functions that use manifest tables assume they were obtained 69-- All functions that use manifest tables assume they were obtained
91-- through this function. 70-- through this function.
@@ -124,7 +103,7 @@ function manif.load_manifest(repo_url, lua_version, versioned_only)
124 else 103 else
125 local err, errcode 104 local err, errcode
126 for _, filename in ipairs(filenames) do 105 for _, filename in ipairs(filenames) do
127 pathname, err, errcode, from_cache = fetch_manifest_from(repo_url, filename) 106 pathname, err, errcode, from_cache = fetch.fetch_caching(dir.path(repo_url, filename))
128 if pathname then 107 if pathname then
129 break 108 break
130 end 109 end