fig 0.1.57 → 0.1.59

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/Changes +80 -0
  2. data/VERSION +1 -1
  3. data/bin/fig-debug +12 -0
  4. data/bin/fig.bat +1 -0
  5. data/lib/fig/applicationconfiguration.rb +41 -41
  6. data/lib/fig/backtrace.rb +28 -30
  7. data/lib/fig/command.rb +52 -112
  8. data/lib/fig/command/listing.rb +207 -41
  9. data/lib/fig/command/packageload.rb +137 -0
  10. data/lib/fig/environment.rb +59 -72
  11. data/lib/fig/environmentvariables.rb +44 -0
  12. data/lib/fig/environmentvariables/caseinsensitive.rb +49 -0
  13. data/lib/fig/environmentvariables/casesensitive.rb +30 -0
  14. data/lib/fig/grammar.treetop +60 -35
  15. data/lib/fig/log4r/outputter.rb +96 -0
  16. data/lib/fig/logging.rb +2 -1
  17. data/lib/fig/logging/colorizable.rb +14 -0
  18. data/lib/fig/nosuchpackageconfigerror.rb +15 -0
  19. data/lib/fig/operatingsystem.rb +24 -13
  20. data/lib/fig/options.rb +70 -20
  21. data/lib/fig/package.rb +25 -26
  22. data/lib/fig/packagecache.rb +3 -3
  23. data/lib/fig/packagedescriptor.rb +36 -19
  24. data/lib/fig/packageparseerror.rb +7 -0
  25. data/lib/fig/parser.rb +76 -39
  26. data/lib/fig/repository.rb +131 -93
  27. data/lib/fig/retriever.rb +61 -39
  28. data/lib/fig/statement.rb +24 -2
  29. data/lib/fig/statement/archive.rb +4 -6
  30. data/lib/fig/statement/command.rb +4 -6
  31. data/lib/fig/statement/configuration.rb +7 -9
  32. data/lib/fig/statement/include.rb +49 -32
  33. data/lib/fig/statement/override.rb +7 -8
  34. data/lib/fig/statement/path.rb +4 -6
  35. data/lib/fig/statement/publish.rb +4 -11
  36. data/lib/fig/statement/resource.rb +4 -6
  37. data/lib/fig/statement/retrieve.rb +4 -6
  38. data/lib/fig/statement/set.rb +4 -6
  39. data/lib/fig/urlaccesserror.rb +4 -5
  40. metadata +52 -215
  41. data/LICENSE +0 -27
  42. data/README.md +0 -526
  43. data/TODO +0 -4
  44. data/lib/fig/packageerror.rb +0 -8
  45. data/lib/fig/windows.rb +0 -44
@@ -7,13 +7,13 @@ class Fig::PackageCache
7
7
  end
8
8
 
9
9
  def add_package(package)
10
- versions = @packages[package.package_name]
10
+ versions = @packages[package.name]
11
11
  if not versions
12
12
  versions = {}
13
- @packages[package.package_name] = versions
13
+ @packages[package.name] = versions
14
14
  end
15
15
 
16
- versions[package.version_name] = package
16
+ versions[package.version] = package
17
17
 
18
18
  return
19
19
  end
@@ -1,18 +1,38 @@
1
1
  module Fig; end
2
2
 
3
- # Parsed representation of a package name:config/version.
3
+ # Parsed representation of a package (name/version:config).
4
4
  class Fig::PackageDescriptor
5
5
  include Comparable
6
6
 
7
- DEFAULT_CONFIG = 'default'
8
-
9
7
  attr_reader :name, :version, :config
10
8
 
9
+ def self.format(name, version, config, use_default_config = false)
10
+ string = name || ''
11
+
12
+ if version
13
+ string += '/'
14
+ string += version
15
+ end
16
+
17
+ if config
18
+ string += ':'
19
+ string += config
20
+ elsif use_default_config
21
+ string += ':default'
22
+ end
23
+
24
+ return string
25
+ end
26
+
11
27
  def self.parse(raw_string)
