diff --git a/hgext/hgsubversion/maps.py b/hgext/hgsubversion/maps.py index e77acd3267..35f3ce99f7 100644 --- a/hgext/hgsubversion/maps.py +++ b/hgext/hgsubversion/maps.py @@ -608,6 +608,7 @@ class SqliteRevMap(collections.MutableMapping): self._lastpulledpath = lastpulled_path self._db = None + self._txndb = None self._sqlitepragmas = sqlitepragmas self.firstpulled = 0 self._updatefirstlastpulled() @@ -733,18 +734,23 @@ class SqliteRevMap(collections.MutableMapping): @contextlib.contextmanager def _transaction(self, mode="IMMEDIATE"): - if self._db is None: - self._opendb() - with self._db as db: - # wait indefinitely for database lock - while True: - try: - db.execute("BEGIN %s" % mode) - break - except sqlite3.OperationalError as ex: - if str(ex) != "database is locked": - raise - yield db + if self._txndb is not None: + yield self._txndb + else: + if self._db is None: + self._opendb() + with self._db as db: + # wait indefinitely for database lock + while True: + try: + db.execute("BEGIN %s" % mode) + break + except sqlite3.OperationalError as ex: + if str(ex) != "database is locked": + raise + self._txndb = db + yield db + self._txndb = None def _query(self, sql, params=()): with self._transaction() as db: diff --git a/hgext/hgsubversion/wrappers.py b/hgext/hgsubversion/wrappers.py index 0a93b041ad..db136a643b 100644 --- a/hgext/hgsubversion/wrappers.py +++ b/hgext/hgsubversion/wrappers.py @@ -501,7 +501,13 @@ def pull(repo, source, heads=None, force=False, meta=None): try: # start converting revisions firstrun = True - with progress.bar(ui, "pull", total=total) as prog: + with repo.wlock(), repo.lock(), repo.transaction( + "svn" + ), meta.revmap._transaction() if hgutil.safehasattr( + meta.revmap, "_transaction" + ) else hgutil.nullcontextmanager(), progress.bar( + ui, "pull", total=total + ) as prog: for r in svn.revisions(start=start, stop=stopat_rev): if r.revnum in skiprevs or ( r.author is None @@ -536,7 +542,6 @@ def pull(repo, source, heads=None, force=False, meta=None): continue meta.delbranch(branch, parent, r) - meta.save() converted = True firstrun = False @@ -557,6 +562,7 @@ def pull(repo, source, heads=None, force=False, meta=None): raise hgutil.Abort(*e.args) lastpulled = r.revnum + meta.save() except KeyboardInterrupt: ui.traceback()