Make "write_sha1_file()" exit early if the file already exists.
[gitweb.git] / update-cache.c
index 68d2f95c1cfc90cc6d39bb4ec2f25f4ebd944d69..8ec69e22b4e32a84cc8575a8eec349cec5b24fc0 100644 (file)
@@ -21,6 +21,7 @@ static int index_fd(unsigned char *sha1, int fd, struct stat *st)
        int max_out_bytes = size + 200;
        void *out = malloc(max_out_bytes);
        void *metadata = malloc(200);
+       int metadata_size;
        void *in;
        SHA_CTX c;
 
@@ -31,6 +32,13 @@ static int index_fd(unsigned char *sha1, int fd, struct stat *st)
        if (!out || (int)(long)in == -1)
                return -1;
 
+       metadata_size = 1+sprintf(metadata, "blob %lu", size);
+
+       SHA1_Init(&c);
+       SHA1_Update(&c, metadata, metadata_size);
+       SHA1_Update(&c, in, size);
+       SHA1_Final(sha1, &c);
+
        memset(&stream, 0, sizeof(stream));
        deflateInit(&stream, Z_BEST_COMPRESSION);
 
@@ -38,7 +46,7 @@ static int index_fd(unsigned char *sha1, int fd, struct stat *st)
         * ASCII size + nul byte
         */     
        stream.next_in = metadata;
-       stream.avail_in = 1+sprintf(metadata, "blob %lu", size);
+       stream.avail_in = metadata_size;
        stream.next_out = out;
        stream.avail_out = max_out_bytes;
        while (deflate(&stream, 0) == Z_OK)
@@ -54,10 +62,6 @@ static int index_fd(unsigned char *sha1, int fd, struct stat *st)
 
        deflateEnd(&stream);
        
-       SHA1_Init(&c);
-       SHA1_Update(&c, out, stream.total_out);
-       SHA1_Final(sha1, &c);
-
        return write_sha1_buffer(sha1, out, stream.total_out);
 }