fig 0.1.57 → 0.1.59

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