X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/aa6865d7617f5239624f1b0604be379709dbde92..a5e0bf35795dde0e5f9b509ba09d9e28dbfb530b:/support/patch-update diff --git a/support/patch-update b/support/patch-update index 15959613..f6eb47fe 100755 --- a/support/patch-update +++ b/support/patch-update @@ -6,10 +6,35 @@ # diffs. use strict; +use Getopt::Long; + +my $patches_dir = 'patches'; +my $tmp_dir = "patches.$$"; + +&Getopt::Long::Configure('bundling'); +&usage if !&GetOptions( + 'skip-check' => \( my $skip_branch_check ), + 'gen:s' => \( my $incl_generated_files ), + 'help|h' => \( my $help_opt ), +); +&usage if $help_opt; + +if (defined $incl_generated_files) { + $patches_dir = $incl_generated_files if $incl_generated_files ne ''; + $incl_generated_files = 1; +} -die "No 'patches' directory present in the current dir.\n" unless -d 'patches'; +die "No '$patches_dir' directory was found.\n" unless -d $patches_dir; die "No '.git' directory present in the current dir.\n" unless -d '.git'; +open(IN, '-|', 'git status') or die $!; +my $status = join('', ); +close IN; +unless ($skip_branch_check) { + die "The checkout is not clean:\n", $status unless $status =~ /\nnothing to commit \(working directory clean\)/; +} +my($starting_branch) = $status =~ /^# On branch (.+)\n/; + my @extra_files; open(IN, '<', 'Makefile.in') or die "Couldn't open Makefile.in: $!\n"; while () { @@ -23,47 +48,38 @@ while () { } close IN; -my $incl_generated_files = shift if @ARGV && $ARGV[0] eq '--gen'; - -system "git-checkout master" and exit 1; if ($incl_generated_files) { - die "'a' must not exist in the current directory.\n" if -e 'a'; - die "'b' must not exist in the current directory.\n" if -e 'b'; - system "make gen && rsync -a @extra_files a/" and exit 1; + die "'$tmp_dir' must not exist in the current directory.\n" if -e $tmp_dir; + 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; -my(@patches, %local_patch); -if (@ARGV) { - foreach (@ARGV) { - s{^(patches|patch|origin/patch)/} {}; - s{\.diff$} {}; - push(@patches, $_); - } - open(PIPE, '-|', 'git-branch', '-l') or die $!; -} else { - open(PIPE, '-|', 'git-branch', '-a') or die $!; -} +my(%patches, %local_patch); + +# Start by finding all patches so that we can load all possible parents. +open(PIPE, '-|', 'git', 'branch', '-a') or die $!; while () { if (m# origin/patch/(.*)#) { - push(@patches, $1); + $patches{$1} = 1; } elsif (m# patch/(.*)#) { - $local_patch{$1} = 1; + $patches{$1} = $local_patch{$1} = 1; } } close PIPE; +my @patches = sort keys %patches; + my(%parent, %description); foreach my $patch (@patches) { my $branch = ($local_patch{$patch} ? '' : 'origin/') . "patch/$patch"; - open(PIPE, '-|', 'git-diff', "master...$branch", '--', "PATCH.$patch") or die $!; + my $desc = ''; + open(PIPE, '-|', 'git', 'diff', '-U1000', "master...$branch", '--', "PATCH.$patch") or die $!; while () { last if /^@@ /; } - my $desc = ''; while () { - next if /^-/; # huh?? - s/^.//; + next unless s/^[ +]//; if (m#patch -p1 ', "patches/$patch.diff") or die $!; + open(OUT, '>', "$patches_dir/$patch.diff") or die $!; print OUT $description{$patch}, "\n"; - if (system("git-rebase -m $parent") != 0) { - print qq|"git-rebase -m $parent" incomplete -- please fix.\n|; + if (system("git merge $parent") != 0) { + print qq|"git merge $parent" incomplete -- please fix.\n|; $ENV{PS1} = "[$parent] patch/$patch: "; system $ENV{SHELL} and exit 1; } if ($incl_generated_files) { - system "make gen && rsync -a @extra_files b/" and exit 1; + system "./config.status Makefile && make gen && rsync -a @extra_files $tmp_dir/$patch/" and exit 1; } $last_touch = time; - open(PIPE, '-|', 'git-diff', $parent) or die $!; + open(PIPE, '-|', 'git', 'diff', $parent) or die $!; DIFF: while () { while (m{^diff --git a/PATCH}) { while () { @@ -133,14 +159,18 @@ sub update_patch } last DIFF if !defined $_; } + next if /^index /; print OUT $_; } close PIPE; if ($incl_generated_files) { - open(PIPE, '-|', 'diff', '-up', 'a', 'b') or die $!; + $parent =~ s#.*/##; + open(PIPE, '-|', 'diff', '-up', "$tmp_dir/$parent", "$tmp_dir/$patch") or die $!; while () { - s/^((?:---|\+\+\+) [^\t]+)\t.*/$1/; + s#^(diff -up) $tmp_dir/[^/]+/(.*?) $tmp_dir/[^/]+/(.*)#$1 a/$2 b/$3#o; + s#^\Q---\E $tmp_dir/[^/]+/([^\t]+)\t.*#--- a/$1#o; + s#^\Q+++\E $tmp_dir/[^/]+/([^\t]+)\t.*#+++ b/$1#o; print OUT $_; } close PIPE; @@ -148,3 +178,15 @@ sub update_patch close OUT; } + +exit; + +sub usage +{ + die <