chiark / gitweb /
make $dsc implicit arg to push_mktag
[dgit.git] / dgit
diff --git a/dgit b/dgit
index 6ec99acb31c13b998bc7c3dcdd4c13620dcd7b03..81622398737251108dc3bab5478ff38d57cc4731 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -180,7 +180,6 @@ sub changedir ($) {
 sub badproto ($$) {
     my ($fh, $m) = @_;
     fail "connection lost: $!" if $fh->error;
-    fail "connection terminated" if $fh->eof;
     fail "protocol violation; $m not expected";
 }
 
@@ -208,9 +207,8 @@ sub protocol_send_file ($$) {
        die "$ourfn: $!" unless defined $got;
        last if !$got;
        print $fh "data-block ".length($d)."\n" or die $!;
-       print $d or die $!;
+       print $fh $d or die $!;
     }
-    PF->eof or die "$ourfn $!";
     PF->error and die "$ourfn $!";
     print $fh "data-end\n" or die $!;
     close PF;
@@ -249,7 +247,7 @@ sub responder_send_command ($) {
     return unless $we_are_responder;
     # called even without $we_are_responder
     printdebug "<< $command\n";
-    print $command, "\n" or die $!;
+    print PO $command, "\n" or die $!;
 }    
 
 sub responder_send_file ($$) {
@@ -257,7 +255,7 @@ sub responder_send_file ($$) {
     return unless $we_are_responder;
     printdebug "[[ $keyword $ourfn\n";
     responder_send_command "file $keyword";
-    protocol_send_file \*STDOUT, $ourfn;
+    protocol_send_file \*PO, $ourfn;
 }
 
 sub responder_receive_files ($@) {
@@ -266,9 +264,9 @@ sub responder_receive_files ($@) {
     printdebug "]] $keyword @ourfns\n";
     responder_send_command "want $keyword";
     foreach my $fn (@ourfns) {
-       protocol_receive_file \*STDIN, $fn;
+       protocol_receive_file \*PI, $fn;
     }
-    protocol_expect { m/^files-end$/ } \*STDIN;
+    protocol_expect { m/^files-end$/ } \*PI;
 }
 
 #---------- remote protocol support, initiator ----------
@@ -284,7 +282,7 @@ sub progress {
     if ($we_are_responder) {
        my $m = join '', @_;
        responder_send_command "progress ".length($m) or die $!;
-       print $m or die $!;
+       print PO $m or die $!;
     } else {
        print @_, "\n";
     }
@@ -1135,9 +1133,9 @@ sub push_parse_dsc ($$$) {
            " but debian/changelog is for $package $cversion";
 }
 
-sub push_mktag ($$$$$$$$) {
+sub push_mktag ($$$$$$$) {
     my ($head,$clogp,$tag,
-       $dsc,$dscfn,
+       $dscfn,
        $changesfile,$changesfilewhat,
        $tfn) = @_;
 
@@ -1264,13 +1262,14 @@ sub dopush () {
     }
 
     responder_send_file('changes',$changesfile);
+    responder_send_command("param head $head");
 
     my $tfn = sub { ".git/dgit/tag$_[0]"; };
     my ($tagobjfn) =
        $we_are_responder
        ? responder_receive_files('signed-tag', $tfn->('.signed.tmp'))
        : push_mktag($head,$clogp,$tag,
-                    $dsc,"../$dscfn",
+                    "../$dscfn",
                     $changesfile,$changesfile,
                                 $tfn);
 
@@ -1422,10 +1421,18 @@ sub cmd_remote_push_responder {
     die unless @rargs;
     my ($dir) = @rargs;
     $debugprefix = ' ';
-    changedir $dir;
     $we_are_responder = 1;
+
+    open PI, "<&STDIN" or die $!;
+    open STDIN, "/dev/null" or die $!;
+    open PO, ">&STDOUT" or die $!;
+    autoflush PO 1;
+    open STDOUT, ">&STDERR" or die $!;
     autoflush STDOUT 1;
+
     responder_send_command("dgit-remote-push-ready");
+
+    changedir $dir;
     &cmd_push;
 }
 
@@ -1521,8 +1528,8 @@ sub i_resp_file ($) {
 
 our %i_param;
 
-sub i_param ($) {
-    $_[0] =~ m/^(\S+) (.*)$/;
+sub i_resp_param ($) {
+    $_[0] =~ m/^(\S+) (.*)$/ or badproto \*RO, "bad param spec";
     $i_param{$1} = $2;
 }
 
@@ -1551,6 +1558,7 @@ sub i_localname_dsc {
 }
 
 sub i_want_signed_tag {
+    printdebug Dumper(\%i_param, $i_dscfn);
     defined $i_param{'head'} && defined $i_dscfn
        or badproto \*RO, "sequencing error";
     my $head = $i_param{'head'};
@@ -1559,7 +1567,7 @@ sub i_want_signed_tag {
     push_parse_dsc $i_dscfn, 'remote dsc', 
 
     push_mktag $head, $i_clogp, $i_tag,
-        $dsc, $i_dscfn,
+        $i_dscfn,
         'remote.changes', 'remote changes',
         'tag.tag';