-
Notifications
You must be signed in to change notification settings - Fork 0
/
rockbuild.moon
157 lines (133 loc) · 4.67 KB
/
rockbuild.moon
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
-- rockbuild
-- Build rockspecs from YAML
-- By daelvn
import load from require "lyaml"
import block from require "serpent"
import exists, makeDir, glob, iglob from require "filekit"
import style from require "ansikit.style"
argparse = require "argparse"
VERSION = "1.1"
args = {}
with argparse!
\name "rockbuild"
\description "Compile YAML rockframes into Lua rockspecs"
\epilog "https://github.com/daelvn/rockbuild"
\help_description_margin 28
\require_command false
with \argument "version", "version for your rockspec"
\args 1
with \option "-p --prefix", "sets the prefix for the source tag"
\default "v"
with \option "-s --suffix", "sets the suffix for the source tag"
\default ""
with \option "-f --file", "rockframe location"
\default "rock.yml"
with \option "-d --dir", "rockspec output location"
\default "rockspecs"
\flag "--dry", "prints the resulting rockspec and does nothing else"
\flag "--delete", "deletes the rockspec after using it"
\option "-r --revision", "custom revision for the rockspec"
\flag "-m --make", "runs 'luarocks make' after compiling the rockspec"
\flag "-t --tag", "Adds a git tag after compiling the rockspec"
with \flag "-v --version", "Shows the current version"
\action ->
print VERSION
os.exit!
\command "upload u", "uploads the rockspec after compile"
args = \parse!
-- err & prefix
err = (txt) ->
print style "%{red}!! #{txt}"
os.exit 1
prefix = (pref) ->
print style "%{magenta}==>%{reset} #{pref}"
-- reads the contents of a file
readfile = (file) ->
return nil unless exists file
local contents
with io.open "#{file}", "r"
contents = \read "*a"
\close!
return contents
-- writes the contents of a file
writefile = (file, contents) ->
with io.open "#{file}", "w"
\write contents
\close!
-- check that rock.yml exists
err "#{args.file} not found." unless exists args.file
-- turns dumped table into a rockspec
torockspec = (txt) ->
txt = txt\match "{\n(.+)\n}"
fin = ""
for line in txt\gmatch "[^\n]+"
line = (line\gsub "^ ", "")
line = (line\gsub "^},", "}")
line = (line\gsub "^([%w_]+ = \".-\"),$", "%1")
fin ..= line .. "\n"
return fin
-- extract dependencies
extractDeps = (dept) ->
clone = {k, v for k, v in pairs dept}
clone.build = nil
clone.external = nil
return clone
-- start
version = args.version
print style "%{blue bold}rockbuild #{VERSION}"
prefix "Using version %{green}'#{version}'"
-- load rockframe
prefix "Loading %{yellow}#{args.file}"
frame = load readfile args.file
-- get a revision number
args.revision or= 1 + #(glob "#{args.dir}/#{frame.package}-#{version}-*.rockspec")
verrev = "#{version}-#{args.revision}"
prefix "Using revision %{green}'#{args.revision}'%{reset} (#{verrev})"
-- create package
prefix "Creating package..."
package = {
rockspec_format: frame.format or "3.0"
package: frame.package or err "Expected package.name"
version: verrev
description: frame.description
supported_platforms: frame.platforms
dependencies: extractDeps frame.dependencies
build_dependencies: frame.dependencies and frame.dependencies.build or nil
external_dependencies: frame.dependencies and frame.dependencies.external or nil
source:
url: frame.source and frame.source.url or err "Expected package.source"
md5: frame.source and frame.source.md5 or nil
file: frame.source and frame.source.file or nil
dir: frame.source and frame.source.dir or nil
tag: "#{args.prefix}#{version}#{args.suffix}"
branch: frame.source and frame.source.branch or nil
module: frame.source and frame.source.module or nil
build: frame.build
}
-- dump package
result = block package, comment: false
if args.dry
print torockspec result
os.exit!
-- write to file
path = "#{args.dir}/#{frame.package}-#{verrev}.rockspec"
prefix "Writing to %{yellow}#{path}"
makeDir args.dir unless exists "#{args.dir}/"
writefile path, torockspec result
-- run post-compile things
if args.tag
prefix "Making Git tag %{yellow}#{args.prefix}#{version}#{args.suffix}"
os.execute "git add -A"
os.execute "git commit -m 'Producing rockspec #{verrev}'"
os.execute "git tag -a #{args.prefix}#{version}#{args.suffix}"
os.execute "git push --tags"
if args.make
prefix "Running 'luarocks make'"
os.execute "luarocks make"
if args.upload
prefix "Uploading rock %{yellow}#{path}"
os.execute "luarocks upload #{path}"
os.remove file for file in iglob "*.src.rock"
if args.delete
prefix "Deleting #{path}"
os.remove path