diff --git a/README.md b/README.md index 82e79b0..068f860 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,11 @@ If you want to forget particular old test results without retesting, run `git te If you want to permanently forget *all* stored results for a particular test (e.g., if something in your environment has changed), run - git test forget-results [--test=] + git test forget-results --all [--test=] + +If you want to permanently forget *all* stored results for *all test*, run + + git test forget-results --all-tests ### Continue on test failures diff --git a/bin/git-test b/bin/git-test index d8ddbb2..6490e94 100755 --- a/bin/git-test +++ b/bin/git-test @@ -826,7 +826,25 @@ def cmd_results(parser, options): def cmd_forget_results(parser, options): - test = Test(options.test) + NO_ARGUMENTS_WARNING = """\ +WARNING: Which test results to forget was not specified. Assuming --all for +backwards compability. This backwards compability might be removed in the +future, please update to explicit specify what should be removed. +""" + + if not (options.all or options.all_tests): + sys.stderr.write(colored(NO_ARGUMENTS_WARNING, AnsiColor.CYAN)) + options.all = True + + if options.all_tests: + for test in iter_tests(): + forget_results_for_test(test.name) + else: + forget_results_for_test(options.test) + + +def forget_results_for_test(name): + test = Test(name) cmd = ['git', 'config', 'test.%s.command' % (test.name,)] try: @@ -838,6 +856,9 @@ def cmd_forget_results(parser, options): test.initialize_status( 'Test results reinitialized by \'git test forget-results\'' ) + sys.stdout.write(colored('All test results for test ', AnsiColor.GREEN)) + sys.stdout.write(colored(test.name, AnsiColor.CYAN)) + sys.stdout.write(colored(' were forgotten.\n', AnsiColor.GREEN)) test_re = re.compile(r'^test\.(?P.*)\.command$') @@ -1058,6 +1079,15 @@ def main(args): action='store', default='default', help='name of test whose results should be forgotten (default is \'default\')', ) + subparser.add_argument( + '--all', action='store_true', + help='forget all existing test results for the current test', + ) + subparser.add_argument( + '--all-tests', + action='store_true', + help='forget all existing test results for all tests', + ) add_verbosity_options(subparser) subparser = subparsers.add_parser( diff --git a/test/forget-results.t b/test/forget-results.t new file mode 100755 index 0000000..dd7d3c0 --- /dev/null +++ b/test/forget-results.t @@ -0,0 +1,164 @@ +#! /bin/sh + +test_description="Test forgetting test results" + +. ./sharness.sh + +test_expect_success 'Set up test repository' ' + git init . && + git config user.name "Test User" && + git config user.email "user@example.com" && + for i in $(seq 0 3) + do + echo $i >number && + git add number && + git commit -m "Number $i" + done && + true +' + +test_expect_success 'Add tests' ' + git-test add true && + git-test add -t t1 true && + git-test add -t t2 true && + git-test add -t t3 true && + true +' + +test_expect_success 'Add some simulated test results' ' + git notes --ref=tests/default add -m "good" HEAD~0^{tree} && + git notes --ref=tests/default add -m "good" HEAD~1^{tree} && + git notes --ref=tests/default add -m "good" HEAD~2^{tree} && + git notes --ref=tests/default add -m "good" HEAD~3^{tree} && + true && + git notes --ref=tests/t1 add -m "good" HEAD~0^{tree} && + git notes --ref=tests/t1 add -m "good" HEAD~1^{tree} && + git notes --ref=tests/t1 add -m "good" HEAD~2^{tree} && + git notes --ref=tests/t1 add -m "bad" HEAD~3^{tree} && + true && + git notes --ref=tests/t2 add -m "good" HEAD~1^{tree} && + git notes --ref=tests/t2 add -m "bad" HEAD~2^{tree} && + true +' + +test_expect_success 'Verify number of notes' ' + echo 4 > expected && + git notes --ref=tests/default list | wc -l >actual && + test_cmp expected actual && + true && + echo 4 > expected && + git notes --ref=tests/t1 list | wc -l >actual && + test_cmp expected actual && + true && + echo 2 > expected && + git notes --ref=tests/t2 list | wc -l >actual && + test_cmp expected actual && + true && + echo 0 > expected && + git notes --ref=tests/t3 list | wc -l >actual && + test_cmp expected actual && + true +' + +test_expect_success 'Forgetting default and not affecting other tests' ' + echo "All test results for test default were forgotten." >expected && + git-test forget-results --all >actual && + test_must_fail grep -q WARNING actual + test_cmp expected actual && + echo 0 > expected && + git notes --ref=tests/default list | wc -l >actual && + test_cmp expected actual && + true && + echo 4 > expected && + git notes --ref=tests/t1 list | wc -l >actual && + test_cmp expected actual && + true && + echo 2 > expected && + git notes --ref=tests/t2 list | wc -l >actual && + test_cmp expected actual && + true && + echo 0 > expected && + git notes --ref=tests/t3 list | wc -l >actual && + test_cmp expected actual && + true +' + + +test_expect_success 'Add default test results again' ' + git notes --ref=tests/default add -m "good" HEAD~0^{tree} && + git notes --ref=tests/default add -m "good" HEAD~1^{tree} && + git notes --ref=tests/default add -m "good" HEAD~2^{tree} && + git notes --ref=tests/default add -m "good" HEAD~3^{tree} && + true +' + + +test_expect_success 'Forgetting t1 and not affecting other tests' ' + echo "All test results for test t1 were forgotten." >expected && + git-test forget-results --all --test t1 >actual && + test_must_fail grep -q WARNING actual + test_cmp expected actual && + echo 4 > expected && + git notes --ref=tests/default list | wc -l >actual && + test_cmp expected actual && + true && + echo 0 > expected && + git notes --ref=tests/t1 list | wc -l >actual && + test_cmp expected actual && + true && + echo 2 > expected && + git notes --ref=tests/t2 list | wc -l >actual && + test_cmp expected actual && + true && + echo 0 > expected && + git notes --ref=tests/t3 list | wc -l >actual && + test_cmp expected actual && + true +' + +test_expect_success 'Forgetting all test results' ' + echo "All test results for test default were forgotten." >expected && + echo "All test results for test t1 were forgotten." >>expected && + echo "All test results for test t2 were forgotten." >>expected && + echo "All test results for test t3 were forgotten." >>expected && + git-test forget-results --all-tests >actual && + test_must_fail grep -q WARNING actual + test_cmp expected actual && + echo 0 > expected && + git notes --ref=tests/default list | wc -l >actual && + test_cmp expected actual && + true && + echo 0 > expected && + git notes --ref=tests/t1 list | wc -l >actual && + test_cmp expected actual && + true && + echo 0 > expected && + git notes --ref=tests/t2 list | wc -l >actual && + test_cmp expected actual && + true && + echo 0 > expected && + git notes --ref=tests/t3 list | wc -l >actual && + test_cmp expected actual && + true +' + + +# sed command: On line 1 remove from the first space and the rest, and delete +# lines 2 and till the last line, e.g. only keep first word on first line. +test_expect_success 'Missing --all or --all-tests argument produces warning' ' + echo "WARNING:" >expected + git-test forget-results 2>actual && + sed -i "1s/ .*//; 2,\$d" actual && + test_cmp expected actual +' + + +test_expect_success 'Should not give output on non-existent test' ' + rm -f expected && + touch expected && + git-test forget-results --all -t this-test-does-not-exist >actual && + test_cmp expected actual && + true +' + +test_done