# HG changeset patch # User Danny Hooper # Date 1564010340 25200 # Node ID 2987d015aba46c20003b29477fbbceaff7f40ea3 # Parent 22c4bd7d1cbfc7e5693a886e55067eb1ab35f9e5 fix: ignore fixer tool configurations that are missing patterns This is to prevent a crash under the same circumstances. This is also to avoid data loss due to accidental application of a fixer tool to all files, if the matching logic somehow changed to that effect. Affecting all files until otherwise configured would be dangerous, and not very useful. We shouldn't abort because there may be other fixers, and it may still be useful to run them without having to adjust configuration. A user might not feel confident in changing configs, for example. Differential Revision: https://phab.mercurial-scm.org/D6693 diff -r 22c4bd7d1cbf -r 2987d015aba4 hgext/fix.py --- a/hgext/fix.py Wed Jul 24 16:21:12 2019 -0700 +++ b/hgext/fix.py Wed Jul 24 16:19:00 2019 -0700 @@ -705,6 +705,14 @@ setattr(fixers[name], pycompat.sysstr('_' + key), attrs.get(key, default)) fixers[name]._priority = int(fixers[name]._priority) + # Don't use a fixer if it has no pattern configured. It would be + # dangerous to let it affect all files. It would be pointless to let it + # affect no files. There is no reasonable subset of files to use as the + # default. + if fixers[name]._pattern is None: + ui.warn( + _('fixer tool has no pattern configuration: %s\n') % (name,)) + del fixers[name] return collections.OrderedDict( sorted(fixers.items(), key=lambda item: item[1]._priority, reverse=True)) @@ -722,7 +730,8 @@ def affects(self, opts, fixctx, path): """Should this fixer run on the file at the given path and context?""" - return scmutil.match(fixctx, [self._pattern], opts)(path) + return (self._pattern is not None and + scmutil.match(fixctx, [self._pattern], opts)(path)) def shouldoutputmetadata(self): """Should the stdout of this fixer start with JSON and a null byte?""" diff -r 22c4bd7d1cbf -r 2987d015aba4 tests/test-fix.t --- a/tests/test-fix.t Wed Jul 24 16:21:12 2019 -0700 +++ b/tests/test-fix.t Wed Jul 24 16:19:00 2019 -0700 @@ -1242,6 +1242,26 @@ $ cd .. +Tools configured without a pattern are ignored. It would be too dangerous to +run them on all files, because this might happen while testing a configuration +that also deletes all of the file content. There is no reasonable subset of the +files to use as a default. Users should be explicit about what files are +affected by a tool. This test also confirms that we don't crash when the +pattern config is missing, and that we only warn about it once. + + $ hg init nopatternconfigured + $ cd nopatternconfigured + + $ printf "foo" > foo + $ printf "bar" > bar + $ hg add -q + $ hg fix --debug --working-dir --config "fix.nopattern:command=echo fixed" + fixer tool has no pattern configuration: nopattern + $ cat foo bar + foobar (no-eol) + + $ cd .. + Test that we can configure a fixer to affect all files regardless of the cwd. The way we invoke matching must not prohibit this.