X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/01e293f1b52bd16b5b487f5003cce4948786c474..ce571e64b6c4ab2947c05a21ebc254729933ea0c:/packaging/patch-update diff --git a/packaging/patch-update b/packaging/patch-update index 30a29bce..dba8e472 100755 --- a/packaging/patch-update +++ b/packaging/patch-update @@ -1,5 +1,5 @@ #!/usr/bin/perl -# This script is used to turn one or more of the "patch/*" branches +# This script is used to turn one or more of the "patch/BASE/*" 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 # one or more diffs if you want to just update a subset of all the @@ -11,6 +11,7 @@ use Getopt::Long; my $patches_dir = 'patches'; my $tmp_dir = "patches.$$"; +my $make_gen_cmd = 'make -f prepare-source.mak conf && ./config.status && make gen'; &Getopt::Long::Configure('bundling'); &usage if !&GetOptions( @@ -30,10 +31,19 @@ if (defined $incl_generated_files) { 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'; -my($status, $is_clean, $starting_branch) = &check_git_status; -if (!$skip_branch_check && !$is_clean) { - die "The checkout is not clean:\n", $status; +require 'packaging/git-status.pl'; +check_git_state($master_branch, !$skip_branch_check, 1); + +my $master_commit; +open PIPE, '-|', "git log -1 --no-color $master_branch" or die $!; +while () { + if (/^commit (\S+)/) { + $master_commit = $1; + last; + } } +close PIPE; +die "Unable to determine commit hash for master branch: $master_branch\n" unless defined $master_commit; my @extra_files; open(IN, '<', 'Makefile.in') or die "Couldn't open Makefile.in: $!\n"; @@ -51,7 +61,7 @@ close IN; if ($incl_generated_files) { 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; + system "$make_gen_cmd && rsync -a @extra_files $tmp_dir/master/" and exit 1; } our $last_touch = time; @@ -60,7 +70,7 @@ my %patches; # Start by finding all patches so that we can load all possible parents. open(PIPE, '-|', 'git', 'branch', '-l') or die $!; while () { - if (m# patch/(.*)#) { + if (m# patch/\Q$master_branch\E/(.*)#o) { $patches{$1} = 1; } } @@ -70,7 +80,7 @@ my @patches = sort keys %patches; my(%parent, %description); foreach my $patch (@patches) { - my $branch = "patch/$patch"; + my $branch = "patch/$master_branch/$patch"; my $desc = ''; open(PIPE, '-|', 'git', 'diff', '-U1000', "$master_branch...$branch", '--', "PATCH.$patch") or die $!; while () { @@ -114,7 +124,7 @@ if ($incl_generated_files) { } sleep 1 while $last_touch >= time; -system "git checkout $starting_branch" and exit 1; +system "git checkout $master_branch" and exit 1; exit; @@ -124,24 +134,27 @@ sub update_patch my($patch) = @_; my $parent = $parent{$patch}; + my $based_on; if (defined $parent) { unless ($completed{$parent}++) { update_patch($parent); } - $parent = "patch/$parent"; + $based_on = $parent = "patch/$master_branch/$parent"; } else { $parent = $master_branch; + $based_on = $master_commit; } print "======== $patch ========\n"; sleep 1 while $incl_generated_files && $last_touch >= time; - system "git checkout patch/$patch" and return 0; + system "git checkout patch/$master_branch/$patch" and return 0; - my $ok = system("git merge $parent") == 0; + my $ok = system("git merge $based_on") == 0; if (!$ok || $launch_shell) { - print qq|"git merge $parent" incomplete -- please fix.\n| if !$ok; - $ENV{PS1} = "[$parent] patch/$patch: "; + my($parent_dir) = $parent =~ m{([^/]+)$}; + print qq|"git merge $based_on" incomplete -- please fix.\n| if !$ok; + $ENV{PS1} = "[$parent_dir] $patch: "; while (1) { if (system($ENV{SHELL}) != 0) { print "Abort? [n/y] "; @@ -149,21 +162,21 @@ sub update_patch next unless /^y/i; return 0; } - ($status, $is_clean) = &check_git_status; + my($cur_branch, $is_clean, $status) = check_git_status(0); last if $is_clean; print $status; } } open(OUT, '>', "$patches_dir/$patch.diff") or die $!; - print OUT $description{$patch}, "\n"; + print OUT $description{$patch}, "\nbased-on: $based_on\n"; if ($incl_generated_files) { - system "./config.status Makefile && make gen && rsync -a @extra_files $tmp_dir/$patch/" and exit 1; + system "$make_gen_cmd && rsync -a @extra_files $tmp_dir/$patch/" and exit 1; } $last_touch = time; - open(PIPE, '-|', 'git', 'diff', $parent) or die $!; + open(PIPE, '-|', 'git', 'diff', $based_on) or die $!; DIFF: while () { while (m{^diff --git a/PATCH}) { while () { @@ -200,22 +213,18 @@ sub update_patch exit; -sub check_git_status -{ - open(IN, '-|', 'git status') or die $!; - my $status = join('', ); - close IN; - my $is_clean = $status =~ /\nnothing to commit \(working directory clean\)/; - my($starting_branch) = $status =~ /^# On branch (.+)\n/; - ($status, $is_clean, $starting_branch); -} - sub usage { die <