Change naming of local patch-related branches and unify
authorWayne Davison <wayned@samba.org>
Wed, 30 Dec 2009 20:48:15 +0000 (12:48 -0800)
committerWayne Davison <wayned@samba.org>
Wed, 30 Dec 2009 21:57:39 +0000 (13:57 -0800)
the git-status checking into a library.

packaging/branch-from-patch
packaging/git-status.pl [new file with mode: 0644]
packaging/patch-update
packaging/release-rsync

index bf854b17d13833d201d3daf8b27683f4149d51c1..e555f00bd29a3fcf9657f62113294e57dc570e06 100755 (executable)
@@ -16,7 +16,7 @@ use Getopt::Long;
 my %local_branch;
 open PIPE, '-|', 'git branch -l' or die "Unable to fork: $!\n";
 while (<PIPE>) {
-    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('', <IN>);
-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 (file)
index 0000000..295018c
--- /dev/null
@@ -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] ";
+       $_ = <STDIN>;
+       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] ";
+           $_ = <STDIN>;
+           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;
index 135b7e48b47e93c25818464ffae97d9f97d364a5..dba8e472fd4ced9b59a271acd9304f977ae71686 100755 (executable)
@@ -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 (<PIPE>) {
-    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 (<PIPE>) {
@@ -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('', <IN>);
-    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 <<EOT;
 Usage: patch-update [OPTIONS] [patches/DIFF...]
 
 Options:
--b, --branch=BRANCH  The master branch to merge into the patch/* branches.
+-b, --branch=BRANCH  The master branch to merge into the patch/BASE/* branches.
     --gen[=DIR]      Include generated files.  Optional destination DIR
                      arg overrides the default of using the "patches" dir.
     --skip-check     Skip the check that ensures starting with a clean branch.
--s, --shell          Launch a shell for every patch/* branch updated, not
+-s, --shell          Launch a shell for every patch/BASE/* branch updated, not
                      just when a conflict occurs.
 -h, --help           Output this help message.
 EOT
index ddd8beddf2e000a4916abaf9af6e4b176ec5b303..939e5b9b60832d478e49739bdbb3c03d7180d9ca 100755 (executable)
@@ -61,30 +61,8 @@ die "There is no .git dir in the current directory.\n" unless -d '.git';
 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';
 
-my $status = `git status`;
-die "The checkout is not clean:\n", $status unless $status =~ /\nnothing to commit \(working directory clean\)/;
-my($cur_branch) = $status =~ /^# On branch (.+)\n/;
-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 to release branch $cur_branch? [n] ";
-    $_ = <STDIN>;
-    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] ";
-       $_ = <STDIN>;
-       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, <<EOT;
 
 About to:
     - commit all version changes
-    - merge the $master_branch branch into the patch/* branches
+    - merge the $master_branch branch into the patch/$master_branch/* branches
     - update the files in the "patches" dir and OPTIONALLY
       (if you type 'y') to launch a shell for each patch
 
@@ -299,7 +277,7 @@ print "Updating files in \"patches\" dir ...\n";
 system "packaging/patch-update --branch=$master_branch";
 
 if ($ans =~ /^y/i) {
-    print "\nVisiting all \"patch/*\" branches ...\n";
+    print "\nVisiting all \"patch/$master_branch/*\" branches ...\n";
     system "packaging/patch-update --branch=$master_branch --shell";
 }