Skip to content

Commit 73203bf

Browse files
committed
Add USK version override support to update releaser
1 parent 00f842a commit 73203bf

3 files changed

Lines changed: 213 additions & 8 deletions

File tree

update_releaser/README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ gh auth status
7979
- Override values must be integer digits only (for example `123`).
8080
- Optional `--prompt-staging-version-override` asks interactively for a staging override; press Enter to keep the default edition.
8181
- Passing either staging override option while `--publish-to production` is rejected.
82+
- Published USK version override:
83+
- Optional `--usk-version-override <value>` can force which USK edition `core-info.json` is inserted to for `publish-descriptor` and `promote`.
84+
- Values must be URI-safe segments using letters, digits, `.`, `_`, or `-`.
85+
- If omitted, publish auto-selects the next available numeric USK version.
8286

8387
## Quickstart
8488

@@ -106,6 +110,7 @@ uv run update-releaser promote \
106110
"https://github.com/crypta-network/cryptad/releases/tag/v1" \
107111
--publish-to staging \
108112
--staging-version-override "123" \
113+
--usk-version-override "456" \
109114
--staging-usk-file ./staging-usk.txt \
110115
--workdir ./dist
111116
```
@@ -185,6 +190,7 @@ uv run update-releaser generate-core-info "$RELEASE_URL" \
185190

186191
uv run update-releaser publish-descriptor "$RELEASE_URL" \
187192
--publish-to staging \
193+
--usk-version-override "456" \
188194
--staging-usk-file ./staging-usk.txt \
189195
--fcp-host "$FCP_HOST" \
190196
--fcp-port "$FCP_PORT" \
@@ -216,6 +222,7 @@ workdir (`./dist-promote/<edition>/`).
216222
uv run update-releaser promote "$RELEASE_URL" \
217223
--github-source gh \
218224
--publish-to staging \
225+
--usk-version-override "456" \
219226
--staging-usk-file ./staging-usk.promote.txt \
220227
--fcp-host "$FCP_HOST" \
221228
--fcp-port "$FCP_PORT" \
@@ -289,6 +296,7 @@ For edition `123`, default output root is `dist/123/`:
289296

290297
- `version` in `core-info.json` is always a string containing integer digits only.
291298
- By default, descriptor `version` equals the release edition. For staging publishes, you may override it with `--staging-version-override` or `--prompt-staging-version-override` (digits only).
299+
- By default, publish probes for the next available numeric USK version segment. You may force a specific publish target edition with `--usk-version-override` on `publish-descriptor` and `promote`.
292300
- Edition derivation:
293301
- `v<digits>` becomes `<digits>`
294302
- non-numeric tags are sanitized into stable path-safe edition strings

update_releaser/src/update_releaser/cli.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import logging
66
import os
77
from pathlib import Path
8+
import re
89
from typing import Sequence
910

1011
from update_releaser.fcp_client import FCPClient
@@ -93,6 +94,7 @@ def _build_parser() -> argparse.ArgumentParser:
9394
_add_release_args(publish_parser)
9495
_add_fcp_args(publish_parser)
9596
_add_publish_args(publish_parser)
97+
_add_usk_version_override_arg(publish_parser)
9698
_add_staging_version_override_args(publish_parser)
9799
publish_parser.set_defaults(handler=_handle_publish_descriptor)
98100

@@ -125,6 +127,7 @@ def _build_parser() -> argparse.ArgumentParser:
125127
_add_release_args(promote_parser)
126128
_add_fcp_args(promote_parser)
127129
_add_publish_args(promote_parser)
130+
_add_usk_version_override_arg(promote_parser)
128131
_add_changelog_args(promote_parser)
129132
_add_staging_version_override_args(promote_parser)
130133
promote_parser.add_argument(
@@ -299,6 +302,18 @@ def _add_staging_version_override_args(parser: argparse.ArgumentParser) -> None:
299302
)
300303

301304

305+
def _add_usk_version_override_arg(parser: argparse.ArgumentParser) -> None:
306+
parser.add_argument(
307+
"--usk-version-override",
308+
default=None,
309+
help=(
310+
"Override the USK edition segment where core-info.json is inserted. "
311+
"Must be a non-empty URI-safe segment using letters, digits, '.', '_' or '-'. "
312+
"If omitted, defaults to the next available USK version."
313+
),
314+
)
315+
316+
302317
def _handle_fetch_assets(args: argparse.Namespace) -> int:
303318
workflow = _build_workflow(args)
304319
assets = workflow.fetch_assets()
@@ -354,13 +369,15 @@ def _handle_publish_descriptor(args: argparse.Namespace) -> int:
354369
args,
355370
publish_to=args.publish_to,
356371
)
372+
usk_version_override = _resolve_usk_version_override(args)
357373
with _fcp_context(args) as fcp:
358374
result_uri = workflow.publish_descriptor(
359375
publish_to=args.publish_to,
360376
staging_usk_file=staging_usk_file,
361377
fcp=fcp,
362378
put_options=put_options,
363379
staging_version_override=staging_version_override,
380+
usk_version_override=usk_version_override,
364381
)
365382
LOGGER.info("Published descriptor URI: %s", result_uri)
366383
return 0
@@ -391,6 +408,7 @@ def _handle_promote(args: argparse.Namespace) -> int:
391408
args,
392409
publish_to=args.publish_to,
393410
)
411+
usk_version_override = _resolve_usk_version_override(args)
394412

395413
workflow.fetch_assets()
396414
with _fcp_context(args) as fcp:
@@ -408,6 +426,7 @@ def _handle_promote(args: argparse.Namespace) -> int:
408426
fcp=fcp,
409427
put_options=put_options,
410428
staging_version_override=staging_version_override,
429+
usk_version_override=usk_version_override,
411430
)
412431
report = workflow.verify(
413432
publish_to=args.publish_to,
@@ -486,6 +505,23 @@ def _normalized_version_text(raw: str | None) -> str | None:
486505
return normalized
487506

488507

508+
def _resolve_usk_version_override(args: argparse.Namespace) -> str | None:
509+
return _normalized_usk_version_text(args.usk_version_override)
510+
511+
512+
def _normalized_usk_version_text(raw: str | None) -> str | None:
513+
if raw is None:
514+
return None
515+
normalized = raw.strip()
516+
if not normalized:
517+
raise ValueError("USK version override must not be empty.")
518+
if not re.fullmatch(r"[A-Za-z0-9._-]+", normalized):
519+
raise ValueError(
520+
"USK version override must contain only letters, digits, '.', '_' or '-'."
521+
)
522+
return normalized
523+
524+
489525
def _build_workflow(args: argparse.Namespace) -> ReleaseWorkflow:
490526
release_ref = parse_release_page_url(args.release_url)
491527
return ReleaseWorkflow(

0 commit comments

Comments
 (0)