[PATCH] git bugfixes and cleanups, mainly Debian things
[gitweb.git] / convert-cache.c
index 77f8bff9ac0cd61412e69921c610e7301f7c350b..95f0302f7abef98b785bb26edd1b5e2785d609d8 100644 (file)
@@ -60,11 +60,21 @@ static void convert_ascii_sha1(void *buffer)
        struct entry *entry;
 
        if (get_sha1_hex(buffer, sha1))
-               die("bad sha1");
+               die("expected sha1, got '%s'", (char*) buffer);
        entry = convert_entry(sha1);
        memcpy(buffer, sha1_to_hex(entry->new_sha1), 40);
 }
 
+static unsigned int convert_mode(unsigned int mode)
+{
+       unsigned int newmode;
+
+       newmode = mode & S_IFMT;
+       if (S_ISREG(mode))
+               newmode |= (mode & 0100) ? 0755 : 0644;
+       return newmode;
+}
+
 static int write_subdirectory(void *buffer, unsigned long size, const char *base, int baselen, unsigned char *result_sha1)
 {
        char *new = xmalloc(size);
@@ -81,6 +91,7 @@ static int write_subdirectory(void *buffer, unsigned long size, const char *base
 
                if (!path || sscanf(buffer, "%o", &mode) != 1)
                        die("bad tree conversion");
+               mode = convert_mode(mode);
                path++;
                if (memcmp(path, base, baselen))
                        break;
@@ -260,6 +271,8 @@ static void convert_commit(void *buffer, unsigned long size, unsigned char *resu
        void *orig_buffer = buffer;
        unsigned long orig_size = size;
 
+       if (memcmp(buffer, "tree ", 5))
+               die("Bad commit '%s'", (char*) buffer);
        convert_ascii_sha1(buffer+5);
        buffer += 46;    /* "tree " + "hex sha1" + "\n" */
        while (!memcmp(buffer, "parent ", 7)) {
@@ -295,6 +308,7 @@ static struct entry * convert_entry(unsigned char *sha1)
                die("unknown object type '%s' in %s", type, sha1_to_hex(sha1));
        entry->converted = 1;
        free(buffer);
+       free(data);
        return entry;
 }