(#17458) Partial revert of "don't rebuild regexp every time"
In commit, 20efe94, a change was made to Puppet::Util.absolute_path? to
require the Puppet module only if necessary. This was done as an
optimization since re-requiring a file is much slower than checking if a
constant is defined.
However, defined?(Puppet) is always true when called within the
Puppet::Util.absolute_path? method, so effectively, absolute_path? would
never require the Puppet module, when previously it used to, in certain
exceptional flows.
In the normal flow, it wasn't an issue, because when puppet runs an
internal subcommand (Application), the app requires the Puppet module,
which loads features, which creates an autoloader, which calls the
absolute_path? method. At this point, requiring puppet is not needed.
However, if an external subcommand was specified, e.g. puppet foo,
where puppet-foo is an external executable, or if no subcommand was
specified, e.g. puppet, the CommandLine would attempt to resolve the
external subcommand using Puppet::Util.which, which calls absolute_path?
at a time when the Puppet module and features haven't been loaded,
causing #17458.
Ideally, the exceptional cases should be requiring puppet rather than
relying on the absolute_path? method to do so. However, in 3.x, this
entire logic has been reworked. In 3.x, the default confdir/vardir
locations are solely based on whether we're running as root or not, and
not the application's run_mode setting. As a result, we can and do
require puppet early on.
For 2.7.x, the safest thing is to revert the change in the require
'puppet' behavior.