[PATCH 3 of 3] debugignore: find out why a file is being ignored (issue4856)

Laurent Charignon lcharignon at fb.com
Tue Jan 5 10:06:35 CST 2016


# HG changeset patch
# User Laurent Charignon <lcharignon at fb.com>
# Date 1452008828 28800
#      Tue Jan 05 07:47:08 2016 -0800
# Node ID 4b94c235c1d56cf1b10b498069be8b8b3cd5df95
# Parent  f7e7e2860418d168df8486867297ce598f5b362b
debugignore: find out why a file is being ignored (issue4856)

This patch adds a capability to hg debugignore: to explain why a given file is
being ignores by mercurial. We display the filename, line and linenumber of the
rule that lead us to ignore the file.

diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -2441,7 +2441,8 @@
 
     With no argument display the combined ignore pattern.
 
-    Given space separated file names, shows if the given file is ignored.
+    Given space separated file names, shows if the given file is ignored and
+    if so, show the ignore rule (file and line number) that matched it.
     """
     ignore = repo.dirstate._ignore
     if not files:
@@ -2454,13 +2455,16 @@
     else:
         for f in files:
             ignored = None
+            ignoredata = None
             if f != '.':
                 if ignore(f):
                     ignored = f
+                    ignoredata = repo.dirstate._ignorefileandline(f)
                 else:
                     for p in util.finddirs(f):
                         if ignore(p):
                             ignored = p
+                            ignoredata = repo.dirstate._ignorefileandline(p)
                             break
             if ignored:
                 if ignored == f:
@@ -2468,6 +2472,9 @@
                 else:
                     ui.write("%s is ignored because of containing folder %s\n"
                              % (f, ignored))
+                ignorefile, lineno, line = ignoredata
+                ui.write("(ignore rule in %s, line %d: '%s')\n"
+                         % (ignorefile, lineno, line))
             else:
                 ui.write("%s is not ignored\n" % f)
 
diff --git a/tests/test-hgignore.t b/tests/test-hgignore.t
--- a/tests/test-hgignore.t
+++ b/tests/test-hgignore.t
@@ -168,6 +168,7 @@
 
   $ hg debugignore b.o
   b.o is ignored
+  (ignore rule in $TESTTMP/ignorerepo/.hgignore, line 1: '*')
 
   $ cd ..
 
@@ -198,6 +199,7 @@
   a.c is not ignored
   $ hg debugignore dir/c.o
   dir/c.o is ignored
+  (ignore rule in $TESTTMP/ignorerepo/.hgignore, line 2: 'dir/**/c.o')
 
 Check using 'include:' in ignore file
 
@@ -283,3 +285,4 @@
   [1]
   $ hg debugignore dir1/file2
   dir1/file2 is ignored
+  (ignore rule in dir2/.hgignore, line 1: 'file*2')


More information about the Mercurial-devel mailing list