tools: add --commit flag to cut for targeting a specific commit

Allow specifying which commit to tag and archive when cutting a release,
rather than always using HEAD. The commit ref flows through to both
git tag and create-archives.sh's git archive call. When not specified,
both default to HEAD as before.

Assisted-by: OpenCode (Claude Opus 4.6)
This commit is contained in:
Jonathan Lebon 2026-04-22 22:43:39 -04:00
parent d836781c61
commit 2e636e495b
2 changed files with 26 additions and 13 deletions

View file

@ -1,7 +1,7 @@
#!/bin/bash
# Creates source and vendor tarballs for chunkah.
# Used by both release.py and Packit's create-archive action.
# Usage: create-archives.sh <source-tarball> <vendor-tarball>
# Usage: create-archives.sh <source-tarball> <vendor-tarball> [commit]
# create-archives.sh --outdir <outdir>
set -euo pipefail
shopt -s inherit_errexit
@ -9,21 +9,23 @@ shopt -s inherit_errexit
version=$(cargo metadata --no-deps --format-version=1 \
| python3 -c 'import json,sys; print(json.load(sys.stdin)["packages"][0]["version"])')
commit="HEAD"
if [[ "${1:-}" == "--outdir" ]]; then
outdir="${2:-.}"
source_tarball="${outdir}/chunkah-${version}.tar.gz"
vendor_tarball="${outdir}/chunkah-${version}-vendor.tar.gz"
elif [[ $# -ne 2 ]]; then
echo "Usage: create-archives.sh <source-tarball> <vendor-tarball>" >&2
elif [[ $# -lt 2 || $# -gt 3 ]]; then
echo "Usage: create-archives.sh <source-tarball> <vendor-tarball> [commit]" >&2
echo " create-archives.sh --outdir <outdir>" >&2
exit 1
else
source_tarball="${1}"
vendor_tarball="${2}"
commit="${3:-${commit}}"
fi
git archive --format=tar.gz "--prefix=chunkah-${version}/" \
-o "${source_tarball}" HEAD
-o "${source_tarball}" "${commit}"
cargo vendor-filterer --platform '*-unknown-linux-gnu' --tier 2 \
--format=tar.gz --prefix=vendor "${vendor_tarball}"

View file

@ -41,12 +41,15 @@ def main():
cut_parser.add_argument(
"--notes-file", default=None,
help="Path to release notes file (skips fetching and editing)")
cut_parser.add_argument(
"--commit", default=None,
help="Target commit to tag and archive (default: HEAD)")
cut_parser.add_argument(
"--no-push", action="store_true",
help="Prepare release without pushing to remote")
cut_parser.set_defaults(
func=lambda args: cut_release(args.version, args.no_push,
args.notes_file))
args.notes_file, args.commit))
args = parser.parse_args()
args.func(args)
@ -188,7 +191,8 @@ def generate_notes(version: str):
sys.stdout.write(notes)
def cut_release(version: str, no_push: bool, notes_file: str | None):
def cut_release(version: str, no_push: bool, notes_file: str | None,
commit: str | None):
"""Cut a release for chunkah."""
tag = f"v{version}"
source_tarball = f"{NAME}-{version}.tar.gz"
@ -239,10 +243,10 @@ def cut_release(version: str, no_push: bool, notes_file: str | None):
saved_notes_file.write_text(edited_notes)
step(f"Creating signed tag {tag}...")
create_signed_tag(tag, edited_notes)
create_signed_tag(tag, edited_notes, commit)
step("Generating source and vendor tarballs...")
generate_archives(source_tarball, vendor_tarball)
generate_archives(source_tarball, vendor_tarball, commit)
step("Verifying offline build...")
verify_offline_build(version, source_tarball, vendor_tarball)
@ -356,19 +360,26 @@ def edit_notes(initial: str) -> str:
os.unlink(tmp_path)
def create_signed_tag(tag: str, message: str):
def create_signed_tag(tag: str, message: str, commit: str | None = None):
"""Create a signed annotated git tag."""
with tempfile.NamedTemporaryFile(mode="w", suffix=".md") as f:
f.write(message)
f.flush()
# Use a non-# commentchar so that markdown headers are preserved
run("git", "-c", "core.commentchar=;", "tag", "-s", "-a", tag,
"-F", f.name)
cmd = ["git", "-c", "core.commentchar=;", "tag", "-s", "-a", tag,
"-F", f.name]
if commit:
cmd.append(commit)
run(*cmd)
def generate_archives(source_tarball: str, vendor_tarball: str):
def generate_archives(source_tarball: str, vendor_tarball: str,
commit: str | None = None):
"""Generate source and vendor tarballs using create-archives.sh."""
run("tools/create-archives.sh", source_tarball, vendor_tarball)
args = ["tools/create-archives.sh", source_tarball, vendor_tarball]
if commit:
args.append(commit)
run(*args)
def verify_offline_build(version: str, source: str, vendor: str):