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
data/Changes CHANGED
@@ -1,3 +1,83 @@
1
+ v0.1.59
2
+
3
+ Backwards incompatibilities:
4
+
5
+ - Specifying a config in the descriptor and --config is now an error, i.e you
6
+ can't do:
7
+
8
+ fig package/1.2.3:some_config --config some_other_config
9
+
10
+ Allowing configurations in both locations was ambiguous and the developers,
11
+ let alone users, couldn't tell which configuration would prevail.
12
+
13
+ New features:
14
+
15
+ - "--list-variables" option. This will display all variables manipulated by
16
+ Fig, following package dependencies recursively. Can have
17
+ "--list-all-configs" and "--list-tree" applied to it for tracking down
18
+ where that nasty setting of EDITOR to "emacs" comes from.
19
+
20
+ Example "--list-variables --list-tree" output:
21
+
22
+ A/1.2.3
23
+ | CLASSPATH = something:$CLASSPATH
24
+ | FROM_A = blah
25
+ '---C/5.6.7
26
+ | CLASSPATH = something_else:$CLASSPATH
27
+ | FROM_C = blah
28
+ '---B/1.2.3
29
+ CLASSPATH = planet_x:$CLASSPATH
30
+ FROM_B = blah
31
+
32
+ See README.md for more.
33
+
34
+ Suggestions for changes to the output format welcome.
35
+
36
+ - "--command-extra-args" option. Allows you to say that the rest of the fig
37
+ command-line is to be appended to the end of the command in a "command"
38
+ statement.
39
+
40
+ - The .fig file created in a repository now contains metadata about
41
+ the publishing of the package (time/user/host).
42
+
43
+ - Logging output is colorized if going to a tty on *nix. This includes
44
+ restoration of the old colorization of local package downloads/deletions.
45
+ Colors are not currently configurable.
46
+
47
+ - The primary package is now treated the same as other packages as far as
48
+ updates are concerned. Previously, if you started with a new environment,
49
+ e.g. FIG_HOME was empty, running "fig foo/1.2.3 -- echo foo" would fall
50
+ over. Even asking for updates ("fig --update foo/1.2.3 -- echo foo")
51
+ wouldn't change anything. Now the latter case will work.
52
+
53
+ - "--suppress-warning-include-statement-missing-version" option and "suppress
54
+ warnings" entry in figrc will, unsurprisingly, turn off warnings for things
55
+ like "include foo" in included packages. Note that this will NOT turn off
56
+ these warnings for the contents of a package.fig file.
57
+
58
+ The idea is that, while not having a version on an include is a bad idea,
59
+ you don't decide on the contents of your dependencies. So, this allows you
60
+ to stop Fig from complaining about things you can't control, while still
61
+ yelling at you for things that you do.
62
+
63
+ - The test suite passes on MS Windows!
64
+
65
+ Bug fixes:
66
+
67
+ - You can publish packages that have versionless includes again.
68
+
69
+ Significant Internals:
70
+
71
+ - The definition of a package descriptor has become more restrictive in the
72
+ Ruby code. This shouldn't be an issue because the Treetop grammar has
73
+ already restricted it this way; this is just a check from the Ruby side.
74
+
75
+ v0.1.58.beta.1
76
+ v0.1.58.alpha.2
77
+ v0.1.58.alpha.1
78
+
79
+ - Test releases
80
+
1
81
  v0.1.57
2
82
 
3
83
  - Logging output now goes to stderr by default, instead of stdout.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.57
1
+ 0.1.59
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), %w< .. lib > ))
4
+
5
+ require 'rubygems'
6
+
7
+ require 'fig/command'
8
+
9
+ # Identical to regular fig, but doesn't use exception handling so you can see
10
+ # stack traces.
11
+ return_code = Fig::Command.new.run_fig(ARGV)
12
+ exit return_code
@@ -0,0 +1 @@
1
+ @"ruby.exe" "%~dpn0" %*
@@ -1,53 +1,53 @@
1
- module Fig
2
- # Configuration for the Fig program, as opposed to the configuration for a
3
- # package.
4
- class ApplicationConfiguration
5
- def initialize(remote_repository_url)
6
- @data = []
7
- @remote_repository_url = remote_repository_url
8
- clear_cached_data
9
- end
1
+ module Fig; end
10
2
 
11
- def ensure_url_whitelist_initialized()
12
- return if not @whitelist.nil?
13
- whitelist = self['url whitelist']
14
- if whitelist.nil?
15
- @whitelist = []
16
- else
17
- @whitelist = [@remote_repository_url, whitelist].flatten
18
- end
19
- end
3
+ # Configuration for the Fig program, as opposed to the configuration in a
4
+ # package.
5
+ class Fig::ApplicationConfiguration
6
+ def initialize(remote_repository_url)
7
+ @data = []
8
+ @remote_repository_url = remote_repository_url
9
+ clear_cached_data
10
+ end
20
11
 
