Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- read-cache.c | 26 ++++++++++++++++++-------- 1 files changed, 18 insertions(+), 8 deletions(-) diff --git a/read-cache.c b/read-cache.c index 2dbf923..7b9a989 100644 --- a/read-cache.c +++ b/read-cache.c @@ -1521,12 +1521,19 @@ static void ce_smudge_racily_clean_entry(struct cache_entry *ce) } } -static int ce_write_entry(git_SHA_CTX *c, int fd, struct cache_entry *ce) +static int ce_prepare_ondisk_entry(struct cache_entry *ce, + void **ondisk_p, int *ondisk_size) { int size = ondisk_ce_size(ce); - struct ondisk_cache_entry *ondisk = xcalloc(1, size); + struct ondisk_cache_entry *ondisk; char *name; - int result; + + if (size <= *ondisk_size) + ondisk = *ondisk_p; + else { + ondisk = *ondisk_p = xrealloc(*ondisk_p, size); + *ondisk_size = size; + } ondisk->ctime.sec = htonl(ce->ce_ctime.sec); ondisk->mtime.sec = htonl(ce->ce_mtime.sec); @@ -1549,10 +1556,7 @@ static int ce_write_entry(git_SHA_CTX *c, int fd, struct cache_entry *ce) else name = ondisk->name; memcpy(name, ce->name, ce_namelen(ce)); - - result = ce_write(c, fd, ondisk, size); - free(ondisk); - return result; + return size; } static int has_racy_timestamp(struct index_state *istate) @@ -1588,6 +1592,8 @@ int write_index(struct index_state *istate, int newfd) struct cache_entry **cache = istate->cache; int entries = istate->cache_nr; struct stat st; + void *ce_ondisk = NULL; + int ce_ondisk_size = 0; for (i = removed = extended = 0; i < entries; i++) { if (cache[i]->ce_flags & CE_REMOVE) @@ -1612,13 +1618,17 @@ int write_index(struct index_state *istate, int newfd) for (i = 0; i < entries; i++) { struct cache_entry *ce = cache[i]; + int size; + if (ce->ce_flags & CE_REMOVE) continue; if (!ce_uptodate(ce) && is_racy_timestamp(istate, ce)) ce_smudge_racily_clean_entry(ce); - if (ce_write_entry(&c, newfd, ce) < 0) + size = ce_prepare_ondisk_entry(ce, &ce_ondisk, &ce_ondisk_size); + if (ce_write(&c, newfd, ce_ondisk, size) < 0) return -1; } + free(ce_ondisk); /* Write extension data here */ if (istate->cache_tree) { -- 1.7.8.36.g69ee2 -- 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