fig 0.1.65 → 0.1.67

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. data/Changes +29 -0
  2. data/bin/fig +1 -1
  3. data/bin/fig-debug +1 -1
  4. data/lib/fig.rb +3 -0
  5. data/lib/fig/{applicationconfiguration.rb → application_configuration.rb} +0 -0
  6. data/lib/fig/{atexit.rb → at_exit.rb} +0 -0
  7. data/lib/fig/command.rb +190 -200
  8. data/lib/fig/command/action.rb +83 -0
  9. data/lib/fig/command/action/clean.rb +33 -0
  10. data/lib/fig/command/action/get.rb +48 -0
  11. data/lib/fig/command/action/help.rb +29 -0
  12. data/lib/fig/command/action/list_configs.rb +39 -0
  13. data/lib/fig/command/action/list_dependencies.rb +19 -0
  14. data/lib/fig/command/action/list_dependencies/all_configs.rb +44 -0
  15. data/lib/fig/command/action/list_dependencies/default.rb +40 -0
  16. data/lib/fig/command/action/list_dependencies/tree.rb +40 -0
  17. data/lib/fig/command/action/list_dependencies/tree_all_configs.rb +40 -0
  18. data/lib/fig/command/action/list_local.rb +29 -0
  19. data/lib/fig/command/action/list_remote.rb +33 -0
  20. data/lib/fig/command/action/list_variables.rb +23 -0
  21. data/lib/fig/command/action/list_variables/all_configs.rb +61 -0
  22. data/lib/fig/command/action/list_variables/default.rb +48 -0
  23. data/lib/fig/command/action/list_variables/tree.rb +20 -0
  24. data/lib/fig/command/action/list_variables/tree_all_configs.rb +20 -0
  25. data/lib/fig/command/action/publish.rb +52 -0
  26. data/lib/fig/command/action/publish_local.rb +29 -0
  27. data/lib/fig/command/action/role/has_no_sub_action.rb +10 -0
  28. data/lib/fig/command/action/role/has_sub_action.rb +58 -0
  29. data/lib/fig/command/action/role/list_all_configs.rb +14 -0
  30. data/lib/fig/command/action/role/list_base_config.rb +14 -0
  31. data/lib/fig/command/action/role/list_dependencies_flat.rb +22 -0
  32. data/lib/fig/command/action/role/list_dependencies_in_a_tree.rb +21 -0
  33. data/lib/fig/command/action/role/list_variables_in_a_tree.rb +150 -0
  34. data/lib/fig/command/action/role/list_walking_dependency_tree.rb +90 -0
  35. data/lib/fig/command/action/role/publish.rb +90 -0
  36. data/lib/fig/command/action/role/update.rb +46 -0
  37. data/lib/fig/command/action/run_command_line.rb +45 -0
  38. data/lib/fig/command/action/run_command_statement.rb +52 -0
  39. data/lib/fig/command/action/update.rb +17 -0
  40. data/lib/fig/command/action/update_if_missing.rb +17 -0
  41. data/lib/fig/command/action/version.rb +27 -0
  42. data/lib/fig/command/{coveragesupport.rb → coverage_support.rb} +0 -0
  43. data/lib/fig/command/{optionerror.rb → option_error.rb} +1 -1
  44. data/lib/fig/command/options.rb +185 -127
  45. data/lib/fig/command/package_applier.rb +140 -0
  46. data/lib/fig/command/package_loader.rb +124 -0
  47. data/lib/fig/{configfileerror.rb → config_file_error.rb} +1 -1
  48. data/lib/fig/{environmentvariables.rb → environment_variables.rb} +0 -0
  49. data/lib/fig/{environmentvariables/caseinsensitive.rb → environment_variables/case_insensitive.rb} +1 -1
  50. data/lib/fig/{environmentvariables/casesensitive.rb → environment_variables/case_sensitive.rb} +1 -1
  51. data/lib/fig/figrc.rb +3 -3
  52. data/lib/fig/grammar.treetop +1 -1
  53. data/lib/fig/{backtrace.rb → include_backtrace.rb} +7 -2
  54. data/lib/fig/log4r/outputter.rb +1 -1
  55. data/lib/fig/{log4rconfigerror.rb → log4r_config_error.rb} +1 -1
  56. data/lib/fig/logging.rb +2 -2
  57. data/lib/fig/{networkerror.rb → network_error.rb} +1 -1
  58. data/lib/fig/{nosuchpackageconfigerror.rb → no_such_package_config_error.rb} +2 -2
  59. data/lib/fig/{notfounderror.rb → not_found_error.rb} +0 -0
  60. data/lib/fig/{operatingsystem.rb → operating_system.rb} +5 -5
  61. data/lib/fig/package.rb +3 -3
  62. data/lib/fig/{packagecache.rb → package_cache.rb} +0 -0
  63. data/lib/fig/{packagedescriptor.rb → package_descriptor.rb} +1 -1
  64. data/lib/fig/{packagedescriptorparseerror.rb → package_descriptor_parse_error.rb} +1 -1
  65. data/lib/fig/{packageparseerror.rb → package_parse_error.rb} +1 -1
  66. data/lib/fig/parser.rb +4 -4
  67. data/lib/fig/{parserpackagebuildstate.rb → parser_package_build_state.rb} +1 -1
  68. data/lib/fig/repository.rb +17 -17
  69. data/lib/fig/{repositoryerror.rb → repository_error.rb} +1 -1
  70. data/lib/fig/{environment.rb → runtime_environment.rb} +15 -8
  71. data/lib/fig/statement/include.rb +1 -1
  72. data/lib/fig/statement/override.rb +1 -1
  73. data/lib/fig/{urlaccesserror.rb → url_access_error.rb} +1 -1
  74. data/lib/fig/{userinputerror.rb → user_input_error.rb} +0 -0
  75. data/lib/fig/{workingdirectorymaintainer.rb → working_directory_maintainer.rb} +4 -4
  76. data/lib/fig/{workingdirectorymetadata.rb → working_directory_metadata.rb} +0 -0
  77. metadata +88 -54
  78. data/VERSION +0 -1
  79. data/lib/fig/command/listing.rb +0 -363
  80. data/lib/fig/command/packageload.rb +0 -236
