From a01e3b490eb36ccf9e704840e1b6683dab867550 Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Wed, 30 Dec 2009 12:48:15 -0800 Subject: [PATCH] Change naming of local patch-related branches and unify the git-status checking into a library. --- packaging/branch-from-patch | 17 ++++++------- packaging/git-status.pl | 48 +++++++++++++++++++++++++++++++++++++ packaging/patch-update | 37 ++++++++++------------------ packaging/release-rsync | 30 ++++------------------- 4 files changed, 72 insertions(+), 60 deletions(-) create mode 100644 packaging/git-status.pl diff --git a/packaging/branch-from-patch b/packaging/branch-from-patch index bf854b17..e555f00b 100755 --- a/packaging/branch-from-patch +++ b/packaging/branch-from-patch @@ -16,7 +16,7 @@ use Getopt::Long; my %local_branch; open PIPE, '-|', 'git branch -l' or die "Unable to fork: $!\n"; while () { - if (m# patch/(.*)#) { + if (m# patch/\Q$master_branch\E/(.*)#o) { $local_branch{$1} = 1; } } @@ -24,17 +24,14 @@ close PIPE; if ($delete_local_branches) { foreach my $name (sort keys %local_branch) { - my $branch = "patch/$name"; + my $branch = "patch/$master_branch/$name"; system 'git', 'branch', '-D', $branch and exit 1; } %local_branch = ( ); } -open IN, '-|', 'git status' or die $!; -my $status = join('', ); -close IN; -die "The checkout is not clean:\n", $status unless $status =~ /\nnothing to commit \(working directory clean\)/; -die "The checkout is not on the $master_branch branch.\n" unless $status =~ /^# On branch $master_branch\n/; +require 'packaging/git-status.pl'; +check_git_state($master_branch, !$skip_branch_check, 1); my @patch_list; foreach (@ARGV) { @@ -121,10 +118,10 @@ sub create_branch $parent_branch = $commit if defined $commit; } else { create_branch("$where/$parent.diff"); - $parent_branch = "patch/$parent"; + $parent_branch = "patch/$master_branch/$parent"; } - my $branch = "patch/$name"; + my $branch = "patch/$master_branch/$name"; print "\n", '=' x 64, "\nProcessing $branch ($parent_branch)\n"; if ($local_branch{$name}) { @@ -176,7 +173,7 @@ Options: -b, --branch=BRANCH Create branches relative to BRANCH if no "based-on" header was found in the patch file. --skip-check Skip the check that ensures starting with a clean branch. - --delete Delete all the local patch/* branches, not just the ones + --delete Delete all the local patch/BASE/* branches, not just the ones that are being recreated. -h, --help Output this help message. EOT diff --git a/packaging/git-status.pl b/packaging/git-status.pl new file mode 100644 index 00000000..295018c9 --- /dev/null +++ b/packaging/git-status.pl @@ -0,0 +1,48 @@ +# Do some git-status checking for the current dir and (optionally) +# the patches dir. + +sub check_git_state +{ + my($master_branch, $fatal_unless_clean, $check_patches_dir) = @_; + + my($cur_branch) = check_git_status($fatal_unless_clean); + if ($cur_branch ne $master_branch) { + print "The checkout is not on the $master_branch branch.\n"; + exit 1 if $master_branch ne 'master'; + print "Do you want me to continue with --branch=$cur_branch? [n] "; + $_ = ; + exit 1 unless /^y/i; + $_[0] = $master_branch = $cur_branch; # Updates caller's $master_branch too. + } + + if ($check_patches_dir && -d 'patches/.git') { + ($cur_branch) = check_git_status($fatal_unless_clean, 'patches'); + if ($cur_branch ne $master_branch) { + print "The *patches* checkout is on branch $cur_branch, not branch $master_branch.\n"; + print "Do you want to change it to branch $master_branch? [n] "; + $_ = ; + exit 1 unless /^y/i; + system "cd patches && git checkout '$master_branch'"; + } + } +} + +sub check_git_status +{ + my($fatal_unless_clean, $subdir) = @_; + $subdir = '.' unless defined $subdir; + my $status = `cd '$subdir' && git status`; + my $is_clean = $status =~ /\nnothing to commit \(working directory clean\)/; + my($cur_branch) = $status =~ /^# On branch (.+)\n/; + if ($fatal_unless_clean && !$is_clean) { + if ($subdir eq '.') { + $subdir = ''; + } else { + $subdir = " *$subdir*"; + } + die "The$subdir checkout is not clean:\n", $status; + } + ($cur_branch, $is_clean, $status); +} + +1; diff --git a/packaging/patch-update b/packaging/patch-update index 135b7e48..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 @@ -31,10 +31,8 @@ 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 $!; @@ -72,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; } } @@ -82,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 () { @@ -126,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; @@ -141,7 +139,7 @@ sub update_patch unless ($completed{$parent}++) { update_patch($parent); } - $based_on = $parent = "patch/$parent"; + $based_on = $parent = "patch/$master_branch/$parent"; } else { $parent = $master_branch; $based_on = $master_commit; @@ -150,12 +148,13 @@ sub update_patch 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 $based_on") == 0; if (!$ok || $launch_shell) { + my($parent_dir) = $parent =~ m{([^/]+)$}; print qq|"git merge $based_on" incomplete -- please fix.\n| if !$ok; - $ENV{PS1} = "[$parent] patch/$patch: "; + $ENV{PS1} = "[$parent_dir] $patch: "; while (1) { if (system($ENV{SHELL}) != 0) { print "Abort? [n/y] "; @@ -163,7 +162,7 @@ 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; } @@ -214,27 +213,17 @@ 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 <; - exit 1 unless /^y/i; - $master_branch = $cur_branch; -} - -if (-d 'patches/.git') { - $status = `cd patches && git status`; - die "The *patches* checkout is not clean:\n", $status unless $status =~ /\nnothing to commit \(working directory clean\)/; - ($cur_branch) = $status =~ /^# On branch (.+)\n/; - if ($cur_branch ne $master_branch) { - print "The *patches* checkout is on branch $cur_branch, not branch $master_branch.\n"; - print "Do you want to change it to branch $master_branch? [n] "; - $_ = ; - exit 1 unless /^y/i; - system "cd patches && git checkout '$master_branch'"; - } -} +require 'packaging/git-status.pl'; +check_git_state($master_branch, 1, 1); my $confversion; open(IN, '<', 'configure.in') or die $!; @@ -285,7 +263,7 @@ print $break, <