chiark / gitweb /
git-debrebase: Defend against missing snags_maybe_bail calls
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 22 Apr 2018 22:27:26 +0000 (23:27 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 16 Jun 2018 21:40:13 +0000 (22:40 +0100)
Almost the only thing gdr does as an output is to update HEAD and
other refs.  That's done with run_deferred_updates.  So, there,
check that (i) we have called snags_maybe_bail at least once;
(ii) we have not had any snags since.

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

index 6259dfe8076bf83b0dab5b00973b28529e1a2afd..6211fb633d85ecee3fcb2f6173dde3f9184d0a1f 100755 (executable)
@@ -99,12 +99,18 @@ sub fresh_workarea () {
     in_workarea sub { playtree_setup };
 }
 
+our $snags_forced;
+our $snags_tripped;
+our $snags_checked;
 our @deferred_updates;
 our @deferred_update_messages;
 
 sub run_deferred_updates ($) {
     my ($mrest) = @_;
 
+    confess 'dangerous internal error' if
+       !$snags_checked || $snags_tripped || $snags_forced;
+
     my @upd_cmd = (@git, qw(update-ref --stdin -m), "debrebase: $mrest");
     debugcmd '>|', @upd_cmd;
     open U, "|-", @upd_cmd or die $!;
@@ -227,8 +233,6 @@ sub make_commit ($$) {
 }
 
 our @snag_force_opts;
-our $snags_forced;
-our $snags_tripped;
 sub snag ($$) {
     my ($tag,$msg) = @_;
     if (grep { $_ eq $tag } @snag_force_opts) {
@@ -241,16 +245,19 @@ sub snag ($$) {
 }
 
 sub snags_maybe_bail () {
+    $snags_checked++;
     if ($snags_forced) {
        printf STDERR
            "%s: snags: %d overriden by individual -f options\n",
            $us, $snags_forced;
+       $snags_forced=0;
     }
     if ($snags_tripped) {
        if ($opt_force) {
            printf STDERR
                "%s: snags: %d overriden by global --force\n",
                $us, $snags_tripped;
+           $snags_tripped=0;
        } else {
            fail sprintf
   "%s: snags: %d blockers (you could -f<tag>, or --force)",