data/Changes CHANGED
@@ -1,3 +1,32 @@
1
+ v0.1.67
2
+
3
+ Backwards incompatibilities:
4
+
5
+ - The --update and --update-if-missing options are always paid attention to.
6
+ (Hey, you said update; Fig endeavors to comply.) This causes problems where
7
+ these were previously ignored.
8
+
9
+ - If you specify --clean, you'll get an error about the options not
10
+ agreeing about whether the base package should be loaded.
11
+
12
+ - Publishing may fail if you have versionless includes. Workaround: don't
13
+ use versionless includes or do the update and the publish separately.
14
+
15
+ Bug fixes:
16
+
17
+ - Updating and using any of the --list-* options would delete any previously
18
+ retrieved files.
19
+
20
+ - More fixes in dealing with symlinks.
21
+
22
+ - Better error reporting for failed installations and package version
23
+ conflicts.
24
+
25
+ v0.1.66.beta.2
26
+ v0.1.66.beta.1
27
+
28
+ - Test releases
29
+
1
30
  v0.1.65
2
31
 
3
32
  Bug fixes:
data/bin/fig CHANGED
@@ -3,7 +3,7 @@
3
3
  if ENV['FIG_COVERAGE']
4
4
  require File.expand_path(
5
5
  File.join(
6
- File.dirname(__FILE__), %w< .. lib fig command coveragesupport.rb >
6
+ File.dirname(__FILE__), %w< .. lib fig command coverage_support.rb >
7
7
  )
8
8
  )
9
9
  end
@@ -3,7 +3,7 @@
3
3
  if ENV['FIG_COVERAGE']
4
4
  require File.expand_path(
5
5
  File.join(
6
- File.dirname(__FILE__), %w< .. lib fig command coveragesupport.rb >
6
+ File.dirname(__FILE__), %w< .. lib fig command coverage_support.rb >
7
7
  )
8
8
  )
9
9
  end
@@ -0,0 +1,3 @@
1
+ module Fig
2
+ VERSION = '0.1.67'
3
+ end
File without changes
@@ -2,131 +2,86 @@ require 'rubygems'
2
2
  require 'net/ftp'
3
3
  require 'set'
4
4
 
5
- require 'fig/atexit'
5
+ require 'fig/at_exit'
6
+ require 'fig/command/action'
6
7
  require 'fig/command/options'
7
- require 'fig/environment'
8
+ require 'fig/command/package_applier'
9
+ require 'fig/command/package_loader'
8
10
  require 'fig/figrc'
9
11
  require 'fig/logging'
10
- require 'fig/operatingsystem'
12
+ require 'fig/operating_system'
11
13
  require 'fig/package'
