[PATCH] Fix assertion failure when merging common ancestors.
[git.git] / read-tree.c
index 3808d23..4db154d 100644 (file)
@@ -12,6 +12,7 @@
 
 static int merge = 0;
 static int update = 0;
+static int index_only = 0;
 
 static int head_idx = -1;
 static int merge_size = 0;
@@ -221,6 +222,7 @@ static int unpack_trees_rec(struct tree_entry_list **posns, int len,
                        if (unpack_trees_rec(subposns, len, newbase, fn,
                                             indpos))
                                return -1;
+                       free(newbase);
                }
                free(subposns);
                free(src);
@@ -305,6 +307,9 @@ static void verify_uptodate(struct cache_entry *ce)
 {
        struct stat st;
 
+       if (index_only)
+               return;
+
        if (!lstat(ce->name, &st)) {
                unsigned changed = ce_match_stat(ce, &st);
                if (!changed)
@@ -575,7 +580,7 @@ static int read_cache_unmerged(void)
        return deleted;
 }
 
-static const char read_tree_usage[] = "git-read-tree (<sha> | -m [-u] <sha1> [<sha2> [<sha3>]])";
+static const char read_tree_usage[] = "git-read-tree (<sha> | -m [-u | -i] <sha1> [<sha2> [<sha3>]])";
 
 static struct cache_file cache_file;
 
@@ -594,12 +599,22 @@ int main(int argc, char **argv)
        for (i = 1; i < argc; i++) {
                const char *arg = argv[i];
 
-               /* "-u" means "update", meaning that a merge will update the working directory */
+               /* "-u" means "update", meaning that a merge will update
+                * the working tree.
+                */
                if (!strcmp(arg, "-u")) {
                        update = 1;
                        continue;
                }
 
+               /* "-i" means "index only", meaning that a merge will
+                * not even look at the working tree.
+                */
+               if (!strcmp(arg, "-i")) {
+                       index_only = 1;
+                       continue;
+               }
+
                /* This differs from "-m" in that we'll silently ignore unmerged entries */
                if (!strcmp(arg, "--reset")) {
                        if (stage || merge)
@@ -627,6 +642,10 @@ int main(int argc, char **argv)
                        continue;
                }
 
+               /* using -u and -i at the same time makes no sense */
+               if (1 < index_only + update)
+                       usage(read_tree_usage);
+
                if (get_sha1(arg, sha1) < 0)
                        usage(read_tree_usage);
                if (list_tree(sha1) < 0)