From: Linus Torvalds Date: Wed, 20 Apr 2005 16:28:05 +0000 (-0700) Subject: Make "write_sha1_file()" exit early if the file already exists. X-Git-Tag: v0.99~798 X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=706bc531a19f268bb03dda7551929dee20172548;p=git.git Make "write_sha1_file()" exit early if the file already exists. Avoid the compression. --- diff --git a/sha1_file.c b/sha1_file.c index 40c00b77d..eee3598bb 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -173,12 +173,30 @@ int write_sha1_file(char *buf, unsigned len, unsigned char *returnsha1) z_stream stream; unsigned char sha1[20]; SHA_CTX c; + char *filename; + int fd; /* Sha1.. */ SHA1_Init(&c); SHA1_Update(&c, buf, len); SHA1_Final(sha1, &c); + if (returnsha1) + memcpy(returnsha1, sha1, 20); + + filename = sha1_file_name(sha1); + fd = open(filename, O_WRONLY | O_CREAT | O_EXCL, 0666); + if (fd < 0) { + if (errno != EEXIST) + return -1; + + /* + * We might do collision checking here, but we'd need to + * uncompress the old file and check it. Later. + */ + return 0; + } + /* Set it up */ memset(&stream, 0, sizeof(stream)); deflateInit(&stream, Z_BEST_COMPRESSION); @@ -195,10 +213,10 @@ int write_sha1_file(char *buf, unsigned len, unsigned char *returnsha1) deflateEnd(&stream); size = stream.total_out; - if (write_sha1_buffer(sha1, compressed, size) < 0) - return -1; - if (returnsha1) - memcpy(returnsha1, sha1, 20); + if (write(fd, compressed, size) != size) + die("unable to write file"); + close(fd); + return 0; }