aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHisham Muhammad <hisham@gobolinux.org>2012-05-20 23:30:14 -0300
committerHisham Muhammad <hisham@gobolinux.org>2012-05-20 23:30:14 -0300
commit123e9c106fb96686981e41f7ce0a47017a8c83c7 (patch)
tree05710e9e5f5db3dc03ed2c19846efcb34eac2ced
parent2f654a1eeb0ea567867149951f9f72ad96070372 (diff)
downloadluarocks-123e9c106fb96686981e41f7ce0a47017a8c83c7.tar.gz
luarocks-123e9c106fb96686981e41f7ce0a47017a8c83c7.tar.bz2
luarocks-123e9c106fb96686981e41f7ce0a47017a8c83c7.zip
Add "new_version", a new feature.
-rwxr-xr-xsrc/bin/luarocks1
-rw-r--r--src/luarocks/new_version.lua141
2 files changed, 142 insertions, 0 deletions
diff --git a/src/bin/luarocks b/src/bin/luarocks
index 5da4bc25..1397bbd0 100755
--- a/src/bin/luarocks
+++ b/src/bin/luarocks
@@ -18,5 +18,6 @@ commands.make = require("luarocks.make")
18commands.download = require("luarocks.download") 18commands.download = require("luarocks.download")
19commands.path = require("luarocks.path") 19commands.path = require("luarocks.path")
20commands.show = require("luarocks.show") 20commands.show = require("luarocks.show")
21commands.new_version = require("luarocks.new_version")
21 22
22command_line.run_command(...) 23command_line.run_command(...)
diff --git a/src/luarocks/new_version.lua b/src/luarocks/new_version.lua
new file mode 100644
index 00000000..b453704f
--- /dev/null
+++ b/src/luarocks/new_version.lua
@@ -0,0 +1,141 @@
1
2--- Module implementing the LuaRocks "new_version" command.
3-- Utility function that writes a new rockspec, updating data from a previous one.
4module("luarocks.new_version", package.seeall)
5
6local util = require("luarocks.util")
7local cfg = require("luarocks.cfg")
8local download = require("luarocks.download")
9local fetch = require("luarocks.fetch")
10local persist = require("luarocks.persist")
11local dir = require("luarocks.dir")
12local fs = require("luarocks.fs")
13
14help_summary = "Auto-write a rockspec for a new version of a rock."
15help_arguments = "{<program>|<rockspec>} [<new_version>] [<new_url>]"
16help = [[
17This is a utility function that writes a new rockspec, updating data
18from a previous one.
19
20If a package name is given, it downloads the latest rockspec from the
21default server. If a rockspec is given, it uses it instead.
22
23If the version number is not given, it only increments the revision
24number of the given (or downloaded) rockspec.
25
26If a URL is given, it replaces the one from the old rockspec with the
27given URL. If a URL is not given and a new version is given, it tries
28to guess the new URL by replacing occurrences of the version number
29in the URL or tag. It also tries to download the new URL to determine
30the new MD5 checksum.
31
32WARNING: it writes the new rockspec to the current directory,
33overwriting the file if it already exists.
34]]
35
36local order = {"rockspec_format", "package", "version",
37 { "source", { "url", "tag", "branch", "md5" } },
38 { "description", {"summary", "detailed", "homepage", "license" } },
39 "supported_platforms", "dependencies", "external_dependencies",
40 { "build", {"type", "modules", "copy_directories", "platforms"} },
41 "hooks"}
42
43local function try_replace(tbl, field, old, new)
44 if not tbl[field] then
45 return false
46 end
47 local old_field = tbl[field]
48 local new_field = tbl[field]:gsub(old, new)
49 if new_field ~= old_field then
50 util.printout("Guessing new '"..field.."' field as "..new_field)
51 tbl[field] = new_field
52 return true
53 end
54 return false
55end
56
57local function check_url_and_update_md5(out_rs, out_name)
58 out_rs.source.md5 = nil
59 local file, temp_dir = fetch.fetch_url_at_temp_dir(out_rs.source.url, "luarocks-new-version-"..out_name)
60 if file then
61 util.printout("File successfully downloaded. Updating MD5 checksum...")
62 out_rs.source.md5 = fs.get_md5(file)
63 else
64 util.printerr("Warning: invalid URL - "..temp_dir)
65 end
66end
67
68function run(...)
69 local flags, input, version, url = util.parse_flags(...)
70 if not input then
71 return nil, "Missing arguments: expected program or rockspec. See help."
72 end
73 assert(type(input) == "string")
74
75 local filename = input
76 if not input:match(".rockspec$") then
77 local err
78 filename, err = download.download("rockspec", input)
79 if not input then
80 return nil, err
81 end
82 end
83
84 local valid_rs, err = fetch.load_rockspec(filename)
85 if not valid_rs then
86 return nil, err
87 end
88
89 local old_ver, old_rev = valid_rs.version:match("(.*)%-(%d+)$")
90 local new_ver, new_rev
91
92 if version then
93 new_ver, new_rev = version:match("(.*)%-(%d+)$")
94 new_rev = tonumber(new_rev)
95 if not new_rev then
96 new_ver = version
97 new_rev = 1
98 end
99 else
100 new_ver = old_ver
101 new_rev = tonumber(old_rev) + 1
102 end
103
104
105 local out_rs = persist.load_into_table(filename)
106 local out_name = out_rs.package:lower()
107 out_rs.version = new_ver.."-"..new_rev
108 if url then
109 out_rs.source.url = url
110 check_url_and_update_md5(out_rs, out_name)
111 else
112 if new_ver ~= old_ver then
113 local ok = try_replace(out_rs.source, "url", old_ver, new_ver)
114 if ok then
115 check_url_and_update_md5(out_rs, out_name)
116 else
117 ok = try_replace(out_rs.source, "tag", old_ver, new_ver)
118 if not ok then
119 return nil, "Failed to determine the location of the new version."
120 end
121 end
122 end
123 end
124
125 if out_rs.build and out_rs.build.type == "module" then
126 out_rs.build.type = "builtin"
127 end
128
129 local out_filename = out_name.."-"..new_ver.."-"..new_rev..".rockspec"
130
131 persist.save_from_table(out_filename, out_rs, order)
132
133 util.printout("Wrote "..out_filename)
134
135 local valid_out_rs, err = fetch.load_local_rockspec(out_filename)
136 if not valid_out_rs then
137 return nil, "Failed loading generated rockspec: "..err
138 end
139
140 return true
141end