Package: git
Version: 1:2.0.0-1
Severity: wishlist
Tags: upstream patch
Talking to a custom git server that has a separate quota for
negotiation:
$ git fetch origin; # https://<something>
fatal: git fetch_pack: expected ACK/NAK, got 'ERR User Is Over Quota'
fatal: The remote end hung up unexpectedly
Three buglets:
i. there's a s/-/_/ typo (and has always been, since v0.99~80, 2005-07-04).
ii. it would be nice to handle the ERR packet instead of showing it as an
internal error (git archive --remote already accepts an ERR packet
in the analagous context.)
iii. why the 'remote end hung up unexpectedly' message after fetch-pack
has already printed a message and died?
(ii) could be handled with a patch like the following:
-- >8 --
Subject: fetch-pack: handle "ERR" line during object negotiation
In addition to the current ACK / NACK responses, also accept ERR.
This produces a slightly nicer message when a (custom) server is
fed up with the client wasting its cycles during negotiation.
Before:
$ git fetch origin
fatal: git fetch_pack: expected ACK/NAK, got 'ERR User Is Over Quota'
fatal: The remote end hung up unexpectedly
After:
$ git fetch origin
fatal: remote error: User Is Over Quota
fatal: The remote end hung up unexpectedly
Getting rid of the spurious 'The remote end hung up' message is a
problem for another day.
Signed-off-by: Jonathan Nieder <[email protected]>
---
Documentation/technical/pack-protocol.txt | 2 +-
fetch-pack.c | 2 ++
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/Documentation/technical/pack-protocol.txt
b/Documentation/technical/pack-protocol.txt
index dc486b1..f097bcb 100644
--- a/Documentation/technical/pack-protocol.txt
+++ b/Documentation/technical/pack-protocol.txt
@@ -347,7 +347,7 @@ if there is no common base found.
Then the server will start sending its packfile data.
----
- server-response = *(ack_multi / ack / nak)
+ server-response = *(ack_multi / ack / nak / error-line)
ack_multi = PKT-LINE("ACK" SP obj-id ack_status LF)
ack_status = "continue" / "common" / "ready"
ack = PKT-LINE("ACK SP obj-id LF)
diff --git a/fetch-pack.c b/fetch-pack.c
index b8a58fa..ccf2fde 100644
--- a/fetch-pack.c
+++ b/fetch-pack.c
@@ -210,6 +210,8 @@ static enum ack_type get_ack(int fd, unsigned char
*result_sha1)
return ACK;
}
}
+ if (skip_prefix(line, "ERR ", &arg))
+ die("remote error: %s", arg);
die("git fetch_pack: expected ACK/NAK, got '%s'", line);
}
--
--
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]