From: Junio C Hamano Date: Fri, 19 Aug 2016 20:31:27 GMT Subject: Re: [PATCH v8 7/8] cache: add empty_tree_oid object Message-ID: In-Reply-To: <20160819000031.24854-8-jacob.e.keller@intel.com> Jacob Keller writes: > From: Jacob Keller > > Add an empty_tree_oid object which can be used in place of > EMPTY_TREE_SHA1_BIN_LITERAL for code which is being converted to struct > object_id. How widely do you envision the users of this symbol would be spread across the entire codebase? I am debating myself if we need a singleton in-core copy like this (if we end up referring to it from everywhere), or we only need one level higher abstraction, e.g. "is_empty_tree_oid()" helper (in which case I do not think we even need a singleton; just imitate how is_empty_blob_sha1() is implemented). Even if we need such a singleton, I think we avoid ".field = value" struct initializations in our code. > > Signed-off-by: Jacob Keller > --- > cache.h | 2 ++ > sha1_file.c | 3 +++ > 2 files changed, 5 insertions(+) > > diff --git a/cache.h b/cache.h > index f30a4417efdf..da9f0be67d7b 100644 > --- a/cache.h > +++ b/cache.h > @@ -964,6 +964,8 @@ static inline void oidclr(struct object_id *oid) > #define EMPTY_BLOB_SHA1_BIN \ > ((const unsigned char *) EMPTY_BLOB_SHA1_BIN_LITERAL) > > +extern const struct object_id empty_tree_oid; > + > static inline int is_empty_blob_sha1(const unsigned char *sha1) > { > return !hashcmp(sha1, EMPTY_BLOB_SHA1_BIN); > diff --git a/sha1_file.c b/sha1_file.c > index 1e23fc186a02..10883d56a600 100644 > --- a/sha1_file.c > +++ b/sha1_file.c > @@ -38,6 +38,9 @@ static inline uintmax_t sz_fmt(size_t s) { return s; } > > const unsigned char null_sha1[20]; > const struct object_id null_oid; > +const struct object_id empty_tree_oid = { > + .hash = EMPTY_TREE_SHA1_BIN_LITERAL > +}; > > /* > * This is meant to hold a *small* number of objects that you would