diff --git a/novelwriter/core/project.py b/novelwriter/core/project.py index 37153e71..51cc8955 100644 --- a/novelwriter/core/project.py +++ b/novelwriter/core/project.py @@ -407,7 +407,6 @@ class NWProject(QObject): self._options.saveSettings() self._tree.writeToCFile() self._session.appendSession(idleTime) - self._storage.clearLockFile() self._storage.closeSession() self.clearProject() self._lockedBy = None diff --git a/novelwriter/core/storage.py b/novelwriter/core/storage.py index b97a42e4..84e4ee35 100644 --- a/novelwriter/core/storage.py +++ b/novelwriter/core/storage.py @@ -67,6 +67,7 @@ class NWStorage: """Reset internal variables.""" self._storagePath = None self._runtimePath = None + self._lockFilePath = None self._openMode = self.MODE_INACTIVE return @@ -146,7 +147,7 @@ class NWStorage: def closeSession(self): """Run tasks related to closing the session.""" - # Clear lockfile + self.clearLockFile() self.clear() return @@ -189,7 +190,7 @@ class NWStorage: if item.suffix == ".nwd" and isHandle(item.stem) ] if contentPath else [] - def readLockFile(self) -> list: + def readLockFile(self) -> list[str]: """Read the project lock file.""" if self._lockFilePath is None: return ["ERROR"] @@ -198,7 +199,7 @@ class NWStorage: return [] try: - lines = self._lockFilePath.read_text(encoding="utf-8").split(";") + lines = self._lockFilePath.read_text(encoding="utf-8").strip().split(";") except Exception: logger.error("Failed to read project lockfile") logException() diff --git a/tests/test_core/test_core_project.py b/tests/test_core/test_core_project.py index b4d5f338..3ac7b54f 100644 --- a/tests/test_core/test_core_project.py +++ b/tests/test_core/test_core_project.py @@ -29,6 +29,7 @@ from tools import C, cmpFiles, writeFile, buildTestProject, XML_IGNORE from novelwriter import CONFIG from novelwriter.enum import nwItemClass, nwItemType, nwItemLayout +from novelwriter.constants import nwFiles from novelwriter.core.tree import NWTree from novelwriter.core.index import NWIndex from novelwriter.core.project import NWProject @@ -172,7 +173,8 @@ def testCoreProject_Open(monkeypatch, caplog, mockGUI, fncPath, mockRnd): assert theProject.openProject(fncPath) is False # Fail on lock file - assert theProject._storage.writeLockFile() + theProject.storage._lockFilePath = fncPath / nwFiles.PROJ_LOCK + assert theProject.storage.writeLockFile() is True assert theProject.openProject(fncPath) is False assert isinstance(theProject.getLockStatus(), list) @@ -185,7 +187,8 @@ def testCoreProject_Open(monkeypatch, caplog, mockGUI, fncPath, mockRnd): theProject.closeProject() # Force open with lockfile - assert theProject._storage.writeLockFile() + theProject.storage._lockFilePath = fncPath / nwFiles.PROJ_LOCK + assert theProject.storage.writeLockFile() is True assert theProject.openProject(fncPath, overrideLock=True) is True theProject.closeProject() assert theProject.getLockStatus() is None diff --git a/tests/test_core/test_core_storage.py b/tests/test_core/test_core_storage.py index 61ac2152..77db582b 100644 --- a/tests/test_core/test_core_storage.py +++ b/tests/test_core/test_core_storage.py @@ -92,7 +92,7 @@ def testCoreStorage_OpenProjectInPlace(mockGUI, fncPath, mockRnd): assert isinstance(storage.getXmlWriter(), ProjectXMLWriter) # Get content - assert sorted(storage.scanContent()) == sorted([C.hTitlePage, C.hChapterDoc, C.hSceneDoc]) + assert sorted(storage.scanContent()) == [C.hTitlePage, C.hChapterDoc, C.hSceneDoc] # Get document assert storage.getDocument(C.hSceneDoc).readDocument() == "### New Scene\n\n"