diff options
Diffstat (limited to 'Debian/Dgit.pm')
-rw-r--r-- | Debian/Dgit.pm | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/Debian/Dgit.pm b/Debian/Dgit.pm index 69db866..91d4c71 100644 --- a/Debian/Dgit.pm +++ b/Debian/Dgit.pm @@ -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: |