21
- def [](key)
22
- @data.each do |dataset|
23
- if dataset.has_key?(key)
24
- return dataset[key]
25
- end
26
- end
27
- return nil
12
+ def ensure_url_whitelist_initialized()
13
+ return if not @whitelist.nil?
14
+ whitelist = self['url whitelist']
15
+ if whitelist.nil?
16
+ @whitelist = []
17
+ else
18
+ @whitelist = [@remote_repository_url, whitelist].flatten
28
19
  end
20
+ end
29
21
 
30
- def push_dataset(dataset)
31
- @data.push(dataset)
22
+ def [](key)
23
+ @data.each do |dataset|
24
+ if dataset.has_key?(key)
25
+ return dataset[key]
26
+ end
32
27
  end
28
+ return nil
29
+ end
33
30
 
34
- def unshift_dataset(dataset)
35
- @data.unshift(dataset)
36
- end
31
+ def push_dataset(dataset)
32
+ @data.push(dataset)
33
+ end
37
34
 
38
- # after push_dataset or unshift_dataset, call clear_cached, and lazy initialize as far as the list of things to exclude
35
+ def unshift_dataset(dataset)
36
+ @data.unshift(dataset)
37
+ end
39
38
 
40
- def clear_cached_data()
41
- @whitelist = nil
42
- end
39
+ # after push_dataset or unshift_dataset, call clear_cached, and lazy
40
+ # initialize as far as the list of things to exclude
41
+ def clear_cached_data()
42
+ @whitelist = nil
43
+ end
43
44
 
