summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--coverage/cmdline.py39
-rw-r--r--coverage/control.py4
-rw-r--r--tests/test_process.py31
3 files changed, 59 insertions, 15 deletions
diff --git a/coverage/cmdline.py b/coverage/cmdline.py
index 499444ca..5d1b388d 100644
--- a/coverage/cmdline.py
+++ b/coverage/cmdline.py
@@ -19,7 +19,7 @@ class Opts(object):
"""A namespace class for individual options we'll build parsers from."""
append = optparse.make_option(
- '-a', '--append', action='store_false', dest="erase_first",
+ '-a', '--append', action='store_true',
help="Append coverage data to .coverage, otherwise it is started "
"clean with each run."
)
@@ -135,11 +135,11 @@ class CoverageOptionParser(optparse.OptionParser, object):
)
self.set_defaults(
action=None,
+ append=None,
branch=None,
concurrency=None,
debug=None,
directory=None,
- erase_first=None,
fail_under=None,
help=None,
ignore_errors=None,
@@ -320,7 +320,6 @@ CMDS = {
Opts.source,
Opts.timid,
] + GLOBAL_ARGS,
- defaults = {'erase_first': True},
usage = "[options] <pyfile> [program options]",
description = "Run a Python program, measuring code execution."
),
@@ -427,18 +426,19 @@ class CoverageScript(object):
if options.action == "debug":
return self.do_debug(args)
- if options.action == "erase" or options.erase_first:
+ elif options.action == "erase":
self.coverage.erase()
- else:
- self.coverage.load()
+ return OK
- if options.action == "run":
- self.do_run(options, args)
+ elif options.action == "run":
+ return self.do_run(options, args)
- if options.action == "combine":
+ elif options.action == "combine":
+ self.coverage.load()
data_dirs = args or None
self.coverage.combine(data_dirs)
self.coverage.save()
+ return OK
# Remaining actions are reporting, with some common options.
report_args = dict(
@@ -448,19 +448,21 @@ class CoverageScript(object):
include = include,
)
+ self.coverage.load()
+
total = None
if options.action == "report":
total = self.coverage.report(
show_missing=options.show_missing,
skip_covered=options.skip_covered, **report_args)
- if options.action == "annotate":
+ elif options.action == "annotate":
self.coverage.annotate(
directory=options.directory, **report_args)
- if options.action == "html":
+ elif options.action == "html":
total = self.coverage.html_report(
directory=options.directory, title=options.title,
**report_args)
- if options.action == "xml":
+ elif options.action == "xml":
outfile = options.outfile
total = self.coverage.xml_report(outfile=outfile, **report_args)
@@ -550,6 +552,10 @@ class CoverageScript(object):
def do_run(self, options, args):
"""Implementation of 'coverage run'."""
+ if not self.coverage.config.parallel:
+ if not options.append:
+ self.coverage.erase()
+
# Set the first path element properly.
old_path0 = sys.path[0]
@@ -570,17 +576,25 @@ class CoverageScript(object):
finally:
self.coverage.stop()
if code_ran:
+ if options.append:
+ from coverage.data import CoverageData
+ old_data = CoverageData()
+ old_data.read_file(self.coverage.config.data_file)
+ self.coverage.data.update(old_data)
self.coverage.save()
# Restore the old path
sys.path[0] = old_path0
+ return OK
+
def do_debug(self, args):
"""Implementation of 'coverage debug'."""
if not args:
self.help_fn("What information would you like: data, sys?")
return ERR
+
for info in args:
if info == 'sys':
sys_info = self.coverage.sys_info()
@@ -608,6 +622,7 @@ class CoverageScript(object):
else:
self.help_fn("Don't know what you mean by %r" % info)
return ERR
+
return OK
diff --git a/coverage/control.py b/coverage/control.py
index 8a671fe0..80bd853f 100644
--- a/coverage/control.py
+++ b/coverage/control.py
@@ -721,6 +721,7 @@ class Coverage(object):
"""
self._init()
+
aliases = None
if self.config.paths:
aliases = PathAliases()
@@ -728,6 +729,7 @@ class Coverage(object):
result = paths[0]
for pattern in paths[1:]:
aliases.add(pattern, result)
+
self.data_files.combine_parallel_data(self.data, aliases=aliases, data_dirs=data_dirs)
def get_data(self):
@@ -778,8 +780,6 @@ class Coverage(object):
self.data.touch_file(py_file)
# Add run information.
- from coverage import __version__
-
self.data.add_run_info(
brief_sys=" ".join([
platform.python_implementation(),
diff --git a/tests/test_process.py b/tests/test_process.py
index b57f4020..507de7d5 100644
--- a/tests/test_process.py
+++ b/tests/test_process.py
@@ -68,6 +68,7 @@ class ProcessTest(CoverageTest):
out = self.run_command("coverage run -p b_or_c.py b")
self.assertEqual(out, 'done\n')
self.assert_doesnt_exist(".coverage")
+ self.assertEqual(self.number_of_data_files(), 1)
out = self.run_command("coverage run -p b_or_c.py c")
self.assertEqual(out, 'done\n')
@@ -111,7 +112,7 @@ class ProcessTest(CoverageTest):
self.assert_exists(".coverage")
self.assertEqual(self.number_of_data_files(), 1)
- out = self.run_command("coverage run --append -p b_or_c.py c")
+ out = self.run_command("coverage run -p b_or_c.py c")
self.assertEqual(out, 'done\n')
self.assert_exists(".coverage")
self.assertEqual(self.number_of_data_files(), 2)
@@ -129,6 +130,34 @@ class ProcessTest(CoverageTest):
data.read_file(".coverage")
self.assertEqual(data.line_counts()['b_or_c.py'], 7)
+ def test_append_data(self):
+ self.make_file("b_or_c.py", """\
+ import sys
+ a = 1
+ if sys.argv[1] == 'b':
+ b = 1
+ else:
+ c = 1
+ d = 1
+ print('done')
+ """)
+
+ out = self.run_command("coverage run b_or_c.py b")
+ self.assertEqual(out, 'done\n')
+ self.assert_exists(".coverage")
+ self.assertEqual(self.number_of_data_files(), 1)
+
+ out = self.run_command("coverage run --append b_or_c.py c")
+ self.assertEqual(out, 'done\n')
+ self.assert_exists(".coverage")
+ self.assertEqual(self.number_of_data_files(), 1)
+
+ # Read the coverage file and see that b_or_c.py has all 7 lines
+ # executed.
+ data = coverage.CoverageData()
+ data.read_file(".coverage")
+ self.assertEqual(data.line_counts()['b_or_c.py'], 7)
+
def test_combine_with_rc(self):
self.make_file("b_or_c.py", """\
import sys