stow 2.3.0 external dependencies

Adam Sampson <[email protected]> Sat, 29 Jun 2019 12:47:03 +0100
Newsgroups gmane.comp.gnu.stow.bugs
Message-ID <[email protected]>
--lMM8JwqTlfDpEaS6
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Hi bug-stow,

stow 2.3.0 added external runtime dependencies on Hash::Merge and
Clone::Choose. Historically stow hasn't had runtime dependencies other
than Perl itself, which is a useful property if you're managing the
installation of Perl using stow; the bootstrapping instructions in
stow's manual would need updating to describe how to install these two
modules (and any dependencies they have now or in the future) as well.

However, Hash::Merge is much more general than stow actually needs.
I've attached a patch which replaces the merge() call with a few lines
of equivalent code -- this avoids the external dependencies, and I think
it's clearer than the merge() call.

Thanks very much,

-- 
Adam Sampson <[email protected]>                         <http://offog.org/>

--lMM8JwqTlfDpEaS6
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="merge.diff"

Avoid using Hash::Merge.

stow 2.3.0 added external dependencies on Hash::Merge and Clone::Choose, which
makes bootstrapping awkward. It's not actually using most of Hash::Merge's
features, so replace it with a specialised merge routine.

diff -x config.guess -x config.log -x config.status -x config.sub -ru tmp/stow-2.3.0/Build.PL work/stow-2.3.0/Build.PL
--- tmp/stow-2.3.0/Build.PL	2019-06-28 23:51:12.000000000 +0100
+++ work/stow-2.3.0/Build.PL	2019-06-29 12:05:59.195616482 +0100
@@ -60,8 +60,6 @@
         'perl'        => '5.006',
         'Carp'        => 0,
         'IO::File'    => 0,
-        'Hash::Merge' => 0,
-        'Clone'       => 0,
     },
     script_files => [ 'bin/stow', 'bin/chkstow' ],
     all_from => 'lib/Stow.pm.in',
diff -x config.guess -x config.log -x config.status -x config.sub -ru tmp/stow-2.3.0/bin/stow.in work/stow-2.3.0/bin/stow.in
--- tmp/stow-2.3.0/bin/stow.in	2019-06-28 23:33:58.000000000 +0100
+++ work/stow-2.3.0/bin/stow.in	2019-06-29 12:25:50.098558041 +0100
@@ -457,16 +457,12 @@
 
 use POSIX qw(getcwd);
 use Getopt::Long qw(GetOptionsFromArray);
+use Scalar::Util qw(reftype);
 
 @USE_LIB_PMDIR@
 use Stow;
 use Stow::Util qw(parent error);
 
-# Need to avoid Storable backend, since it can't deal with regexps:
-# https://rt.perl.org/Public/Bug/Display.html?id=50608
-use Clone::Choose qw(:Clone);
-use Hash::Merge qw(merge);
-
 my $ProgramName = $0;
 $ProgramName =~ s{.*/}{};
 
@@ -530,17 +526,27 @@
 
     # Merge .stowrc and command line options.
     # Preference is given to cli options.
-    # rc options come first in merged arrays.
-    # cli options overwrite conflicting rc options.
-    Hash::Merge::set_behavior('RIGHT_PRECEDENT');
-    my $options = merge($rc_options, $cli_options);
+    my %options = %$rc_options;
+    foreach my $option (keys %$cli_options) {
+        my $rc_value = $rc_options->{$option};
+        my $cli_value = $cli_options->{$option};
+        my $type = reftype($cli_value);
+
+        if (defined $type && $type eq 'ARRAY' && defined $rc_value) {
+            # rc options come first in merged arrays.
+            $options{$option} = [@{$rc_value}, @{$cli_value}];
+        } else {
+            # cli options overwrite conflicting rc options.
+            $options{$option} = $cli_value;
+        }
+    }
 
     # Run checks on the merged options.
-    sanitize_path_options($options);
+    sanitize_path_options(\%options);
     check_packages($pkgs_to_unstow, $pkgs_to_stow);
 
     # Return merged and processed options.
-    return ($options, $pkgs_to_unstow, $pkgs_to_stow);
+    return (\%options, $pkgs_to_unstow, $pkgs_to_stow);
 }
 
 #===== SUBROUTINE ===========================================================

--lMM8JwqTlfDpEaS6--