Merge branch 'master' of git://repo.or.cz/git-gui
[gitweb.git] / merge-tree.c
index 7cf00be6d51b17ca60979a9c856e67405906d9a7..3b8d9e6887ae051bf61cc0833f97d83bb47a0bae 100644 (file)
@@ -57,11 +57,11 @@ extern void *merge_file(struct blob *, struct blob *, struct blob *, unsigned lo
 
 static void *result(struct merge_list *entry, unsigned long *size)
 {
-       char type[20];
+       enum object_type type;
        struct blob *base, *our, *their;
 
        if (!entry->stage)
-               return read_sha1_file(entry->blob->object.sha1, type, size);
+               return read_sha1_file(entry->blob->object.sha1, &type, size);
        base = NULL;
        if (entry->stage == 1) {
                base = entry->blob;
@@ -80,10 +80,10 @@ static void *result(struct merge_list *entry, unsigned long *size)
 
 static void *origin(struct merge_list *entry, unsigned long *size)
 {
-       char type[20];
+       enum object_type type;
        while (entry) {
                if (entry->stage == 2)
-                       return read_sha1_file(entry->blob->object.sha1, type, size);
+                       return read_sha1_file(entry->blob->object.sha1, &type, size);
                entry = entry->link;
        }
        return NULL;
@@ -152,7 +152,7 @@ static int same_entry(struct name_entry *a, struct name_entry *b)
 {
        return  a->sha1 &&
                b->sha1 &&
-               !memcmp(a->sha1, b->sha1, 20) &&
+               !hashcmp(a->sha1, b->sha1) &&
                a->mode == b->mode;
 }
 
@@ -177,7 +177,7 @@ static void resolve(const char *base, struct name_entry *branch1, struct name_en
        if (!branch1)
                return;
 
-       path = strdup(mkpath("%s%s", base, result->path));
+       path = xstrdup(mkpath("%s%s", base, result->path));
        orig = create_entry(2, branch1->mode, branch1->sha1, path);
        final = create_entry(0, result->mode, result->sha1, path);
 
@@ -188,7 +188,7 @@ static void resolve(const char *base, struct name_entry *branch1, struct name_en
 
 static int unresolved_directory(const char *base, struct name_entry n[3])
 {
-       int baselen;
+       int baselen, pathlen;
        char *newbase;
        struct name_entry *p;
        struct tree_desc t[3];
@@ -205,10 +205,11 @@ static int unresolved_directory(const char *base, struct name_entry n[3])
        if (!S_ISDIR(p->mode))
                return 0;
        baselen = strlen(base);
-       newbase = xmalloc(baselen + p->pathlen + 2);
+       pathlen = tree_entry_len(p->path, p->sha1);
+       newbase = xmalloc(baselen + pathlen + 2);
        memcpy(newbase, base, baselen);
-       memcpy(newbase + baselen, p->path, p->pathlen);
-       memcpy(newbase + baselen + p->pathlen, "/", 2);
+       memcpy(newbase + baselen, p->path, pathlen);
+       memcpy(newbase + baselen + pathlen, "/", 2);
 
        buf0 = fill_tree_descriptor(t+0, n[0].sha1);
        buf1 = fill_tree_descriptor(t+1, n[1].sha1);
@@ -233,7 +234,7 @@ static struct merge_list *link_entry(unsigned stage, const char *base, struct na
        if (entry)
                path = entry->path;
        else
-               path = strdup(mkpath("%s%s", base, n->path));
+               path = xstrdup(mkpath("%s%s", base, n->path));
        link = create_entry(stage, n->mode, n->sha1, path);
        link->link = entry;
        return link;
@@ -337,9 +338,11 @@ int main(int argc, char **argv)
        struct tree_desc t[3];
        void *buf1, *buf2, *buf3;
 
-       if (argc < 4)
+       if (argc != 4)
                usage(merge_tree_usage);
 
+       setup_git_directory();
+
        buf1 = get_tree_descriptor(t+0, argv[1]);
        buf2 = get_tree_descriptor(t+1, argv[2]);
        buf3 = get_tree_descriptor(t+2, argv[3]);