comparison tests/test-fix.t @ 40532:93bab80993f4

fix: add a config to abort when a fixer tool fails This allows users to stop and address tool failures before proceeding, instead of the default behavior of continuing to apply any tools that didn't fail. For example, a code formatting tool could fail if you have syntax errors, and you might want your repo to stay in its current state while you fix the syntax error before re-running 'hg fix'. It's conceivable that this would even be necessary for the correctness of some fixer tools across a chain of revisions. Differential Revision: https://phab.mercurial-scm.org/D5200
author Danny Hooper <hooper@google.com>
date Wed, 31 Oct 2018 13:11:51 -0700
parents 5abc47d4ca6b
children 2ecf5c24d0cd
comparison
equal deleted inserted replaced
40531:e6c8a0fd3db4 40532:93bab80993f4
128 clang-format:linerange=--lines={first}:{last} 128 clang-format:linerange=--lines={first}:{last}
129 clang-format:fileset=set:**.cpp or **.hpp 129 clang-format:fileset=set:**.cpp or **.hpp
130 130
131 The :command suboption forms the first part of the shell command that will be 131 The :command suboption forms the first part of the shell command that will be
132 used to fix a file. The content of the file is passed on standard input, and 132 used to fix a file. The content of the file is passed on standard input, and
133 the fixed file content is expected on standard output. If there is any output 133 the fixed file content is expected on standard output. Any output on standard
134 on standard error, the file will not be affected. Some values may be 134 error will be displayed as a warning. If the exit status is not zero, the file
135 substituted into the command: 135 will not be affected. A placeholder warning is displayed if there is a non-
136 zero exit status but no standard error output. Some values may be substituted
137 into the command:
136 138
137 {rootpath} The path of the file being fixed, relative to the repo root 139 {rootpath} The path of the file being fixed, relative to the repo root
138 {basename} The name of the file being fixed, without the directory path 140 {basename} The name of the file being fixed, without the directory path
139 141
140 If the :linerange suboption is set, the tool will only be run if there are 142 If the :linerange suboption is set, the tool will only be run if there are
151 153
152 There is also a configurable limit for the maximum size of file that will be 154 There is also a configurable limit for the maximum size of file that will be
153 processed by 'hg fix': 155 processed by 'hg fix':
154 156
155 [fix] 157 [fix]
156 maxfilesize=2MB 158 maxfilesize = 2MB
159
160 Normally, execution of configured tools will continue after a failure
161 (indicated by a non-zero exit status). It can also be configured to abort
162 after the first such failure, so that no files will be affected if any tool
163 fails. This abort will also cause 'hg fix' to exit with a non-zero status:
164
165 [fix]
166 failure = abort
157 167
158 list of commands: 168 list of commands:
159 169
160 fix rewrite file content in changesets or working directory 170 fix rewrite file content in changesets or working directory
161 171
506 error messages to the user, and we still let the fixer affect the file it was 516 error messages to the user, and we still let the fixer affect the file it was
507 fixing if its exit code is zero. Some code formatters might emit error messages 517 fixing if its exit code is zero. Some code formatters might emit error messages
508 on stderr and nothing on stdout, which would cause us the clear the file, 518 on stderr and nothing on stdout, which would cause us the clear the file,
509 except that they also exit with a non-zero code. We show the user which fixer 519 except that they also exit with a non-zero code. We show the user which fixer
510 emitted the stderr, and which revision, but we assume that the fixer will print 520 emitted the stderr, and which revision, but we assume that the fixer will print
511 the filename if it is relevant (since the issue may be non-specific). 521 the filename if it is relevant (since the issue may be non-specific). There is
522 also a config to abort (without affecting any files whatsoever) if we see any
523 tool with a non-zero exit status.
512 524
513 $ hg init showstderr 525 $ hg init showstderr
514 $ cd showstderr 526 $ cd showstderr
515 527
516 $ printf "hello\n" > hello.txt 528 $ printf "hello\n" > hello.txt
517 $ hg add 529 $ hg add
518 adding hello.txt 530 adding hello.txt
519 $ cat > $TESTTMP/fail.sh <<'EOF' 531 $ cat > $TESTTMP/work.sh <<'EOF'
520 > printf 'HELLO\n' 532 > printf 'HELLO\n'
521 > printf "$@: some\nerror" >&2 533 > printf "$@: some\nerror that didn't stop the tool" >&2
522 > exit 0 # success despite the stderr output 534 > exit 0 # success despite the stderr output
523 > EOF 535 > EOF
536 $ hg --config "fix.work:command=sh $TESTTMP/work.sh {rootpath}" \
537 > --config "fix.work:fileset=hello.txt" \
538 > fix --working-dir
539 [wdir] work: hello.txt: some
540 [wdir] work: error that didn't stop the tool
541 $ cat hello.txt
542 HELLO
543
544 $ printf "goodbye\n" > hello.txt
545 $ printf "foo\n" > foo.whole
546 $ hg add
547 adding foo.whole
548 $ cat > $TESTTMP/fail.sh <<'EOF'
549 > printf 'GOODBYE\n'
550 > printf "$@: some\nerror that did stop the tool\n" >&2
551 > exit 42 # success despite the stdout output
552 > EOF
553 $ hg --config "fix.fail:command=sh $TESTTMP/fail.sh {rootpath}" \
554 > --config "fix.fail:fileset=hello.txt" \
555 > --config "fix.failure=abort" \
556 > fix --working-dir
557 [wdir] fail: hello.txt: some
558 [wdir] fail: error that did stop the tool
559 abort: no fixes will be applied
560 (use --config fix.failure=continue to apply any successful fixes anyway)
561 [255]
562 $ cat hello.txt
563 goodbye
564 $ cat foo.whole
565 foo
566
524 $ hg --config "fix.fail:command=sh $TESTTMP/fail.sh {rootpath}" \ 567 $ hg --config "fix.fail:command=sh $TESTTMP/fail.sh {rootpath}" \
525 > --config "fix.fail:fileset=hello.txt" \ 568 > --config "fix.fail:fileset=hello.txt" \
526 > fix --working-dir 569 > fix --working-dir
527 [wdir] fail: hello.txt: some 570 [wdir] fail: hello.txt: some
528 [wdir] fail: error 571 [wdir] fail: error that did stop the tool
529 $ cat hello.txt
530 HELLO
531
532 $ printf "goodbye\n" > hello.txt
533 $ cat > $TESTTMP/work.sh <<'EOF'
534 > printf 'GOODBYE\n'
535 > printf "$@: some\nerror\n" >&2
536 > exit 42 # success despite the stdout output
537 > EOF
538 $ hg --config "fix.fail:command=sh $TESTTMP/work.sh {rootpath}" \
539 > --config "fix.fail:fileset=hello.txt" \
540 > fix --working-dir
541 [wdir] fail: hello.txt: some
542 [wdir] fail: error
543 $ cat hello.txt 572 $ cat hello.txt
544 goodbye 573 goodbye
574 $ cat foo.whole
575 FOO
545 576
546 $ hg --config "fix.fail:command=exit 42" \ 577 $ hg --config "fix.fail:command=exit 42" \
547 > --config "fix.fail:fileset=hello.txt" \ 578 > --config "fix.fail:fileset=hello.txt" \
548 > fix --working-dir 579 > fix --working-dir
549 [wdir] fail: exited with status 42 580 [wdir] fail: exited with status 42