summaryrefslogtreecommitdiff
path: root/system/stow/merge.diff
diff options
context:
space:
mode:
Diffstat (limited to 'system/stow/merge.diff')
-rw-r--r--system/stow/merge.diff73
1 files changed, 73 insertions, 0 deletions
diff --git a/system/stow/merge.diff b/system/stow/merge.diff
new file mode 100644
index 0000000000..1ee166872d
--- /dev/null
+++ b/system/stow/merge.diff
@@ -0,0 +1,73 @@
+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 ===========================================================