44
- def url_access_allowed?(url)
45
- ensure_url_whitelist_initialized
46
- return true if @whitelist.empty?
47
- @whitelist.each do |allowed_url|
48
- return true if url.match(/\A#{Regexp.quote(allowed_url)}\b/)
49
- end
50
- return false
45
+ def url_access_allowed?(url)
46
+ ensure_url_whitelist_initialized
47
+ return true if @whitelist.empty?
48
+ @whitelist.each do |allowed_url|
49
+ return true if url.match(/\A#{Regexp.quote(allowed_url)}\b/)
51
50
  end
51
+ return false
52
52
  end
53
53
  end
@@ -5,50 +5,48 @@ module Fig; end
5
5
  class Fig::Backtrace
6
6
  attr_reader :overrides
7
7
 
8
- def initialize(parent, package_name, version_name, config_name)
9
- @parent = parent
10
- @package_name = package_name
11
- @version_name = version_name
12
- @config_name = config_name || 'default'
13
- @overrides = {}
8
+ def initialize(parent, descriptor)
9
+ @parent = parent
10
+ @descriptor = descriptor
11
+ @overrides = {}
14
12
  end
15
13
 
16
- def collect(stack)
17
- if @parent
18
- @parent.collect(stack)
19
- end
20
- elem = ''
21
- if @package_name
22
- elem = @package_name
23
- end
24
- if @version_name
25
- elem += '/' + @version_name
26
- end
27
- if @config_name
28
- elem += ':' + @config_name
29
- end
30
- stack << elem
31
- end
32
-
33
- def add_override(package_name, version_name)
14
+ def add_override(package_name, version)
34
15
  # Don't replace an existing override on the stack
35
16
  return if get_override(package_name)
36
- @overrides[package_name] = version_name
17
+
18
+ @overrides[package_name] = version
37
19
  end
38
20
 
39
- def get_override(package_name)
40
- return @overrides[package_name] || (@parent ? @parent.get_override(package_name) : nil)
21
+ # Returns a version.
22
+ def get_override(package_name, default_version = nil)
23
+ version = @overrides[package_name]
24
+ return version if version
25
+
26
+ return @parent.get_override(package_name, default_version) if @parent
27
+ return default_version
41
28
  end
42
29
 
30
+ # Prints a stack trace to the IO object.
43
31
  def dump(out)
44
32
  stack = []
45
33
  collect(stack)
46
34
  i=0
47
- for elem in stack
35
+ for descriptor in stack
48
36
  indent=''
49
37
  i.times { indent += ' ' }
50
- out.puts indent+elem
38
+ out.puts indent + descriptor.to_string(:use_default_config)
51
39
  i += 1
52
40
  end
53
- end
41
+ end
42
+
43
+ private
44
+
45
+ def collect(stack)
46
+ if @parent
47
+ @parent.collect(stack)
48
+ end
49
+
50
+ stack << @descriptor
51
+ end
54
52
  end
@@ -1,6 +1,5 @@
1
1
  require 'rubygems'
2
2
  require 'net/ftp'
3
- require 'log4r'
4
3
  require 'set'
5
4
 
6
5
  require 'fig/environment'
@@ -17,17 +16,21 @@ require 'fig/statement/configuration'
17
16
  require 'fig/statement/publish'
18
17
  require 'fig/userinputerror'
19
18
 
20
- # This is a breakout of part of this class simply to keep the file size down.
19
+ # These are a breakout of parts of this class simply to keep the file size down.
20
+
21
21
  # You will need to look in this file for any stuff related to --list-* options.
22
22
  require 'fig/command/listing'
23
23
 
24
+ # You will need to look in this file for any stuff related to loading the
25
+ # primary Package object.
26
+ require 'fig/command/packageload'
27
+
24
28
  module Fig; end
25
29
 
26
30
  # Main program
27
31
  class Fig::Command
28
32
  include Fig::Command::Listing
29
-
30
- DEFAULT_FIG_FILE = 'package.fig'
33
+ include Fig::Command::PackageLoad
31
34
 
32
35
  def run_fig(argv)
33
36
  @options = Fig::Options.new(argv)
@@ -40,7 +43,7 @@ class Fig::Command
40
43
 
41
44
  if @options.clean?
42
45
  check_required_package_descriptor('to clean')
43
- @repository.clean(@descriptor.name, @descriptor.version)
46
+ @repository.clean(@descriptor)
44
47
  return 0
45
48
  end
46
49
 
@@ -52,7 +55,7 @@ class Fig::Command
52
55
  return publish()
53
56
  end
54
57
 
55
- get_package()
58
+ load_package_object()
56
59
 
57
60
  if @options.listing()
58
61
  handle_post_parse_list_options()
@@ -63,11 +66,11 @@ class Fig::Command
63
66
  |command| @operating_system.shell_exec command
64
67
  end
65
68
  elsif @descriptor
66
- @environment.include_config(
67
- @package, @descriptor.name, @descriptor.config, @descriptor.version, {}, nil
68
- )
69
+ @environment.include_config(@package, @descriptor, {}, nil)
69
70
  @environment.execute_config(
70
- @package, @descriptor.name, @descriptor.config, nil, []
71
+ @package,
72
+ @descriptor,
73
+ @options.command_extra_argv || []
71
74
  ) { |cmd| @operating_system.shell_exec cmd }
72
75
  elsif not @repository.updating?
73
76
  $stderr.puts "Nothing to do.\n"
@@ -113,6 +116,15 @@ class Fig::Command
113
116
  return nil
114
117
  end
115
118
 
119
+ def check_include_statements_versions?()
120
+ return false if @options.suppress_warning_include_statement_missing_version?
121
+
122
+ suppressed_warnings = @configuration['suppress warnings']
123
+ return true if not suppressed_warnings
124
+
125
+ return ! suppressed_warnings.include?('include statement missing version')
126
+ end
127
+
116
128
  def configure()
117
129
  Fig::Logging.initialize_pre_configuration(@options.log_level())
118
130
 
@@ -139,21 +151,36 @@ class Fig::Command
139
151
  @configuration,
140
152
  nil, # remote_user
141
153
  @options.update?,
142
- @options.update_if_missing?
154
+ @options.update_if_missing?,
155
+ check_include_statements_versions?
143
156
  )
144
157
 
145
158
  @retriever = Fig::Retriever.new('.')
146
159
 
147
- # Check to see if this is still happening with the new layers of abstraction.
148
- at_exit { @retriever.save }
160
+ at_exit { @retriever.save_metadata() }
149
161
 
150
- @environment = Fig::Environment.new(@repository, @options.reset_environment? ? {} : nil, @retriever)
162
+ @environment = prepare_environment
151
163
 
152
164
  @options.non_command_package_statements().each do |statement|
153
165
  @environment.apply_config_statement(nil, statement, nil)
154
166
  end
155
167
  end
156
168
 
169
+ def prepare_environment()
170
+ environment_variables = nil
171
+ if @options.reset_environment?
172
+ environment_variables = Fig::OperatingSystem.get_environment_variables({})
173
+ end
174
+
175
+ return Fig::Environment.new(@repository, environment_variables, @retriever)
176
+ end
177
+
178
+ def base_config()
179
+ return @options.config() ||
180
+ @descriptor && @descriptor.config ||
181
+ Fig::Package::DEFAULT_CONFIG
182
+ end
183
+
157
184
  def check_required_package_descriptor(operation_description)
158
185
  if not @descriptor
159
186
  raise Fig::UserInputError.new(
@@ -172,100 +199,12 @@ class Fig::Command
172
199
  end
173
200
  end
174
201
 
175
- def read_in_package_config_file(config_file)
176
- if File.exist?(config_file)
177
- return File.read(config_file)
178
- else
179
- raise Fig::UserInputError.new(%Q<File not found: "#{config_file}".>)
180
- end
181
- end
182
-
183
202
  def remote_operation_necessary?()
184
203
  return @options.updating? ||
185
204
  @options.publish? ||
186
205
  @options.listing == :remote_packages
187
206
  end
188
207
 
189
- def load_package_config_file_contents()
190
- package_config_file = @options.package_config_file()
191
-
192
- if package_config_file == :none
193
- return nil
194
- elsif package_config_file == '-'
195
- return $stdin.read
196
- elsif package_config_file.nil?
197
- if File.exist?(DEFAULT_FIG_FILE)
198
- return File.read(DEFAULT_FIG_FILE)
199
- end
200
- else
201
- return read_in_package_config_file(package_config_file)
202
- end
203
-
204
- return
205
- end
206
-
207
- def register_package_with_environment_if_not_listing()
208
- return if @options.listing
209
-
210
- register_package_with_environment()
211
-
212
- return
213
- end
214
-
215
- def register_package_with_environment()
216
- if @options.updating?
217
- @package.retrieves.each do |var, path|
218
- @environment.add_retrieve(var, path)
219
- end
220
- end
221
-
222
- @environment.register_package(@package)
223
- @environment.apply_config(
224
- @package,
225
- @options.config() || @descriptor && @descriptor.config() || 'default',
226
- nil
227
- )
228
- return
229
- end
230
-
231
- def parse_package_config_file(config_raw_text)
232
- if config_raw_text.nil?
233
- @package = Fig::Package.new(nil, nil, '.', [])
234
- return
235
- end
236
-
237
- @package =
238
- Fig::Parser.new(@configuration).parse_package(
239
- nil, nil, '.', config_raw_text
240
- )
241
-
242
- register_package_with_environment_if_not_listing()
243
-
244
- return
245
- end
246
-
247
- def load_package_file()
248
- config_raw_text = load_package_config_file_contents()
249
-
250
- parse_package_config_file(config_raw_text)
251
- end
252
-
253
- def get_package()
254
- if @descriptor.nil?
255
- load_package_file()
256
- else
257
- # TODO: complain if config file was specified on the command-line.
258
- @package =
259
- @repository.get_package(
260
- @descriptor.name, @descriptor.version, :disable_updating
261
- )
262
-
263
- register_package_with_environment_if_not_listing()
264
- end
265
-
266
- return
267
- end
268
-
269
208
  def publish()
270
209
  check_required_package_descriptor('to publish')
271
210
 
@@ -279,10 +218,12 @@ class Fig::Command
279
218
  @options.archives() +
280
219
  [
281
220
  Fig::Statement::Configuration.new(
282
- 'default', @options.non_command_package_statements()
221
+ nil,
222
+ Fig::Package::DEFAULT_CONFIG,
223
+ @options.non_command_package_statements()
283
224
  )
284
225
  ]
285
- publish_statements << Fig::Statement::Publish.new('default','default')
226
+ publish_statements << Fig::Statement::Publish.new()
286
227
  else
287
228
  load_package_file()
288
229
  if not @package.statements.empty?
@@ -294,10 +235,12 @@ class Fig::Command
294
235
  end
295
236
 
296
237
  if @options.publish?
297
- Fig::Logging.info "Checking status of #{@descriptor.name}/#{@descriptor.version}..."
238
+ Fig::Logging.info "Checking status of #{@descriptor.to_string()}..."
298
239
 
299
- if @repository.list_remote_packages.include?("#{@descriptor.name}/#{@descriptor.version}")
300
- Fig::Logging.info "#{@descriptor.name}/#{@descriptor.version} has already been published."
240
+ package_description =
241
+ Fig::PackageDescriptor.format(@descriptor.name, @descriptor.version, nil)
242
+ if @repository.list_remote_packages.include?("#{package_description}")
243
+ Fig::Logging.info "#{@descriptor.to_string()} has already been published."
301
244
 
302
245
  if not @options.force?
303
246
  Fig::Logging.fatal 'Use the --force option if you really want to overwrite, or use --publish-local for testing.'
@@ -308,12 +251,9 @@ class Fig::Command
308
251
  end
309
252
  end
310
253
 
311
- Fig::Logging.info "Publishing #{@descriptor.name}/#{@descriptor.version}."
254
+ Fig::Logging.info "Publishing #{@descriptor.to_string()}."
312
255
  @repository.publish_package(
313
- publish_statements,
314
- @descriptor.name,
315
- @descriptor.version,
316
- @options.publish_local?
256
+ publish_statements, @descriptor, @options.publish_local?
317
257
  )
318
258
 
319
259
  return 0