12
14
  require 'fig/parser'
13
15
  require 'fig/repository'
14
- require 'fig/repositoryerror'
16
+ require 'fig/repository_error'
17
+ require 'fig/runtime_environment'
15
18
  require 'fig/statement/configuration'
16
- require 'fig/userinputerror'
17
- require 'fig/workingdirectorymaintainer'
18
-
19
- # The following are a break out of parts of this class simply to keep the file
20
- # size down.
21
-
22
- # You will need to look in this file for any stuff related to --list-* options.
23
- require 'fig/command/listing'
24
-
25
- # You will need to look in this file for any stuff related to loading the
26
- # base Package object.
27
- require 'fig/command/packageload'
19
+ require 'fig/user_input_error'
20
+ require 'fig/working_directory_maintainer'
28
21
 
29
22
  module Fig; end
30
23
 
31
24
  # Main program
32
25
  class Fig::Command
33
- include Fig::Command::Listing
34
- include Fig::Command::PackageLoad
35
-
36
- def self.get_version()
37
- line = nil
38
-
39
- begin
40
- File.open(
41
- "#{File.expand_path(File.dirname(__FILE__) + '/../../VERSION')}"
42
- ) do |file|
43
- line = file.gets
44
- end
45
- rescue
46
- $stderr.puts 'Could not retrieve version number. Something has mucked with your Fig install.'
47
-
48
- return nil
49
- end
50
-
51
- # Note that we accept anything that contains three decimal numbers
52
- # seperated by periods. This allows for versions like
53
- # "4.3.2-super-special-version-in-3D".
54
- if line !~ %r< \b \d+ [.] \d+ [.] \d+ \b >x
55
- $stderr.puts %Q<"#{line}" does not look like a version number. Something has mucked with your Fig install.>
56
-
57
- return nil
58
- end
59
-
60
- return line
61
- end
62
-
63
26
  def run_fig(argv)
64
27
  begin
65
28
  @options = Fig::Command::Options.new(argv)
66
29
  rescue Fig::UserInputError => error
67
30
  $stderr.puts error.to_s # Logging isn't set up yet.
68
- return 1
31
+ return Fig::Command::Action::EXIT_FAILURE
69
32
  end
70
33
 
71
34
  if not @options.exit_code.nil?
72
35
  return @options.exit_code
73
36
  end
74
- @descriptor = @options.descriptor
75
37
 
76
- if @options.help?
77
- return @options.help
38
+ actions = @options.actions()
39
+ if actions.empty?
40
+ $stderr.puts "Nothing to do.\n\n"
41
+ $stderr.puts %q<Run "fig --help" for a full list of commands.>
42
+ return Fig::Command::Action::EXIT_FAILURE
78
43
  end
79
44
 
80
- if @options.version?
81
- return emit_version()
45
+ actions.each do
46
+ |action|
47
+
48
+ if action.execute_immediately_after_command_line_parse?
49
+ # Note that the action doesn't get an execution context.
50
+ return action.execute()
51
+ end
82
52
  end
83
53
 
84
- configure()
54
+ Fig::Logging.initialize_pre_configuration(@options.log_level())
85
55
 
86
- if @options.clean?
87
- check_required_package_descriptor('to clean')
56
+ @descriptor = @options.descriptor
57
+ check_descriptor_requirement()
58
+ if actions.any? {|action| not action.allow_both_descriptor_and_file? }
88
59
  ensure_descriptor_and_file_were_not_both_specified()
89
- @repository.clean(@descriptor)
90
- return 0
91
- end
92
-
93
- if handle_pre_parse_list_options()
94
- return 0
95
60
  end
96
61
 
97
- if @options.publishing?
98
- return publish()
99
- end
62
+ configure()
63
+ set_up_base_package()
64
+
65
+ context = ExecutionContext.new(
66
+ @base_package,
67
+ base_config(),
68
+ @environment,
69
+ @repository,
70
+ @operating_system
71
+ )
100
72
 
101
- ensure_descriptor_and_file_were_not_both_specified()
73
+ actions.each do
74
+ |action|
102
75
 
103
- load_package_object()
76
+ action.execution_context = context
104
77
 
105
- if @options.listing()
106
- handle_post_parse_list_options()
107
- elsif @options.get()
108
- # Ruby v1.8 emits "nil" for nil, whereas ruby v1.9 emits the empty
109
- # string, so, for consistency, we need to ensure that we always emit the
110
- # empty string.
111
- puts @environment[@options.get()] || ''
112
- elsif @options.shell_command
113
- @environment.execute_shell(@options.shell_command) do
114
- |command| @operating_system.shell_exec command
78
+ exit_code = action.execute
79
+ if exit_code != Fig::Command::Action::EXIT_SUCCESS
80
+ return exit_code
115
81
  end
