chiark / gitweb /
git-debrebase: fix ffq divergence checking (many bugs)
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 18 Feb 2018 00:07:05 +0000 (00:07 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 16 Jun 2018 15:06:58 +0000 (16:06 +0100)
Also add some debugging to ffq checking

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
git-debrebase

index 403fba1..2b65846 100755 (executable)
@@ -915,6 +915,7 @@ sub ffq_prev_branchinfo () {
     return ('weird-symref', 'HEAD symref is not to refs/')
        unless $current =~ m{^refs/};
     my $ffq_prev = "refs/$ffq_refprefix/$'";
+    printdebug "ffq_prev_branchinfo branch current $current\n";
     return ('branch', undef, $current, $ffq_prev);
 }
 
@@ -944,12 +945,15 @@ sub record_ffq_prev () {
     my @check_specs = split /\;/, (cfg "branch.$branch.ffq-ffrefs",1) // '*';
     my %checked;
 
+    printdebug "ffq check_specs @check_specs\n";
+
     my $check = sub {
        my ($lrref, $desc) = @_;
+       printdebug "ffq might check $lrref ($desc)\n";
        my $invert;
        for my $chk (@check_specs) {
            my $glob = $chk;
-           $invert = $glob =~ s{^[^!]}{};
+           $invert = $glob =~ s{^[!^]}{};
            last if fnmatch $glob, $lrref;
        }
        return if $invert;
@@ -959,7 +963,7 @@ sub record_ffq_prev () {
        if (is_fast_fwd $lrval, $currentval) {
            print "OK, you are ahead of $lrref\n" or die $!;
            $checked{$lrref} = 1;
-       } if (is_fast_fwd $currentval, $lrval) {
+       } elsif (is_fast_fwd $currentval, $lrval) {
            $checked{$lrref} = -1;
            fproblem 'behind', "you are behind $lrref, divergence risk";
        } else {
@@ -969,23 +973,25 @@ sub record_ffq_prev () {
     };
 
     my $merge = cfg "branch.$branch.merge",1;
-    if (defined $merge && $merge =~ m{^refs/heads/}) {
+    if (defined $merge and $merge =~ m{^refs/heads/}) {
        my $rhs = $';
+       printdebug "ffq merge $rhs\n";
        my $check_remote = sub {
-           my ($remote, $desc) = (@_);
+           my ($remote, $desc) = @_;
+           printdebug "ffq check_remote ".($remote//'undef')." $desc\n";
            return unless defined $remote;
            $check->("refs/remotes/$remote/$rhs", $desc);
        };
-       $check_remote->((cfg "branch.$branch.remote",1),
+       $check_remote->((scalar cfg "branch.$branch.remote",1),
                        'remote fetch/merge branch');
-       $check_remote->((cfg "branch.$branch.pushRemote",1) //
-                       (cfg "branch.$branch.pushDefault",1),
+       $check_remote->((scalar cfg "branch.$branch.pushRemote",1) //
+                       (scalar cfg "branch.$branch.pushDefault",1),
                        'remote push branch');
     }
     if ($branch =~ m{^dgit/}) {
-       $check->("remotes/dgit/$branch", 'remote dgit branch');
+       $check->("refs/remotes/dgit/$branch", 'remote dgit branch');
     } elsif ($branch =~ m{^master$}) {
-       $check->("remotes/dgit/dgit/sid", 'remote dgit branch for sid');
+       $check->("refs/remotes/dgit/dgit/sid", 'remote dgit branch for sid');
     }
 
     fproblems_maybe_bail();