[PATCH 1/3] fast-import: extract object preparation function
- From
Dmitry Ivankov <divanorama@gmail.com>
- Date
- Aug 12, 2011, 10:32 UTC
- Message-ID
- <1313145170-24471-2-git-send-email-divanorama@gmail.com>
- In-Reply-To
- <1313145170-24471-1-git-send-email-divanorama@gmail.com>
We're constructing raw objects and compute their sha1's in fast-import just before saving them.
Extract header and sha1 computations so that we can get sha1 without actually saving the object.
Signed-off-by: Dmitry Ivankov <divanorama@gmail.com> --- fast-import.c | 32 +++++++++++++++++++++++++------- 1 files changed, 25 insertions(+), 7 deletions(-)
diff --git a/fast-import.c b/fast-import.c index 7cc2262..d0f8580 100644 --- a/fast-import.c +++ b/fast-import.c @@ -1006,6 +1006,30 @@ static void cycle_packfile(void) start_packfile(); } +static void prepare_object_hash( + enum object_type type, + struct strbuf *dat, + unsigned char *hdr_out, + unsigned long *hdrlen_out, + unsigned char *sha1_out +) +{ + unsigned char hdr_[96]; + unsigned char *hdr = hdr_out ? hdr_out : hdr_; + unsigned long hdrlen; + git_SHA_CTX c; + + hdrlen = sprintf((char *)hdr,"%s %lu", typename(type), + (unsigned long)dat->len) + 1; + git_SHA1_Init(&c); + git_SHA1_Update(&c, hdr, hdrlen); + git_SHA1_Update(&c, dat->buf, dat->len); + git_SHA1_Final(sha1_out, &c); + + if (hdrlen_out) + *hdrlen_out = hdrlen; +} + static int store_object( enum object_type type, struct strbuf *dat, @@ -1018,15 +1042,9 @@ static int store_object( unsigned char hdr[96]; unsigned char sha1[20]; unsigned long hdrlen, deltalen; - git_SHA_CTX c; git_zstream s; - hdrlen = sprintf((char *)hdr,"%s %lu", typename(type), - (unsigned long)dat->len) + 1; - git_SHA1_Init(&c); - git_SHA1_Update(&c, hdr, hdrlen); - git_SHA1_Update(&c, dat->buf, dat->len); - git_SHA1_Final(sha1, &c); + prepare_object_hash(type, dat, hdr, &hdrlen, sha1); if (sha1out) hashcpy(sha1out, sha1);
-- 1.7.3.4