diff options
author | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2019-07-17 13:28:06 +0100 |
---|---|---|
committer | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2019-07-17 13:33:01 +0100 |
commit | 5cecc26a9bb8f6478443fad2909ed0a3203a719d (patch) | |
tree | 689a90493696ec6b8672d1504eba8792a35f585d | |
parent | fdccbe592d6095c1f77fb25714e163c07ddd5342 (diff) |
Dgit.pm: printcmd: Print in one go
Sometimes this message is used to report failure of `git fetch' etc.
But when such operations fail, they may interleave output from the
remote git, which typically prints
fatal: The remote end hung up unexpectedly
(referring to the local end as the `remote' end, from its point
of view), after the the local end printed its message and failed.
This sets up a race between Dgit.pm's printcmd and the message from
the remote. If we're really unlucky, the remote's message interrupts
the output from printcmd.
We can avoid the within-line interleaving - at least, the interruption
of our message - by printing the whole message in one go, so do that.
(Strictly, the approach we use here only ensures that the message
appears in a single write(2) call if it fits in the stdio buffer.)
One of our test cases (tagupl) depends on this message not being split
and has a small chance of failing without this fix.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
-rw-r--r-- | Debian/Dgit.pm | 4 |
1 files changed, 1 insertions, 3 deletions
diff --git a/Debian/Dgit.pm b/Debian/Dgit.pm index 9c1a08e..d99e520 100644 --- a/Debian/Dgit.pm +++ b/Debian/Dgit.pm @@ -219,9 +219,7 @@ sub shellquote { sub printcmd { my $fh = shift @_; my $intro = shift @_; - print $fh $intro," " or confess "$!"; - print $fh shellquote @_ or confess "$!"; - print $fh "\n" or confess "$!"; + print $fh $intro." ".(join '', shellquote @_)."\n" or confess "$!"; } sub debugcmd { |