From a69d09436687746a898f86f32c180083f323b616 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Tue, 28 Jun 2005 09:58:23 -0700 Subject: [PATCH] Teach packing about "tag" objects (And teach sha1_file and unpack-object know how to unpack them too, of course) --- pack-objects.c | 28 +++++++++++++++------------- sha1_file.c | 6 ++++++ unpack-objects.c | 3 ++- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/pack-objects.c b/pack-objects.c index 62ed265437..90b27c60c3 100644 --- a/pack-objects.c +++ b/pack-objects.c @@ -6,21 +6,21 @@ static const char pack_usage[] = "git-pack-objects [--window=N] [--depth=N] base-name < object-list"; -enum object_type { - OBJ_NONE, - OBJ_COMMIT, - OBJ_TREE, - OBJ_BLOB, - OBJ_DELTA -}; - +/* + * The object type is a single-character shorthand: + * - 'C' for "Commit" + * - 'T' for "Tree" + * - 'B' for "Blob" + * - 'G' for "taG" + * - 'D' for "Delta" + */ struct object_entry { unsigned char sha1[20]; unsigned long size; unsigned long offset; unsigned int depth; unsigned int hash; - enum object_type type; + unsigned char type; unsigned long delta_size; struct object_entry *delta; }; @@ -67,7 +67,7 @@ static unsigned long write_object(struct sha1file *f, struct object_entry *entry * length, except for deltas that has the 20 bytes of delta sha * instead. */ - header[0] = ".CTB"[entry->type]; + header[0] = entry->type; hdrlen = 5; if (entry->delta) { header[0] = 'D'; @@ -164,11 +164,13 @@ static void check_object(struct object_entry *entry) if (!sha1_object_info(entry->sha1, type, &entry->size)) { if (!strcmp(type, "commit")) { - entry->type = OBJ_COMMIT; + entry->type = 'C'; } else if (!strcmp(type, "tree")) { - entry->type = OBJ_TREE; + entry->type = 'T'; } else if (!strcmp(type, "blob")) { - entry->type = OBJ_BLOB; + entry->type = 'B'; + } else if (!strcmp(type, "tag")) { + entry->type = 'G'; } else die("unable to pack object %s of type %s", sha1_to_hex(entry->sha1), type); diff --git a/sha1_file.c b/sha1_file.c index 5695c962fe..e27affb288 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -695,6 +695,9 @@ static int packed_object_info(struct pack_entry *entry, case 'B': strcpy(type, "blob"); break; + case 'G': + strcpy(type, "tag"); + break; default: die("corrupted pack file"); } @@ -807,6 +810,9 @@ static void *unpack_entry(struct pack_entry *entry, case 'B': strcpy(type, "blob"); break; + case 'G': + strcpy(type, "tag"); + break; default: die("corrupted pack file"); } diff --git a/unpack-objects.c b/unpack-objects.c index a792b92ece..57f3c9b6bb 100644 --- a/unpack-objects.c +++ b/unpack-objects.c @@ -124,6 +124,7 @@ static int unpack_non_delta_entry(struct pack_entry *entry, case 'C': type_s = "commit"; break; case 'T': type_s = "tree"; break; case 'B': type_s = "blob"; break; + case 'G': type_s = "tag"; break; default: goto err_finish; } if (write_sha1_file(buffer, size, type_s, sha1) < 0) @@ -249,7 +250,7 @@ static void unpack_entry(struct pack_entry *entry) size = (pack[1] << 24) + (pack[2] << 16) + (pack[3] << 8) + pack[4]; left = pack_size - offset - 5; switch (*pack) { - case 'C': case 'T': case 'B': + case 'C': case 'T': case 'B': case 'G': unpack_non_delta_entry(entry, *pack, pack+5, size, left); break; case 'D': -- 2.11.4.GIT