chiark / gitweb /
Dgit.pm: Move reflog_cache_* from dgit
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 11 Aug 2018 20:11:21 +0000 (21:11 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 12 Aug 2018 00:40:29 +0000 (01:40 +0100)
We are going to want this for git-debrebase merge resolutions.

NFC other than the usual change to literal `git'.

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Debian/Dgit.pm
dgit

index 69db866..91d4c71 100644 (file)
@@ -32,6 +32,7 @@ use IPC::Open2;
 use File::Path;
 use File::Basename;
 use Dpkg::Control::Hash;
+use Debian::Dgit::ExitStatus;
 
 BEGIN {
     use Exporter   ();
@@ -58,6 +59,7 @@ BEGIN {
                      git_check_unmodified
                      git_reflog_action_msg  git_update_ref_cmd
                      make_commit_text
+                     reflog_cache_insert reflog_cache_lookup
                       $package_re $component_re $deliberately_re
                      $distro_re $versiontag_re $series_filename_re
                      $orig_f_comp_re $orig_f_sig_re $orig_f_tail_re
@@ -715,6 +717,66 @@ sub make_commit_text ($) {
     return $h;
 }
 
+sub reflog_cache_insert ($$$) {
+    my ($ref, $cachekey, $value) = @_;
+    # you must call this in $maindir
+    # you must have called record_maindir
+
+    # When we no longer need to support squeeze, use --create-reflog
+    # instead of this:
+    my $parent = $ref; $parent =~ s{/[^/]+$}{};
+    ensuredir "$maindir_gitcommon/logs/$parent";
+    my $makelogfh = new IO::File "$maindir_gitcommon/logs/$ref", '>>'
+      or die $!;
+
+    my $oldcache = git_get_ref $ref;
+
+    if ($oldcache eq $value) {
+       my $tree = cmdoutput qw(git rev-parse), "$value:";
+       # git update-ref doesn't always update, in this case.  *sigh*
+       my $authline = (ucfirst _us()).
+           ' <'._us().'@example.com> 1000000000 +0000';
+       my $dummy = make_commit_text <<END;
+tree $tree
+parent $value
+author $authline
+committer $authline
+
+Dummy commit - do not use
+END
+       runcmd qw(git update-ref -m), _us()." - dummy", $ref, $dummy;
+    }
+    runcmd qw(git update-ref -m), $cachekey, $ref, $value;
+}
+
+sub reflog_cache_lookup ($$) {
+    my ($ref, $cachekey) = @_;
+    # you may call this in $maindir or in a playtree
+    # you must have called record_maindir
+    my @cmd = (qw(git log -g), '--pretty=format:%H %gs', $ref);
+    debugcmd "|(probably)",@cmd;
+    my $child = open GC, "-|";  defined $child or die $!;
+    if (!$child) {
+       chdir $maindir or die $!;
+       if (!stat "$maindir_gitcommon/logs/$ref") {
+           $! == ENOENT or die $!;
+           printdebug ">(no reflog)\n";
+           finish 0;
+       }
+       exec @cmd; die $!;
+    }
+    while (<GC>) {
+       chomp;
+       printdebug ">| ", $_, "\n" if $debuglevel > 1;
+       next unless m/^(\w+) (\S.*\S)$/ && $2 eq $cachekey;
+       close GC;
+       return $1;
+    }
+    die $! if GC->error;
+    failedcmd unless close GC;
+    return undef;
+}
+
 # ========== playground handling ==========
 
 # terminology:
diff --git a/dgit b/dgit
index 6879e54..991fd9a 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -5228,29 +5228,7 @@ END
     my $dgitview = git_rev_parse 'HEAD';
 
     changedir $maindir;
-    # When we no longer need to support squeeze, use --create-reflog
-    # instead of this:
-    ensuredir "$maindir_gitcommon/logs/refs/dgit-intern";
-    my $makelogfh = new IO::File "$maindir_gitcommon/logs/refs/$splitbraincache", '>>'
-      or die $!;
-
-    my $oldcache = git_get_ref "refs/$splitbraincache";
-    if ($oldcache eq $dgitview) {
-       my $tree = cmdoutput qw(git rev-parse), "$dgitview:";
-       # git update-ref doesn't always update, in this case.  *sigh*
-       my $dummy = make_commit_text <<END;
-tree $tree
-parent $dgitview
-author Dgit <dgit\@example.com> 1000000000 +0000
-committer Dgit <dgit\@example.com> 1000000000 +0000
-
-Dummy commit - do not use
-END
-       runcmd @git, qw(update-ref -m), "dgit $our_version - dummy",
-           "refs/$splitbraincache", $dummy;
-    }
-    runcmd @git, qw(update-ref -m), $cachekey, "refs/$splitbraincache",
-       $dgitview;
+    reflog_cache_insert "refs/$splitbraincache", $cachekey, $dgitview;
 
     changedir "$playground/work";
 
@@ -5753,26 +5731,12 @@ sub quilt_check_splitbrain_cache ($$) {
     push @cachekey, $srcshash->hexdigest();
     $splitbrain_cachekey = "@cachekey";
 
-    my @cmd = (@git, qw(log -g), '--pretty=format:%H %gs',
-              $splitbraincache);
     printdebug "splitbrain cachekey $splitbrain_cachekey\n";
-    debugcmd "|(probably)",@cmd;
-    my $child = open GC, "-|";  defined $child or die $!;
-    if (!$child) {
-       chdir $maindir or die $!;
-       if (!stat "$maindir_gitcommon/logs/refs/$splitbraincache") {
-           $! == ENOENT or die $!;
-           printdebug ">(no reflog)\n";
-           finish 0;
-       }
-       exec @cmd; die $!;
-    }
-    while (<GC>) {
-       chomp;
-       printdebug ">| ", $_, "\n" if $debuglevel > 1;
-       next unless m/^(\w+) (\S.*\S)$/ && $2 eq $splitbrain_cachekey;
-           
-       my $cachehit = $1;
+
+    my $cachehit = reflog_cache_lookup
+       "refs/$splitbraincache", $splitbrain_cachekey;
+
+    if ($cachehit) {
        unpack_playtree_mkwork($headref);
        my $saved = maybe_split_brain_save $headref, $cachehit, "cache-hit";
        if ($cachehit ne $headref) {
@@ -5784,8 +5748,6 @@ sub quilt_check_splitbrain_cache ($$) {
        progress "dgit view: found cached, no changes required";
        return ($headref, $splitbrain_cachekey);
     }
-    die $! if GC->error;
-    failedcmd unless close GC;
 
     printdebug "splitbrain cache miss\n";
     return (undef, $splitbrain_cachekey);