Commit a01e3b49 authored by Wayne Davison's avatar Wayne Davison

Change naming of local patch-related branches and unify

the git-status checking into a library.
parent 2b2a4738
...@@ -16,7 +16,7 @@ use Getopt::Long; ...@@ -16,7 +16,7 @@ use Getopt::Long;
my %local_branch; my %local_branch;
open PIPE, '-|', 'git branch -l' or die "Unable to fork: $!\n"; open PIPE, '-|', 'git branch -l' or die "Unable to fork: $!\n";
while (<PIPE>) { while (<PIPE>) {
if (m# patch/(.*)#) { if (m# patch/\Q$master_branch\E/(.*)#o) {
$local_branch{$1} = 1; $local_branch{$1} = 1;
} }
} }
...@@ -24,17 +24,14 @@ close PIPE; ...@@ -24,17 +24,14 @@ close PIPE;
if ($delete_local_branches) { if ($delete_local_branches) {
foreach my $name (sort keys %local_branch) { 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; system 'git', 'branch', '-D', $branch and exit 1;
} }
%local_branch = ( ); %local_branch = ( );
} }
open IN, '-|', 'git status' or die $!; require 'packaging/git-status.pl';
my $status = join('', <IN>); check_git_state($master_branch, !$skip_branch_check, 1);
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/;
my @patch_list; my @patch_list;
foreach (@ARGV) { foreach (@ARGV) {
...@@ -121,10 +118,10 @@ sub create_branch ...@@ -121,10 +118,10 @@ sub create_branch
$parent_branch = $commit if defined $commit; $parent_branch = $commit if defined $commit;
} else { } else {
create_branch("$where/$parent.diff"); 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"; print "\n", '=' x 64, "\nProcessing $branch ($parent_branch)\n";
if ($local_branch{$name}) { if ($local_branch{$name}) {
...@@ -176,7 +173,7 @@ Options: ...@@ -176,7 +173,7 @@ Options:
-b, --branch=BRANCH Create branches relative to BRANCH if no "based-on" -b, --branch=BRANCH Create branches relative to BRANCH if no "based-on"
header was found in the patch file. header was found in the patch file.
--skip-check Skip the check that ensures starting with a clean branch. --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. that are being recreated.
-h, --help Output this help message. -h, --help Output this help message.
EOT EOT
......
# 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 #!/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 # 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 # --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 # one or more diffs if you want to just update a subset of all the
...@@ -31,10 +31,8 @@ if (defined $incl_generated_files) { ...@@ -31,10 +31,8 @@ if (defined $incl_generated_files) {
die "No '$patches_dir' directory was found.\n" unless -d $patches_dir; 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'; die "No '.git' directory present in the current dir.\n" unless -d '.git';
my($status, $is_clean, $starting_branch) = &check_git_status; require 'packaging/git-status.pl';
if (!$skip_branch_check && !$is_clean) { check_git_state($master_branch, !$skip_branch_check, 1);
die "The checkout is not clean:\n", $status;
}
my $master_commit; my $master_commit;
open PIPE, '-|', "git log -1 --no-color $master_branch" or die $!; open PIPE, '-|', "git log -1 --no-color $master_branch" or die $!;
...@@ -72,7 +70,7 @@ my %patches; ...@@ -72,7 +70,7 @@ my %patches;
# Start by finding all patches so that we can load all possible parents. # Start by finding all patches so that we can load all possible parents.
open(PIPE, '-|', 'git', 'branch', '-l') or die $!; open(PIPE, '-|', 'git', 'branch', '-l') or die $!;
while (<PIPE>) { while (<PIPE>) {
if (m# patch/(.*)#) { if (m# patch/\Q$master_branch\E/(.*)#o) {
$patches{$1} = 1; $patches{$1} = 1;
} }
} }
...@@ -82,7 +80,7 @@ my @patches = sort keys %patches; ...@@ -82,7 +80,7 @@ my @patches = sort keys %patches;
my(%parent, %description); my(%parent, %description);
foreach my $patch (@patches) { foreach my $patch (@patches) {
my $branch = "patch/$patch"; my $branch = "patch/$master_branch/$patch";
my $desc = ''; my $desc = '';
open(PIPE, '-|', 'git', 'diff', '-U1000', "$master_branch...$branch", '--', "PATCH.$patch") or die $!; open(PIPE, '-|', 'git', 'diff', '-U1000', "$master_branch...$branch", '--', "PATCH.$patch") or die $!;
while (<PIPE>) { while (<PIPE>) {
...@@ -126,7 +124,7 @@ if ($incl_generated_files) { ...@@ -126,7 +124,7 @@ if ($incl_generated_files) {
} }
sleep 1 while $last_touch >= time; sleep 1 while $last_touch >= time;
system "git checkout $starting_branch" and exit 1; system "git checkout $master_branch" and exit 1;
exit; exit;
...@@ -141,7 +139,7 @@ sub update_patch ...@@ -141,7 +139,7 @@ sub update_patch
unless ($completed{$parent}++) { unless ($completed{$parent}++) {
update_patch($parent); update_patch($parent);
} }
$based_on = $parent = "patch/$parent"; $based_on = $parent = "patch/$master_branch/$parent";
} else { } else {
$parent = $master_branch; $parent = $master_branch;
$based_on = $master_commit; $based_on = $master_commit;
...@@ -150,12 +148,13 @@ sub update_patch ...@@ -150,12 +148,13 @@ sub update_patch
print "======== $patch ========\n"; print "======== $patch ========\n";
sleep 1 while $incl_generated_files && $last_touch >= time; 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; my $ok = system("git merge $based_on") == 0;
if (!$ok || $launch_shell) { if (!$ok || $launch_shell) {
my($parent_dir) = $parent =~ m{([^/]+)$};
print qq|"git merge $based_on" incomplete -- please fix.\n| if !$ok; print qq|"git merge $based_on" incomplete -- please fix.\n| if !$ok;
$ENV{PS1} = "[$parent] patch/$patch: "; $ENV{PS1} = "[$parent_dir] $patch: ";
while (1) { while (1) {
if (system($ENV{SHELL}) != 0) { if (system($ENV{SHELL}) != 0) {
print "Abort? [n/y] "; print "Abort? [n/y] ";
...@@ -163,7 +162,7 @@ sub update_patch ...@@ -163,7 +162,7 @@ sub update_patch
next unless /^y/i; next unless /^y/i;
return 0; return 0;
} }
($status, $is_clean) = &check_git_status; my($cur_branch, $is_clean, $status) = check_git_status(0);
last if $is_clean; last if $is_clean;
print $status; print $status;
} }
...@@ -214,27 +213,17 @@ sub update_patch ...@@ -214,27 +213,17 @@ sub update_patch
exit; 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 sub usage
{ {
die <<EOT; die <<EOT;
Usage: patch-update [OPTIONS] [patches/DIFF...] Usage: patch-update [OPTIONS] [patches/DIFF...]
Options: 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 --gen[=DIR] Include generated files. Optional destination DIR
arg overrides the default of using the "patches" dir. arg overrides the default of using the "patches" dir.
--skip-check Skip the check that ensures starting with a clean branch. --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. just when a conflict occurs.
-h, --help Output this help message. -h, --help Output this help message.
EOT EOT
......
...@@ -61,30 +61,8 @@ die "There is no .git dir in the current directory.\n" unless -d '.git'; ...@@ -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 "'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'; die "'b' must not exist in the current directory.\n" if -e 'b';
my $status = `git status`; require 'packaging/git-status.pl';
die "The checkout is not clean:\n", $status unless $status =~ /\nnothing to commit \(working directory clean\)/; check_git_state($master_branch, 1, 1);
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'";
}
}
my $confversion; my $confversion;
open(IN, '<', 'configure.in') or die $!; open(IN, '<', 'configure.in') or die $!;
...@@ -285,7 +263,7 @@ print $break, <<EOT; ...@@ -285,7 +263,7 @@ print $break, <<EOT;
About to: About to:
- commit all version changes - 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 - update the files in the "patches" dir and OPTIONALLY
(if you type 'y') to launch a shell for each patch (if you type 'y') to launch a shell for each patch
...@@ -299,7 +277,7 @@ print "Updating files in \"patches\" dir ...\n"; ...@@ -299,7 +277,7 @@ print "Updating files in \"patches\" dir ...\n";
system "packaging/patch-update --branch=$master_branch"; system "packaging/patch-update --branch=$master_branch";
if ($ans =~ /^y/i) { 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"; system "packaging/patch-update --branch=$master_branch --shell";
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment