{"thread":{"id":"1168","subject":"[PATCH] 4/7 Use SHA1 for git-update-cache --refresh","startedAt":"2005-07-08T10:54:35Z","lastAt":"2005-07-08T10:54:35Z","messageCount":1,"participants":["Bryan Larsen"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"5818","messageId":"42CE5B6B.2080308@gmail.com","threadId":"1168","inReplyTo":null,"subject":"[PATCH] 4/7 Use SHA1 for git-update-cache --refresh","fromName":"Bryan Larsen","fromEmail":"bryan.larsen@gmail.com","sentAt":"2005-07-08T10:54:35Z","receivedAt":"2005-07-08T10:54:35Z","isPatch":true,"sender":{"key":"bryan@larsen.st","avatar":"https://avatars.githubusercontent.com/u/32073?v=4"},"body":"\n\nChange git-update-cache --refresh behaviour to use sha1's rather than\ncomparing byte by byte.\n\nSigned-off-by: Bryan Larsen <bryan.larsen@gmail.com>\n---\n\n  update-cache.c |   31 +++++--------------------------\n  1 files changed, 5 insertions(+), 26 deletions(-)\n\ndiff --git a/update-cache.c b/update-cache.c\n--- a/update-cache.c\n+++ b/update-cache.c\n@@ -93,37 +93,16 @@ static int add_file_to_cache(char *path)\n  \treturn add_cache_entry(ce, option);\n  }\n\n-static int match_data(int fd, void *buffer, unsigned long size)\n-{\n-\twhile (size) {\n-\t\tchar compare[1024];\n-\t\tint ret = read(fd, compare, sizeof(compare));\n-\n-\t\tif (ret <= 0 || ret > size || memcmp(buffer, compare, ret))\n-\t\t\treturn -1;\n-\t\tsize -= ret;\n-\t\tbuffer += ret;\n-\t}\n-\treturn 0;\n-}\n-\n-static int compare_data(struct cache_entry *ce, unsigned long \nexpected_size)\n+static int compare_data(struct cache_entry *ce, struct stat *st)\n  {\n  \tint match = -1;\n  \tint fd = open(ce->name, O_RDONLY);\n\n  \tif (fd >= 0) {\n-\t\tvoid *buffer;\n-\t\tunsigned long size;\n-\t\tchar type[20];\n-\n-\t\tbuffer = read_sha1_file(ce->sha1, type, &size);\n-\t\tif (buffer) {\n-\t\t\tif (size == expected_size && !strcmp(type, \"blob\"))\n-\t\t\t\tmatch = match_data(fd, buffer, size);\n-\t\t\tfree(buffer);\n+\t\tunsigned char sha1[20];\n+\t\tif(!index_fd(sha1, fd, st, 1)) {\n+\t\t\tmatch = memcmp(sha1, ce->sha1, 20);\n  \t\t}\n-\t\tclose(fd);\n  \t}\n  \treturn match;\n  }\n@@ -188,7 +167,7 @@ static struct cache_entry *refresh_entry\n\n  \tswitch (st.st_mode & S_IFMT) {\n  \tcase S_IFREG:\n-\t\tif (compare_data(ce, st.st_size))\n+\t\tif (compare_data(ce, &st))\n  \t\t\treturn ERR_PTR(-EINVAL);\n  \t\tbreak;\n  \tcase S_IFLNK:\n\n\n\f\n"}]}