Manage SHA of git tags

This commit is contained in:
Valentin Niess
2023-11-10 22:43:46 +01:00
parent 602f65c0e8
commit fd7e28817c

View File

@@ -38,6 +38,15 @@ class ReleaseMeta:
return f'Python {version}'
@dataclass
class TagMeta:
'''Metadata relative to a git tag
'''
tag: str
ref: "github.GitRef"
@dataclass
class AssetMeta:
'''Metadata relative to a release Asset
@@ -94,7 +103,7 @@ def update(args):
repo = session.get_repo('niess/python-appimage')
# Fetch currently released AppImages
log('FETCH', 'Currently released AppImages')
log('FETCH', 'currently released AppImages')
releases = {}
assets = defaultdict(dict)
n_assets = 0
@@ -113,11 +122,12 @@ def update(args):
assets[meta.tag][meta.abi] = meta
n_releases = len(releases)
log('FETCH', f'Found {n_assets} AppImages in {n_releases} releases')
log('FETCH', f'found {n_assets} AppImages in {n_releases} releases')
# Look for updates.
new_releases = set()
new_assets = []
new_sha = []
for manylinux in MANYLINUSES:
for arch in ARCHS:
@@ -146,22 +156,53 @@ def update(args):
if rtag not in releases:
new_releases.add(rtag)
if not new_assets:
# Check SHA of tags.
p = subprocess.run(
'git rev-parse HEAD',
shell = True,
capture_output = True,
check = True
)
sha = p.stdout.decode().strip()
for tag in releases.keys():
ref = repo.get_git_ref(f'tags/{tag}')
if ref.ref is not None:
if ref.object.sha != sha:
meta = TagMeta(
tag = tag,
ref = ref
)
new_sha.append(meta)
# Log foreseen changes.
for tag in new_releases:
meta = ReleaseMeta(tag)
log('FORESEEN', f'create new release for {meta.title()}')
for meta in new_assets:
log('FORESEEN', f'create asset {meta.appimage_name()}')
if meta.asset:
log('FORESEEN', f'remove asset {meta.asset.name}')
for meta in new_sha:
log('FORESEEN', f'update git SHA for refs/tags/{meta.tag}')
if args.dry:
return
# Build new AppImage(s)
cwd = os.getcwd()
os.makedirs(APPIMAGES_DIR, exist_ok=True)
try:
os.chdir(APPIMAGES_DIR)
for meta in new_assets:
build_manylinux(meta.tag, meta.abi)
finally:
os.chdir(cwd)
if new_assets:
# Build new AppImage(s)
cwd = os.getcwd()
os.makedirs(APPIMAGES_DIR, exist_ok=True)
try:
os.chdir(APPIMAGES_DIR)
for meta in new_assets:
build_manylinux(meta.tag, meta.abi)
finally:
os.chdir(cwd)
# Create any new release(s).
repo = session.get_repo('niess/test-releases') # XXX
for tag in new_releases:
meta = ReleaseMeta(tag)
title = meta.title()
@@ -179,24 +220,35 @@ def update(args):
appimage = meta.appimage_name()
new_asset = release.upload_asset(
path = f'{APPIMAGES_DIR}/{appimage}',
label = appimage
name = appimage
)
if meta.asset:
meta.asset.delete_asset()
meta.asset = new_asset
assets[meta.tag][meta.abi] = meta
# Update git tags SHA.
for meta in new_sha:
meta.ref.edit(
sha = sha,
force = True
)
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description = "Update GitHub releases of Python AppImages"
description = 'Update GitHub releases of Python AppImages'
)
parser.add_argument("-t", "--token",
help = "GitHub authentication token"
parser.add_argument('-d', '--dry',
help = 'dry run (only log changes)',
action = 'store_true',
default = False
)
parser.add_argument("-s", "--sha",
help = "Current commit SHA"
parser.add_argument('-t', '--token',
help = 'GitHub authentication token'
)
# XXX Add --all arg
args = parser.parse_args()
update(args)