]> git.ipfire.org Git - thirdparty/git.git/blobdiff - trailer.c
t1503: mark symlink test as REFFILES
[thirdparty/git.git] / trailer.c
index be4e9726421cc81d049e5eec2c557ac896965f7f..7c7cb61a945c7ba2634685d6d49e3ad7ac23204a 100644 (file)
--- a/trailer.c
+++ b/trailer.c
@@ -14,6 +14,7 @@ struct conf_info {
        char *name;
        char *key;
        char *command;
+       char *cmd;
        enum trailer_where where;
        enum trailer_if_exists if_exists;
        enum trailer_if_missing if_missing;
@@ -127,6 +128,7 @@ static void free_arg_item(struct arg_item *item)
        free(item->conf.name);
        free(item->conf.key);
        free(item->conf.command);
+       free(item->conf.cmd);
        free(item->token);
        free(item->value);
        free(item);
@@ -216,18 +218,24 @@ static int check_if_different(struct trailer_item *in_tok,
        return 1;
 }
 
-static char *apply_command(const char *command, const char *arg)
+static char *apply_command(struct conf_info *conf, const char *arg)
 {
        struct strbuf cmd = STRBUF_INIT;
        struct strbuf buf = STRBUF_INIT;
        struct child_process cp = CHILD_PROCESS_INIT;
        char *result;
 
-       strbuf_addstr(&cmd, command);
-       if (arg)
-               strbuf_replace(&cmd, TRAILER_ARG_STRING, arg);
-
-       strvec_push(&cp.args, cmd.buf);
+       if (conf->cmd) {
+               strbuf_addstr(&cmd, conf->cmd);
+               strvec_push(&cp.args, cmd.buf);
+               if (arg)
+                       strvec_push(&cp.args, arg);
+       } else if (conf->command) {
+               strbuf_addstr(&cmd, conf->command);
+               if (arg)
+                       strbuf_replace(&cmd, TRAILER_ARG_STRING, arg);
+               strvec_push(&cp.args, cmd.buf);
+       }
        cp.env = local_repo_env;
        cp.no_stdin = 1;
        cp.use_shell = 1;
@@ -247,7 +255,7 @@ static char *apply_command(const char *command, const char *arg)
 
 static void apply_item_command(struct trailer_item *in_tok, struct arg_item *arg_tok)
 {
-       if (arg_tok->conf.command) {
+       if (arg_tok->conf.command || arg_tok->conf.cmd) {
                const char *arg;
                if (arg_tok->value && arg_tok->value[0]) {
                        arg = arg_tok->value;
@@ -257,7 +265,7 @@ static void apply_item_command(struct trailer_item *in_tok, struct arg_item *arg
                        else
                                arg = xstrdup("");
                }
-               arg_tok->value = apply_command(arg_tok->conf.command, arg);
+               arg_tok->value = apply_command(&arg_tok->conf, arg);
                free((char *)arg);
        }
 }
@@ -430,6 +438,7 @@ static void duplicate_conf(struct conf_info *dst, const struct conf_info *src)
        dst->name = xstrdup_or_null(src->name);
        dst->key = xstrdup_or_null(src->key);
        dst->command = xstrdup_or_null(src->command);
+       dst->cmd = xstrdup_or_null(src->cmd);
 }
 
 static struct arg_item *get_conf_item(const char *name)
@@ -454,8 +463,8 @@ static struct arg_item *get_conf_item(const char *name)
        return item;
 }
 
-enum trailer_info_type { TRAILER_KEY, TRAILER_COMMAND, TRAILER_WHERE,
-                        TRAILER_IF_EXISTS, TRAILER_IF_MISSING };
+enum trailer_info_type { TRAILER_KEY, TRAILER_COMMAND, TRAILER_CMD,
+                       TRAILER_WHERE, TRAILER_IF_EXISTS, TRAILER_IF_MISSING };
 
 static struct {
        const char *name;
@@ -463,6 +472,7 @@ static struct {
 } trailer_config_items[] = {
        { "key", TRAILER_KEY },
        { "command", TRAILER_COMMAND },
+       { "cmd", TRAILER_CMD },
        { "where", TRAILER_WHERE },
        { "ifexists", TRAILER_IF_EXISTS },
        { "ifmissing", TRAILER_IF_MISSING }
@@ -542,6 +552,11 @@ static int git_trailer_config(const char *conf_key, const char *value, void *cb)
                        warning(_("more than one %s"), conf_key);
                conf->command = xstrdup(value);
                break;
+       case TRAILER_CMD:
+               if (conf->cmd)
+                       warning(_("more than one %s"), conf_key);
+               conf->cmd = xstrdup(value);
+               break;
        case TRAILER_WHERE:
                if (trailer_set_where(&conf->where, value))
                        warning(_("unknown value '%s' for key '%s'"), value, conf_key);