ignore: resolve ignore files relative to repo root (issue4473) (BC)
authorSiddharth Agarwal <sid0@fb.com>
Tue, 16 Dec 2014 14:34:53 -0800
changeset 23629 a04c7b74b3d5
parent 23628 7d7a4848fff4
child 23630 b9af235810cc
ignore: resolve ignore files relative to repo root (issue4473) (BC) Previously these would be considered to be relative to the current working directory. That behavior is both undocumented and doesn't really make sense. There are two reasonable options for how to resolve relative paths: - relative to the repo root - relative to the config file Resolving these files relative to the repo root matches existing behavior with hooks. An earlier discussion about this is available at http://mercurial.markmail.org/thread/tvu7yhzsiywgkjzl. Thanks to Isaac Jurado <diptongo@gmail.com> for the initial patchset that spurred the discussion.
mercurial/dirstate.py
mercurial/help/config.txt
tests/test-hgignore.t
--- a/mercurial/dirstate.py	Wed Dec 17 18:53:38 2014 -0800
+++ b/mercurial/dirstate.py	Tue Dec 16 14:34:53 2014 -0800
@@ -130,7 +130,9 @@
         files = [self._join('.hgignore')]
         for name, path in self._ui.configitems("ui"):
             if name == 'ignore' or name.startswith('ignore.'):
-                files.append(util.expandpath(path))
+                # we need to use os.path.join here rather than self._join
+                # because path is arbitrary and user-specified
+                files.append(os.path.join(self._rootdir, util.expandpath(path)))
         return ignore.ignore(self._root, files, self._ui.warn)
 
     @propertycache
--- a/mercurial/help/config.txt	Wed Dec 17 18:53:38 2014 -0800
+++ b/mercurial/help/config.txt	Tue Dec 16 14:34:53 2014 -0800
@@ -1338,11 +1338,11 @@
 
 ``ignore``
     A file to read per-user ignore patterns from. This file should be
-    in the same format as a repository-wide .hgignore file. This
-    option supports hook syntax, so if you want to specify multiple
-    ignore files, you can do so by setting something like
-    ``ignore.other = ~/.hgignore2``. For details of the ignore file
-    format, see the ``hgignore(5)`` man page.
+    in the same format as a repository-wide .hgignore file. Filenames
+    are relative to the repository root. This option supports hook syntax,
+    so if you want to specify multiple ignore files, you can do so by
+    setting something like ``ignore.other = ~/.hgignore2``. For details
+    of the ignore file format, see the ``hgignore(5)`` man page.
 
 ``interactive``
     Allow to prompt the user. True or False. Default is True.
--- a/tests/test-hgignore.t	Wed Dec 17 18:53:38 2014 -0800
+++ b/tests/test-hgignore.t	Tue Dec 16 14:34:53 2014 -0800
@@ -80,13 +80,23 @@
 
 empty out testhgignore
   $ echo > .hg/testhgignore
-  $ echo "glob:*.o" > .hgignore
+
+Test relative ignore path (issue4473):
+
+  $ cat >> $HGRCPATH << EOF
+  > [ui]
+  > ignore.relative = .hg/testhgignorerel
+  > EOF
+  $ echo "glob:*.o" > .hg/testhgignorerel
+  $ cd dir
   $ hg status
   A dir/b.o
   ? .hgignore
   ? a.c
   ? syntax
 
+  $ cd ..
+  $ echo > .hg/testhgignorerel
   $ echo "syntax: glob" > .hgignore
   $ echo "re:.*\.o" >> .hgignore
   $ hg status