diff options
author | Ned Batchelder <ned@nedbatchelder.com> | 2019-12-22 09:48:17 -0500 |
---|---|---|
committer | Ned Batchelder <ned@nedbatchelder.com> | 2019-12-22 11:09:01 -0500 |
commit | 0d6a8784cdafd46409fe187ad87b7c38772d6d1b (patch) | |
tree | 72d83360eb575ad10d8ec0213a242bd9e0bf156c /coverage/sqldata.py | |
parent | d66d496b53e3fd8ba891a2704d82e0b6a0be1502 (diff) | |
download | python-coveragepy-git-0d6a8784cdafd46409fe187ad87b7c38772d6d1b.tar.gz |
Detect when a 4.x data file is being read. #886
Diffstat (limited to 'coverage/sqldata.py')
-rw-r--r-- | coverage/sqldata.py | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/coverage/sqldata.py b/coverage/sqldata.py index 01f5ce01..613a280c 100644 --- a/coverage/sqldata.py +++ b/coverage/sqldata.py @@ -1031,7 +1031,20 @@ class SqliteDb(SimpleReprMixin): try: return self.con.execute(sql, parameters) except sqlite3.Error as exc: - raise CoverageException("Couldn't use data file {!r}: {}".format(self.filename, exc)) + msg = str(exc) + try: + # `execute` is the first thing we do with the database, so try + # hard to provide useful hints if something goes wrong now. + with open(self.filename, "rb") as bad_file: + cov4_sig = b"!coverage.py: This is a private format" + if bad_file.read(len(cov4_sig)) == cov4_sig: + msg = ( + "Looks like a coverage 4.x data file. " + "Are you mixing versions of coverage?" + ) + except Exception: + pass + raise CoverageException("Couldn't use data file {!r}: {}".format(self.filename, msg)) def executemany(self, sql, data): """Same as :meth:`python:sqlite3.Connection.executemany`.""" |