From: Chris Zehner <cbzeh...@gmail.com>

Signed-off-by: Chris Zehner <cbzeh...@gmail.com>
---
 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

Reply via email to