From: Linus Torvalds Date: Wed, 12 Jul 2006 03:45:31 +0000 (-0700) Subject: Remove TYPE_* constant macros and use object_type enums consistently. X-Git-Tag: v1.4.2-rc1~5^2~1 X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=1974632c664c2d573b36a00fa993c1c13dd8a967;p=git.git Remove TYPE_* constant macros and use object_type enums consistently. This updates the type-enumeration constants introduced to reduce the memory footprint of "struct object" to match the type bits already used in the packfile format, by removing the former (i.e. TYPE_* constant macros) and using the latter (i.e. enum object_type) throughout the code for consistency. Eventually we can stop passing around the "type strings" entirely, and this will help - no confusion about two different integer enumeration. Signed-off-by: Linus Torvalds Signed-off-by: Junio C Hamano --- diff --git a/blob.c b/blob.c index 496f27004..d1af2e62f 100644 --- a/blob.c +++ b/blob.c @@ -10,12 +10,12 @@ struct blob *lookup_blob(const unsigned char *sha1) if (!obj) { struct blob *ret = alloc_blob_node(); created_object(sha1, &ret->object); - ret->object.type = TYPE_BLOB; + ret->object.type = OBJ_BLOB; return ret; } if (!obj->type) - obj->type = TYPE_BLOB; - if (obj->type != TYPE_BLOB) { + obj->type = OBJ_BLOB; + if (obj->type != OBJ_BLOB) { error("Object %s is a %s, not a blob", sha1_to_hex(sha1), typename(obj->type)); return NULL; diff --git a/builtin-diff.c b/builtin-diff.c index ae901dd25..cb38f4456 100644 --- a/builtin-diff.c +++ b/builtin-diff.c @@ -285,9 +285,9 @@ int cmd_diff(int argc, const char **argv, char **envp) obj = deref_tag(obj, NULL, 0); if (!obj) die("invalid object '%s' given.", name); - if (obj->type == TYPE_COMMIT) + if (obj->type == OBJ_COMMIT) obj = &((struct commit *)obj)->tree->object; - if (obj->type == TYPE_TREE) { + if (obj->type == OBJ_TREE) { if (ARRAY_SIZE(ent) <= ents) die("more than %d trees given: '%s'", (int) ARRAY_SIZE(ent), name); @@ -297,7 +297,7 @@ int cmd_diff(int argc, const char **argv, char **envp) ents++; continue; } - if (obj->type == TYPE_BLOB) { + if (obj->type == OBJ_BLOB) { if (2 <= blobs) die("more than two blobs given: '%s'", name); memcpy(blob[blobs].sha1, obj->sha1, 20); diff --git a/builtin-fmt-merge-msg.c b/builtin-fmt-merge-msg.c index fe0ef44b4..f20b27b8a 100644 --- a/builtin-fmt-merge-msg.c +++ b/builtin-fmt-merge-msg.c @@ -181,7 +181,7 @@ static void shortlog(const char *name, unsigned char *sha1, int flags = UNINTERESTING | TREECHANGE | SEEN | SHOWN | ADDED; branch = deref_tag(parse_object(sha1), sha1_to_hex(sha1), 40); - if (!branch || branch->type != TYPE_COMMIT) + if (!branch || branch->type != OBJ_COMMIT) return; setup_revisions(0, NULL, rev, NULL); diff --git a/builtin-grep.c b/builtin-grep.c index 4c2f7dfe0..a79bac305 100644 --- a/builtin-grep.c +++ b/builtin-grep.c @@ -891,9 +891,9 @@ static int grep_tree(struct grep_opt *opt, const char **paths, static int grep_object(struct grep_opt *opt, const char **paths, struct object *obj, const char *name) { - if (obj->type == TYPE_BLOB) + if (obj->type == OBJ_BLOB) return grep_sha1(opt, obj->sha1, name); - if (obj->type == TYPE_COMMIT || obj->type == TYPE_TREE) { + if (obj->type == OBJ_COMMIT || obj->type == OBJ_TREE) { struct tree_desc tree; void *data; int hit; diff --git a/builtin-rev-list.c b/builtin-rev-list.c index 63bad0e96..8f3287133 100644 --- a/builtin-rev-list.c +++ b/builtin-rev-list.c @@ -167,16 +167,16 @@ static void show_commit_list(struct rev_info *revs) const char *name = pending->name; if (obj->flags & (UNINTERESTING | SEEN)) continue; - if (obj->type == TYPE_TAG) { + if (obj->type == OBJ_TAG) { obj->flags |= SEEN; add_object_array(obj, name, &objects); continue; } - if (obj->type == TYPE_TREE) { + if (obj->type == OBJ_TREE) { process_tree((struct tree *)obj, &objects, NULL, name); continue; } - if (obj->type == TYPE_BLOB) { + if (obj->type == OBJ_BLOB) { process_blob((struct blob *)obj, &objects, NULL, name); continue; } diff --git a/commit.c b/commit.c index 522a6f3ac..4c5aac876 100644 --- a/commit.c +++ b/commit.c @@ -56,7 +56,7 @@ static struct commit *check_commit(struct object *obj, const unsigned char *sha1, int quiet) { - if (obj->type != TYPE_COMMIT) { + if (obj->type != OBJ_COMMIT) { if (!quiet) error("Object %s is a %s, not a commit", sha1_to_hex(sha1), typename(obj->type)); @@ -86,11 +86,11 @@ struct commit *lookup_commit(const unsigned char *sha1) if (!obj) { struct commit *ret = alloc_commit_node(); created_object(sha1, &ret->object); - ret->object.type = TYPE_COMMIT; + ret->object.type = OBJ_COMMIT; return ret; } if (!obj->type) - obj->type = TYPE_COMMIT; + obj->type = OBJ_COMMIT; return check_commit(obj, sha1, 0); } diff --git a/describe.c b/describe.c index 8e68d5df3..324ca8965 100644 --- a/describe.c +++ b/describe.c @@ -67,7 +67,7 @@ static int get_name(const char *path, const unsigned char *sha1) * Otherwise only annotated tags are used. */ if (!strncmp(path, "refs/tags/", 10)) { - if (object->type == TYPE_TAG) + if (object->type == OBJ_TAG) prio = 2; else prio = 1; diff --git a/fetch-pack.c b/fetch-pack.c index f2c51ebe4..b7824dbed 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -46,7 +46,7 @@ static int rev_list_insert_ref(const char *path, const unsigned char *sha1) { struct object *o = deref_tag(parse_object(sha1), path, 0); - if (o && o->type == TYPE_COMMIT) + if (o && o->type == OBJ_COMMIT) rev_list_push((struct commit *)o, SEEN); return 0; @@ -256,14 +256,14 @@ static int mark_complete(const char *path, const unsigned char *sha1) { struct object *o = parse_object(sha1); - while (o && o->type == TYPE_TAG) { + while (o && o->type == OBJ_TAG) { struct tag *t = (struct tag *) o; if (!t->tagged) break; /* broken repository */ o->flags |= COMPLETE; o = parse_object(t->tagged->sha1); } - if (o && o->type == TYPE_COMMIT) { + if (o && o->type == OBJ_COMMIT) { struct commit *commit = (struct commit *)o; commit->object.flags |= COMPLETE; insert_by_date(commit, &complete); @@ -357,7 +357,7 @@ static int everything_local(struct ref **refs, int nr_match, char **match) * in sync with the other side at some time after * that (it is OK if we guess wrong here). */ - if (o->type == TYPE_COMMIT) { + if (o->type == OBJ_COMMIT) { struct commit *commit = (struct commit *)o; if (!cutoff || cutoff < commit->date) cutoff = commit->date; @@ -376,7 +376,7 @@ static int everything_local(struct ref **refs, int nr_match, char **match) struct object *o = deref_tag(lookup_object(ref->old_sha1), NULL, 0); - if (!o || o->type != TYPE_COMMIT || !(o->flags & COMPLETE)) + if (!o || o->type != OBJ_COMMIT || !(o->flags & COMPLETE)) continue; if (!(o->flags & SEEN)) { diff --git a/fetch.c b/fetch.c index 238032b79..989d7a478 100644 --- a/fetch.c +++ b/fetch.c @@ -118,20 +118,20 @@ static struct object_list **process_queue_end = &process_queue; static int process_object(struct object *obj) { - if (obj->type == TYPE_COMMIT) { + if (obj->type == OBJ_COMMIT) { if (process_commit((struct commit *)obj)) return -1; return 0; } - if (obj->type == TYPE_TREE) { + if (obj->type == OBJ_TREE) { if (process_tree((struct tree *)obj)) return -1; return 0; } - if (obj->type == TYPE_BLOB) { + if (obj->type == OBJ_BLOB) { return 0; } - if (obj->type == TYPE_TAG) { + if (obj->type == OBJ_TAG) { if (process_tag((struct tag *)obj)) return -1; return 0; diff --git a/fsck-objects.c b/fsck-objects.c index ef54a8a41..e167f4105 100644 --- a/fsck-objects.c +++ b/fsck-objects.c @@ -297,13 +297,13 @@ static int fsck_sha1(unsigned char *sha1) if (obj->flags & SEEN) return 0; obj->flags |= SEEN; - if (obj->type == TYPE_BLOB) + if (obj->type == OBJ_BLOB) return 0; - if (obj->type == TYPE_TREE) + if (obj->type == OBJ_TREE) return fsck_tree((struct tree *) obj); - if (obj->type == TYPE_COMMIT) + if (obj->type == OBJ_COMMIT) return fsck_commit((struct commit *) obj); - if (obj->type == TYPE_TAG) + if (obj->type == OBJ_TAG) return fsck_tag((struct tag *) obj); /* By now, parse_object() would've returned NULL instead. */ return objerror(obj, "unknown type '%d' (internal fsck error)", obj->type); @@ -472,7 +472,7 @@ static int fsck_cache_tree(struct cache_tree *it) } mark_reachable(obj, REACHABLE); obj->used = 1; - if (obj->type != TYPE_TREE) + if (obj->type != OBJ_TREE) err |= objerror(obj, "non-tree in cache-tree"); } for (i = 0; i < it->subtree_nr; i++) diff --git a/http-push.c b/http-push.c index f761584d7..47686195c 100644 --- a/http-push.c +++ b/http-push.c @@ -1784,16 +1784,16 @@ static int get_delta(struct rev_info *revs, struct remote_lock *lock) if (obj->flags & (UNINTERESTING | SEEN)) continue; - if (obj->type == TYPE_TAG) { + if (obj->type == OBJ_TAG) { obj->flags |= SEEN; p = add_one_object(obj, p); continue; } - if (obj->type == TYPE_TREE) { + if (obj->type == OBJ_TREE) { p = process_tree((struct tree *)obj, p, NULL, name); continue; } - if (obj->type == TYPE_BLOB) { + if (obj->type == OBJ_BLOB) { p = process_blob((struct blob *)obj, p, NULL, name); continue; } @@ -1960,12 +1960,12 @@ static int ref_newer(const unsigned char *new_sha1, * old. Otherwise we require --force. */ o = deref_tag(parse_object(old_sha1), NULL, 0); - if (!o || o->type != TYPE_COMMIT) + if (!o || o->type != OBJ_COMMIT) return 0; old = (struct commit *) o; o = deref_tag(parse_object(new_sha1), NULL, 0); - if (!o || o->type != TYPE_COMMIT) + if (!o || o->type != OBJ_COMMIT) return 0; new = (struct commit *) o; @@ -2044,7 +2044,7 @@ static void add_remote_info_ref(struct remote_ls_ctx *ls) fwrite_buffer(ref_info, 1, len, buf); free(ref_info); - if (o->type == TYPE_TAG) { + if (o->type == OBJ_TAG) { o = deref_tag(o, ls->dentry_name, 0); if (o) { len = strlen(ls->dentry_name) + 45; diff --git a/name-rev.c b/name-rev.c index 083d067e1..f92f14e32 100644 --- a/name-rev.c +++ b/name-rev.c @@ -84,14 +84,14 @@ static int name_ref(const char *path, const unsigned char *sha1) if (tags_only && strncmp(path, "refs/tags/", 10)) return 0; - while (o && o->type == TYPE_TAG) { + while (o && o->type == OBJ_TAG) { struct tag *t = (struct tag *) o; if (!t->tagged) break; /* broken repository */ o = parse_object(t->tagged->sha1); deref = 1; } - if (o && o->type == TYPE_COMMIT) { + if (o && o->type == OBJ_COMMIT) { struct commit *commit = (struct commit *)o; if (!strncmp(path, "refs/heads/", 11)) @@ -111,7 +111,7 @@ static const char* get_rev_name(struct object *o) struct rev_name *n; struct commit *c; - if (o->type != TYPE_COMMIT) + if (o->type != OBJ_COMMIT) return "undefined"; c = (struct commit *) o; n = c->util; @@ -172,7 +172,7 @@ int main(int argc, char **argv) } o = deref_tag(parse_object(sha1), *argv, 0); - if (!o || o->type != TYPE_COMMIT) { + if (!o || o->type != OBJ_COMMIT) { fprintf(stderr, "Could not get commit for %s. Skipping.\n", *argv); continue; diff --git a/object.c b/object.c index 37277f943..b5d8ed467 100644 --- a/object.c +++ b/object.c @@ -19,7 +19,8 @@ struct object *get_indexed_object(unsigned int idx) } const char *type_names[] = { - "none", "blob", "tree", "commit", "bad" + "none", "commit", "tree", "blob", "tag", + "bad type 5", "bad type 6", "delta", "bad", }; static unsigned int hash_obj(struct object *obj, unsigned int n) @@ -88,7 +89,7 @@ void created_object(const unsigned char *sha1, struct object *obj) { obj->parsed = 0; obj->used = 0; - obj->type = TYPE_NONE; + obj->type = OBJ_NONE; obj->flags = 0; memcpy(obj->sha1, sha1, 20); @@ -131,7 +132,7 @@ struct object *lookup_unknown_object(const unsigned char *sha1) if (!obj) { union any_object *ret = xcalloc(1, sizeof(*ret)); created_object(sha1, &ret->object); - ret->object.type = TYPE_NONE; + ret->object.type = OBJ_NONE; return &ret->object; } return obj; diff --git a/object.h b/object.h index e0125e154..733faac4c 100644 --- a/object.h +++ b/object.h @@ -24,12 +24,19 @@ struct object_array { #define TYPE_BITS 3 #define FLAG_BITS 27 -#define TYPE_NONE 0 -#define TYPE_BLOB 1 -#define TYPE_TREE 2 -#define TYPE_COMMIT 3 -#define TYPE_TAG 4 -#define TYPE_BAD 5 +/* + * The object type is stored in 3 bits. + */ +enum object_type { + OBJ_NONE = 0, + OBJ_COMMIT = 1, + OBJ_TREE = 2, + OBJ_BLOB = 3, + OBJ_TAG = 4, + /* 5/6 for future expansion */ + OBJ_DELTA = 7, + OBJ_BAD, +}; struct object { unsigned parsed : 1; @@ -40,14 +47,14 @@ struct object { }; extern int track_object_refs; -extern const char *type_names[]; +extern const char *type_names[9]; extern unsigned int get_max_object_index(void); extern struct object *get_indexed_object(unsigned int); static inline const char *typename(unsigned int type) { - return type_names[type > TYPE_TAG ? TYPE_BAD : type]; + return type_names[type > OBJ_BAD ? OBJ_BAD : type]; } extern struct object_refs *lookup_object_refs(struct object *); diff --git a/pack.h b/pack.h index 694e0c56f..eb07b033a 100644 --- a/pack.h +++ b/pack.h @@ -1,20 +1,7 @@ #ifndef PACK_H #define PACK_H -/* - * The packed object type is stored in 3 bits. - * The type value 0 is a reserved prefix if ever there is more than 7 - * object types, or any future format extensions. - */ -enum object_type { - OBJ_EXT = 0, - OBJ_COMMIT = 1, - OBJ_TREE = 2, - OBJ_BLOB = 3, - OBJ_TAG = 4, - /* 5/6 for future expansion */ - OBJ_DELTA = 7, -}; +#include "object.h" /* * Packed object header diff --git a/revision.c b/revision.c index 7df9089f5..874e349db 100644 --- a/revision.c +++ b/revision.c @@ -135,7 +135,7 @@ static struct commit *handle_commit(struct rev_info *revs, struct object *object /* * Tag object? Look what it points to.. */ - while (object->type == TYPE_TAG) { + while (object->type == OBJ_TAG) { struct tag *tag = (struct tag *) object; if (revs->tag_objects && !(flags & UNINTERESTING)) add_pending_object(revs, object, tag->tag); @@ -148,7 +148,7 @@ static struct commit *handle_commit(struct rev_info *revs, struct object *object * Commit object? Just return it, we'll do all the complex * reachability crud. */ - if (object->type == TYPE_COMMIT) { + if (object->type == OBJ_COMMIT) { struct commit *commit = (struct commit *)object; if (parse_commit(commit) < 0) die("unable to parse commit %s", name); @@ -164,7 +164,7 @@ static struct commit *handle_commit(struct rev_info *revs, struct object *object * Tree object? Either mark it uniniteresting, or add it * to the list of objects to look at later.. */ - if (object->type == TYPE_TREE) { + if (object->type == OBJ_TREE) { struct tree *tree = (struct tree *)object; if (!revs->tree_objects) return NULL; @@ -179,7 +179,7 @@ static struct commit *handle_commit(struct rev_info *revs, struct object *object /* * Blob object? You know the drill by now.. */ - if (object->type == TYPE_BLOB) { + if (object->type == OBJ_BLOB) { struct blob *blob = (struct blob *)object; if (!revs->blob_objects) return NULL; @@ -494,11 +494,11 @@ static int add_parents_only(struct rev_info *revs, const char *arg, int flags) return 0; while (1) { it = get_reference(revs, arg, sha1, 0); - if (it->type != TYPE_TAG) + if (it->type != OBJ_TAG) break; memcpy(sha1, ((struct tag*)it)->tagged->sha1, 20); } - if (it->type != TYPE_COMMIT) + if (it->type != OBJ_COMMIT) return 0; commit = (struct commit *)it; for (parents = commit->parents; parents; parents = parents->next) { diff --git a/send-pack.c b/send-pack.c index 4019a4b98..10bc8bc35 100644 --- a/send-pack.c +++ b/send-pack.c @@ -151,12 +151,12 @@ static int ref_newer(const unsigned char *new_sha1, * old. Otherwise we require --force. */ o = deref_tag(parse_object(old_sha1), NULL, 0); - if (!o || o->type != TYPE_COMMIT) + if (!o || o->type != OBJ_COMMIT) return 0; old = (struct commit *) o; o = deref_tag(parse_object(new_sha1), NULL, 0); - if (!o || o->type != TYPE_COMMIT) + if (!o || o->type != OBJ_COMMIT) return 0; new = (struct commit *) o; diff --git a/server-info.c b/server-info.c index fdfe05a2d..7df628f2b 100644 --- a/server-info.c +++ b/server-info.c @@ -12,7 +12,7 @@ static int add_info_ref(const char *path, const unsigned char *sha1) struct object *o = parse_object(sha1); fprintf(info_ref_fp, "%s %s\n", sha1_to_hex(sha1), path); - if (o->type == TYPE_TAG) { + if (o->type == OBJ_TAG) { o = deref_tag(o, path, 0); if (o) fprintf(info_ref_fp, "%s %s^{}\n", diff --git a/sha1_name.c b/sha1_name.c index f2cbafa49..5fe8e5d4b 100644 --- a/sha1_name.c +++ b/sha1_name.c @@ -381,13 +381,13 @@ static int peel_onion(const char *name, int len, unsigned char *sha1) sp++; /* beginning of type name, or closing brace for empty */ if (!strncmp(commit_type, sp, 6) && sp[6] == '}') - expected_type = TYPE_COMMIT; + expected_type = OBJ_COMMIT; else if (!strncmp(tree_type, sp, 4) && sp[4] == '}') - expected_type = TYPE_TREE; + expected_type = OBJ_TREE; else if (!strncmp(blob_type, sp, 4) && sp[4] == '}') - expected_type = TYPE_BLOB; + expected_type = OBJ_BLOB; else if (sp[0] == '}') - expected_type = TYPE_NONE; + expected_type = OBJ_NONE; else return -1; @@ -416,9 +416,9 @@ static int peel_onion(const char *name, int len, unsigned char *sha1) memcpy(sha1, o->sha1, 20); return 0; } - if (o->type == TYPE_TAG) + if (o->type == OBJ_TAG) o = ((struct tag*) o)->tagged; - else if (o->type == TYPE_COMMIT) + else if (o->type == OBJ_COMMIT) o = &(((struct commit *) o)->tree->object); else return error("%.*s: expected %s type, but the object dereferences to %s type", diff --git a/tag.c b/tag.c index 74d0dabe5..864ac1bb6 100644 --- a/tag.c +++ b/tag.c @@ -5,7 +5,7 @@ const char *tag_type = "tag"; struct object *deref_tag(struct object *o, const char *warn, int warnlen) { - while (o && o->type == TYPE_TAG) + while (o && o->type == OBJ_TAG) o = parse_object(((struct tag *)o)->tagged->sha1); if (!o && warn) { if (!warnlen) @@ -21,12 +21,12 @@ struct tag *lookup_tag(const unsigned char *sha1) if (!obj) { struct tag *ret = alloc_tag_node(); created_object(sha1, &ret->object); - ret->object.type = TYPE_TAG; + ret->object.type = OBJ_TAG; return ret; } if (!obj->type) - obj->type = TYPE_TAG; - if (obj->type != TYPE_TAG) { + obj->type = OBJ_TAG; + if (obj->type != OBJ_TAG) { error("Object %s is a %s, not a tree", sha1_to_hex(sha1), typename(obj->type)); return NULL; diff --git a/tree.c b/tree.c index 10236555c..a6032e35e 100644 --- a/tree.c +++ b/tree.c @@ -131,12 +131,12 @@ struct tree *lookup_tree(const unsigned char *sha1) if (!obj) { struct tree *ret = alloc_tree_node(); created_object(sha1, &ret->object); - ret->object.type = TYPE_TREE; + ret->object.type = OBJ_TREE; return ret; } if (!obj->type) - obj->type = TYPE_TREE; - if (obj->type != TYPE_TREE) { + obj->type = OBJ_TREE; + if (obj->type != OBJ_TREE) { error("Object %s is a %s, not a tree", sha1_to_hex(sha1), typename(obj->type)); return NULL; @@ -216,11 +216,11 @@ struct tree *parse_tree_indirect(const unsigned char *sha1) do { if (!obj) return NULL; - if (obj->type == TYPE_TREE) + if (obj->type == OBJ_TREE) return (struct tree *) obj; - else if (obj->type == TYPE_COMMIT) + else if (obj->type == OBJ_COMMIT) obj = &(((struct commit *) obj)->tree->object); - else if (obj->type == TYPE_TAG) + else if (obj->type == OBJ_TAG) obj = ((struct tag *) obj)->tagged; else return NULL; diff --git a/upload-pack.c b/upload-pack.c index b18eb9ba0..2e820c9c8 100644 --- a/upload-pack.c +++ b/upload-pack.c @@ -326,7 +326,7 @@ static int got_sha1(char *hex, unsigned char *sha1) o = parse_object(sha1); if (!o) die("oops (%s)", sha1_to_hex(sha1)); - if (o->type == TYPE_COMMIT) { + if (o->type == OBJ_COMMIT) { struct commit_list *parents; if (o->flags & THEY_HAVE) return 0; @@ -457,7 +457,7 @@ static int send_ref(const char *refname, const unsigned char *sha1) o->flags |= OUR_REF; nr_our_refs++; } - if (o->type == TYPE_TAG) { + if (o->type == OBJ_TAG) { o = deref_tag(o, refname, 0); packet_write(1, "%s %s^{}\n", sha1_to_hex(o->sha1), refname); }