X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=dgit;h=9602b9891951ebacaae42b818396d25b21447e59;hb=7de1cca83307cda0d0bf04f8646e23da334f19ef;hp=3cb47804fdd854f7cd42524b17c4d0d5175da270;hpb=3759f1f708f46004df69810a4c7e07714bf00ecc;p=dgit.git diff --git a/dgit b/dgit index 3cb47804..9602b989 100755 --- a/dgit +++ b/dgit @@ -36,6 +36,8 @@ our $sign = 1; our $dryrun = 0; our $changesfile; our $new_package = 0; +our $ignoredirty = 0; +our $noquilt = 0; our $existing_package = 'dpkg'; our $cleanmode = 'dpkg-source'; @@ -83,7 +85,16 @@ sub debiantag ($) { return "debian/$v"; } -sub dscfn ($) { return "${package}_$_[0].dsc"; } +sub stripepoch ($) { + my ($vsn) = @_; + $vsn =~ s/^\d+\://; + return $vsn; +} + +sub dscfn ($) { + my ($vsn) = @_; + return "${package}_".(stripepoch $vsn).".dsc"; +} sub changesopts () { return @changesopts[1..$#changesopts]; } @@ -399,7 +410,7 @@ sub madison_parse ($) { } $5 eq 'source' or die "$rmad ?"; my $prefix = substr($package, 0, $package =~ m/^l/ ? 4 : 1); - my $subpath = "/pool/$component/$prefix/$package/${package}_$vsn.dsc"; + my $subpath = "/pool/$component/$prefix/$package/".dscfn($vsn); push @out, [$vsn,$subpath,$newsuite]; } return sort { -version_compare_string($a->[0],$b->[0]); } @out; @@ -630,8 +641,14 @@ sub rev_parse ($) { sub is_fast_fwd ($$) { my ($ancestor,$child) = @_; - my $mb = cmdoutput @git, qw(merge-base), $ancestor, $child; - return rev_parse($mb) eq rev_parse($ancestor); + my @cmd = (@git, qw(merge-base), $ancestor, $child); + my $mb = cmdoutput_errok @cmd; + if (defined $mb) { + return rev_parse($mb) eq rev_parse($ancestor); + } else { + $?==256 or failedcmd @cmd; + return 0; + } } sub git_fetch_us () { @@ -748,6 +765,7 @@ sub pull () { } sub check_not_dirty () { + return if $ignoredirty; my @cmd = (@git, qw(diff --quiet HEAD)); printcmd(\*DEBUG,"+",@cmd) if $debug>0; $!=0; $?=0; system @cmd; @@ -787,6 +805,10 @@ sub madformat ($) { my ($format) = @_; return 0 unless $format eq '3.0 (quilt)'; print "Format \`$format', urgh\n"; + if ($noquilt) { + print "Not doing any fixup of \`$format' due to --no-quilt-fixup"; + return 0; + } return 1; } @@ -837,12 +859,12 @@ sub dopush () { $dsc->{$ourdscfield[0]} = rev_parse('HEAD'); $dsc->save("../$dscfn.tmp") or die $!; if (!$changesfile) { - my $multi = "../${package}_${cversion}_multi.changes"; + my $multi = "../${package}_".(stripepoch $cversion)."_multi.changes"; if (stat "$multi") { $changesfile = $multi; } else { $!==&ENOENT or die "$multi: $!"; - my $pat = "${package}_${cversion}_*.changes"; + my $pat = "${package}_".(stripepoch $cversion)."_*.changes"; my @cs = glob "../$pat"; fail "failed to find unique changes file". " (looked for $pat in .., or $multi);". @@ -969,7 +991,10 @@ sub cmd_push { git_fetch_us(); } if (fetch_from_archive()) { - is_fast_fwd(lrref(), 'HEAD') or die; + is_fast_fwd(lrref(), 'HEAD') or + fail "dgit push: HEAD is not a descendant". + " of the archive's version.\n". + "$us: To overwrite it, use git-merge -s ours ".lrref()."."; } else { $new_package or fail "package appears to be new in this suite;". @@ -1077,7 +1102,7 @@ sub cmd_git_build { my @cmd = (qw(git-buildpackage -us -uc --git-no-sign-tags), "--git-builder=@dpkgbuildpackage"); - unless (grep { m/^--git-debian-branch/ } @ARGV) { + unless (grep { m/^--git-debian-branch|^--git-ignore-branch/ } @ARGV) { canonicalise_suite(); push @cmd, "--git-debian-branch=".lbranch(); } @@ -1088,7 +1113,7 @@ sub cmd_git_build { sub build_source { build_prep(); - $sourcechanges = "${package}_${version}_source.changes"; + $sourcechanges = "${package}_".(stripepoch $version)."_source.changes"; $dscfn = dscfn($version); if ($cleanmode eq 'dpkg-source') { runcmd_ordryrun (@dpkgbuildpackage, qw(-us -uc -S)), changesopts(); @@ -1120,7 +1145,7 @@ sub cmd_build_source { sub cmd_sbuild { build_source(); chdir ".." or die $!; - my $pat = "${package}_${version}_*.changes"; + my $pat = "${package}_".(stripepoch $version)."_*.changes"; if (!$dryrun) { stat $dscfn or fail "$dscfn (in parent directory): $!"; stat $sourcechanges or fail "$sourcechanges (in parent directory): $!"; @@ -1131,7 +1156,7 @@ sub cmd_sbuild { } runcmd_ordryrun @sbuild, @ARGV, qw(-d), $isuite, $dscfn; runcmd_ordryrun @mergechanges, glob $pat; - my $multichanges = "${package}_${version}_multi.changes"; + my $multichanges = "${package}_".(stripepoch $version)."_multi.changes"; if (!$dryrun) { stat $multichanges or fail "$multichanges: $!"; } @@ -1175,6 +1200,10 @@ sub parseopts () { $cleanmode = $1; } elsif (m/^--clean=(.*)$/s) { badusage "unknown cleaning mode \`$1'"; + } elsif (m/^--ignore-dirty$/s) { + $ignoredirty = 1; + } elsif (m/^--no-quilt-fixup$/s) { + $noquilt = 1; } else { badusage "unknown long option \`$_'"; }