Skip to content

Commit 8e2c7be

Browse files
jonathantanmygitster
authored andcommitted
fetch-pack: show clearer error message upon ERR
Currently, fetch-pack prints a confusing error message ("expected ACK/NAK") when the server it's communicating with sends a pkt-line starting with "ERR". Replace it with a less confusing error message. Also update the documentation describing the fetch-pack/upload-pack protocol (pack-protocol.txt) to indicate that "ERR" can be sent in the place of "ACK" or "NAK". In practice, this has been done for quite some time by other Git implementations (e.g. JGit sends "want $id not valid") and by Git itself (since commit bdb31ea: "upload-pack: report "not our ref" to client", 2017-02-23) whenever a "want" line references an object that it does not have. (This is uncommon, but can happen if a repository is garbage-collected during a negotiation.) Signed-off-by: Jonathan Tan <[email protected]> Reviewed-by: Jonathan Nieder <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 49800c9 commit 8e2c7be

File tree

2 files changed

+8
-1
lines changed

2 files changed

+8
-1
lines changed

Documentation/technical/pack-protocol.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -351,14 +351,19 @@ ACK after 'done' if there is at least one common base and multi_ack or
351351
multi_ack_detailed is enabled. The server always sends NAK after 'done'
352352
if there is no common base found.
353353

354+
Instead of 'ACK' or 'NAK', the server may send an error message (for
355+
example, if it does not recognize an object in a 'want' line received
356+
from the client).
357+
354358
Then the server will start sending its packfile data.
355359

356360
----
357-
server-response = *ack_multi ack / nak
361+
server-response = *ack_multi ack / nak / error-line
358362
ack_multi = PKT-LINE("ACK" SP obj-id ack_status)
359363
ack_status = "continue" / "common" / "ready"
360364
ack = PKT-LINE("ACK" SP obj-id)
361365
nak = PKT-LINE("NAK")
366+
error-line = PKT-LINE("ERR" SP explanation-text)
362367
----
363368

364369
A simple clone may look like this (with no 'have' lines):

fetch-pack.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,8 @@ static enum ack_type get_ack(int fd, unsigned char *result_sha1)
240240
return ACK;
241241
}
242242
}
243+
if (skip_prefix(line, "ERR ", &arg))
244+
die(_("remote error: %s"), arg);
243245
die(_("git fetch-pack: expected ACK/NAK, got '%s'"), line);
244246
}
245247

0 commit comments

Comments
 (0)