diff --git a/.semversioner/next-release/patch-20260607074511239035.json b/.semversioner/next-release/patch-20260607074511239035.json new file mode 100644 index 0000000..ec3e5ce --- /dev/null +++ b/.semversioner/next-release/patch-20260607074511239035.json @@ -0,0 +1,4 @@ +{ + "type": "patch", + "description": "Fix next-release folder recreation after release." +} diff --git a/semversioner/storage.py b/semversioner/storage.py index cc813e5..3ed5c7e 100644 --- a/semversioner/storage.py +++ b/semversioner/storage.py @@ -159,6 +159,9 @@ def create_changeset(self, change: Changeset) -> str: Absolute path of the file generated. """ + if not self.next_release_path.is_dir(): + self.next_release_path.mkdir(parents=True) + # Retry loop with atomic file creation to prevent race conditions while True: filename = f"{change.type}-{datetime.now(timezone.utc):%Y%m%d%H%M%S%f}.json" diff --git a/tests/core_test.py b/tests/core_test.py index 9f879fb..766f785 100644 --- a/tests/core_test.py +++ b/tests/core_test.py @@ -161,3 +161,14 @@ def test_check_after_release(directory_name: str) -> None: releaser.add_change("major", "My description") releaser.release() assert not releaser.check() + + +def test_add_change_after_release_same_instance(directory_name: str) -> None: + """Ensure add_change works after a release using the same object.""" + releaser = Semversioner(path=directory_name) + releaser.add_change("minor", "First") + releaser.release() + + # Directory is removed during release but add_change should recreate it + path = releaser.add_change("patch", "Second") + assert os.path.isfile(path)