the git-status checking into a library.
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;
}
}
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) {
$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}) {
-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
--- /dev/null
+# 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;
#!/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
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 $!;
# 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;
}
}
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>) {
}
sleep 1 while $last_touch >= time;
-system "git checkout $starting_branch" and exit 1;
+system "git checkout $master_branch" and exit 1;
exit;
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;
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] ";
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;
}
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
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 $!;
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
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";
}