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.
@@ -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