diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py --- a/mercurial/dirstate.py +++ b/mercurial/dirstate.py @@ -130,7 +130,9 @@ class dirstate(object): 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 diff --git a/mercurial/help/config.txt b/mercurial/help/config.txt --- a/mercurial/help/config.txt +++ b/mercurial/help/config.txt @@ -1338,11 +1338,11 @@ User interface controls. ``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. diff --git a/tests/test-hgignore.t b/tests/test-hgignore.t --- a/tests/test-hgignore.t +++ b/tests/test-hgignore.t @@ -80,13 +80,23 @@ Test that patterns from ui.ignore option 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