Show More
@@ -36,6 +36,15 b' substituted into the command::' | |||||
36 | {first} The 1-based line number of the first line in the modified range |
|
36 | {first} The 1-based line number of the first line in the modified range | |
37 | {last} The 1-based line number of the last line in the modified range |
|
37 | {last} The 1-based line number of the last line in the modified range | |
38 |
|
38 | |||
|
39 | Deleted sections of a file will be ignored by :linerange, because there is no | |||
|
40 | corresponding line range in the version being fixed. | |||
|
41 | ||||
|
42 | By default, tools that set :linerange will only be executed if there is at least | |||
|
43 | one changed line range. This is meant to prevent accidents like running a code | |||
|
44 | formatter in such a way that it unexpectedly reformats the whole file. If such a | |||
|
45 | tool needs to operate on unchanged files, it should set the :skipclean suboption | |||
|
46 | to false. | |||
|
47 | ||||
39 | The :pattern suboption determines which files will be passed through each |
|
48 | The :pattern suboption determines which files will be passed through each | |
40 | configured tool. See :hg:`help patterns` for possible values. If there are file |
|
49 | configured tool. See :hg:`help patterns` for possible values. If there are file | |
41 | arguments to :hg:`fix`, the intersection of these patterns is used. |
|
50 | arguments to :hg:`fix`, the intersection of these patterns is used. | |
@@ -126,6 +135,7 b' from mercurial.node import wdirrev' | |||||
126 |
|
135 | |||
127 | from mercurial.utils import ( |
|
136 | from mercurial.utils import ( | |
128 | procutil, |
|
137 | procutil, | |
|
138 | stringutil, | |||
129 | ) |
|
139 | ) | |
130 |
|
140 | |||
131 | from mercurial import ( |
|
141 | from mercurial import ( | |
@@ -162,6 +172,7 b' FIXER_ATTRS = {' | |||||
162 | 'pattern': None, |
|
172 | 'pattern': None, | |
163 | 'priority': 0, |
|
173 | 'priority': 0, | |
164 | 'metadata': False, |
|
174 | 'metadata': False, | |
|
175 | 'skipclean': 'true', | |||
165 | } |
|
176 | } | |
166 |
|
177 | |||
167 | for key, default in FIXER_ATTRS.items(): |
|
178 | for key, default in FIXER_ATTRS.items(): | |
@@ -713,6 +724,7 b' def getfixers(ui):' | |||||
713 | setattr(fixers[name], pycompat.sysstr('_' + key), |
|
724 | setattr(fixers[name], pycompat.sysstr('_' + key), | |
714 | attrs.get(key, default)) |
|
725 | attrs.get(key, default)) | |
715 | fixers[name]._priority = int(fixers[name]._priority) |
|
726 | fixers[name]._priority = int(fixers[name]._priority) | |
|
727 | fixers[name]._skipclean = stringutil.parsebool(fixers[name]._skipclean) | |||
716 | # Don't use a fixer if it has no pattern configured. It would be |
|
728 | # Don't use a fixer if it has no pattern configured. It would be | |
717 | # dangerous to let it affect all files. It would be pointless to let it |
|
729 | # dangerous to let it affect all files. It would be pointless to let it | |
718 | # affect no files. There is no reasonable subset of files to use as the |
|
730 | # affect no files. There is no reasonable subset of files to use as the | |
@@ -756,7 +768,7 b' class Fixer(object):' | |||||
756 | {'rootpath': path, 'basename': os.path.basename(path)})] |
|
768 | {'rootpath': path, 'basename': os.path.basename(path)})] | |
757 | if self._linerange: |
|
769 | if self._linerange: | |
758 | ranges = rangesfn() |
|
770 | ranges = rangesfn() | |
759 | if not ranges: |
|
771 | if self._skipclean and not ranges: | |
760 | # No line ranges to fix, so don't run the fixer. |
|
772 | # No line ranges to fix, so don't run the fixer. | |
761 | return None |
|
773 | return None | |
762 | for first, last in ranges: |
|
774 | for first, last in ranges: |
@@ -147,6 +147,15 b' Help text for fix.' | |||||
147 | {first} The 1-based line number of the first line in the modified range |
|
147 | {first} The 1-based line number of the first line in the modified range | |
148 | {last} The 1-based line number of the last line in the modified range |
|
148 | {last} The 1-based line number of the last line in the modified range | |
149 |
|
149 | |||
|
150 | Deleted sections of a file will be ignored by :linerange, because there is no | |||
|
151 | corresponding line range in the version being fixed. | |||
|
152 | ||||
|
153 | By default, tools that set :linerange will only be executed if there is at | |||
|
154 | least one changed line range. This is meant to prevent accidents like running | |||
|
155 | a code formatter in such a way that it unexpectedly reformats the whole file. | |||
|
156 | If such a tool needs to operate on unchanged files, it should set the | |||
|
157 | :skipclean suboption to false. | |||
|
158 | ||||
150 | The :pattern suboption determines which files will be passed through each |
|
159 | The :pattern suboption determines which files will be passed through each | |
151 | configured tool. See 'hg help patterns' for possible values. If there are file |
|
160 | configured tool. See 'hg help patterns' for possible values. If there are file | |
152 | arguments to 'hg fix', the intersection of these patterns is used. |
|
161 | arguments to 'hg fix', the intersection of these patterns is used. | |
@@ -1356,3 +1365,34 b' The way we invoke matching must not proh' | |||||
1356 | fixed |
|
1365 | fixed | |
1357 |
|
1366 | |||
1358 | $ cd .. |
|
1367 | $ cd .. | |
|
1368 | ||||
|
1369 | Tools should be able to run on unchanged files, even if they set :linerange. | |||
|
1370 | This includes a corner case where deleted chunks of a file are not considered | |||
|
1371 | changes. | |||
|
1372 | ||||
|
1373 | $ hg init skipclean | |||
|
1374 | $ cd skipclean | |||
|
1375 | ||||
|
1376 | $ printf "a\nb\nc\n" > foo | |||
|
1377 | $ printf "a\nb\nc\n" > bar | |||
|
1378 | $ printf "a\nb\nc\n" > baz | |||
|
1379 | $ hg commit -Aqm "base" | |||
|
1380 | ||||
|
1381 | $ printf "a\nc\n" > foo | |||
|
1382 | $ printf "a\nx\nc\n" > baz | |||
|
1383 | ||||
|
1384 | $ hg fix --working-dir foo bar baz \ | |||
|
1385 | > --config 'fix.changedlines:command=printf "Line ranges:\n"; ' \ | |||
|
1386 | > --config 'fix.changedlines:linerange=printf "{first} through {last}\n"; ' \ | |||
|
1387 | > --config 'fix.changedlines:pattern=rootglob:**' \ | |||
|
1388 | > --config 'fix.changedlines:skipclean=false' | |||
|
1389 | ||||
|
1390 | $ cat foo | |||
|
1391 | Line ranges: | |||
|
1392 | $ cat bar | |||
|
1393 | Line ranges: | |||
|
1394 | $ cat baz | |||
|
1395 | Line ranges: | |||
|
1396 | 2 through 2 | |||
|
1397 | ||||
|
1398 | $ cd .. |
General Comments 0
You need to be logged in to leave comments.
Login now