Added completion support for git-branch.exe.
[gitweb.git] / sha1_file.c
index fdb4588280634e3d87c02353db55bc808f57f16f..4e5ee1054f6a4f5d1f50c8f93a3f45d6a6b1c72a 100644 (file)
@@ -671,14 +671,8 @@ static void reprepare_packed_git(void)
 
 int check_sha1_signature(const unsigned char *sha1, void *map, unsigned long size, const char *type)
 {
-       char header[100];
        unsigned char real_sha1[20];
-       SHA_CTX c;
-
-       SHA1_Init(&c);
-       SHA1_Update(&c, header, 1+sprintf(header, "%s %lu", type, size));
-       SHA1_Update(&c, map, size);
-       SHA1_Final(real_sha1, &c);
+       hash_sha1_file(map, size, type, real_sha1);
        return hashcmp(sha1, real_sha1) ? -1 : 0;
 }
 
@@ -949,7 +943,7 @@ static int packed_delta_info(struct packed_git *p,
 
        if (sizep) {
                const unsigned char *data;
-               unsigned char delta_head[64];
+               unsigned char delta_head[20];
                unsigned long result_size;
                z_stream stream;
                int st;
@@ -1000,25 +994,6 @@ static unsigned long unpack_object_header(struct packed_git *p, unsigned long of
        return offset + used;
 }
 
-int check_reuse_pack_delta(struct packed_git *p, unsigned long offset,
-                          unsigned char *base, unsigned long *sizep,
-                          enum object_type *kindp)
-{
-       unsigned long ptr;
-       int status = -1;
-
-       use_packed_git(p);
-       ptr = offset;
-       ptr = unpack_object_header(p, ptr, kindp, sizep);
-       if (*kindp != OBJ_REF_DELTA)
-               goto done;
-       hashcpy(base, (unsigned char *) p->pack_base + ptr);
-       status = 0;
- done:
-       unuse_packed_git(p);
-       return status;
-}
-
 void packed_object_info_detail(struct packed_git *p,
                               unsigned long offset,
                               char *type,
@@ -1383,12 +1358,9 @@ void *read_object_with_reference(const unsigned char *sha1,
        }
 }
 
-char *write_sha1_file_prepare(void *buf,
-                             unsigned long len,
-                             const char *type,
-                             unsigned char *sha1,
-                             unsigned char *hdr,
-                             int *hdrlen)
+static void write_sha1_file_prepare(void *buf, unsigned long len,
+                                    const char *type, unsigned char *sha1,
+                                    unsigned char *hdr, int *hdrlen)
 {
        SHA_CTX c;
 
@@ -1400,8 +1372,6 @@ char *write_sha1_file_prepare(void *buf,
        SHA1_Update(&c, hdr, *hdrlen);
        SHA1_Update(&c, buf, len);
        SHA1_Final(sha1, &c);
-
-       return sha1_file_name(sha1);
 }
 
 /*
@@ -1429,9 +1399,10 @@ static int link_temp_to_file(const char *tmpfile, const char *filename)
        dir = strrchr(filename, '/');
        if (dir) {
                *dir = 0;
-               mkdir(filename, 0777);
-               if (adjust_shared_perm(filename))
+               if (!mkdir(filename, 0777) && adjust_shared_perm(filename)) {
+                       *dir = '/';
                        return -2;
+               }
                *dir = '/';
                if (!link(tmpfile, filename))
                        return 0;
@@ -1537,6 +1508,15 @@ static void setup_object_header(z_stream *stream, const char *type, unsigned lon
        stream->avail_out -= hdr;
 }
 
+int hash_sha1_file(void *buf, unsigned long len, const char *type,
+                   unsigned char *sha1)
+{
+       unsigned char hdr[50];
+       int hdrlen;
+       write_sha1_file_prepare(buf, len, type, sha1, hdr, &hdrlen);
+       return 0;
+}
+
 int write_sha1_file(void *buf, unsigned long len, const char *type, unsigned char *returnsha1)
 {
        int size;
@@ -1551,7 +1531,8 @@ int write_sha1_file(void *buf, unsigned long len, const char *type, unsigned cha
        /* Normally if we have it in the pack then we do not bother writing
         * it out into .git/objects/??/?{38} file.
         */
-       filename = write_sha1_file_prepare(buf, len, type, sha1, hdr, &hdrlen);
+       write_sha1_file_prepare(buf, len, type, sha1, hdr, &hdrlen);
+       filename = sha1_file_name(sha1);
        if (returnsha1)
                hashcpy(returnsha1, sha1);
        if (has_sha1_file(sha1))
@@ -1820,8 +1801,6 @@ int index_pipe(unsigned char *sha1, int fd, const char *type, int write_object)
        unsigned long size = 4096;
        char *buf = xmalloc(size);
        int ret;
-       unsigned char hdr[50];
-       int hdrlen;
 
        if (read_pipe(fd, &buf, &size)) {
                free(buf);
@@ -1832,10 +1811,8 @@ int index_pipe(unsigned char *sha1, int fd, const char *type, int write_object)
                type = blob_type;
        if (write_object)
                ret = write_sha1_file(buf, size, type, sha1);
-       else {
-               write_sha1_file_prepare(buf, size, type, sha1, hdr, &hdrlen);
-               ret = 0;
-       }
+       else
+               ret = hash_sha1_file(buf, size, type, sha1);
        free(buf);
        return ret;
 }
@@ -1845,8 +1822,6 @@ int index_fd(unsigned char *sha1, int fd, struct stat *st, int write_object, con
        unsigned long size = st->st_size;
        void *buf;
        int ret;
-       unsigned char hdr[50];
-       int hdrlen;
 
        buf = "";
        if (size)
@@ -1859,10 +1834,8 @@ int index_fd(unsigned char *sha1, int fd, struct stat *st, int write_object, con
                type = blob_type;
        if (write_object)
                ret = write_sha1_file(buf, size, type, sha1);
-       else {
-               write_sha1_file_prepare(buf, size, type, sha1, hdr, &hdrlen);
-               ret = 0;
-       }
+       else
+               ret = hash_sha1_file(buf, size, type, sha1);
        if (size)
                munmap(buf, size);
        return ret;
@@ -1891,12 +1864,9 @@ int index_path(unsigned char *sha1, const char *path, struct stat *st, int write
                        return error("readlink(\"%s\"): %s", path,
                                     errstr);
                }
-               if (!write_object) {
-                       unsigned char hdr[50];
-                       int hdrlen;
-                       write_sha1_file_prepare(target, st->st_size, blob_type,
-                                               sha1, hdr, &hdrlen);
-               } else if (write_sha1_file(target, st->st_size, blob_type, sha1))
+               if (!write_object)
+                       hash_sha1_file(target, st->st_size, blob_type, sha1);
+               else if (write_sha1_file(target, st->st_size, blob_type, sha1))
                        return error("%s: failed to insert into database",
                                     path);
                free(target);