116
- elsif @descriptor
117
- @environment.include_config(@base_package, @descriptor, nil)
118
- @environment.execute_config(
119
- @base_package,
120
- @descriptor,
121
- @options.command_extra_argv || []
122
- ) { |cmd| @operating_system.shell_exec cmd }
123
- elsif not @repository.updating?
124
- $stderr.puts "Nothing to do.\n\n"
125
- $stderr.puts %q<Run "fig --help" for a full list of commands.>
126
- return 1
127
82
  end
128
83
 
129
- return 0
84
+ return Fig::Command::Action::EXIT_SUCCESS
130
85
  end
131
86
 
132
87
  def run_with_exception_handling(argv)
@@ -136,31 +91,20 @@ class Fig::Command
136
91
  rescue Fig::URLAccessError => error
137
92
  urls = error.urls.join(', ')
138
93
  $stderr.puts "Access to #{urls} in #{error.package}/#{error.version} not allowed."
139
- return 1
94
+ return Fig::Command::Action::EXIT_FAILURE
140
95
  rescue Fig::UserInputError => error
141
96
  log_error_message(error)
142
- return 1
143
- rescue OptionParser::InvalidOption => error
144
- $stderr.puts error.to_s
145
- $stderr.puts Fig::Command::Options::USAGE
146
- return 1
147
- rescue Fig::RepositoryError => error
148
- log_error_message(error)
149
- return 1
97
+ return Fig::Command::Action::EXIT_FAILURE
150
98
  end
151
99
  end
152
100
 
153
- def emit_version()
154
- version = Fig::Command.get_version()
155
- return 1 if version.nil?
156
-
157
- puts File.basename($0) + ' v' + version
158
-
159
- return 0
160
- end
161
-
162
101
  private
163
102
 
103
+ ExecutionContext =
104
+ Struct.new(
105
+ :base_package, :base_config, :environment, :repository, :operating_system
106
+ )
107
+
164
108
  def derive_remote_url()
165
109
  if remote_operation_necessary?()
166
110
  if ENV['FIG_REMOTE_URL'].nil?
@@ -182,9 +126,20 @@ class Fig::Command
182
126
  end
183
127
 
184
128
  def configure()
185
- Fig::Logging.initialize_pre_configuration(@options.log_level())
129
+ set_up_application_configuration()
130
+
131
+ Fig::Logging.initialize_post_configuration(
132
+ @options.log_config() || @configuration['log configuration'],
133
+ @options.log_level()
134
+ )
186
135
 
136
+ @operating_system = Fig::OperatingSystem.new(@options.login?)
137
+
138
+ prepare_repository()
139
+ prepare_environment()
140
+ end
187
141
 
142
+ def set_up_application_configuration()
188
143
  @configuration = Fig::FigRC.find(
189
144
  @options.figrc(),
190
145
  derive_remote_url(),
@@ -193,39 +148,44 @@ class Fig::Command
193
148
  @options.no_figrc?
194
149
  )
195
150
 
196
- Fig::Logging.initialize_post_configuration(
197
- @options.log_config() || @configuration['log configuration'],
198
- @options.log_level()
199
- )
151
+ return
152
+ end
200
153
 
201
- @operating_system = Fig::OperatingSystem.new(@options.login?)
154
+ def prepare_repository()
202
155
  @repository = Fig::Repository.new(
203
156
  @operating_system,
204
157
  @options.home(),
205
158
  @configuration,
206
159
  nil, # remote_user
207
- @options.update?,
208
- @options.update_if_missing?,
209
160
  check_include_statements_versions?
210
161
  )
211
162
 
212
- @working_directory_maintainer = Fig::WorkingDirectoryMaintainer.new('.')
213
-
214
- Fig::AtExit.add do
215
- @working_directory_maintainer.prepare_for_shutdown(@options.updating?)
163
+ case @options.update_packages
164
+ when :unconditionally
165
+ @repository.update_unconditionally
166
+ when :if_missing
167
+ @repository.update_if_missing
216
168
  end
217
169
 
218
- prepare_environment()
170
+ return
219
171
  end
220
172
 
221
173
  def prepare_environment()
