From e4b8389b27ce4e7681788b8a28dc875ff4991739 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Tue, 7 Jan 2020 22:08:19 -0500 Subject: Put the filename calc back in _connect. Fixes #916 It was moved to __init__ to avoid recalculating, but the directory could have changed, so we need to wait to do the work. Instead, only do the relpath on systems that need it (Windows Py 2). --- coverage/sqldata.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) (limited to 'coverage/sqldata.py') diff --git a/coverage/sqldata.py b/coverage/sqldata.py index 2bb3035a..cac2c4b3 100644 --- a/coverage/sqldata.py +++ b/coverage/sqldata.py @@ -16,6 +16,7 @@ import sqlite3 import sys import zlib +from coverage import env from coverage.backward import get_thread_id, iitems, to_bytes, to_string from coverage.debug import NoDebugging, SimpleReprMixin, clipped_repr from coverage.files import PathAliases @@ -971,23 +972,26 @@ class SqliteDb(SimpleReprMixin): self.filename = filename self.nest = 0 self.con = None - # SQLite on Windows on py2 won't open a file if the filename argument - # has non-ascii characters in it. Opening a relative file name avoids - # a problem if the current directory has non-ascii. - try: - self.connect_filename = os.path.relpath(self.filename) - except ValueError: - # ValueError can be raised under Windows when os.getcwd() returns a - # folder from a different drive than the drive of self.filename in - # which case we keep the original value of self.filename unchanged, - # hoping that we won't face the non-ascii directory problem. - self.connect_filename = self.filename def _connect(self): """Connect to the db and do universal initialization.""" if self.con is not None: return + # SQLite on Windows on py2 won't open a file if the filename argument + # has non-ascii characters in it. Opening a relative file name avoids + # a problem if the current directory has non-ascii. + filename = self.filename + if env.WINDOWS and env.PY2: + try: + filename = os.path.relpath(self.filename) + except ValueError: + # ValueError can be raised under Windows when os.getcwd() returns a + # folder from a different drive than the drive of self.filename in + # which case we keep the original value of self.filename unchanged, + # hoping that we won't face the non-ascii directory problem. + pass + # It can happen that Python switches threads while the tracer writes # data. The second thread will also try to write to the data, # effectively causing a nested context. However, given the idempotent @@ -995,7 +999,7 @@ class SqliteDb(SimpleReprMixin): # is not a problem. if self.debug: self.debug.write("Connecting to {!r}".format(self.filename)) - self.con = sqlite3.connect(self.connect_filename, check_same_thread=False) + self.con = sqlite3.connect(filename, check_same_thread=False) self.con.create_function('REGEXP', 2, _regexp) # This pragma makes writing faster. It disables rollbacks, but we never need them. -- cgit v1.2.1