Fix random segfaults in pack-objects.
[gitweb.git] / merge-recursive.c
index 6dd6e2e5af779f2b3ad5da050776c37646b45a84..ca4f19e34d4216fed7c8110ba8f75585c69f92c7 100644 (file)
@@ -3,13 +3,6 @@
  * Fredrik Kuivinen.
  * The thieves were Alex Riesen and Johannes Schindelin, in June/July 2006
  */
-#include <stdarg.h>
-#include <string.h>
-#include <assert.h>
-#include <sys/wait.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <time.h>
 #include "cache.h"
 #include "cache-tree.h"
 #include "commit.h"
@@ -656,8 +649,8 @@ static struct merge_file_info merge_file(struct diff_filespec *o,
                        char *name1, *name2;
                        int merge_status;
 
-                       name1 = xstrdup(mkpath("%s/%s", branch1, a->path));
-                       name2 = xstrdup(mkpath("%s/%s", branch2, b->path));
+                       name1 = xstrdup(mkpath("%s:%s", branch1, a->path));
+                       name2 = xstrdup(mkpath("%s:%s", branch2, b->path));
 
                        fill_mm(o->sha1, &orig);
                        fill_mm(a->sha1, &src1);
@@ -1270,6 +1263,18 @@ static struct commit *get_ref(const char *ref)
        return (struct commit *)object;
 }
 
+static const char *better_branch_name(const char *branch)
+{
+       static char githead_env[8 + 40 + 1];
+       char *name;
+
+       if (strlen(branch) != 40)
+               return branch;
+       sprintf(githead_env, "GITHEAD_%s", branch);
+       name = getenv(githead_env);
+       return name ? name : branch;
+}
+
 int main(int argc, char *argv[])
 {
        static const char *bases[2];
@@ -1279,7 +1284,7 @@ int main(int argc, char *argv[])
        struct commit *result, *h1, *h2;
 
        git_config(git_default_config); /* core.filemode */
-       original_index_file = getenv("GIT_INDEX_FILE");
+       original_index_file = getenv(INDEX_ENVIRONMENT);
 
        if (!original_index_file)
                original_index_file = xstrdup(git_path("index"));
@@ -1300,11 +1305,14 @@ int main(int argc, char *argv[])
 
        branch1 = argv[++i];
        branch2 = argv[++i];
-       printf("Merging %s with %s\n", branch1, branch2);
 
        h1 = get_ref(branch1);
        h2 = get_ref(branch2);
 
+       branch1 = better_branch_name(branch1);
+       branch2 = better_branch_name(branch2);
+       printf("Merging %s with %s\n", branch1, branch2);
+
        if (bases_count == 1) {
                struct commit *ancestor = get_ref(bases[0]);
                clean = merge(h1, h2, branch1, branch2, 0, ancestor, &result);