@@ -38,6 +38,15 @@ def title(self):
3838 return f'Python { version } '
3939
4040
41+ @dataclass
42+ class TagMeta :
43+ '''Metadata relative to a git tag
44+ '''
45+
46+ tag : str
47+ ref : "github.GitRef"
48+
49+
4150@dataclass
4251class AssetMeta :
4352 '''Metadata relative to a release Asset
@@ -94,7 +103,7 @@ def update(args):
94103 repo = session .get_repo ('niess/python-appimage' )
95104
96105 # Fetch currently released AppImages
97- log ('FETCH' , 'Currently released AppImages' )
106+ log ('FETCH' , 'currently released AppImages' )
98107 releases = {}
99108 assets = defaultdict (dict )
100109 n_assets = 0
@@ -113,11 +122,12 @@ def update(args):
113122 assets [meta .tag ][meta .abi ] = meta
114123
115124 n_releases = len (releases )
116- log ('FETCH' , f'Found { n_assets } AppImages in { n_releases } releases' )
125+ log ('FETCH' , f'found { n_assets } AppImages in { n_releases } releases' )
117126
118127 # Look for updates.
119128 new_releases = set ()
120129 new_assets = []
130+ new_sha = []
121131
122132 for manylinux in MANYLINUSES :
123133 for arch in ARCHS :
@@ -146,22 +156,53 @@ def update(args):
146156 if rtag not in releases :
147157 new_releases .add (rtag )
148158
149- if not new_assets :
159+ # Check SHA of tags.
160+ p = subprocess .run (
161+ 'git rev-parse HEAD' ,
162+ shell = True ,
163+ capture_output = True ,
164+ check = True
165+ )
166+ sha = p .stdout .decode ().strip ()
167+
168+ for tag in releases .keys ():
169+ ref = repo .get_git_ref (f'tags/{ tag } ' )
170+ if ref .ref is not None :
171+ if ref .object .sha != sha :
172+ meta = TagMeta (
173+ tag = tag ,
174+ ref = ref
175+ )
176+ new_sha .append (meta )
177+
178+ # Log foreseen changes.
179+ for tag in new_releases :
180+ meta = ReleaseMeta (tag )
181+ log ('FORESEEN' , f'create new release for { meta .title ()} ' )
182+
183+ for meta in new_assets :
184+ log ('FORESEEN' , f'create asset { meta .appimage_name ()} ' )
185+ if meta .asset :
186+ log ('FORESEEN' , f'remove asset { meta .asset .name } ' )
187+
188+ for meta in new_sha :
189+ log ('FORESEEN' , f'update git SHA for refs/tags/{ meta .tag } ' )
190+
191+ if args .dry :
150192 return
151193
152- # Build new AppImage(s)
153- cwd = os .getcwd ()
154- os .makedirs (APPIMAGES_DIR , exist_ok = True )
155- try :
156- os .chdir (APPIMAGES_DIR )
157- for meta in new_assets :
158- build_manylinux (meta .tag , meta .abi )
159- finally :
160- os .chdir (cwd )
194+ if new_assets :
195+ # Build new AppImage(s)
196+ cwd = os .getcwd ()
197+ os .makedirs (APPIMAGES_DIR , exist_ok = True )
198+ try :
199+ os .chdir (APPIMAGES_DIR )
200+ for meta in new_assets :
201+ build_manylinux (meta .tag , meta .abi )
202+ finally :
203+ os .chdir (cwd )
161204
162205 # Create any new release(s).
163- repo = session .get_repo ('niess/test-releases' ) # XXX
164-
165206 for tag in new_releases :
166207 meta = ReleaseMeta (tag )
167208 title = meta .title ()
@@ -179,24 +220,35 @@ def update(args):
179220 appimage = meta .appimage_name ()
180221 new_asset = release .upload_asset (
181222 path = f'{ APPIMAGES_DIR } /{ appimage } ' ,
182- label = appimage
223+ name = appimage
183224 )
184225 if meta .asset :
185226 meta .asset .delete_asset ()
186227 meta .asset = new_asset
187228 assets [meta .tag ][meta .abi ] = meta
188229
230+ # Update git tags SHA.
231+ for meta in new_sha :
232+ meta .ref .edit (
233+ sha = sha ,
234+ force = True
235+ )
236+
189237
190238if __name__ == '__main__' :
191239 parser = argparse .ArgumentParser (
192- description = " Update GitHub releases of Python AppImages"
240+ description = ' Update GitHub releases of Python AppImages'
193241 )
194- parser .add_argument ("-t" , "--token" ,
195- help = "GitHub authentication token"
242+ parser .add_argument ('-d' , '--dry' ,
243+ help = 'dry run (only log changes)' ,
244+ action = 'store_true' ,
245+ default = False
196246 )
197- parser .add_argument ("-s" , "--sha" ,
198- help = "Current commit SHA"
247+ parser .add_argument ('-t' , '--token' ,
248+ help = 'GitHub authentication token'
199249 )
200250
251+ # XXX Add --all arg
252+
201253 args = parser .parse_args ()
202254 update (args )
0 commit comments