fig 0.1.24-universal-darwin9.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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