Fix crash when reading the empty tree
[gitweb.git] / merge-base.c
index 43a6818369a71078a61fc223339c4918699e052d..07f5ab4d1c72afeac5e3f193cefe91801ee9a9c9 100644 (file)
@@ -123,6 +123,47 @@ static struct commit *interesting(struct commit_list *list)
 
 static int show_all = 0;
 
+static void mark_reachable_commits(struct commit_list *result,
+                                  struct commit_list *list)
+{
+       struct commit_list *tmp;
+
+       /*
+        * Postprocess to fully contaminate the well.
+        */
+       for (tmp = result; tmp; tmp = tmp->next) {
+               struct commit *c = tmp->item;
+               /* Reinject uninteresting ones to list,
+                * so we can scan their parents.
+                */
+               if (c->object.flags & UNINTERESTING)
+                       commit_list_insert(c, &list);
+       }
+       while (list) {
+               struct commit *c = list->item;
+               struct commit_list *parents;
+
+               tmp = list;
+               list = list->next;
+               free(tmp);
+
+               /* Anything taken out of the list is uninteresting, so
+                * mark all its parents uninteresting.  We do not
+                * parse new ones (we already parsed all the relevant
+                * ones).
+                */
+               parents = c->parents;
+               while (parents) {
+                       struct commit *p = parents->item;
+                       parents = parents->next;
+                       if (!(p->object.flags & UNINTERESTING)) {
+                               p->object.flags |= UNINTERESTING;
+                               commit_list_insert(p, &list);
+                       }
+               }
+       }
+}
+
 static int merge_base(struct commit *rev1, struct commit *rev2)
 {
        struct commit_list *list = NULL;
@@ -171,40 +212,8 @@ static int merge_base(struct commit *rev1, struct commit *rev2)
        if (!result)
                return 1;
 
-       /*
-        * Postprocess to fully contaminate the well.
-        */
-       for (tmp = result; tmp; tmp = tmp->next) {
-               struct commit *c = tmp->item;
-               /* Reinject uninteresting ones to list,
-                * so we can scan their parents.
-                */
-               if (c->object.flags & UNINTERESTING)
-                       commit_list_insert(c, &list);
-       }
-       while (list) {
-               struct commit *c = list->item;
-               struct commit_list *parents;
-
-               tmp = list;
-               list = list->next;
-               free(tmp);
-
-               /* Anything taken out of the list is uninteresting, so
-                * mark all its parents uninteresting.  We do not
-                * parse new ones (we already parsed all the relevant
-                * ones).
-                */
-               parents = c->parents;
-               while (parents) {
-                       struct commit *p = parents->item;
-                       parents = parents->next;
-                       if (!(p->object.flags & UNINTERESTING)) {
-                               p->object.flags |= UNINTERESTING;
-                               commit_list_insert(p, &list);
-                       }
-               }
-       }
+       if (result->next && list)
+               mark_reachable_commits(result, list);
 
        while (result) {
                struct commit *commit = result->item;
@@ -227,6 +236,9 @@ int main(int argc, char **argv)
        struct commit *rev1, *rev2;
        unsigned char rev1key[20], rev2key[20];
 
+       setup_git_directory();
+       git_config(git_default_config);
+
        while (1 < argc && argv[1][0] == '-') {
                char *arg = argv[1];
                if (!strcmp(arg, "-a") || !strcmp(arg, "--all"))