chiark / gitweb /
Remove scary warning from Description.
[dgit.git] / dgit
diff --git a/dgit b/dgit
index f582be0e8ee39cd1a0e00275ec6c78d76c2100c3..a21cddec32952c26243ae029a9edd490cb39d3a3 100755 (executable)
--- 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';
 
@@ -510,16 +512,37 @@ sub mktree_in_ud_from_only_subdir () {
     return ($tree,$dir);
 }
 
-sub dsc_files () {
-    my $field = $dsc->{'Checksums-Sha256'} || $dsc->{Files};
-    defined $field or
-       fail "missing both Checksums-Sha256 and Files in ".
+sub dsc_files_info () {
+    foreach my $csum (qw(Sha256 Sha1 MD5)) {
+       my $fname = $csum eq 'MD5' ? 'Files' : "Checksums-$csum";
+       my $field = $dsc->{$fname};
+       next unless defined $field;
+       my $digest = uc $csum;
+       if (!eval "use Digest::$digest; 1;") {
+           print DEBUG "ignoring $fname because $@\n";
+           next;
+       }
+       my @out;
+       foreach (split /\n/, $field) {
+           next unless m/\S/;
+           m/^(\w+) (\d+) (\S+)$/ or
+               fail "could not parse .dsc $fname line \`$_'";
+           my $digester = eval "Digest::$digest->new;" or die $@;
+           push @out, {
+               Hash => $1,
+               Bytes => $2,
+               Filename => $3,
+               Digester => $digester,
+           };
+       }
+       return @out;
+    }
+    fail "missing any supported Checksums-* or Files field in ".
        $dsc->get_option('name');
-    map {
-       m/^\w+ \d+ (\S+)$/ or
-           fail "could not parse .dsc Files/Checksums line \`$_'";
-       $1;
-    } grep m/\S/, split /\n/, $field;
+}
+
+sub dsc_files () {
+    map { $_->{Filename} } dsc_files_info();
 }
 
 sub is_orig_file ($) {
@@ -763,6 +786,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;
@@ -802,6 +826,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;
 }
 
@@ -984,7 +1012,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;".
@@ -1190,6 +1221,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 \`$_'";
            }
@@ -1233,6 +1268,8 @@ if ($ENV{$fakeeditorenv}) {
     quilt_fixup_editor();
 }
 
+delete $ENV{'DGET_UNPACK'};
+
 parseopts();
 print STDERR "DRY RUN ONLY\n" if $dryrun;
 if (!@ARGV) {