X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=Debian%2FDgit.pm;h=3202180587105a7f039278379978b0acd33e0741;hb=b910e13d424229a7ef4d7241264aa552fe6e7399;hp=7da60f664cb079438213fa95f70a7a899ab99d98;hpb=f90d29c48dd4183174dd08f36d03e9db81636eb0;p=dgit.git diff --git a/Debian/Dgit.pm b/Debian/Dgit.pm index 7da60f66..32021805 100644 --- a/Debian/Dgit.pm +++ b/Debian/Dgit.pm @@ -44,7 +44,7 @@ BEGIN { server_branch server_ref stat_exists link_ltarget hashfile - fail ensuredir must_getcwd executable_on_path + fail failmsg ensuredir must_getcwd executable_on_path waitstatusmsg failedcmd_waitstatus failedcmd_report_cmd failedcmd runcmd cmdoutput cmdoutput_errok @@ -55,7 +55,9 @@ BEGIN { $package_re $component_re $deliberately_re $distro_re $versiontag_re $series_filename_re $extra_orig_namepart_re + $git_null_obj $branchprefix + $ffq_refprefix $gdrlast_refprefix initdebug enabledebug enabledebuglevel printdebug debugcmd $debugprefix *debuglevel *DEBUG @@ -83,6 +85,9 @@ our $versiontag_re = qr{[-+.\%_0-9a-zA-Z/]+}; our $branchprefix = 'dgit'; our $series_filename_re = qr{(?:^|\.)series(?!\n)$}s; our $extra_orig_namepart_re = qr{[-0-9a-z]+}; +our $git_null_obj = '0' x 40; +our $ffq_refprefix = 'ffq-prev'; +our $gdrlast_refprefix = 'debrebase-last'; # policy hook exit status bits # see dgit-repos-server head comment for documentation @@ -216,12 +221,16 @@ sub _us () { $::us // ($0 =~ m#[^/]*$#, $&); } -sub fail { +sub failmsg { my $s = "@_\n"; $s =~ s/\n\n$/\n/; my $prefix = _us().": "; $s =~ s/^/$prefix/gm; - die $s; + return $s; +} + +sub fail { + die failmsg @_; } sub ensuredir ($) { @@ -445,14 +454,21 @@ sub git_for_each_tag_referring ($$) { } sub git_check_unmodified () { - my @cmd = qw(git diff --quiet HEAD); - debugcmd "+",@cmd; - $!=0; $?=-1; system @cmd; - return if !$?; - if ($?==256) { - fail "working tree is dirty (does not match HEAD)"; - } else { - failedcmd @cmd; + foreach my $cached (qw(0 1)) { + my @cmd = qw(git diff --quiet); + push @cmd, qw(--cached) if $cached; + push @cmd, qw(HEAD); + debugcmd "+",@cmd; + $!=0; $?=-1; system @cmd; + return if !$?; + if ($?==256) { + fail + $cached + ? "git index contains changes (does not match HEAD)" + : "working tree is dirty (does not match HEAD)"; + } else { + failedcmd @cmd; + } } }