28
+ # Additional checks in validate_component() will take care of the looseness
29
+ # of the regexes. These just need to ensure that the entire string gets
30
+ # assigned to one component or another.
31
+
12
32
  self.new(
13
- raw_string =~ %r< ^ ( [^:/]+ ) >x ? $1 : nil,
14
- raw_string =~ %r< / ( [^:/]+ ) >x ? $1 : nil,
15
- raw_string =~ %r< : ( [^:/]+ ) >x ? $1 : nil
33
+ raw_string =~ %r< \A ( [^:/]+ ) >x ? $1 : nil,
34
+ raw_string =~ %r< \A [^/]* / ( [^:]+ ) >x ? $1 : nil,
35
+ raw_string =~ %r< \A [^:]* : ( .+ ) \z >x ? $1 : nil
16
36
  )
17
37
  end
18
38
 
@@ -22,22 +42,19 @@ class Fig::PackageDescriptor
22
42
  @config = config
23
43
  end
24
44
 
25
- def to_string(use_default_config = false)
26
- string = @name || ''
45
+ def validate_component(value, name)
46
+ return if value.nil?
27
47
 
28
- if @version
29
- string += '/'
30
- string += @version
31
- end
48
+ return if value =~ / \A [a-zA-Z0-9_.-]+ \z /x
32
49
 
33
- if @config
34
- string += ':'
35
- string += @config
36
- elsif use_default_config
37
- string += ':default'
38
- end
50
+ raise %Q<Invalid #{name} for package descriptor: "#{value}".>
51
+ end
39
52
 
40
- return string
53
+ # Specifically not named :to_s because it doesn't act like that should.
54
+ def to_string(use_default_config = false)
55
+ return Fig::PackageDescriptor.format(
56
+ @name, @version, @config, use_default_config
57
+ )
41
58
  end
42
59
 
43
60
  def <=>(other)
@@ -0,0 +1,7 @@
1
+ require 'fig/userinputerror'
2
+
3
+ module Fig
4
+ # An issue with parsing a .fig file.
5
+ class PackageParseError < UserInputError
6
+ end
7
+ end
@@ -3,61 +3,98 @@ require 'treetop'
3
3
 
4
4
  require 'fig/grammar'
5
5
  require 'fig/logging'
6
- require 'fig/packageerror'
6
+ require 'fig/packageparseerror'
7
7
  require 'fig/repository'
8
8
  require 'fig/urlaccesserror'
9
9
  require 'fig/userinputerror'
10
10
 
11
- module Fig
12
- # Parses configuration files and deals with a few restrictions on them.
13
- class Parser
14
- def initialize(application_config)
15
- @parser = FigParser.new
16
- @application_config = application_config
17
- end
11
+ module Fig; end
18
12
 
19
- def find_bad_urls(package, package_name, version_name)
20
- bad_urls = []
21
- package.walk_statements do |statement|
22
- statement.urls.each do |url|
23
- # collect all bad urls in bad_urls
24
- next if not Repository.is_url?(url)
25
- bad_urls << url if not @application_config.url_access_allowed?(url)
26
- end
27
- end
13
+ # Parses .fig files (wrapping the Treetop-generated parser object) and deals
14
+ # with a few restrictions on them.
15
+ class Fig::Parser
16
+ def self.node_location(node)
17
+ offset_from_start_of_file = node.interval.first
18
+ input = node.input
28
19
 
