interpret-trailers: add an option to show only existing trailers
authorJeff King <peff@peff.net>
Tue, 15 Aug 2017 10:23:25 +0000 (06:23 -0400)
committerJunio C Hamano <gitster@pobox.com>
Tue, 15 Aug 2017 18:13:58 +0000 (11:13 -0700)
It can be useful to invoke interpret-trailers for the
primary purpose of parsing existing trailers. But in that
case, we don't want to apply existing ifMissing or ifExists
rules from the config. Let's add a special mode where we
avoid applying those rules. Coupled with --only-trailers,
this gives us a reasonable parsing tool.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-interpret-trailers.txt
builtin/interpret-trailers.c
t/t7513-interpret-trailers.sh
trailer.c
trailer.h
index 295dffbd2104ba7b471b69bc1300deb002318e53..7cc43b0e3e11535ae271d8fb17011b1155d479cf 100644 (file)
@@ -83,6 +83,11 @@ OPTIONS
 --only-trailers::
        Output only the trailers, not any other parts of the input.
 
+--only-input::
+       Output only trailers that exist in the input; do not add any
+       from the command-line or by following configured `trailer.*`
+       rules.
+
 CONFIGURATION VARIABLES
 -----------------------
 
index afb12c11bc9966c7786f6602e3940ea0ffaa39be..2d90e0e4808144e3fcc016b0f6a9366b6ab66a8d 100644 (file)
@@ -25,6 +25,7 @@ int cmd_interpret_trailers(int argc, const char **argv, const char *prefix)
                OPT_BOOL(0, "in-place", &opts.in_place, N_("edit files in place")),
                OPT_BOOL(0, "trim-empty", &opts.trim_empty, N_("trim empty trailers")),
                OPT_BOOL(0, "only-trailers", &opts.only_trailers, N_("output only the trailers")),
+               OPT_BOOL(0, "only-input", &opts.only_input, N_("do not apply config rules")),
                OPT_STRING_LIST(0, "trailer", &trailers, N_("trailer"),
                                N_("trailer(s) to add")),
                OPT_END()
@@ -33,6 +34,12 @@ int cmd_interpret_trailers(int argc, const char **argv, const char *prefix)
        argc = parse_options(argc, argv, prefix, options,
                             git_interpret_trailers_usage, 0);
 
+       if (opts.only_input && trailers.nr)
+               usage_msg_opt(
+                       _("--trailer with --only-input does not make sense"),
+                       git_interpret_trailers_usage,
+                       options);
+
        if (argc) {
                int i;
                for (i = 0; i < argc; i++)
index 90d30037b7b38397123a080c8d70df4de894066f..94b6c52473e3a9862d7b4107796b45cbd6cf755d 100755 (executable)
@@ -1314,4 +1314,20 @@ test_expect_success 'only-trailers omits non-trailer in middle of block' '
        test_cmp expected actual
 '
 
+test_expect_success 'only input' '
+       git config trailer.sign.command "echo config-value" &&
+       cat >expected <<-\EOF &&
+               existing: existing-value
+       EOF
+       git interpret-trailers \
+               --only-trailers --only-input >actual <<-\EOF &&
+               my subject
+
+               my body
+
+               existing: existing-value
+       EOF
+       test_cmp expected actual
+'
+
 test_done
index 83225c6828b30d893a641142c8c7c2684ac4f6a4..847417ef89906694aaa3b27809d2a50b6afef789 100644 (file)
--- a/trailer.c
+++ b/trailer.c
@@ -976,7 +976,6 @@ void process_trailers(const char *file,
                      struct string_list *trailers)
 {
        LIST_HEAD(head);
-       LIST_HEAD(arg_head);
        struct strbuf sb = STRBUF_INIT;
        int trailer_end;
        FILE *outfile = stdout;
@@ -991,9 +990,11 @@ void process_trailers(const char *file,
        /* Print the lines before the trailers */
        trailer_end = process_input_file(outfile, sb.buf, &head, opts);
 
-       process_command_line_args(&arg_head, trailers);
-
-       process_trailers_lists(&head, &arg_head);
+       if (!opts->only_input) {
+               LIST_HEAD(arg_head);
+               process_command_line_args(&arg_head, trailers);
+               process_trailers_lists(&head, &arg_head);
+       }
 
        print_all(outfile, &head, opts);
 
index 3cf35ced00ffbc57de93b6d8a005085836b23ed5..76c3b571bf66f65a4cf86a4aaa08393e31136b70 100644 (file)
--- a/trailer.h
+++ b/trailer.h
@@ -26,6 +26,7 @@ struct process_trailer_options {
        int in_place;
        int trim_empty;
        int only_trailers;
+       int only_input;
 };
 
 #define PROCESS_TRAILER_OPTIONS_INIT {0}