chiark / gitweb /
i18n: Flag a handful of messages for translation
[dgit.git] / Debian / Dgit.pm
index 9d2e471948173fa33f38294b80daced55d5f8b07..b1aa620366daefb40079b287ea400c458dab42e2 100644 (file)
@@ -32,6 +32,8 @@ use IPC::Open2;
 use File::Path;
 use File::Basename;
 use Dpkg::Control::Hash;
+use Debian::Dgit::ExitStatus;
+use Debian::Dgit::I18n;
 
 BEGIN {
     use Exporter   ();
@@ -58,6 +60,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
@@ -105,6 +108,11 @@ our $gdrlast_refprefix = 'debrebase-last';
 our $printdebug_when_debuglevel = 1;
 our $debugcmd_when_debuglevel = 1;
 
+# these three all go together, only valid after record_maindir
+our $maindir;
+our $maindir_gitdir;
+our $maindir_gitcommon;
+
 # policy hook exit status bits
 # see dgit-repos-server head comment for documentation
 # 1 is reserved in case something fails with `exit 1' and to spot
@@ -664,7 +672,7 @@ sub getfield ($$) {
     my ($dctrl,$field) = @_;
     my $v = $dctrl->{$field};
     return $v if defined $v;
-    fail "missing field $field in ".$dctrl->get_option('name');
+    fail ___ "missing field %s in %s", $field, $dctrl->get_option('name');
 }
 
 sub parsechangelog_loop ($$$) {
@@ -710,6 +718,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:
@@ -758,11 +826,6 @@ sub make_commit_text ($) {
 
 # ----- maindir -----
 
-# these three all go together
-our $maindir;
-our $maindir_gitdir;
-our $maindir_gitcommon;
-
 our $local_git_cfg;
 
 sub record_maindir () {