Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- read-cache.c | 90 +++++++++++++++------------------------------------------- 1 files changed, 23 insertions(+), 67 deletions(-) diff --git a/read-cache.c b/read-cache.c index a51bba1..e9a20b6 100644 --- a/read-cache.c +++ b/read-cache.c @@ -12,6 +12,7 @@ #include "commit.h" #include "blob.h" #include "resolve-undo.h" +#include "csum-file.h" static struct cache_entry *refresh_cache_entry(struct cache_entry *ce, int really); @@ -1395,73 +1396,28 @@ int unmerged_index(const struct index_state *istate) return 0; } -#define WRITE_BUFFER_SIZE 8192 -static unsigned char write_buffer[WRITE_BUFFER_SIZE]; -static unsigned long write_buffer_len; - -static int ce_write_flush(git_SHA_CTX *context, int fd) -{ - unsigned int buffered = write_buffer_len; - if (buffered) { - git_SHA1_Update(context, write_buffer, buffered); - if (write_in_full(fd, write_buffer, buffered) != buffered) - return -1; - write_buffer_len = 0; - } - return 0; -} - -static int ce_write(git_SHA_CTX *context, int fd, void *data, unsigned int len) +static int ce_write(struct sha1file *f, void *data, unsigned int len) { - while (len) { - unsigned int buffered = write_buffer_len; - unsigned int partial = WRITE_BUFFER_SIZE - buffered; - if (partial > len) - partial = len; - memcpy(write_buffer + buffered, data, partial); - buffered += partial; - if (buffered == WRITE_BUFFER_SIZE) { - write_buffer_len = buffered; - if (ce_write_flush(context, fd)) - return -1; - buffered = 0; - } - write_buffer_len = buffered; - len -= partial; - data = (char *) data + partial; - } - return 0; + return sha1write(f, data, len); } -static int write_index_ext_header(git_SHA_CTX *context, int fd, +static int write_index_ext_header(struct sha1file *f, unsigned int ext, unsigned int sz) { ext = htonl(ext); sz = htonl(sz); - return ((ce_write(context, fd, &ext, 4) < 0) || - (ce_write(context, fd, &sz, 4) < 0)) ? -1 : 0; + return ((ce_write(f, &ext, 4) < 0) || + (ce_write(f, &sz, 4) < 0)) ? -1 : 0; } -static int ce_flush(git_SHA_CTX *context, int fd) +static int ce_flush(struct sha1file *f) { - unsigned int left = write_buffer_len; - - if (left) { - write_buffer_len = 0; - git_SHA1_Update(context, write_buffer, left); - } - - /* Flush first if not enough space for SHA1 signature */ - if (left + 20 > WRITE_BUFFER_SIZE) { - if (write_in_full(fd, write_buffer, left) != left) - return -1; - left = 0; - } + unsigned char sha1[20]; + int fd = sha1close(f, sha1, 0); - /* Append the SHA1 signature at the end */ - git_SHA1_Final(write_buffer + left, context); - left += 20; - return (write_in_full(fd, write_buffer, left) != left) ? -1 : 0; + if (fd < 0) + return -1; + return (write_in_full(fd, sha1, 20) != 20) ? -1 : 0; } static void ce_smudge_racily_clean_entry(struct cache_entry *ce) @@ -1513,7 +1469,7 @@ 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_write_entry(struct sha1file *f, struct cache_entry *ce) { int size = ondisk_ce_size(ce); struct ondisk_cache_entry *ondisk = xcalloc(1, size); @@ -1542,7 +1498,7 @@ static int ce_write_entry(git_SHA_CTX *c, int fd, struct cache_entry *ce) name = ondisk->name; memcpy(name, ce->name, ce_namelen(ce)); - result = ce_write(c, fd, ondisk, size); + result = ce_write(f, ondisk, size); free(ondisk); return result; } @@ -1574,7 +1530,7 @@ void update_index_if_able(struct index_state *istate, struct lock_file *lockfile int write_index(struct index_state *istate, int newfd) { - git_SHA_CTX c; + struct sha1file *f; struct cache_header hdr; int i, err, removed, extended; struct cache_entry **cache = istate->cache; @@ -1598,8 +1554,8 @@ int write_index(struct index_state *istate, int newfd) hdr.hdr_version = htonl(extended ? 3 : 2); hdr.hdr_entries = htonl(entries - removed); - git_SHA1_Init(&c); - if (ce_write(&c, newfd, &hdr, sizeof(hdr)) < 0) + f = sha1fd(newfd, NULL); + if (ce_write(f, &hdr, sizeof(hdr)) < 0) return -1; for (i = 0; i < entries; i++) { @@ -1608,7 +1564,7 @@ int write_index(struct index_state *istate, int newfd) continue; if (!ce_uptodate(ce) && is_racy_timestamp(istate, ce)) ce_smudge_racily_clean_entry(ce); - if (ce_write_entry(&c, newfd, ce) < 0) + if (ce_write_entry(f, ce) < 0) return -1; } @@ -1617,8 +1573,8 @@ int write_index(struct index_state *istate, int newfd) struct strbuf sb = STRBUF_INIT; cache_tree_write(&sb, istate->cache_tree); - err = write_index_ext_header(&c, newfd, CACHE_EXT_TREE, sb.len) < 0 - || ce_write(&c, newfd, sb.buf, sb.len) < 0; + err = write_index_ext_header(f, CACHE_EXT_TREE, sb.len) < 0 + || ce_write(f, sb.buf, sb.len) < 0; strbuf_release(&sb); if (err) return -1; @@ -1627,15 +1583,15 @@ int write_index(struct index_state *istate, int newfd) struct strbuf sb = STRBUF_INIT; resolve_undo_write(&sb, istate->resolve_undo); - err = write_index_ext_header(&c, newfd, CACHE_EXT_RESOLVE_UNDO, + err = write_index_ext_header(f, CACHE_EXT_RESOLVE_UNDO, sb.len) < 0 - || ce_write(&c, newfd, sb.buf, sb.len) < 0; + || ce_write(f, sb.buf, sb.len) < 0; strbuf_release(&sb); if (err) return -1; } - if (ce_flush(&c, newfd) || fstat(newfd, &st)) + if (ce_flush(f) || fstat(newfd, &st)) return -1; istate->timestamp.sec = (unsigned int)st.st_mtime; istate->timestamp.nsec = ST_MTIME_NSEC(st); -- 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