Skip to content

Commit 0733d93

Browse files
committed
Ability to override state file name for test runs
1 parent f20517d commit 0733d93

File tree

3 files changed

+24
-7
lines changed

3 files changed

+24
-7
lines changed

src/redis_release/cli.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,11 @@ def release(
107107
"--force-release-type",
108108
help="Force release type (public or internal)",
109109
),
110+
override_state_name: Optional[str] = typer.Option(
111+
None,
112+
"--override-state-name",
113+
help="Custom state name to use instead of release tag, to be able to make test runs without affecting production state",
114+
),
110115
) -> None:
111116
"""Run release using behaviour tree implementation."""
112117
setup_logging()
@@ -119,6 +124,7 @@ def release(
119124
force_rebuild=force_rebuild or [],
120125
only_packages=only_packages or [],
121126
force_release_type=force_release_type,
127+
override_state_name=override_state_name,
122128
)
123129

124130
# Use context manager version with automatic lock management

src/redis_release/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,3 +160,4 @@ class ReleaseArgs(BaseModel):
160160
force_rebuild: List[str] = Field(default_factory=list)
161161
only_packages: List[str] = Field(default_factory=list)
162162
force_release_type: Optional[ReleaseType] = None
163+
override_state_name: Optional[str] = None

src/redis_release/state_manager.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -167,24 +167,34 @@ def __init__(
167167
self._lock_acquired = False
168168
self.read_only = read_only
169169

170+
# allow custom name for state, to be able to make test runs with real tags
171+
# without affecting production state
172+
if args.override_state_name:
173+
logger.info(
174+
f"Using custom state name instead of release tag: {args.override_state_name}"
175+
)
176+
self.state_name = args.override_state_name
177+
else:
178+
self.state_name = self.tag
179+
170180
def __enter__(self) -> "StateManager":
171181
if self.read_only:
172182
return self
173183
"""Acquire lock when entering context."""
174-
if not self.storage.acquire_lock(self.tag):
175-
raise RuntimeError(f"Failed to acquire lock for tag: {self.tag}")
184+
if not self.storage.acquire_lock(self.state_name):
185+
raise RuntimeError(f"Failed to acquire lock for tag: {self.state_name}")
176186
self._lock_acquired = True
177-
logger.info(f"Lock acquired for tag: {self.tag}")
187+
logger.info(f"Lock acquired for tag: {self.state_name}")
178188
return self
179189

180190
def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
181191
if self.read_only:
182192
return
183193
"""Release lock when exiting context."""
184194
if self._lock_acquired:
185-
self.storage.release_lock(self.tag)
195+
self.storage.release_lock(self.state_name)
186196
self._lock_acquired = False
187-
logger.info(f"Lock released for tag: {self.tag}")
197+
logger.info(f"Lock released for tag: {self.state_name}")
188198

189199
@property
190200
def state(self) -> ReleaseState:
@@ -233,7 +243,7 @@ def apply_args(self, state: ReleaseState) -> None:
233243

234244
def load(self) -> Optional[ReleaseState]:
235245
"""Load state from storage backend."""
236-
state_data = self.storage.get(self.tag)
246+
state_data = self.storage.get(self.state_name)
237247
if state_data is None:
238248
return None
239249

@@ -250,7 +260,7 @@ def sync(self) -> None:
250260
if current_dump != self.last_dump:
251261
self.last_dump = current_dump
252262
state_dict = json.loads(current_dump)
253-
self.storage.put(self.tag, state_dict)
263+
self.storage.put(self.state_name, state_dict)
254264
logger.debug("State saved")
255265

256266

0 commit comments

Comments
 (0)