chiark / gitweb /
document --gpg=
[dgit.git] / dgit
diff --git a/dgit b/dgit
index 9d2d8769974355e5fcd7135225295cbb589d1c87..3c24c2c1b5ae9a70d3f9a42f0bbcb0ade4f0aefe 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -76,6 +76,8 @@ our %opts_opt_map = ('dget' => \@dget,
                      'ch' => \@changesopts,
                      'mergechanges' => \@mergechanges);
 
+our %opts_opt_cmdonly = ('gpg' => 1);
+
 our $keyid;
 
 our $debug = 0;
@@ -144,6 +146,8 @@ sub fetchspec () {
 #  > file begin changes
 #  [etc]
 #
+#  > param head HEAD
+#
 #  > want signed-tag
 #  [indicates that signed tag is wanted]
 #  < data-block NBYTES
@@ -152,11 +156,11 @@ sub fetchspec () {
 #  < data-end
 #  < files-end
 #
-#  > want signed-changes-dsc
-#  < data-block NBYTES    [transfer of signed changes]
-#  [etc]
+#  > want signed-dsc-changes
 #  < data-block NBYTES    [transfer of signed dsc]
 #  [etc]
+#  < data-block NBYTES    [transfer of signed changes]
+#  [etc]
 #  < files-end
 #
 #  > complete
@@ -1132,6 +1136,7 @@ sub sign_changes ($) {
     if ($sign) {
        my @debsign_cmd = @debsign;
        push @debsign_cmd, "-k$keyid" if defined $keyid;
+       push @debsign_cmd, "-p$pgp[0]" if $pgp[0] ne 'gpg';
        push @debsign_cmd, $changesfile;
        runcmd_ordryrun @debsign_cmd;
     }
@@ -1433,8 +1438,18 @@ sub i_resp_file ($) {
     protocol_receive_file \*RO, $localpath;
 }
 
+our %i_param;
+
+sub i_param ($) {
+    $_[0] =~ m/^(\S+) (.*)$/;
+    $i_param{$1} = $2;
+}
+
+our %i_wanted;
+
 sub i_resp_want ($) {
     my ($keyword) = @_;
+    die "$keyword ?" if $i_wanted{$keyword}++;
     my @localpaths = i_method "i_want_", $keyword;
     foreach my $localpath (@localpaths) {
        protocol_send_file \*RI, $localpath;
@@ -1453,6 +1468,28 @@ sub i_localname_dsc {
     return $dscfn;
 }
 
+sub i_want_signed_tag {
+    defined $i_param{'head'} && defined $dscfn
+       or badproto \*RO, "sequencing error";
+    my $head = $i_param{'head'};
+    die if $head =~ m/[^0-9a-f]/ || $head !~ m/^../;
+
+    push_parse_dsc $i_dscfn, 'remote dsc', 
+
+    push_mktag $head, $i_clogp, $i_tag,
+        $dsc, $i_dscfn,
+        'remote.changes', 'remote changes',
+        'tag.tag';
+
+    return 'tag.tag';
+}
+
+sub i_want_signed_dsc_changes {
+    rename "$i_dscfn.tmp","$i_dscfn" or die "$i_dscfn $!";
+    sign_changes 'remote.changes';
+    return ($i_dscfn, 'remote.changes');
+}
+
 #---------- building etc. ----------
 
 our $version;
@@ -1656,6 +1693,7 @@ sub parseopts () {
                push @ropts, $_;
                $om->[0] = $2;
            } elsif (m/^--(\w+):(.*)/s &&
+                    !$opts_opt_cmdonly{$1} &&
                     ($om = $opts_opt_map{$1})) {
                push @ropts, $_;
                push @$om, $2;