# HG changeset patch # User Laurent Charignon # Date 2016-01-05 15:47:08 # Node ID f2da9bb87ae027e68852d25455e2b3b66f8d10a6 # Parent 067d87feeb11c11fb3ca1ee40b5fa242c93850ea 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 @@ def debugignore(ui, repo, *files, **opts 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 @@ def debugignore(ui, repo, *files, **opts 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 @@ def debugignore(ui, repo, *files, **opts 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 @@ Test relative ignore path (issue4473): $ hg debugignore b.o b.o is ignored + (ignore rule in $TESTTMP/ignorerepo/.hgignore, line 1: '*') $ cd .. @@ -198,6 +199,7 @@ Check recursive glob pattern matches no 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 @@ Check include subignore at the same leve [1] $ hg debugignore dir1/file2 dir1/file2 is ignored + (ignore rule in dir2/.hgignore, line 1: 'file*2')