174
+ working_directory_maintainer = Fig::WorkingDirectoryMaintainer.new('.')
175
+
176
+ Fig::AtExit.add do
177
+ working_directory_maintainer.prepare_for_shutdown(
178
+ @base_package && retrieves_should_happen?
179
+ )
180
+ end
181
+
222
182
  environment_variables = nil
223
- if @options.reset_environment?
183
+ if reset_environment?
224
184
  environment_variables = Fig::OperatingSystem.get_environment_variables({})
225
185
  end
226
186
 
227
- @environment = Fig::Environment.new(
228
- @repository, environment_variables, @working_directory_maintainer
187
+ @environment = Fig::RuntimeEnvironment.new(
188
+ @repository, environment_variables, working_directory_maintainer
229
189
  )
230
190
 
231
191
  Fig::AtExit.add { @environment.check_unused_retrieves() }
@@ -233,9 +193,36 @@ class Fig::Command
233
193
  return
234
194
  end
235
195
 
236
- def config_was_specified_by_user()
237
- return ! @options.config().nil? ||
238
- @descriptor && ! @descriptor.config().nil?
196
+ def set_up_base_package()
197
+ return if ! load_base_package?
198
+
199
+ # We get these before loading the package so that we detect conflicts
200
+ # between actions.
201
+ retrieves_should_happen = retrieves_should_happen?
202
+ register_base_package = register_base_package?
203
+ apply_config = apply_config?
204
+ apply_base_config = apply_config ? apply_base_config? : nil
205
+
206
+ package_loader = new_package_loader()
207
+ if @options.actions.all? {|action| action.base_package_can_come_from_descriptor?}
208
+ @base_package = package_loader.load_package_object()
209
+ else
210
+ @base_package = package_loader.load_package_object_from_file()
211
+ end
212
+
213
+ applier = new_package_applier(package_loader.package_source_description())
214
+
215
+ if retrieves_should_happen
216
+ applier.activate_retrieves()
217
+ end
218
+ if register_base_package
219
+ applier.register_package_with_environment()
220
+ end
221
+ if apply_config
222
+ applier.apply_config_to_environment(! apply_base_config)
223
+ end
224
+
225
+ return
239
226
  end
240
227
 
241
228
  def base_config()
@@ -244,12 +231,30 @@ class Fig::Command
244
231
  Fig::Package::DEFAULT_CONFIG
245
232
  end
246
233
 
234
+ def new_package_loader()
235
+ return Fig::Command::PackageLoader.new(
236
+ @configuration,
237
+ @descriptor,
238
+ @options.package_definition_file,
239
+ base_config(),
240
+ @repository
241
+ )
242
+ end
243
+
244
+ def new_package_applier(package_source_description)
245
+ return Fig::Command::PackageApplier.new(
246
+ @base_package,
247
+ @environment,
248
+ @options,
249
+ @descriptor,
250
+ base_config(),
251
+ package_source_description
252
+ )
253
+ end
254
+
247
255
  # If the user has specified a descriptor, than any package.fig or --file
248
256
  # option is ignored. Thus, in order to avoid confusing the user, we make
249
257
  # specifying both an error.
250
- #
251
- # The one exception to this rule is when we are publishing, which should
252
- # already have been invoked by the time this is called.
253
258
  def ensure_descriptor_and_file_were_not_both_specified()
254
259
  file = @options.package_definition_file()
255
260
 
@@ -267,96 +272,81 @@ class Fig::Command
267
272
  return
268
273
  end
269
274
 
270
- def check_required_package_descriptor(operation_description)
271
- if not @descriptor
272
- raise Fig::UserInputError.new(
273
- "Need to specify a package #{operation_description}."
274
- )
275
+ def check_descriptor_requirement()
276
+ @options.actions.each do
277
+ |action|
278
+
279
+ case action.descriptor_requirement()
280
+ when :required
281
+ if not @descriptor
282
+ raise Fig::UserInputError.new(
283
+ "Need to specify a descriptor for #{action.primary_option()}."
284
+ )
285
+ end
286
+ when :warn
287
+ if @descriptor
288
+ Fig::Logging.warn(
289
+ %Q<Ignored descriptor "#{@descriptor.to_string}".>
290
+ )
291
+ end
292
+ end
275
293
  end
276
294
 
277
295
  return
278
296
  end
279
297
 
280
- def check_disallowed_package_descriptor(operation_description)
281
- if @descriptor
282
- raise Fig::UserInputError.new(
283
- "Cannot specify a package for #{operation_description}."
284
- )
285
- end
298
+ def remote_operation_necessary?()
299
+ return @options.actions.any? {|action| action.remote_operation_necessary?}
286
300
  end
287
301
 
288
- def remote_operation_necessary?()
289
- return @options.updating? ||
290
- @options.publish? ||
291
- @options.listing == :remote_packages
302
+ def load_base_package?()
303
+ return should_perform?(
304
+ @options.actions, %Q<the base package should be loaded>
305
+ ) {|action| action.load_base_package?}
292
306
  end
293
307
 
294
- def publish()
295
- check_required_package_descriptor('to publish')
308
+ def retrieves_should_happen?()
309
+ return @options.actions.any? {|action| action.retrieves_should_happen?}
310
+ end
296
311
 
297
- if @descriptor.name.nil? || @descriptor.version.nil?
298
- raise Fig::UserInputError.new(
299
- 'Please specify a package name and a version name.'
300
- )
301
- end
302
- if @descriptor.name == '_meta'
303
- raise Fig::UserInputError.new(
304
- %q<Due to implementation issues, cannot create a package named "_meta".>
305
- )
306
- end
312
+ def register_base_package?()
313
+ return should_perform?(
314
+ @options.actions, %Q<the base package should be in the starting set of packages>
315
+ ) {|action| action.register_base_package?}
316
+ end
307
317
 
308
- publish_statements = nil
309
- if not @options.environment_statements().empty?
310
- publish_statements =
311
- @options.resources() +
312
- @options.archives() +
313
- [
314
- Fig::Statement::Configuration.new(
315
- nil,
316
- nil,
317
- Fig::Package::DEFAULT_CONFIG,
318
- @options.environment_statements()
319
- )
320
- ]
321
- elsif not @options.resources().empty? or not @options.archives().empty?
322
- raise Fig::UserInputError.new(
323
- '--resource/--archive options were specified, but no --set/--append option was given. Will not publish.'
324
- )
325
- else
326
- load_package_object_from_file()
327
- if not @base_package.statements.empty?
328
- publish_statements = @base_package.statements
329
- else
330
- $stderr.puts 'Nothing to publish.'
331
- return 1
332
- end
333
- end
318
+ def apply_config?()
319
+ return should_perform?(
320
+ @options.actions, %Q<any config should be applied>
321
+ ) {|action| action.apply_config?}
322
+ end
334
323
 
335
- apply_base_config_to_environment(:ignore_base_package)
324
+ def apply_base_config?()
325
+ actions_wanting_application =
326
+ @options.actions.select {|action| action.apply_config?}
336
327
 
337
- if @options.publish?
338
- Fig::Logging.info "Checking status of #{@descriptor.to_string()}..."
328
+ return should_perform?(
329
+ actions_wanting_application, %Q<the base config should be applied>
330
+ ) {|action| action.apply_base_config?}
331
+ end
339
332
 
340
- package_description =
341
- Fig::PackageDescriptor.format(@descriptor.name, @descriptor.version, nil)
342
- if @repository.list_remote_packages.include?("#{package_description}")
343
- Fig::Logging.info "#{@descriptor.to_string()} has already been published."
333
+ def should_perform?(actions, failure_description, &predicate)
334
+ yes_actions, no_actions = actions.partition &predicate
335
+ # Filter out the "don't care" actions".
336
+ no_actions = no_actions.select { |action| ! predicate.call(action).nil? }
344
337
 
345
- if not @options.force?
346
- Fig::Logging.fatal 'Use the --force option if you really want to overwrite, or use --publish-local for testing.'
347
- return 1
348
- else
349
- Fig::Logging.info 'Overwriting...'
350
- end
351
- end
352
- end
338
+ return false if yes_actions.empty?
339
+ return true if no_actions.empty?
353
340
 
354
- Fig::Logging.info "Publishing #{@descriptor.to_string()}."
355
- @repository.publish_package(
356
- publish_statements, @descriptor, @options.publish_local?
341
+ action_strings = actions.map {|action| action.options.join}
342
+ action_string = action_strings.join %q<", ">
343
+ raise Fig::UserInputError.new(
344
+ %Q<Cannot use "#{action_string}" together because they disagree on whether #{failure_description}.>
357
345
  )
346
+ end
358
347
 
359
- return 0
348
+ def reset_environment?()
349
+ return @options.actions.any? {|action| action.reset_environment?}
360
350
  end
361
351
 
362
352
  def log_error_message(error)