Some checks failed
Vierziel-Build und Pflichtabnahme / checks (push) Has been cancelled
Vierziel-Build und Pflichtabnahme / build (ghcr.io/rust-cross/cargo-zigbuild@sha256:82af75c41958c2af2787e8bedd912da7678a9438937e223e9d83d006d747b38b, aarch64-apple-darwin) (push) Has been cancelled
Vierziel-Build und Pflichtabnahme / build (ghcr.io/rust-cross/cargo-zigbuild@sha256:82af75c41958c2af2787e8bedd912da7678a9438937e223e9d83d006d747b38b, aarch64-unknown-linux-gnu) (push) Has been cancelled
Vierziel-Build und Pflichtabnahme / build (ghcr.io/rust-cross/cargo-zigbuild@sha256:82af75c41958c2af2787e8bedd912da7678a9438937e223e9d83d006d747b38b, x86_64-unknown-linux-gnu) (push) Has been cancelled
Vierziel-Build und Pflichtabnahme / build (messense/cargo-xwin@sha256:4696dd4e79edf8569fa99c4b06bd99273e0501c7adc983aa61d57945f795bef0, x86_64-pc-windows-msvc) (push) Has been cancelled
Vierziel-Build und Pflichtabnahme / stage (push) Has been cancelled
38 lines
2.1 KiB
Python
38 lines
2.1 KiB
Python
#!/usr/bin/env python3
|
|
"""Nur einen bestehenden Tag und Nachweise aus einer Origin-Revision verwenden."""
|
|
import os
|
|
from pathlib import Path
|
|
import re
|
|
import subprocess
|
|
import tempfile
|
|
import distribution as dist
|
|
import release
|
|
|
|
tag, evidence_revision = os.environ['TB_TAG'], os.environ['TB_EVIDENCE_REVISION']
|
|
dist.require(re.fullmatch(r'v[0-9]+\.[0-9]+\.[0-9]+(?:-[A-Za-z0-9.-]+)?', tag), 'Ungültiger Tag')
|
|
dist.require(re.fullmatch('[0-9a-f]{40}', evidence_revision), 'Ungültige Nachweisrevision')
|
|
revision = subprocess.check_output(['git', 'rev-parse', '--verify', tag + '^{commit}'], text=True).strip()
|
|
api = release.Gitea()
|
|
info = api.request('GET', '/git/commits/' + evidence_revision)
|
|
dist.require(info['sha'] == evidence_revision, 'Nachweise nicht am Origin')
|
|
# Checkout enthält alle Origin-Branches. Ein nicht vorhandener Commit scheitert hier.
|
|
base = f'release-evidence/{tag}'
|
|
names = subprocess.check_output(['git', 'ls-tree', '-r', '--name-only', evidence_revision, base], text=True).splitlines()
|
|
with tempfile.TemporaryDirectory(prefix='tb-release-') as tmp:
|
|
evidence = Path(tmp) / 'evidence'; evidence.mkdir()
|
|
for name in names:
|
|
relative = Path(name).relative_to(base)
|
|
dist.require('..' not in relative.parts and not relative.is_absolute(), 'Ungültiger Nachweispfad')
|
|
path = evidence / relative; path.parent.mkdir(parents=True, exist_ok=True)
|
|
path.write_bytes(subprocess.check_output(['git', 'show', evidence_revision + ':' + name]))
|
|
packages = Path(tmp) / 'packages'; packages.mkdir()
|
|
draft = api.request('GET', '/releases/tags/' + tag)
|
|
wanted = release.expected(tag[1:])
|
|
dist.require(draft['draft'] and len(draft.get('assets', [])) == len(wanted) and
|
|
{a['name'] for a in draft['assets']} == set(wanted), 'Unvollständiger Entwurf')
|
|
for asset in draft['assets']:
|
|
(packages / asset['name']).write_bytes(api.download(asset))
|
|
# Grundabnahme kommt aus dem ursprünglichen Taglauf, nicht aus manuell ersetzten Angaben.
|
|
(evidence / 'acceptance.json').write_bytes((packages / 'acceptance.json').read_bytes())
|
|
release.publish(api, packages, evidence, tag, revision)
|