Show More
@@ -54,6 +54,24 b' will also cause :hg:`fix` to exit with a' | |||
|
54 | 54 | [fix] |
|
55 | 55 | failure = abort |
|
56 | 56 | |
|
57 | When multiple tools are configured to affect a file, they execute in an order | |
|
58 | defined by the :priority suboption. The priority suboption has a default value | |
|
59 | of zero for each tool. Tools are executed in order of descending priority. The | |
|
60 | execution order of tools with equal priority is unspecified. For example, you | |
|
61 | could use the 'sort' and 'head' utilities to keep only the 10 smallest numbers | |
|
62 | in a text file by ensuring that 'sort' runs before 'head':: | |
|
63 | ||
|
64 | [fix] | |
|
65 | sort:command = sort --numeric-sort | |
|
66 | head:command = head --lines=10 | |
|
67 | sort:pattern = numbers.txt | |
|
68 | head:pattern = numbers.txt | |
|
69 | sort:priority = 2 | |
|
70 | head:priority = 1 | |
|
71 | ||
|
72 | To account for changes made by each tool, the line numbers used for incremental | |
|
73 | formatting are recomputed before executing the next tool. So, each tool may see | |
|
74 | different values for the arguments added by the :linerange suboption. | |
|
57 | 75 | """ |
|
58 | 76 | |
|
59 | 77 | from __future__ import absolute_import |
@@ -100,10 +118,16 b' configtable = {}' | |||
|
100 | 118 | configitem = registrar.configitem(configtable) |
|
101 | 119 | |
|
102 | 120 | # Register the suboptions allowed for each configured fixer. |
|
103 | FIXER_ATTRS = ('command', 'linerange', 'fileset', 'pattern') | |
|
121 | FIXER_ATTRS = { | |
|
122 | 'command': None, | |
|
123 | 'linerange': None, | |
|
124 | 'fileset': None, | |
|
125 | 'pattern': None, | |
|
126 | 'priority': 0, | |
|
127 | } | |
|
104 | 128 | |
|
105 | for key in FIXER_ATTRS: | |
|
106 |
configitem('fix', '.*(:%s)?' % key, default= |
|
|
129 | for key, default in FIXER_ATTRS.items(): | |
|
130 | configitem('fix', '.*(:%s)?' % key, default=default, generic=True) | |
|
107 | 131 | |
|
108 | 132 | # A good default size allows most source code files to be fixed, but avoids |
|
109 | 133 | # letting fixer tools choke on huge inputs, which could be surprising to the |
@@ -602,18 +626,21 b' def getfixers(ui):' | |||
|
602 | 626 | Each value is a Fixer object with methods that implement the behavior of the |
|
603 | 627 | fixer's config suboptions. Does not validate the config values. |
|
604 | 628 | """ |
|
605 |
|
|
|
629 | fixers = {} | |
|
606 | 630 | for name in fixernames(ui): |
|
607 |
|
|
|
631 | fixers[name] = Fixer() | |
|
608 | 632 | attrs = ui.configsuboptions('fix', name)[1] |
|
609 | 633 | if 'fileset' in attrs and 'pattern' not in attrs: |
|
610 | 634 | ui.warn(_('the fix.tool:fileset config name is deprecated; ' |
|
611 | 635 | 'please rename it to fix.tool:pattern\n')) |
|
612 | 636 | attrs['pattern'] = attrs['fileset'] |
|
613 | for key in FIXER_ATTRS: | |
|
614 |
setattr( |
|
|
615 |
attrs.get(key, |
|
|
616 | return result | |
|
637 | for key, default in FIXER_ATTRS.items(): | |
|
638 | setattr(fixers[name], pycompat.sysstr('_' + key), | |
|
639 | attrs.get(key, default)) | |
|
640 | fixers[name]._priority = int(fixers[name]._priority) | |
|
641 | return collections.OrderedDict( | |
|
642 | sorted(fixers.items(), key=lambda item: item[1]._priority, | |
|
643 | reverse=True)) | |
|
617 | 644 | |
|
618 | 645 | def fixernames(ui): |
|
619 | 646 | """Returns the names of [fix] config options that have suboptions""" |
@@ -165,6 +165,26 b' Help text for fix.' | |||
|
165 | 165 | [fix] |
|
166 | 166 | failure = abort |
|
167 | 167 | |
|
168 | When multiple tools are configured to affect a file, they execute in an order | |
|
169 | defined by the :priority suboption. The priority suboption has a default value | |
|
170 | of zero for each tool. Tools are executed in order of descending priority. The | |
|
171 | execution order of tools with equal priority is unspecified. For example, you | |
|
172 | could use the 'sort' and 'head' utilities to keep only the 10 smallest numbers | |
|
173 | in a text file by ensuring that 'sort' runs before 'head': | |
|
174 | ||
|
175 | [fix] | |
|
176 | sort:command = sort --numeric-sort | |
|
177 | head:command = head --lines=10 | |
|
178 | sort:pattern = numbers.txt | |
|
179 | head:pattern = numbers.txt | |
|
180 | sort:priority = 2 | |
|
181 | head:priority = 1 | |
|
182 | ||
|
183 | To account for changes made by each tool, the line numbers used for | |
|
184 | incremental formatting are recomputed before executing the next tool. So, each | |
|
185 | tool may see different values for the arguments added by the :linerange | |
|
186 | suboption. | |
|
187 | ||
|
168 | 188 | list of commands: |
|
169 | 189 | |
|
170 | 190 | fix rewrite file content in changesets or working directory |
@@ -1127,3 +1147,51 b' warning.' | |||
|
1127 | 1147 | first |
|
1128 | 1148 | |
|
1129 | 1149 | $ cd .. |
|
1150 | ||
|
1151 | The execution order of tools can be controlled. This example doesn't work if | |
|
1152 | you sort after truncating, but the config defines the correct order while the | |
|
1153 | definitions are out of order (which might imply the incorrect order given the | |
|
1154 | implementation of fix). The goal is to use multiple tools to select the lowest | |
|
1155 | 5 numbers in the file. | |
|
1156 | ||
|
1157 | $ hg init priorityexample | |
|
1158 | $ cd priorityexample | |
|
1159 | ||
|
1160 | $ cat >> .hg/hgrc <<EOF | |
|
1161 | > [fix] | |
|
1162 | > head:command = head --lines=5 | |
|
1163 | > head:pattern = numbers.txt | |
|
1164 | > head:priority = 1 | |
|
1165 | > sort:command = sort --numeric-sort | |
|
1166 | > sort:pattern = numbers.txt | |
|
1167 | > sort:priority = 2 | |
|
1168 | > EOF | |
|
1169 | ||
|
1170 | $ printf "8\n2\n3\n6\n7\n4\n9\n5\n1\n0\n" > numbers.txt | |
|
1171 | $ hg add -q | |
|
1172 | $ hg fix -w | |
|
1173 | $ cat numbers.txt | |
|
1174 | 0 | |
|
1175 | 1 | |
|
1176 | 2 | |
|
1177 | 3 | |
|
1178 | 4 | |
|
1179 | ||
|
1180 | And of course we should be able to break this by reversing the execution order. | |
|
1181 | Test negative priorities while we're at it. | |
|
1182 | ||
|
1183 | $ cat >> .hg/hgrc <<EOF | |
|
1184 | > [fix] | |
|
1185 | > head:priority = -1 | |
|
1186 | > sort:priority = -2 | |
|
1187 | > EOF | |
|
1188 | $ printf "8\n2\n3\n6\n7\n4\n9\n5\n1\n0\n" > numbers.txt | |
|
1189 | $ hg fix -w | |
|
1190 | $ cat numbers.txt | |
|
1191 | 2 | |
|
1192 | 3 | |
|
1193 | 6 | |
|
1194 | 7 | |
|
1195 | 8 | |
|
1196 | ||
|
1197 | $ cd .. |
General Comments 0
You need to be logged in to leave comments.
Login now