hgext/fix.py
changeset 42756 ed0da6e0d6ee
parent 42673 74b4cd091e0d
child 42757 2d70b1118af2
--- a/hgext/fix.py	Wed Jul 10 09:57:28 2019 +0200
+++ b/hgext/fix.py	Mon Aug 12 16:39:39 2019 -0700
@@ -36,6 +36,15 @@
   {first}   The 1-based line number of the first line in the modified range
   {last}    The 1-based line number of the last line in the modified range
 
+Deleted sections of a file will be ignored by :linerange, because there is no
+corresponding line range in the version being fixed.
+
+By default, tools that set :linerange will only be executed if there is at least
+one changed line range. This is meant to prevent accidents like running a code
+formatter in such a way that it unexpectedly reformats the whole file. If such a
+tool needs to operate on unchanged files, it should set the :skipclean suboption
+to false.
+
 The :pattern suboption determines which files will be passed through each
 configured tool. See :hg:`help patterns` for possible values. If there are file
 arguments to :hg:`fix`, the intersection of these patterns is used.
@@ -126,6 +135,7 @@
 
 from mercurial.utils import (
     procutil,
+    stringutil,
 )
 
 from mercurial import (
@@ -162,6 +172,7 @@
     'pattern': None,
     'priority': 0,
     'metadata': False,
+    'skipclean': 'true',
 }
 
 for key, default in FIXER_ATTRS.items():
@@ -713,6 +724,7 @@
             setattr(fixers[name], pycompat.sysstr('_' + key),
                     attrs.get(key, default))
         fixers[name]._priority = int(fixers[name]._priority)
+        fixers[name]._skipclean = stringutil.parsebool(fixers[name]._skipclean)
         # 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
@@ -756,7 +768,7 @@
                         {'rootpath': path, 'basename': os.path.basename(path)})]
         if self._linerange:
             ranges = rangesfn()
-            if not ranges:
+            if self._skipclean and not ranges:
                 # No line ranges to fix, so don't run the fixer.
                 return None
             for first, last in ranges: