summaryrefslogtreecommitdiff
path: root/sha1_file.c
diff options
context:
space:
mode:
authorShawn O. Pearce <spearce@spearce.org>2007-01-17 20:43:57 -0500
committerJunio C Hamano <junkio@cox.net>2007-01-17 20:51:45 -0800
commitdf1b059d8dd5c16edaa98d7da842b2a32c01e526 (patch)
tree93f971286c5cf0a1c1b197e08dbf071b05f8644c /sha1_file.c
parent41a5564e054043945e365c580abab724e12744ff (diff)
downloadgit-df1b059d8dd5c16edaa98d7da842b2a32c01e526.tar.gz
Document pack .idx file format upgrade strategy.
Way back when Junio developed the 64 bit index topic he came up with a means of changing the .idx file format so that older Git clients would recognize that they don't understand the file and refuse to read it, while newer clients could tell the difference between the old-style and new-style .idx files. Unfortunately this wasn't recorded anywhere. This change documents how we might go about changing the .idx file format by using a special signature in the first four bytes. Credit (and possible blame) goes completely to Junio for thinking up this technique. The change also modifies the error message of the current Git code so that users get a recommendation to upgrade their Git software should this version or later encounter a new-style .idx which it cannot process. We already do this for the .pack files, but since we usually process the .idx files first its important that these files are recognized and encourage an upgrade. Signed-off-by: Shawn O. Pearce <spearce@spearce.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'sha1_file.c')
-rw-r--r--sha1_file.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/sha1_file.c b/sha1_file.c
index 1b1c0f7b4d..0b70545562 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -456,12 +456,23 @@ static int check_packed_git_idx(const char *path, unsigned long *idx_size_,
/* check index map */
if (idx_size < 4*256 + 20 + 20)
- return error("index file too small");
+ return error("index file %s is too small", path);
+
+ /* a future index format would start with this, as older git
+ * binaries would fail the non-monotonic index check below.
+ * give a nicer warning to the user if we can.
+ */
+ if (index[0] == htonl(PACK_IDX_SIGNATURE))
+ return error("index file %s is a newer version"
+ " and is not supported by this binary"
+ " (try upgrading GIT to a newer version)",
+ path);
+
nr = 0;
for (i = 0; i < 256; i++) {
unsigned int n = ntohl(index[i]);
if (n < nr)
- return error("non-monotonic index");
+ return error("non-monotonic index %s", path);
nr = n;
}
@@ -473,7 +484,7 @@ static int check_packed_git_idx(const char *path, unsigned long *idx_size_,
* - 20-byte SHA1 file checksum
*/
if (idx_size != 4*256 + nr * 24 + 20 + 20)
- return error("wrong index file size");
+ return error("wrong index file size in %s", path);
return 0;
}