Merge branch 'dl/complete-cherry-pick-revert-skip'
[gitweb.git] / tmp-objdir.c
index 64435f23a483dfc40e91437f0689bdfb9ac4b8f8..91c00567f4d63367d6766808b0ff90f6faa08765 100644 (file)
@@ -5,6 +5,8 @@
 #include "string-list.h"
 #include "strbuf.h"
 #include "argv-array.h"
+#include "quote.h"
+#include "object-store.h"
 
 struct tmp_objdir {
        struct strbuf path;
@@ -79,12 +81,27 @@ static void remove_tmp_objdir_on_signal(int signo)
  */
 static void env_append(struct argv_array *env, const char *key, const char *val)
 {
-       const char *old = getenv(key);
+       struct strbuf quoted = STRBUF_INIT;
+       const char *old;
 
+       /*
+        * Avoid quoting if it's not necessary, for maximum compatibility
+        * with older parsers which don't understand the quoting.
+        */
+       if (*val == '"' || strchr(val, PATH_SEP)) {
+               strbuf_addch(&quoted, '"');
+               quote_c_style(val, &quoted, NULL, 1);
+               strbuf_addch(&quoted, '"');
+               val = quoted.buf;
+       }
+
+       old = getenv(key);
        if (!old)
                argv_array_pushf(env, "%s=%s", key, val);
        else
                argv_array_pushf(env, "%s=%s%c%s", key, old, PATH_SEP, val);
+
+       strbuf_release(&quoted);
 }
 
 static void env_replace(struct argv_array *env, const char *key, const char *val)
@@ -110,7 +127,7 @@ struct tmp_objdir *tmp_objdir_create(void)
        struct tmp_objdir *t;
 
        if (the_tmp_objdir)
-               die("BUG: only one tmp_objdir can be used at a time");
+               BUG("only one tmp_objdir can be used at a time");
 
        t = xmalloc(sizeof(*t));
        strbuf_init(&t->path, 0);