fig 0.1.24-universal-darwin9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +27 -0
- data/README.md +215 -0
- data/bin/fig +187 -0
- data/bin/fig-download +20 -0
- data/lib/fig.rb +0 -0
- data/lib/fig/environment.rb +171 -0
- data/lib/fig/grammar.treetop +141 -0
- data/lib/fig/options.rb +98 -0
- data/lib/fig/os.rb +325 -0
- data/lib/fig/package.rb +197 -0
- data/lib/fig/parser.rb +27 -0
- data/lib/fig/repository.rb +240 -0
- data/lib/fig/windows.rb +46 -0
- data/spec/fig_spec.rb +331 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/win_spec.rb +21 -0
- metadata +140 -0
data/lib/fig/package.rb
ADDED
@@ -0,0 +1,197 @@
|
|
1
|
+
module Fig
|
2
|
+
class Package
|
3
|
+
attr_reader :package_name, :version_name, :directory, :statements
|
4
|
+
|
5
|
+
def initialize(package_name, version_name, directory, statements)
|
6
|
+
@package_name = package_name
|
7
|
+
@version_name = version_name
|
8
|
+
@directory = directory
|
9
|
+
@statements = statements
|
10
|
+
end
|
11
|
+
|
12
|
+
def [](config_name)
|
13
|
+
@statements.each do |stmt|
|
14
|
+
return stmt if stmt.is_a?(Configuration) && stmt.name == config_name
|
15
|
+
end
|
16
|
+
puts "Configuration not found: #{@package_name}/#{@version_name}:#{config_name}"
|
17
|
+
exit 10
|
18
|
+
end
|
19
|
+
|
20
|
+
def configs
|
21
|
+
@statements.select { |statement| statement.is_a?(Configuration) }
|
22
|
+
end
|
23
|
+
|
24
|
+
def retrieves
|
25
|
+
retrieves = {}
|
26
|
+
statements.each { |statement| retrieves[statement.var] = statement.path if statement.is_a?(Retrieve) }
|
27
|
+
retrieves
|
28
|
+
end
|
29
|
+
|
30
|
+
def archive_urls
|
31
|
+
@statements.select{|s| s.is_a?(Archive)}.map{|s|s.url}
|
32
|
+
end
|
33
|
+
|
34
|
+
def resource_urls
|
35
|
+
@statements.select{|s| s.is_a?(Resource)}.map{|s|s.url}
|
36
|
+
end
|
37
|
+
|
38
|
+
def unparse
|
39
|
+
@statements.map { |statement| statement.unparse('') }.join("\n")
|
40
|
+
end
|
41
|
+
|
42
|
+
def ==(other)
|
43
|
+
@package_name == other.package_name && @version_name == other.version_name && @statements.to_yaml == other.statements.to_yaml
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class Archive
|
48
|
+
attr_reader :url
|
49
|
+
|
50
|
+
def initialize(url)
|
51
|
+
@url = url
|
52
|
+
end
|
53
|
+
|
54
|
+
def unparse(indent)
|
55
|
+
"#{indent}archive \"#{url}\""
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
class Resource
|
60
|
+
attr_reader :url
|
61
|
+
|
62
|
+
def initialize(url)
|
63
|
+
@url = url
|
64
|
+
end
|
65
|
+
|
66
|
+
def unparse(indent)
|
67
|
+
"#{indent}resource #{url}"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class Retrieve
|
72
|
+
attr_reader :var, :path
|
73
|
+
|
74
|
+
def initialize(var, path)
|
75
|
+
@var = var
|
76
|
+
@path = path
|
77
|
+
end
|
78
|
+
|
79
|
+
def unparse(indent)
|
80
|
+
"#{indent}retrieve #{var}->#{path}"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
class Publish
|
85
|
+
attr_reader :local_name, :remote_name
|
86
|
+
|
87
|
+
def initialize(local_name, remote_name)
|
88
|
+
@local_name = local_name
|
89
|
+
@remote_name = remote_name
|
90
|
+
end
|
91
|
+
|
92
|
+
def unparse(indent)
|
93
|
+
"#{indent}publish #{@local_name}->#{@remote_name}"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
class Install
|
98
|
+
def initialize(statements)
|
99
|
+
@statements = statements
|
100
|
+
end
|
101
|
+
|
102
|
+
def unparse(indent)
|
103
|
+
prefix = "\n#{indent}install"
|
104
|
+
body = @statements.map { |statement| statement.unparse(indent+' ') }.join("\n")
|
105
|
+
suffix = "#{indent}end"
|
106
|
+
return [prefix, body, suffix].join("\n")
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
class Configuration
|
111
|
+
attr_reader :name, :statements
|
112
|
+
|
113
|
+
def initialize(name, statements)
|
114
|
+
@name = name
|
115
|
+
@statements = statements
|
116
|
+
end
|
117
|
+
|
118
|
+
def with_name(name)
|
119
|
+
Configuration.new(name, statements)
|
120
|
+
end
|
121
|
+
|
122
|
+
def commands
|
123
|
+
result = statements.select { |statement| statement.is_a?(Command) }
|
124
|
+
# if result.empty?
|
125
|
+
# raise "No commands found for config: #{@name}"
|
126
|
+
# end
|
127
|
+
result
|
128
|
+
end
|
129
|
+
|
130
|
+
def unparse(indent)
|
131
|
+
unparse_statements(indent, "config #{@name}", @statements, "end")
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
class Path
|
136
|
+
attr_reader :name, :value
|
137
|
+
|
138
|
+
def initialize(name, value)
|
139
|
+
@name = name
|
140
|
+
@value = value
|
141
|
+
end
|
142
|
+
|
143
|
+
def unparse(indent)
|
144
|
+
"#{indent}append #{name}=#{value}"
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
class Set
|
149
|
+
attr_reader :name, :value
|
150
|
+
|
151
|
+
def initialize(name, value)
|
152
|
+
@name = name
|
153
|
+
@value = value
|
154
|
+
end
|
155
|
+
|
156
|
+
def unparse(indent)
|
157
|
+
"#{indent}set #{name}=#{value}"
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
class Include
|
162
|
+
attr_reader :package_name, :config_name, :version_name
|
163
|
+
|
164
|
+
def initialize(package_name, config_name, version_name)
|
165
|
+
@package_name = package_name
|
166
|
+
@config_name = config_name
|
167
|
+
@version_name = version_name
|
168
|
+
end
|
169
|
+
|
170
|
+
def unparse(indent)
|
171
|
+
descriptor = ""
|
172
|
+
descriptor += @package_name if @package_name
|
173
|
+
descriptor += "/#{@version_name}" if @version_name
|
174
|
+
descriptor += ":#{@config_name}" if @config_name
|
175
|
+
"#{indent}include #{descriptor}"
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
class Command
|
180
|
+
attr_reader :command
|
181
|
+
|
182
|
+
def initialize(command)
|
183
|
+
@command = command
|
184
|
+
end
|
185
|
+
|
186
|
+
def unparse(indent)
|
187
|
+
"#{indent}command \"#{@command}\""
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
end
|
192
|
+
|
193
|
+
def unparse_statements(indent, prefix, statements, suffix)
|
194
|
+
body = @statements.map { |statement| statement.unparse(indent+' ') }.join("\n")
|
195
|
+
return ["\n#{indent}#{prefix}", body, "#{indent}#{suffix}"].join("\n")
|
196
|
+
end
|
197
|
+
|
data/lib/fig/parser.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'polyglot'
|
2
|
+
require 'treetop'
|
3
|
+
|
4
|
+
require 'fig/grammar'
|
5
|
+
|
6
|
+
module Fig
|
7
|
+
class Parser
|
8
|
+
def initialize
|
9
|
+
@parser = FigParser.new
|
10
|
+
end
|
11
|
+
|
12
|
+
def parse_package(package_name, version_name, directory, input)
|
13
|
+
input = input.gsub(/#.*$/, '')
|
14
|
+
result = @parser.parse(" #{input} ")
|
15
|
+
if result.nil?
|
16
|
+
puts "#{directory}: #{@parser.failure_reason}"
|
17
|
+
exit 10
|
18
|
+
end
|
19
|
+
result.to_package(package_name, version_name, directory)
|
20
|
+
end
|
21
|
+
|
22
|
+
# def parse_descriptor(descriptor)
|
23
|
+
# puts @parser.methods.sort
|
24
|
+
# end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,240 @@
|
|
1
|
+
require 'fig/parser'
|
2
|
+
|
3
|
+
module Fig
|
4
|
+
class Repository
|
5
|
+
def initialize(os, local_repository_dir, remote_repository_url, remote_repository_user=nil, update=false, update_if_missing=true)
|
6
|
+
@os = os
|
7
|
+
@local_repository_dir = local_repository_dir
|
8
|
+
@remote_repository_url = remote_repository_url
|
9
|
+
@remote_repository_user = remote_repository_user
|
10
|
+
@update = update
|
11
|
+
@update_if_missing = update_if_missing
|
12
|
+
@parser = Parser.new
|
13
|
+
|
14
|
+
@overrides = {}
|
15
|
+
if File.exist?('fig.properties')
|
16
|
+
File.readlines('fig.properties').each do |line|
|
17
|
+
descriptor, path = line.strip.split('=')
|
18
|
+
@overrides[descriptor] = path
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def clean(package_name, version_name)
|
24
|
+
dir = File.join(@local_repository_dir, package_name)
|
25
|
+
dir = File.join(dir, version_name) if version_name
|
26
|
+
FileUtils.rm_rf(dir)
|
27
|
+
end
|
28
|
+
|
29
|
+
def list_packages
|
30
|
+
results = []
|
31
|
+
if File.exist?(@local_repository_dir)
|
32
|
+
@os.list(@local_repository_dir).each do |package_name|
|
33
|
+
@os.list(File.join(@local_repository_dir, package_name)).each do |version_name|
|
34
|
+
results << "#{package_name}/#{version_name}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
results
|
39
|
+
end
|
40
|
+
|
41
|
+
def list_remote_packages
|
42
|
+
@os.download_list(@remote_repository_url)
|
43
|
+
end
|
44
|
+
|
45
|
+
def publish_package(package_statements, package_name, version_name, local_only)
|
46
|
+
temp_dir = temp_dir_for_package(package_name, version_name)
|
47
|
+
@os.clear_directory(temp_dir)
|
48
|
+
local_dir = local_dir_for_package(package_name, version_name)
|
49
|
+
@os.clear_directory(local_dir)
|
50
|
+
fig_file = File.join(temp_dir, ".fig")
|
51
|
+
content = bundle_resources(package_statements).map do |statement|
|
52
|
+
if statement.is_a?(Publish)
|
53
|
+
nil
|
54
|
+
elsif statement.is_a?(Archive) || statement.is_a?(Resource)
|
55
|
+
if statement.is_a?(Resource) && !is_url?(statement.url)
|
56
|
+
archive_name = statement.url
|
57
|
+
archive_remote = "#{remote_dir_for_package(package_name, version_name)}/#{statement.url}"
|
58
|
+
else
|
59
|
+
archive_name = statement.url.split("/").last
|
60
|
+
archive_remote = "#{remote_dir_for_package(package_name, version_name)}/#{archive_name}"
|
61
|
+
end
|
62
|
+
if is_url?(statement.url)
|
63
|
+
archive_local = File.join(temp_dir, archive_name)
|
64
|
+
@os.download(statement.url, archive_local)
|
65
|
+
else
|
66
|
+
archive_local = statement.url
|
67
|
+
end
|
68
|
+
@os.upload(archive_local, archive_remote, @remote_repository_user) unless local_only
|
69
|
+
@os.copy(archive_local, local_dir + "/" + archive_name)
|
70
|
+
if statement.is_a?(Archive)
|
71
|
+
@os.unpack_archive(local_dir, archive_name)
|
72
|
+
end
|
73
|
+
statement.class.new(archive_name).unparse('')
|
74
|
+
else
|
75
|
+
statement.unparse('')
|
76
|
+
end
|
77
|
+
end.select {|s|not s.nil?}
|
78
|
+
@os.write(fig_file, content.join("\n").strip)
|
79
|
+
@os.upload(fig_file, remote_fig_file_for_package(package_name, version_name), @remote_repository_user) unless local_only
|
80
|
+
@os.copy(fig_file, local_fig_file_for_package(package_name, version_name))
|
81
|
+
end
|
82
|
+
|
83
|
+
def bundle_resources(package_statements)
|
84
|
+
resources = []
|
85
|
+
new_package_statements = package_statements.reject do |statement|
|
86
|
+
if statement.is_a?(Resource) && !is_url?(statement.url)
|
87
|
+
resources << statement.url
|
88
|
+
true
|
89
|
+
else
|
90
|
+
false
|
91
|
+
end
|
92
|
+
end
|
93
|
+
if resources.size > 0
|
94
|
+
resources = expand_globs_from(resources)
|
95
|
+
file = "resources.tar.gz"
|
96
|
+
@os.create_archive(file, resources)
|
97
|
+
new_package_statements.unshift(Archive.new(file))
|
98
|
+
at_exit { File.delete(file) }
|
99
|
+
end
|
100
|
+
new_package_statements
|
101
|
+
end
|
102
|
+
|
103
|
+
def load_package(package_name, version_name)
|
104
|
+
if @update || (@update_if_missing && package_missing?(package_name, version_name))
|
105
|
+
update_package(package_name, version_name)
|
106
|
+
end
|
107
|
+
read_local_package(package_name, version_name)
|
108
|
+
end
|
109
|
+
|
110
|
+
def update_package(package_name, version_name)
|
111
|
+
remote_fig_file = remote_fig_file_for_package(package_name, version_name)
|
112
|
+
local_fig_file = local_fig_file_for_package(package_name, version_name)
|
113
|
+
begin
|
114
|
+
if @os.download(remote_fig_file, local_fig_file)
|
115
|
+
install_package(package_name, version_name)
|
116
|
+
end
|
117
|
+
rescue NotFoundException
|
118
|
+
$stderr.puts "Package not found in remote repository: #{package_name}/#{version_name}"
|
119
|
+
exit 1
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def read_local_package(package_name, version_name)
|
124
|
+
dir = local_dir_for_package(package_name, version_name)
|
125
|
+
read_package_from_directory(dir, package_name, version_name)
|
126
|
+
end
|
127
|
+
|
128
|
+
def read_remote_package(package_name, version_name)
|
129
|
+
url = remote_fig_file_for_package(package_name, version_name)
|
130
|
+
content = @os.read_url(url)
|
131
|
+
@parser.parse_package(package_name, version_name, nil, content)
|
132
|
+
end
|
133
|
+
|
134
|
+
def read_package_from_directory(dir, package_name, version_name)
|
135
|
+
file = File.join(dir, ".fig")
|
136
|
+
if not File.exist?(file)
|
137
|
+
file = File.join(dir, "package.fig")
|
138
|
+
end
|
139
|
+
if not File.exist?(file)
|
140
|
+
puts "Fig file not found for package: #{file}"
|
141
|
+
exit 10
|
142
|
+
end
|
143
|
+
read_package_from_file(file, package_name, version_name)
|
144
|
+
end
|
145
|
+
|
146
|
+
def read_package_from_file(file_name, package_name, version_name)
|
147
|
+
if not @os.exist?(file_name)
|
148
|
+
$stderr.puts "Package not found: #{package_name}/#{version_name}"
|
149
|
+
exit 1
|
150
|
+
end
|
151
|
+
modified_time = @os.mtime(file_name)
|
152
|
+
content = @os.read(file_name)
|
153
|
+
@parser.parse_package(package_name, version_name, File.dirname(file_name), content)
|
154
|
+
end
|
155
|
+
|
156
|
+
def local_dir_for_package(package_name, version_name)
|
157
|
+
descriptor = "#{package_name}/#{version_name}"
|
158
|
+
dir = @overrides[descriptor]
|
159
|
+
if dir
|
160
|
+
$stderr.puts "override: #{descriptor}=#{dir}"
|
161
|
+
else
|
162
|
+
dir = File.join(@local_repository_dir, package_name, version_name)
|
163
|
+
end
|
164
|
+
dir
|
165
|
+
end
|
166
|
+
|
167
|
+
private
|
168
|
+
|
169
|
+
def install_package(package_name, version_name)
|
170
|
+
begin
|
171
|
+
package = read_local_package(package_name, version_name)
|
172
|
+
temp_dir = temp_dir_for_package(package_name, version_name)
|
173
|
+
@os.clear_directory(temp_dir)
|
174
|
+
package.archive_urls.each do |archive_url|
|
175
|
+
if not is_url?(archive_url)
|
176
|
+
archive_url = remote_dir_for_package(package_name, version_name) + "/" + archive_url
|
177
|
+
end
|
178
|
+
@os.download_archive(archive_url, File.join(temp_dir))
|
179
|
+
end
|
180
|
+
package.resource_urls.each do |resource_url|
|
181
|
+
if not is_url?(resource_url)
|
182
|
+
resource_url = remote_dir_for_package(package_name, version_name) + "/" + resource_url
|
183
|
+
end
|
184
|
+
@os.download_resource(resource_url, File.join(temp_dir))
|
185
|
+
end
|
186
|
+
local_dir = local_dir_for_package(package_name, version_name)
|
187
|
+
@os.clear_directory(local_dir)
|
188
|
+
# some packages contain no files, only a fig file.
|
189
|
+
if not (package.archive_urls.empty? && package.resource_urls.empty?)
|
190
|
+
FileUtils.mv(Dir.glob(File.join(temp_dir, "*")), local_dir)
|
191
|
+
end
|
192
|
+
write_local_package(package_name, version_name, package)
|
193
|
+
rescue
|
194
|
+
$stderr.puts "Install failed, cleaning up"
|
195
|
+
delete_local_package(package_name, version_name)
|
196
|
+
exit 10
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
# 'resources' is an Array of filenames: ['tmp/foo/file1', 'tmp/foo/*.jar']
|
201
|
+
def expand_globs_from(resources)
|
202
|
+
expanded_files = []
|
203
|
+
resources.each {|f| expanded_files.concat(Dir.glob(f))}
|
204
|
+
expanded_files
|
205
|
+
end
|
206
|
+
|
207
|
+
def is_url?(url)
|
208
|
+
not (/ftp:\/\/|http:\/\/|file:\/\/|ssh:\/\// =~ url).nil?
|
209
|
+
end
|
210
|
+
|
211
|
+
def delete_local_package(package_name, version_name)
|
212
|
+
FileUtils.rm_rf(local_dir_for_package(package_name, version_name))
|
213
|
+
end
|
214
|
+
|
215
|
+
def write_local_package(package_name, version_name, package)
|
216
|
+
file = local_fig_file_for_package(package_name, version_name)
|
217
|
+
@os.write(file, package.unparse)
|
218
|
+
end
|
219
|
+
|
220
|
+
def remote_fig_file_for_package(package_name, version_name)
|
221
|
+
"#{@remote_repository_url}/#{package_name}/#{version_name}/.fig"
|
222
|
+
end
|
223
|
+
|
224
|
+
def local_fig_file_for_package(package_name, version_name)
|
225
|
+
File.join(local_dir_for_package(package_name, version_name), ".fig")
|
226
|
+
end
|
227
|
+
|
228
|
+
def remote_dir_for_package(package_name, version_name)
|
229
|
+
"#{@remote_repository_url}/#{package_name}/#{version_name}"
|
230
|
+
end
|
231
|
+
|
232
|
+
def temp_dir_for_package(package_name, version_name)
|
233
|
+
File.join(@local_repository_dir, "tmp")
|
234
|
+
end
|
235
|
+
|
236
|
+
def package_missing?(package_name, version_name)
|
237
|
+
not File.exist?(local_fig_file_for_package(package_name, version_name))
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|