Fix "unpack-objects --strict"
[gitweb.git] / ll-merge.c
index 4a716146f67c5921646bcde0e8499fb37b993636..f7c2bc9278a906baa6dc22289acd920234072500 100644 (file)
@@ -8,7 +8,6 @@
 #include "attr.h"
 #include "xdiff-interface.h"
 #include "run-command.h"
-#include "interpolate.h"
 #include "ll-merge.h"
 
 struct ll_merge_driver;
@@ -169,11 +168,12 @@ static int ll_ext_merge(const struct ll_merge_driver *fn,
                        int virtual_ancestor)
 {
        char temp[3][50];
-       char cmdbuf[2048];
-       struct interp table[] = {
-               { "%O" },
-               { "%A" },
-               { "%B" },
+       struct strbuf cmd = STRBUF_INIT;
+       struct strbuf_expand_dict_entry dict[] = {
+               { "O", temp[0] },
+               { "A", temp[1] },
+               { "B", temp[2] },
+               { NULL }
        };
        struct child_process child;
        const char *args[20];
@@ -189,17 +189,13 @@ static int ll_ext_merge(const struct ll_merge_driver *fn,
        create_temp(src1, temp[1]);
        create_temp(src2, temp[2]);
 
-       interp_set_entry(table, 0, temp[0]);
-       interp_set_entry(table, 1, temp[1]);
-       interp_set_entry(table, 2, temp[2]);
-
-       interpolate(cmdbuf, sizeof(cmdbuf), fn->cmdline, table, 3);
+       strbuf_expand(&cmd, fn->cmdline, strbuf_expand_dict_cb, &dict);
 
        memset(&child, 0, sizeof(child));
        child.argv = args;
        args[0] = "sh";
        args[1] = "-c";
-       args[2] = cmdbuf;
+       args[2] = cmd.buf;
        args[3] = NULL;
 
        status = run_command(&child);
@@ -223,7 +219,8 @@ static int ll_ext_merge(const struct ll_merge_driver *fn,
        close(fd);
  bad:
        for (i = 0; i < 3; i++)
-               unlink(temp[i]);
+               unlink_or_warn(temp[i]);
+       strbuf_release(&cmd);
        return status;
 }
 
@@ -241,7 +238,7 @@ static int read_merge_config(const char *var, const char *value, void *cb)
 
        if (!strcmp(var, "merge.default")) {
                if (value)
-                       default_ll_merge = strdup(value);
+                       default_ll_merge = xstrdup(value);
                return 0;
        }
 
@@ -275,7 +272,7 @@ static int read_merge_config(const char *var, const char *value, void *cb)
        if (!strcmp("name", ep)) {
                if (!value)
                        return error("%s: lacks value", var);
-               fn->description = strdup(value);
+               fn->description = xstrdup(value);
                return 0;
        }
 
@@ -298,14 +295,14 @@ static int read_merge_config(const char *var, const char *value, void *cb)
                 * file named by %A, and signal that it has done with zero exit
                 * status.
                 */
-               fn->cmdline = strdup(value);
+               fn->cmdline = xstrdup(value);
                return 0;
        }
 
        if (!strcmp("recursive", ep)) {
                if (!value)
                        return error("%s: lacks value", var);
-               fn->recursive = strdup(value);
+               fn->recursive = xstrdup(value);
                return 0;
        }