); SAEximRunCond expanded to false E.g if "Closes" is a configured trailer a line starting with "c:" shouldn't be treated as a recognized trailer when looking for trailer block. Signed-off-by: Anders Waldenborg <anders@xxxxxxx> --- t/t7513-interpret-trailers.sh | 7 +------ trailer.c | 28 ++++++++++++++++++---------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/t/t7513-interpret-trailers.sh b/t/t7513-interpret-trailers.sh index b1e9a9e6d1..6ddc2f5573 100755 --- a/t/t7513-interpret-trailers.sh +++ b/t/t7513-interpret-trailers.sh @@ -239,12 +239,7 @@ test_expect_success 'with non-trailer lines mixed with a configured trailer' ' test_cmp expected actual ' -# This fails because "c:/windows/tmp/stuff/temp.txt" is classified as -# a trailer line because "c" is a prefix of "Confirmed-By". Therefore -# the new trailer is appended to that (non-trailer) block rather than -# creating a new block. It also canonicalize the "trailer" to -# "Confirmed-By: /windows/tmp/stuff/temp.txt" -test_expect_failure 'with non-trailer lines mixed with prefix of configured trailer' ' +test_expect_success 'with non-trailer lines mixed with prefix of configured trailer' ' cat >patch <<-\EOF && some subject diff --git a/trailer.c b/trailer.c index 21877e4c06..d75d240e10 100644 --- a/trailer.c +++ b/trailer.c @@ -831,10 +831,20 @@ enum trailer_classification { BLANK, }; +static int starts_with_separator(const char *buf) +{ + while (*buf == ' ' || *buf == '\t') + buf++; + if (!*buf) + return 0; + return !!strchr(separators, *buf); +} + static enum trailer_classification classify_trailer_line(const char *line) { const char **p; ssize_t separator_pos; + struct list_head *pos; if (line[0] == comment_line_char) return COMMENT; @@ -849,19 +859,17 @@ static enum trailer_classification classify_trailer_line(const char *line) if (starts_with(line, *p)) return GIT_GENERATED_PREFIX; - - separator_pos = find_separator(line, separators); - if (separator_pos >= 1) { - struct list_head *pos; - - list_for_each(pos, &conf_head) { - struct conf_info_item *item; - item = list_entry(pos, struct conf_info_item, list); - if (token_matches_conf(line, &item->conf, - separator_pos)) + list_for_each(pos, &conf_head) { + struct conf_info_item *item = list_entry(pos, struct conf_info_item, list); + const char *conftrailer = item->conf.key ? item->conf.key : item->conf.name; + if (istarts_with(line, conftrailer)) { + if (starts_with_separator (line + strlen (conftrailer))) return CONFIGURED_TRAILER; } + } + separator_pos = find_separator(line, separators); + if (separator_pos >= 1) { return TRAILER; } -- 2.25.1