From: Chris Zehner <cbzehner@xxxxxxxxx> Signed-off-by: Chris Zehner <cbzehner@xxxxxxxxx> --- Documentation/gitignore.txt | 8 ++++++-- dir.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/Documentation/gitignore.txt b/Documentation/gitignore.txt index d47b1ae296..1778cf1d38 100644 --- a/Documentation/gitignore.txt +++ b/Documentation/gitignore.txt @@ -74,8 +74,12 @@ PATTERN FORMAT for readability. - A line starting with # serves as a comment. - Put a backslash ("`\`") in front of the first hash for patterns - that begin with a hash. + Put a backslash ("`\`") in front of each hash for patterns + containing a hash. + + - A # after a pattern will be treated as the start of a comment. + Put a backslash ("`\`") in front of each hash for patterns + containing a hash. - Trailing spaces are ignored unless they are quoted with backslash ("`\`"). diff --git a/dir.c b/dir.c index cab9c2a458..aeefe142bc 100644 --- a/dir.c +++ b/dir.c @@ -658,6 +658,38 @@ void clear_pattern_list(struct pattern_list *pl) memset(pl, 0, sizeof(*pl)); } +static void trim_trailing_comments(char *buf) +{ + char *p, *last_hash = NULL; + int escape_seq = 0; + + for (p = buf; *p; p++) + { + if (!*p) + return; + switch (*p) { + case '#': + if (escape_seq) + { + escape_seq = 0; + p++; + break; + } + if (!last_hash) + last_hash = p; + break; + case '\\': + escape_seq = 1; + break; + default: + escape_seq = 0; + } + } + + if (last_hash) + *last_hash = '\0'; +} + static void trim_trailing_spaces(char *buf) { char *p, *last_space = NULL; @@ -859,6 +891,7 @@ static int add_patterns_from_buffer(char *buf, size_t size, if (buf[i] == '\n') { if (entry != buf + i && entry[0] != '#') { buf[i - (i && buf[i-1] == '\r')] = 0; + trim_trailing_comments(entry); trim_trailing_spaces(entry); add_pattern(entry, base, baselen, pl, lineno); } -- gitgitgadget