summaryrefslogtreecommitdiff
path: root/coverage/sqldata.py
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2019-09-03 13:36:10 -0400
committerNed Batchelder <ned@nedbatchelder.com>2019-09-03 13:36:10 -0400
commitd9bc47d0db97ea47ebbe1b775947049792e8aa00 (patch)
treefd7dddd7a52a112bbd10ac6c6b605cb8b4c5523c /coverage/sqldata.py
parent48d95f9510328769faa174f569548f5c63513d95 (diff)
downloadpython-coveragepy-git-d9bc47d0db97ea47ebbe1b775947049792e8aa00.tar.gz
Updating with an empty data is ok
With no arc or line data, it used to choose lines arbitrarily, which would fail if an empty data was updating an arc data.
Diffstat (limited to 'coverage/sqldata.py')
-rw-r--r--coverage/sqldata.py40
1 files changed, 24 insertions, 16 deletions
diff --git a/coverage/sqldata.py b/coverage/sqldata.py
index babfcb8d..06ccff52 100644
--- a/coverage/sqldata.py
+++ b/coverage/sqldata.py
@@ -411,6 +411,8 @@ class CoverageData(SimpleReprMixin):
)
def _choose_lines_or_arcs(self, lines=False, arcs=False):
+ assert lines or arcs
+ assert not (lines and arcs)
if lines and self._has_arcs:
raise CoverageException("Can't add lines to existing arc data")
if arcs and self._has_lines:
@@ -480,6 +482,8 @@ class CoverageData(SimpleReprMixin):
If `aliases` is provided, it's a `PathAliases` object that is used to
re-map paths to match the local machine's.
"""
+ if self._debug.should('dataop'):
+ self._debug.write("Updating with data from %r" % (getattr(other_data, '_filename', '???'),))
if self._has_lines and other_data._has_arcs:
raise CoverageException("Can't combine arc data with line data")
if self._has_arcs and other_data._has_lines:
@@ -608,23 +612,27 @@ class CoverageData(SimpleReprMixin):
lines[key] = numbits
cur.close()
- self._choose_lines_or_arcs(arcs=bool(arcs), lines=bool(lines))
+ if arcs:
+ self._choose_lines_or_arcs(arcs=True)
- # Write the combined data.
- conn.executemany(
- 'insert or ignore into arc '
- '(file_id, context_id, fromno, tono) values (?, ?, ?, ?)',
- arc_rows
- )
- conn.execute("delete from line_bits")
- conn.executemany(
- "insert into line_bits "
- "(file_id, context_id, numbits) values (?, ?, ?)",
- [
- (file_ids[file], context_ids[context], numbits)
- for (file, context), numbits in lines.items()
- ]
- )
+ # Write the combined data.
+ conn.executemany(
+ 'insert or ignore into arc '
+ '(file_id, context_id, fromno, tono) values (?, ?, ?, ?)',
+ arc_rows
+ )
+
+ if lines:
+ self._choose_lines_or_arcs(lines=True)
+ conn.execute("delete from line_bits")
+ conn.executemany(
+ "insert into line_bits "
+ "(file_id, context_id, numbits) values (?, ?, ?)",
+ [
+ (file_ids[file], context_ids[context], numbits)
+ for (file, context), numbits in lines.items()
+ ]
+ )
conn.executemany(
'insert or ignore into tracer (file_id, tracer) values (?, ?)',
((file_ids[filename], tracer) for filename, tracer in tracer_map.items())