X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/0668bfe077a9e2101f8ef0fea60780f30273a826..df7ec1cf428ef45f255589a5ca662cfb25724510:/packaging/patch-update diff --git a/packaging/patch-update b/packaging/patch-update index 4892d668..30a29bce 100755 --- a/packaging/patch-update +++ b/packaging/patch-update @@ -1,4 +1,4 @@ -#!/usr/bin/perl -w +#!/usr/bin/perl # This script is used to turn one or more of the "patch/*" branches # into one or more diffs in the "patches" directory. Pass the option # --gen if you want generated files in the diffs. Pass the name of @@ -6,6 +6,7 @@ # diffs. use strict; +use warnings; use Getopt::Long; my $patches_dir = 'patches'; @@ -13,6 +14,7 @@ my $tmp_dir = "patches.$$"; &Getopt::Long::Configure('bundling'); &usage if !&GetOptions( + 'branch|b=s' => \( my $master_branch = 'master' ), 'skip-check' => \( my $skip_branch_check ), 'shell|s' => \( my $launch_shell ), 'gen:s' => \( my $incl_generated_files ), @@ -51,17 +53,15 @@ if ($incl_generated_files) { mkdir($tmp_dir, 0700) or die "Unable to mkdir($tmp_dir): $!\n"; system "./config.status Makefile && make gen && rsync -a @extra_files $tmp_dir/master/" and exit 1; } -my $last_touch = time; +our $last_touch = time; -my(%patches, %local_patch); +my %patches; # Start by finding all patches so that we can load all possible parents. -open(PIPE, '-|', 'git', 'branch', '-a') or die $!; +open(PIPE, '-|', 'git', 'branch', '-l') or die $!; while () { - if (m# origin/patch/(.*)#) { + if (m# patch/(.*)#) { $patches{$1} = 1; - } elsif (m# patch/(.*)#) { - $patches{$1} = $local_patch{$1} = 1; } } close PIPE; @@ -70,19 +70,23 @@ my @patches = sort keys %patches; my(%parent, %description); foreach my $patch (@patches) { - my $branch = ($local_patch{$patch} ? '' : 'origin/') . "patch/$patch"; + my $branch = "patch/$patch"; my $desc = ''; - open(PIPE, '-|', 'git', 'diff', '-U1000', "master...$branch", '--', "PATCH.$patch") or die $!; + open(PIPE, '-|', 'git', 'diff', '-U1000', "$master_branch...$branch", '--', "PATCH.$patch") or die $!; while () { last if /^@@ /; } while () { next unless s/^[ +]//; if (m#patch -p1 = time; system "git checkout $starting_branch" and exit 1; exit; @@ -123,17 +130,13 @@ sub update_patch } $parent = "patch/$parent"; } else { - $parent = 'master'; + $parent = $master_branch; } print "======== $patch ========\n"; - sleep 1 if $incl_generated_files && $last_touch == time; - if ($local_patch{$patch}) { - system "git checkout patch/$patch" and return 0; - } else { - system "git checkout --track -b patch/$patch origin/patch/$patch" and return 0; - } + sleep 1 while $incl_generated_files && $last_touch >= time; + system "git checkout patch/$patch" and return 0; my $ok = system("git merge $parent") == 0; if (!$ok || $launch_shell) { @@ -156,7 +159,7 @@ sub update_patch print OUT $description{$patch}, "\n"; if ($incl_generated_files) { - system "./config.status Makefile && make gen && rsync -a @extra_files $tmp_dir/$patch/"; + system "./config.status Makefile && make gen && rsync -a @extra_files $tmp_dir/$patch/" and exit 1; } $last_touch = time; @@ -174,8 +177,13 @@ sub update_patch close PIPE; if ($incl_generated_files) { - $parent =~ s#.*/##; - open(PIPE, '-|', 'diff', '-up', "$tmp_dir/$parent", "$tmp_dir/$patch") or die $!; + my $parent_dir; + if ($parent eq $master_branch) { + $parent_dir = 'master'; + } else { + ($parent_dir) = $parent =~ m{([^/]+)$}; + } + open(PIPE, '-|', 'diff', '-up', "$tmp_dir/$parent_dir", "$tmp_dir/$patch") or die $!; while () { s#^(diff -up) $tmp_dir/[^/]+/(.*?) $tmp_dir/[^/]+/(.*)#$1 a/$2 b/$3#o; s#^\Q---\E $tmp_dir/[^/]+/([^\t]+)\t.*#--- a/$1#o;