29
- raise URLAccessError.new(bad_urls, package_name, version_name) if not bad_urls.empty?
20
+ return [
21
+ input.line_of(offset_from_start_of_file),
22
+ input.column_of(offset_from_start_of_file)
23
+ ]
24
+ end
25
+
26
+ def initialize(application_config, check_include_versions)
27
+ @parser = Fig::FigParser.new
28
+ @application_config = application_config
29
+ @check_include_versions = check_include_versions
30
+ end
31
+
32
+ def parse_package(descriptor, directory, input)
33
+ # Bye bye comments.
34
+ input = input.gsub(/#.*$/, '')
35
+
36
+ # Extra space at the end because most of the rules in the grammar require
37
+ # trailing whitespace.
38
+ result = @parser.parse(input + ' ')
39
+
40
+ if result.nil?
41
+ Fig::Logging.fatal "#{directory}: #{@parser.failure_reason}"
42
+ raise Fig::PackageParseError.new("#{directory}: #{@parser.failure_reason}")
30
43
  end
31
44
 
32
- def find_multiple_command_statements(package)
33
- command_processed = false
34
- package.walk_statements do |statement|
35
- if statement.is_a?(Statement::Command)
36
- if command_processed == true
37
- raise UserInputError.new("Multiple command statements cannot be processed.")
38
- end
39
- command_processed = true
40
- elsif statement.is_a?(Statement::Configuration)
41
- command_processed = false
42
- end
45
+ package = result.to_package(descriptor, directory)
46
+
47
+ check_for_bad_urls(package, descriptor)
48
+ check_for_multiple_command_statements(package)
49
+ check_for_missing_versions_on_include_statements(package)
50
+
51
+ return package
52
+ end
53
+
54
+ private
55
+
56
+ def check_for_bad_urls(package, descriptor)
57
+ bad_urls = []
58
+ package.walk_statements do |statement|
59
+ statement.urls.each do |url|
60
+ # collect all bad urls in bad_urls
61
+ next if not Fig::Repository.is_url?(url)
62
+ bad_urls << url if not @application_config.url_access_allowed?(url)
43
63
  end
44
64
  end
45
65
 
46
- def parse_package(package_name, version_name, directory, input)
47
- input = input.gsub(/#.*$/, '')
48
- result = @parser.parse(" #{input} ")
66
+ raise Fig::URLAccessError.new(bad_urls, descriptor) if not bad_urls.empty?
67
+
68
+ return
69
+ end
49
70
 
50
- if result.nil?
51
- Logging.fatal "#{directory}: #{@parser.failure_reason}"
52
- raise PackageError.new("#{directory}: #{@parser.failure_reason}")
71
+ def check_for_multiple_command_statements(package)
72
+ command_processed = false
73
+ package.walk_statements do |statement|
74
+ if statement.is_a?(Fig::Statement::Command)
75
+ if command_processed == true
76
+ raise Fig::UserInputError.new(
77
+ %Q<Found a second "command" statement within a "config" block#{statement.position_string()}.>
78
+ )
79
+ end
80
+ command_processed = true
81
+ elsif statement.is_a?(Fig::Statement::Configuration)
82
+ command_processed = false
53
83
  end
84
+ end
54
85
 
55
- package = result.to_package(package_name, version_name, directory)
86
+ return
87
+ end
56
88
 
57
- find_bad_urls(package, package_name, version_name)
58
- find_multiple_command_statements(package)
89
+ def check_for_missing_versions_on_include_statements(package)
90
+ return if not @check_include_versions
59
91
 
60
- return package
92
+ package.walk_statements do |statement|
93
+ if statement.is_a?(Fig::Statement::Include)
94
+ statement.complain_if_version_missing()
95
+ end
61
96
  end
97
+
98
+ return
62
99
  end
63
100
  end
@@ -1,6 +1,10 @@
1
+ require 'socket'
2
+ require 'sys/admin'
3
+
1
4
  require 'fig/logging'
2
5
  require 'fig/notfounderror'
3
6
  require 'fig/packagecache'
7
+ require 'fig/packagedescriptor'
4
8
  require 'fig/parser'
5
9
  require 'fig/repositoryerror'
6
10
  require 'fig/statement/archive'
@@ -22,27 +26,33 @@ module Fig
22
26
  local_repository_dir,
23
27
  remote_repository_url,
24
28
  application_config,
25
- remote_repository_user = nil,
26
- update = false,
27
- update_if_missing = true
29
+ remote_repository_user,
30
+ update,
31
+ update_if_missing,
32
+ check_include_versions
28
33
  )
29
- @operating_system = os
30
- @local_repository_dir = local_repository_dir
31
- @remote_repository_url = remote_repository_url
34
+ @operating_system = os
35
+ @local_repository_dir = local_repository_dir
36
+ @remote_repository_url = remote_repository_url
32
37
  @remote_repository_user = remote_repository_user
33
- @update = update
34
- @update_if_missing = update_if_missing
38
+ @update = update
39
+ @update_if_missing = update_if_missing
40
+
41
+ @parser = Parser.new(application_config, check_include_versions)
35
42
 
36
- @parser = Parser.new(application_config)
43
+ reset_cached_data()
44
+ end
45
+
46
+ def reset_cached_data()
37
47
  @packages = PackageCache.new()
38
48
  end
39
49
 
40
50
  def list_packages
41
51
  results = []
42
52
  if File.exist?(@local_repository_dir)
43
- @operating_system.list(@local_repository_dir).each do |package_name|
44
- @operating_system.list(File.join(@local_repository_dir, package_name)).each do |version_name|
45
- results << "#{package_name}/#{version_name}"
53
+ @operating_system.list(@local_repository_dir).each do |name|
54
+ @operating_system.list(File.join(@local_repository_dir, name)).each do |version|
55
+ results << PackageDescriptor.format(name, version, nil)
46
56
  end
47
57
  end
48
58
  end
@@ -57,69 +67,66 @@ module Fig
57
67
  end
58
68
 
59
69
  def get_package(
60
- package_name,
61
- version_name,
62
- disable_updating = false,
70
+ descriptor,
63
71
  allow_any_version = false
64
72
  )
65
- if not version_name
73
+ if not descriptor.version
66
74
  if allow_any_version
67
- package = @packages.get_any_version_of_package(package_name)
75
+ package = @packages.get_any_version_of_package(descriptor.name)
68
76
  if package
69
77
  Logging.warn(
70
- "Picked version #{package.version_name} of #{package.package_name} at random."
78
+ "Picked version #{package.version} of #{package.name} at random."
71
79
  )
72
80
  return package
73
81
  end
74
82
  end
75
83
 
76
84
  raise RepositoryError.new(
77
- %Q<Cannot retrieve "#{package_name}" without a version.>
85
+ %Q<Cannot retrieve "#{descriptor.name}" without a version.>
78
86
  )
79
87
  end
80
88
 
81
- package = @packages.get_package(package_name, version_name)
89
+ package = @packages.get_package(descriptor.name, descriptor.version)
82
90
  return package if package
83
91
 
84
- Logging.debug "Considering #{package_name}/#{version_name}."
92
+ Logging.debug \
93
+ "Considering #{PackageDescriptor.format(descriptor.name, descriptor.version, nil)}."
85
94
 
86
- if should_update?(package_name, version_name, disable_updating)
87
- update_package(package_name, version_name)
95
+ if should_update?(descriptor)
96
+ update_package(descriptor)
88
97
  end
89
98
 
90
- return read_local_package(package_name, version_name)
99
+ return read_local_package(descriptor)
91
100
  end
92
101
 
93
- def clean(package_name, version_name)
94
- @packages.remove_package(package_name, version_name)
102
+ def clean(descriptor)
103
+ @packages.remove_package(descriptor.name, descriptor.version)
95
104
 
96
- dir = File.join(@local_repository_dir, package_name)
97
- dir = File.join(dir, version_name) if version_name
105
+ dir = File.join(@local_repository_dir, descriptor.name)
106
+ dir = File.join(dir, descriptor.version) if descriptor.version
98
107
 
99
108
  FileUtils.rm_rf(dir)
100
109
 
101
110
  return
102
111
  end
103
112
 
104
- def publish_package(
105
- package_statements, package_name, version_name, local_only
106
- )
107
- temp_dir = temp_dir_for_package(package_name, version_name)
113
+ def publish_package(package_statements, descriptor, local_only)
114
+ temp_dir = temp_dir_for_package(descriptor)
108
115
  @operating_system.clear_directory(temp_dir)
109
- local_dir = local_dir_for_package(package_name, version_name)
116
+ local_dir = local_dir_for_package(descriptor)
110
117
  @operating_system.clear_directory(local_dir)
111
118
  fig_file = File.join(temp_dir, '.fig')
112
119
  content = derive_package_content(
113
- package_statements, package_name, version_name, local_dir, local_only
120
+ package_statements, descriptor, local_dir, local_only
114
121
  )
115
122
  @operating_system.write(fig_file, content.join("\n").strip)
116
123
  @operating_system.upload(
117
124
  fig_file,
118
- remote_fig_file_for_package(package_name, version_name),
125
+ remote_fig_file_for_package(descriptor),
119
126
  @remote_repository_user
120
127
  ) unless local_only
121
128
  @operating_system.copy(
122
- fig_file, local_fig_file_for_package(package_name, version_name)
129
+ fig_file, local_fig_file_for_package(descriptor)
123
130
  )
124
131
 
125
132
  FileUtils.rm_rf(temp_dir)
@@ -131,18 +138,15 @@ module Fig
131
138
 
132
139
  private
133
140
 
134
- def should_update?(package_name, version_name, disable_updating)
135
- return false if disable_updating
136
-
141
+ def should_update?(descriptor)
137
142
  return true if @update
138
143
 
139
- return @update_if_missing &&
140
- package_missing?(package_name, version_name)
144
+ return @update_if_missing && package_missing?(descriptor)
141
145
  end
142
146
 
143
- def read_local_package(package_name, version_name)
144
- dir = local_dir_for_package(package_name, version_name)
145
- return read_package_from_directory(dir, package_name, version_name)
147
+ def read_local_package(descriptor)
148
+ directory = local_dir_for_package(descriptor)
149
+ return read_package_from_directory(directory, descriptor)
146
150
  end
147
151
 
148
152
  def bundle_resources(package_statements)
@@ -163,42 +167,43 @@ module Fig
163
167
  resources = expand_globs_from(resources)
164
168
  file = 'resources.tar.gz'
165
169
  @operating_system.create_archive(file, resources)
166
- new_package_statements.unshift(Statement::Archive.new(file))
170
+ new_package_statements.unshift(Statement::Archive.new(nil, file))
167
171
  at_exit { File.delete(file) }
168
172
  end
169
173
 
170
174
  return new_package_statements
171
175
  end
172
176
 
173
- def install_package(package_name, version_name)
177
+ def install_package(descriptor)
174
178
  temp_dir = nil
175
179
 
176
180
  begin
177
- package = read_local_package(package_name, version_name)
178
- temp_dir = temp_dir_for_package(package_name, version_name)
181
+ package = read_local_package(descriptor)
182
+ temp_dir = temp_dir_for_package(descriptor)
179
183
  @operating_system.clear_directory(temp_dir)
180
184
  package.archive_urls.each do |archive_url|
181
185
  if not Repository.is_url?(archive_url)
182
- archive_url = remote_dir_for_package(package_name, version_name) + '/' + archive_url
186
+ archive_url = remote_dir_for_package(descriptor) + '/' + archive_url
183
187
  end
184
188
  @operating_system.download_archive(archive_url, File.join(temp_dir))
185
189
  end
186
190
  package.resource_urls.each do |resource_url|
187
191
  if not Repository.is_url?(resource_url)
188
- resource_url = remote_dir_for_package(package_name, version_name) + '/' + resource_url
192
+ resource_url =
193
+ remote_dir_for_package(descriptor) + '/' + resource_url
189
194
  end
190
195
  @operating_system.download_resource(resource_url, File.join(temp_dir))
191
196
  end
192
- local_dir = local_dir_for_package(package_name, version_name)
197
+ local_dir = local_dir_for_package(descriptor)
193
198
  @operating_system.clear_directory(local_dir)
194
199
  # some packages contain no files, only a fig file.
195
200
  if not (package.archive_urls.empty? && package.resource_urls.empty?)
196
201
  FileUtils.mv(Dir.glob(File.join(temp_dir, '*')), local_dir)
197
202
  end
198
- write_local_package(package_name, version_name, package)
203
+ write_local_package(descriptor, package)
199
204
  rescue
200
205
  Logging.fatal 'Install failed, cleaning up.'
201
- delete_local_package(package_name, version_name)
206
+ delete_local_package(descriptor)
202
207
  raise RepositoryError.new
203
208
  ensure
204
209
  if temp_dir
@@ -207,49 +212,55 @@ module Fig
207
212
  end
208
213
  end
209
214
 
210
- def update_package(package_name, version_name)
211
- remote_fig_file = remote_fig_file_for_package(package_name, version_name)
212
- local_fig_file = local_fig_file_for_package(package_name, version_name)
215
+ def update_package(descriptor)
216
+ remote_fig_file = remote_fig_file_for_package(descriptor)
217
+ local_fig_file = local_fig_file_for_package(descriptor)
213
218
  begin
214
219
  if @operating_system.download(remote_fig_file, local_fig_file)
215
- install_package(package_name, version_name)
220
+ install_package(descriptor)
216
221
  end
217
222
  rescue NotFoundError
218
- Logging.fatal "Package not found in remote repository: #{package_name}/#{version_name}"
219
- delete_local_package(package_name, version_name)
223
+ Logging.fatal "Package not found in remote repository: #{descriptor.to_string()}"
224
+ delete_local_package(descriptor)
220
225
  raise RepositoryError.new
221
226
  end
222
227
  end
223
228
 
224
- # 'resources' is an Array of filenames: ['tmp/foo/file1', 'tmp/foo/*.jar']
229
+ # 'resources' is an Array of fileglob patterns: ['tmp/foo/file1',
230
+ # 'tmp/foo/*.jar']
225
231
  def expand_globs_from(resources)
226
232
  expanded_files = []
227
233
  resources.each {|f| expanded_files.concat(Dir.glob(f))}
228
234
  expanded_files
229
235
  end
230
236
 
231
- def read_package_from_directory(dir, package_name, version_name)
232
- file = File.join(dir, '.fig')
233
- if not File.exist?(file)
234
- file = File.join(dir, 'package.fig')
235
- end
236
- if not File.exist?(file)
237
- Logging.fatal %Q<Fig file not found for package "#{package_name || '<unnamed>'}": #{file}>
238
- raise RepositoryError.new
237
+ def read_package_from_directory(dir, descriptor)
238
+ file = nil
239
+ dot_fig_file = File.join(dir, '.fig')
240
+ if File.exist?(dot_fig_file)
241
+ file = dot_fig_file
242
+ else
243
+ package_dot_fig_file = File.join(dir, 'package.fig')
244
+ if not File.exist?(package_dot_fig_file)
245
+ Logging.fatal %Q<Fig file not found for package "#{descriptor.name || '<unnamed>'}". Looked for "#{dot_fig_file}" and "#{package_dot_fig_file}" and found neither.>
246
+ raise RepositoryError.new
247
+ end
248
+
249
+ file = package_dot_fig_file
239
250
  end
240
251
 
241
- return read_package_from_file(file, package_name, version_name)
252
+ return read_package_from_file(file, descriptor)
242
253
  end
243
254
 
244
- def read_package_from_file(file_name, package_name, version_name)
255
+ def read_package_from_file(file_name, descriptor)
245
256
  if not File.exist?(file_name)
246
- Logging.fatal "Package not found: #{package_name}/#{version_name}"
257
+ Logging.fatal "Package not found: #{descriptor.to_string()}"
247
258
  raise RepositoryError.new
248
259
  end
249
260
  content = File.read(file_name)
250
261
 
251
262
  package = @parser.parse_package(
252
- package_name, version_name, File.dirname(file_name), content
263
+ descriptor, File.dirname(file_name), content
253
264
  )
254
265
 
255
266
  @packages.add_package(package)
@@ -257,52 +268,79 @@ module Fig
257
268
  return package
258
269
  end
259
270
 
260
- def delete_local_package(package_name, version_name)
261
- FileUtils.rm_rf(local_dir_for_package(package_name, version_name))
271
+ def delete_local_package(descriptor)
272
+ FileUtils.rm_rf(local_dir_for_package(descriptor))
262
273
  end
263
274
 
264
- def write_local_package(package_name, version_name, package)
265
- file = local_fig_file_for_package(package_name, version_name)
275
+ def write_local_package(descriptor, package)
276
+ file = local_fig_file_for_package(descriptor)
266
277
  @operating_system.write(file, package.unparse)
267
278
  end
268
279
 
269
- def remote_fig_file_for_package(package_name, version_name)
270
- "#{@remote_repository_url}/#{package_name}/#{version_name}/.fig"
280
+ def remote_fig_file_for_package(descriptor)
281
+ "#{@remote_repository_url}/#{descriptor.name}/#{descriptor.version}/.fig"
271
282
  end
272
283
 
273
- def local_fig_file_for_package(package_name, version_name)
274
- File.join(local_dir_for_package(package_name, version_name), '.fig')
284
+ def local_fig_file_for_package(descriptor)
285
+ File.join(local_dir_for_package(descriptor), '.fig')
275
286
  end
276
287
 
277
- def remote_dir_for_package(package_name, version_name)
278
- "#{@remote_repository_url}/#{package_name}/#{version_name}"
288
+ def remote_dir_for_package(descriptor)
289
+ "#{@remote_repository_url}/#{descriptor.name}/#{descriptor.version}"
279
290
  end
280
291
 
281
- def local_dir_for_package(package_name, version_name)
282
- return File.join(@local_repository_dir, package_name, version_name)
292
+ def local_dir_for_package(descriptor)
293
+ return File.join(
294
+ @local_repository_dir, descriptor.name, descriptor.version
295
+ )
283
296
  end
284
297
 
285
- def temp_dir_for_package(package_name, version_name)
298
+ def temp_dir_for_package(descriptor)
286
299
  File.join(@local_repository_dir, 'tmp')
287
300
  end
288
301
 
289
- def package_missing?(package_name, version_name)
290
- not File.exist?(local_fig_file_for_package(package_name, version_name))
302
+ def package_missing?(descriptor)
303
+ not File.exist?(local_fig_file_for_package(descriptor))
291
304
  end
292
305
 
293
306
  def derive_package_content(
294
- package_statements, package_name, version_name, local_dir, local_only
307
+ package_statements, descriptor, local_dir, local_only
308
+ )
309
+ header_strings = derive_package_metadata_comments(descriptor)
310
+ resource_statement_strings = derive_package_resources(
311
+ package_statements, descriptor, local_dir, local_only
312
+ )
313
+
314
+ return [header_strings, resource_statement_strings].flatten()
315
+ end
316
+
317
+ def derive_package_metadata_comments(descriptor)
318
+ now = Time.now()
319
+
320
+ return [
321
+ %Q<# Publishing information for #{descriptor.to_string()}:>,
322
+ %q<#>,
323
+ %Q<# Time: #{now} (epoch: #{now.to_i()})>,
324
+ %Q<# User: #{Sys::Admin.get_login()}>,
325
+ %Q<# Host: #{Socket.gethostname()}>,
326
+ %Q<# Args: "#{ARGV.join %q[", "]}">,
327
+ %q<#>
328
+ ]
329
+ end
330
+
331
+ def derive_package_resources(
332
+ package_statements, descriptor, local_dir, local_only
295
333
  )
296
334
  return bundle_resources(package_statements).map do |statement|
297
335
  if statement.is_a?(Statement::Publish)
298
336
  nil
299
337
  elsif statement.is_a?(Statement::Archive) || statement.is_a?(Statement::Resource)
300
- if statement.is_a?(Statement::Resource) && !Repository.is_url?(statement.url)
338
+ if statement.is_a?(Statement::Resource) && ! Repository.is_url?(statement.url)
301
339
  archive_name = statement.url
302
- archive_remote = "#{remote_dir_for_package(package_name, version_name)}/#{statement.url}"
340
+ archive_remote = "#{remote_dir_for_package(descriptor)}/#{statement.url}"
303
341
  else
304
342
  archive_name = statement.url.split('/').last
305
- archive_remote = "#{remote_dir_for_package(package_name, version_name)}/#{archive_name}"
343
+ archive_remote = "#{remote_dir_for_package(descriptor)}/#{archive_name}"
306
344
  end
307
345
  if Repository.is_url?(statement.url)
308
346
  archive_local = File.join(temp_dir, archive_name)
@@ -315,11 +353,11 @@ module Fig
315
353
  if statement.is_a?(Statement::Archive)
316
354
  @operating_system.unpack_archive(local_dir, archive_name)
317
355
  end
318
- statement.class.new(archive_name).unparse('')
356
+ statement.class.new(nil, archive_name).unparse('')
319
357
  else
320
358
  statement.unparse('')
321
359
  end
322
- end.select { |s|not s.nil? }
360
+ end.select { |s| not s.nil? }
323
361
  end
324
362
  end
325
363
  end