summaryrefslogtreecommitdiffstats
path: root/lib/puppet/util
diff options
context:
space:
mode:
authorMax Martin <max@puppetlabs.com>2011-06-02 15:46:17 -0700
committerMax Martin <max@puppetlabs.com>2011-06-02 15:46:17 -0700
commit4ad88017d3b8b8000325f5165520a6c21b48c469 (patch)
treecd126ce5723d8f2b390fda275f2e82e1dd8620d6 /lib/puppet/util
parent284113707fa07c6abcbb765dcd6d8c24e1b6b5fa (diff)
parentc295ae699ff78f3d7e4922d00dcf5d9e92c790b8 (diff)
downloadpuppet-4ad88017d3b8b8000325f5165520a6c21b48c469.tar.gz
puppet-4ad88017d3b8b8000325f5165520a6c21b48c469.tar.xz
puppet-4ad88017d3b8b8000325f5165520a6c21b48c469.zip
Merge branch '2.7rc' into 2.7.x
* 2.7rc: (24 commits) (#7746) Fix bootstrap issues from #7717 fix. (#7683) Use ronn, when available, to render the output. (#7683) Add a 'man' face and subcommand to Puppet. maint: remove obsolete work-around code from help face. (#7699) Don't duplicate inherited action names on faces. (#7177) Deprecate implicit 'puppet apply' for 2.7.0 (#7717) Layout cleanup for subcommand extraction. #7211: Test unknown options don't shadow unknown actions. #7211: nasty logic error with global Face options taking arguments. #7211: more helpful error messages in various cases. (#7708) Delete extended documentation from configuration reference (#7707) Document signals in puppet agent and puppet master help add puppet master polling step for ticket 7117 (#5318) Always notice changes to manifests when compiling. (#7557) Remove Faces Application maint: Fix order dependent spec failure for face indirection (#7690) Don't blow up when listing terminuses available for faces maint: Dedup the loadpath so we don't have to walk it multiple times Maint: Fix ellipses for short descriptions (#7563) DRY: Remove indirector boilerplate from individual faces ... Conflicts (resolved manually): acceptance/tests/ticket_7117_broke_env_criteria_authconf.rb lib/puppet/application/faces.rb lib/puppet/face/help/man.erb lib/puppet/indirector/face.rb spec/shared_behaviours/documentation_on_faces.rb
Diffstat (limited to 'lib/puppet/util')
-rw-r--r--lib/puppet/util/command_line.rb91
1 files changed, 86 insertions, 5 deletions
diff --git a/lib/puppet/util/command_line.rb b/lib/puppet/util/command_line.rb
index 8190f8ac1..244e2c2c9 100644
--- a/lib/puppet/util/command_line.rb
+++ b/lib/puppet/util/command_line.rb
@@ -59,6 +59,13 @@ module Puppet
require_application subcommand_name
app = Puppet::Application.find(subcommand_name).new(self)
Puppet::Plugins.on_application_initialization(:appliation_object => self)
+
+ # See the note in 'warn_later' down below. --daniel 2011-06-01
+ if $delayed_deprecation_warning_for_p_u_cl.is_a? String then
+ Puppet.deprecation_warning($delayed_deprecation_warning_for_p_u_cl)
+ $delayed_deprecation_warning_for_p_u_cl = true
+ end
+
app.run
elsif execute_external_subcommand then
# Logically, we shouldn't get here, but we do, so whatever. We just
@@ -93,16 +100,90 @@ module Puppet
if zero == 'puppet'
case argv.first
- when nil; [ stdin.tty? ? nil : "apply", argv] # ttys get usage info
- when "--help", "-h"; [nil, argv] # help should give you usage, not the help for `puppet apply`
- when /^-|\.pp$|\.rb$/; ["apply", argv]
- else [ argv.first, argv[1..-1] ]
+ when nil then
+ if stdin.tty? then
+ [nil, argv] # ttys get usage info
+ else
+ # Killed for 2.7.0 --daniel 2011-06-01
+ warn_later <<EOM
+Implicit invocation of 'puppet apply' by redirection into 'puppet' is deprecated,
+and will be removed in the 2.8 series. Please invoke 'puppet apply' directly
+in the future.
+EOM
+ ["apply", argv]
+ end
+ when "--help", "-h" then
+ # help should give you usage, not the help for `puppet apply`
+ [nil, argv]
+ when /^-|\.pp$|\.rb$/ then
+ # Killed for 2.7.0 --daniel 2011-06-01
+ warn_later <<EOM
+Implicit invocation of 'puppet apply' by passing files (or flags) directly
+to 'puppet' is deprecated, and will be removed in the 2.8 series. Please
+invoke 'puppet apply' directly in the future.
+EOM
+ ["apply", argv]
+ else
+ [argv.first, argv[1..-1]]
end
else
- [ zero, argv ]
+ [zero, argv]
end
end
+ # So, this is more than a little bit of a horror. You see, the process
+ # of bootstrapping Puppet is ... complex. This file, like many of our
+ # early initialization files, has an incestuous relationship between the
+ # order of files loaded, code executed at load time, and code executed
+ # in other files at runtime.
+ #
+ # When we construct this object we have not yet actually loaded the
+ # global puppet object, so we can't use any methods in it. That
+ # includes all the logging stuff, which is used by the deprecation
+ # warning subsystem.
+ #
+ # On the other hand, we can't just load the logging system, because that
+ # depends on the top level Puppet module being bootstrapped. It doesn't
+ # actually load the stuff it uses, though, for hysterical raisins.
+ #
+ # Finally, we can't actually just load the top level Puppet module.
+ # This one is precious: it turns out that some of the code loaded in the
+ # top level Puppet module has a dependency on the run mode values.
+ #
+ # Run mode is set correctly *only* when the application is loaded, and
+ # if it is wrong when the top level code is brought in we end up with
+ # the wrong settings scattered through some of the defaults.
+ #
+ # Which means that we have a dependency cycle that runs:
+ # 1. The binary creates an instance of P::U::CL.
+ # 2. That identifies the application to load.
+ # 3. It does, then instantiates the application.
+ # 4. That sets the run-mode.
+ # 5. That then loads the top level Puppet module.
+ # 6. Finally, we get to where we can use the top level stuff
+ #
+ # So, essentially, we see a dependency between runtime code in this
+ # file, run-time code in the application, and load-time code in the top
+ # level module.
+ #
+ # Which leads me to our current horrible hack: we stash away the message
+ # we wanted to log about deprecation, then send it to our logging system
+ # once we have done enough bootstrapping that it will, y'know, actually
+ # work.
+ #
+ # I would have liked to fix this, but that is going to be a whole pile
+ # of work digging through and decrufting all the global state from the
+ # local state, and working out what depends on what else in the product.
+ #
+ # Oh, and we use a global because we have *two* instances of a P::U::CL
+ # object during the startup sequence. I don't know why.
+ #
+ # Maybe, one day, when I am not behind a deadline to ship code.
+ # --daniel 2011-06-01
+ def warn_later(text)
+ return if $delayed_deprecation_warning_for_p_u_cl
+ $delayed_deprecation_warning_for_p_u_cl = text
+ end
end
end
end