Browse Source

Manage SHA of git tags

Valentin Niess 2 years ago
parent
commit
fd7e28817c
1 changed files with 72 additions and 20 deletions
  1. 72 20
      scripts/update-appimages.py

+ 72 - 20
scripts/update-appimages.py

@@ -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)