This maps sha1 4b825dc642cb6eb9a060e54bf8d69288fbee4904 to the empty tree object, whether such an object exists in the object database or not. The empty tree is useful for showing some specialized diffs, especially for initial commits. We also hard-code the special ref '{}' as an alias for the empty tree. Users may refer to the empty tree by its sha1 or by '{}'. Thanks to Johannes Schindelin for the '{}' syntax and implementation. Signed-off-by: Jeff King <peff@xxxxxxxx> --- This is a cleaned-up version of what's in pu, along with the magic ref syntax from Johannes (2/2 will have the fixes to "git add -i"). cache.h | 5 +++++ sha1_file.c | 9 +++++++++ sha1_name.c | 5 +++++ 3 files changed, 19 insertions(+), 0 deletions(-) diff --git a/cache.h b/cache.h index 3867ba7..e3abbe1 100644 --- a/cache.h +++ b/cache.h @@ -253,6 +253,11 @@ static inline enum object_type object_type(unsigned int mode) #define INFOATTRIBUTES_FILE "info/attributes" #define ATTRIBUTE_MACRO_PREFIX "[attr]" +/* empty tree sha1: 4b825dc642cb6eb9a060e54bf8d69288fbee4904 */ +#define EMPTY_TREE_SHA1 \ + "\x4b\x82\x5d\xc6\x42\xcb\x6e\xb9\xa0\x60" \ + "\xe5\x4b\xf8\xd6\x92\x88\xfb\xee\x49\x04" + extern int is_bare_repository_cfg; extern int is_bare_repository(void); extern int is_inside_git_dir(void); diff --git a/sha1_file.c b/sha1_file.c index 66a4e00..8068a4b 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -1845,6 +1845,13 @@ static struct cached_object { } *cached_objects; static int cached_object_nr, cached_object_alloc; +static struct cached_object empty_tree = { + EMPTY_TREE_SHA1, + OBJ_TREE, + "", + 0 +}; + static struct cached_object *find_cached_object(const unsigned char *sha1) { int i; @@ -1854,6 +1861,8 @@ static struct cached_object *find_cached_object(const unsigned char *sha1) if (!hashcmp(co->sha1, sha1)) return co; } + if (!hashcmp(sha1, empty_tree.sha1)) + return &empty_tree; return NULL; } diff --git a/sha1_name.c b/sha1_name.c index be8489e..165aa7d 100644 --- a/sha1_name.c +++ b/sha1_name.c @@ -716,5 +716,10 @@ int get_sha1_with_mode(const char *name, unsigned char *sha1, unsigned *mode) return get_tree_entry(tree_sha1, cp+1, sha1, mode); } + if (ret && !strcmp(name, "{}")) { + *mode = 0755; + hashcpy(sha1, (unsigned char *)EMPTY_TREE_SHA1); + ret = 0; + } return ret; } -- 1.5.4.1.123.ge4e8d-dirty - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html