flutter332: 3.32.6 -> 3.32.7 (#426532)

authored by Aleksana and committed by GitHub 0f50c2a4 0f4060b1

+263 -195
+226 -158
pkgs/development/compilers/flutter/update/update.py
··· 1 #! /usr/bin/env nix-shell 2 #! nix-shell -i python3 -p python3Packages.pyyaml 3 4 - import shutil 5 import json 6 - import urllib.request 7 - import tempfile 8 - from sys import exit 9 import os 10 - import subprocess 11 import re 12 - import json 13 - import argparse 14 import yaml 15 - import json 16 17 - FAKE_HASH = 'sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=' 18 19 - NIXPKGS_ROOT = subprocess.Popen(['git', 20 - 'rev-parse', 21 - '--show-toplevel'], 22 - stdout=subprocess.PIPE, 23 - text=True).communicate()[0].strip() 24 25 26 def load_code(name, **kwargs): 27 - with open(f"{NIXPKGS_ROOT}/pkgs/development/compilers/flutter/update/{name}.in", 'r') as f: 28 code = f.read() 29 30 - for (key, value) in kwargs.items(): 31 code = code.replace(f"@{key}@", value) 32 33 return code ··· 35 36 # Return out paths 37 def nix_build(code): 38 - temp = tempfile.NamedTemporaryFile(mode='w') 39 - temp.write(code) 40 - temp.flush() 41 - os.fsync(temp.fileno()) 42 43 process = subprocess.Popen( 44 [ ··· 46 "--impure", 47 "--no-out-link", 48 "--expr", 49 - f"with import {NIXPKGS_ROOT} {{}}; callPackage {temp.name} {{}}"], 50 stdout=subprocess.PIPE, 51 - text=True) 52 53 process.wait() 54 - temp.close() 55 return process.stdout.read().strip().splitlines()[0] 56 57 58 # Return errors 59 def nix_build_to_fail(code): 60 - temp = tempfile.NamedTemporaryFile(mode='w') 61 - temp.write(code) 62 - temp.flush() 63 - os.fsync(temp.fileno()) 64 65 process = subprocess.Popen( 66 [ ··· 69 "--keep-going", 70 "--no-link", 71 "--expr", 72 - f"with import {NIXPKGS_ROOT} {{}}; callPackage {temp.name} {{}}"], 73 stderr=subprocess.PIPE, 74 - text=True) 75 76 stderr = "" 77 while True: ··· 82 print(line.strip()) 83 84 process.wait() 85 - temp.close() 86 return stderr 87 88 89 def get_engine_hashes(engine_version, flutter_version): 90 - code = load_code("get-engine-hashes.nix", 91 - nixpkgs_root=NIXPKGS_ROOT, 92 - flutter_version=flutter_version, 93 - engine_version=engine_version) 94 95 stderr = nix_build_to_fail(code) 96 97 pattern = re.compile( 98 - rf"/nix/store/.*-flutter-engine-source-{engine_version}-(.+?-.+?)-(.+?-.+?).drv':\n\s+specified: .*\n\s+got:\s+(.+?)\n") 99 matches = pattern.findall(stderr) 100 result_dict = {} 101 ··· 105 106 def sort_dict_recursive(d): 107 return { 108 - k: sort_dict_recursive(v) if isinstance( 109 - v, dict) else v for k, v in sorted( 110 - d.items())} 111 - result_dict = sort_dict_recursive(result_dict) 112 113 - return result_dict 114 115 116 def get_artifact_hashes(flutter_compact_version): 117 - code = load_code("get-artifact-hashes.nix", 118 - nixpkgs_root=NIXPKGS_ROOT, 119 - flutter_compact_version=flutter_compact_version) 120 121 stderr = nix_build_to_fail(code) 122 123 pattern = re.compile( 124 - r"/nix/store/.*-flutter-artifacts-(.+?)-(.+?).drv':\n\s+specified: .*\n\s+got:\s+(.+?)\n") 125 matches = pattern.findall(stderr) 126 result_dict = {} 127 ··· 131 132 def sort_dict_recursive(d): 133 return { 134 - k: sort_dict_recursive(v) if isinstance( 135 - v, dict) else v for k, v in sorted( 136 - d.items())} 137 - result_dict = sort_dict_recursive(result_dict) 138 139 - return result_dict 140 141 142 def get_dart_hashes(dart_version, channel): 143 - platforms = [ 144 - "x86_64-linux", 145 - "aarch64-linux", 146 - "x86_64-darwin", 147 - "aarch64-darwin"] 148 result_dict = {} 149 for platform in platforms: 150 code = load_code( 151 "get-dart-hashes.nix", 152 dart_version=dart_version, 153 channel=channel, 154 - platform=platform) 155 stderr = nix_build_to_fail(code) 156 157 pattern = re.compile(r"got:\s+(.+?)\n") ··· 161 162 163 def get_flutter_hash_and_src(flutter_version): 164 - code = load_code( 165 - "get-flutter.nix", 166 - flutter_version=flutter_version, 167 - hash="") 168 169 stderr = nix_build_to_fail(code) 170 pattern = re.compile(r"got:\s+(.+?)\n") 171 - hash = pattern.findall(stderr)[0] 172 173 code = load_code( 174 - "get-flutter.nix", 175 - flutter_version=flutter_version, 176 - hash=hash) 177 178 - return (hash, nix_build(code)) 179 180 181 def get_pubspec_lock(flutter_compact_version, flutter_src): ··· 183 "get-pubspec-lock.nix", 184 flutter_compact_version=flutter_compact_version, 185 flutter_src=flutter_src, 186 - hash="") 187 188 stderr = nix_build_to_fail(code) 189 pattern = re.compile(r"got:\s+(.+?)\n") 190 - hash = pattern.findall(stderr)[0] 191 192 code = load_code( 193 "get-pubspec-lock.nix", 194 flutter_compact_version=flutter_compact_version, 195 flutter_src=flutter_src, 196 - hash=hash) 197 198 pubspec_lock_file = nix_build(code) 199 200 - with open(pubspec_lock_file, 'r') as f: 201 pubspec_lock_yaml = f.read() 202 203 return yaml.safe_load(pubspec_lock_yaml) 204 205 def get_engine_swiftshader_rev(engine_version): 206 - with urllib.request.urlopen(f"https://github.com/flutter/flutter/raw/{engine_version}/DEPS") as f: 207 - deps = f.read().decode('utf-8') 208 - pattern = re.compile(r"Var\('swiftshader_git'\) \+ '\/SwiftShader\.git' \+ '@' \+ \'([0-9a-fA-F]{40})\'\,") 209 - rev = pattern.findall(deps)[0] 210 - return rev 211 212 def get_engine_swiftshader_hash(engine_swiftshader_rev): 213 code = load_code( 214 "get-engine-swiftshader.nix", 215 engine_swiftshader_rev=engine_swiftshader_rev, 216 - hash="") 217 218 stderr = nix_build_to_fail(code) 219 pattern = re.compile(r"got:\s+(.+?)\n") 220 return pattern.findall(stderr)[0] 221 222 def write_data( 223 - nixpkgs_flutter_version_directory, 224 - flutter_version, 225 - channel, 226 - engine_hash, 227 - engine_hashes, 228 - engine_swiftshader_hash, 229 - engine_swiftshader_rev, 230 - dart_version, 231 - dart_hash, 232 - flutter_hash, 233 - artifact_hashes, 234 - pubspec_lock): 235 - with open(f"{nixpkgs_flutter_version_directory}/data.json", "w") as f: 236 - f.write(json.dumps({ 237 - "version": flutter_version, 238 - "engineVersion": engine_hash, 239 - "engineSwiftShaderHash": engine_swiftshader_hash, 240 - "engineSwiftShaderRev": engine_swiftshader_rev, 241 - "channel": channel, 242 - "engineHashes": engine_hashes, 243 - "dartVersion": dart_version, 244 - "dartHash": dart_hash, 245 - "flutterHash": flutter_hash, 246 - "artifactHashes": artifact_hashes, 247 - "pubspecLock": pubspec_lock, 248 - }, indent=2).strip() + "\n") 249 250 251 def update_all_packages(): 252 versions_directory = f"{NIXPKGS_ROOT}/pkgs/development/compilers/flutter/versions" 253 - versions = [directory for directory in os.listdir(versions_directory)] 254 - versions = sorted(versions, key=lambda x: ( 255 - int(x.split('_')[0]), int(x.split('_')[1])), reverse=True) 256 257 new_content = [ 258 "flutterPackages-bin = recurseIntoAttrs (callPackage ../development/compilers/flutter { });", 259 - "flutterPackages-source = recurseIntoAttrs (callPackage ../development/compilers/flutter { useNixpkgsEngine = true; });", 260 "flutterPackages = flutterPackages-bin;", 261 "flutter = flutterPackages.stable;", 262 - ] + [f"flutter{version.replace('_', '')} = flutterPackages.v{version};" for version in versions] 263 264 - with open(f"{NIXPKGS_ROOT}/pkgs/top-level/all-packages.nix", 'r') as file: 265 lines = file.read().splitlines(keepends=True) 266 267 start = -1 268 end = -1 269 for i, line in enumerate(lines): 270 - if "flutterPackages-bin = recurseIntoAttrs (callPackage ../development/compilers/flutter { });" in line: 271 start = i 272 if start != -1 and len(line.strip()) == 0: 273 end = i ··· 275 276 if start != -1 and end != -1: 277 del lines[start:end] 278 - lines[start:start] = [f" {l}\n" for l in new_content] 279 280 - with open(f"{NIXPKGS_ROOT}/pkgs/top-level/all-packages.nix", 'w') as file: 281 file.write("".join(lines)) 282 283 ··· 288 engine_hash = None 289 dart_version = None 290 291 - releases = json.load(urllib.request.urlopen( 292 - "https://storage.googleapis.com/flutter_infra_release/releases/releases_linux.json")) 293 294 if not channel: 295 - channel = 'stable' 296 297 if not flutter_version: 298 - hash = releases['current_release'][channel] 299 release = next( 300 filter( 301 - lambda release: release['hash'] == hash, 302 - releases['releases'])) 303 - flutter_version = release['version'] 304 305 - tags = subprocess.Popen(['git', 306 - 'ls-remote', 307 - '--tags', 308 - 'https://github.com/flutter/flutter.git'], 309 - stdout=subprocess.PIPE, 310 - text=True).communicate()[0].strip() 311 312 try: 313 - flutter_hash = next( 314 - filter( 315 - lambda line: line.endswith(f'refs/tags/{flutter_version}'), 316 - tags.splitlines())).split('refs')[0].strip() 317 318 - engine_hash = urllib.request.urlopen(f'https://github.com/flutter/flutter/raw/{flutter_hash}/bin/internal/engine.version').read().decode('utf-8').strip() 319 except StopIteration: 320 - exit( 321 - f"Couldn't find Engine hash for Flutter version: {flutter_version}") 322 323 try: 324 dart_version = next( 325 filter( 326 - lambda release: release['version'] == flutter_version, 327 - releases['releases']))['dart_sdk_version'] 328 329 if " " in dart_version: 330 - dart_version = dart_version.split(' ')[2][:-1] 331 except StopIteration: 332 - exit( 333 - f"Couldn't find Dart version for Flutter version: {flutter_version}") 334 335 return (flutter_version, engine_hash, dart_version, channel) 336 337 338 def main(): 339 - parser = argparse.ArgumentParser(description='Update Flutter in Nixpkgs') 340 - parser.add_argument('--version', type=str, help='Specify Flutter version') 341 - parser.add_argument('--channel', type=str, help='Specify Flutter release channel') 342 - parser.add_argument('--artifact-hashes', action='store_true', 343 - help='Whether to get artifact hashes') 344 args = parser.parse_args() 345 346 - (flutter_version, engine_hash, dart_version, channel) = find_versions(args.version, args.channel) 347 348 - flutter_compact_version = '_'.join(flutter_version.split('.')[:2]) 349 350 if args.artifact_hashes: 351 print( 352 - json.dumps( 353 - get_artifact_hashes(flutter_compact_version), 354 - indent=2).strip() + 355 - "\n") 356 return 357 358 - print(f"Flutter version: {flutter_version} ({flutter_compact_version}) on ({channel})") 359 print(f"Engine hash: {engine_hash}") 360 print(f"Dart version: {dart_version}") 361 ··· 364 365 nixpkgs_flutter_version_directory = f"{NIXPKGS_ROOT}/pkgs/development/compilers/flutter/versions/{flutter_compact_version}" 366 367 - if os.path.exists(f"{nixpkgs_flutter_version_directory}/data.json"): 368 - os.remove(f"{nixpkgs_flutter_version_directory}/data.json") 369 - os.makedirs(nixpkgs_flutter_version_directory, exist_ok=True) 370 371 update_all_packages() 372 ··· 385 artifact_hashes={}, 386 engine_hashes={}, 387 engine_swiftshader_hash=FAKE_HASH, 388 - engine_swiftshader_rev='0', 389 - **common_data_args) 390 391 pubspec_lock = get_pubspec_lock(flutter_compact_version, flutter_src) 392 ··· 395 artifact_hashes={}, 396 engine_hashes={}, 397 engine_swiftshader_hash=FAKE_HASH, 398 - engine_swiftshader_rev='0', 399 - **common_data_args) 400 401 artifact_hashes = get_artifact_hashes(flutter_compact_version) 402 ··· 405 artifact_hashes=artifact_hashes, 406 engine_hashes={}, 407 engine_swiftshader_hash=FAKE_HASH, 408 - engine_swiftshader_rev='0', 409 - **common_data_args) 410 411 engine_hashes = get_engine_hashes(engine_hash, flutter_version) 412 ··· 415 artifact_hashes=artifact_hashes, 416 engine_hashes=engine_hashes, 417 engine_swiftshader_hash=FAKE_HASH, 418 - engine_swiftshader_rev='0', 419 - **common_data_args) 420 421 engine_swiftshader_rev = get_engine_swiftshader_rev(engine_hash) 422 engine_swiftshader_hash = get_engine_swiftshader_hash(engine_swiftshader_rev) ··· 427 engine_hashes=engine_hashes, 428 engine_swiftshader_hash=engine_swiftshader_hash, 429 engine_swiftshader_rev=engine_swiftshader_rev, 430 - **common_data_args) 431 432 433 if __name__ == "__main__":
··· 1 #! /usr/bin/env nix-shell 2 #! nix-shell -i python3 -p python3Packages.pyyaml 3 4 + import argparse 5 import json 6 import os 7 import re 8 + import subprocess 9 + import sys 10 + import tempfile 11 + import urllib.request 12 + from pathlib import Path 13 + 14 import yaml 15 16 + FAKE_HASH = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" 17 18 + NIXPKGS_ROOT = ( 19 + subprocess.Popen( 20 + ["git", "rev-parse", "--show-toplevel"], stdout=subprocess.PIPE, text=True 21 + ) 22 + .communicate()[0] 23 + .strip() 24 + ) 25 26 27 def load_code(name, **kwargs): 28 + with Path( 29 + f"{NIXPKGS_ROOT}/pkgs/development/compilers/flutter/update/{name}.in" 30 + ).open("r", encoding="utf-8") as f: 31 code = f.read() 32 33 + for key, value in kwargs.items(): 34 code = code.replace(f"@{key}@", value) 35 36 return code ··· 38 39 # Return out paths 40 def nix_build(code): 41 + with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", delete=False) as temp: 42 + temp.write(code) 43 + temp.flush() 44 + os.fsync(temp.fileno()) 45 + temp_name = temp.name 46 47 process = subprocess.Popen( 48 [ ··· 50 "--impure", 51 "--no-out-link", 52 "--expr", 53 + f"with import {NIXPKGS_ROOT} {{}}; callPackage {temp_name} {{}}", 54 + ], 55 stdout=subprocess.PIPE, 56 + text=True, 57 + ) 58 59 process.wait() 60 + Path(temp_name).unlink() # Clean up the temporary file 61 return process.stdout.read().strip().splitlines()[0] 62 63 64 # Return errors 65 def nix_build_to_fail(code): 66 + with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", delete=False) as temp: 67 + temp.write(code) 68 + temp.flush() 69 + os.fsync(temp.fileno()) 70 + temp_name = temp.name 71 72 process = subprocess.Popen( 73 [ ··· 76 "--keep-going", 77 "--no-link", 78 "--expr", 79 + f"with import {NIXPKGS_ROOT} {{}}; callPackage {temp_name} {{}}", 80 + ], 81 stderr=subprocess.PIPE, 82 + text=True, 83 + ) 84 85 stderr = "" 86 while True: ··· 91 print(line.strip()) 92 93 process.wait() 94 + Path(temp_name).unlink() # Clean up the temporary file 95 return stderr 96 97 98 def get_engine_hashes(engine_version, flutter_version): 99 + code = load_code( 100 + "get-engine-hashes.nix", 101 + nixpkgs_root=NIXPKGS_ROOT, 102 + flutter_version=flutter_version, 103 + engine_version=engine_version, 104 + ) 105 106 stderr = nix_build_to_fail(code) 107 108 pattern = re.compile( 109 + rf"/nix/store/.*-flutter-engine-source-{engine_version}-(.+?-.+?)-(.+?-.+?).drv':\n\s+specified: .*\n\s+got:\s+(.+?)\n" 110 + ) 111 matches = pattern.findall(stderr) 112 result_dict = {} 113 ··· 117 118 def sort_dict_recursive(d): 119 return { 120 + k: sort_dict_recursive(v) if isinstance(v, dict) else v 121 + for k, v in sorted(d.items()) 122 + } 123 124 + return sort_dict_recursive(result_dict) 125 126 127 def get_artifact_hashes(flutter_compact_version): 128 + code = load_code( 129 + "get-artifact-hashes.nix", 130 + nixpkgs_root=NIXPKGS_ROOT, 131 + flutter_compact_version=flutter_compact_version, 132 + ) 133 134 stderr = nix_build_to_fail(code) 135 136 pattern = re.compile( 137 + r"/nix/store/.*-flutter-artifacts-(.+?)-(.+?).drv':\n\s+specified: .*\n\s+got:\s+(.+?)\n" 138 + ) 139 matches = pattern.findall(stderr) 140 result_dict = {} 141 ··· 145 146 def sort_dict_recursive(d): 147 return { 148 + k: sort_dict_recursive(v) if isinstance(v, dict) else v 149 + for k, v in sorted(d.items()) 150 + } 151 152 + return sort_dict_recursive(result_dict) 153 154 155 def get_dart_hashes(dart_version, channel): 156 + platforms = ["x86_64-linux", "aarch64-linux", "x86_64-darwin", "aarch64-darwin"] 157 result_dict = {} 158 for platform in platforms: 159 code = load_code( 160 "get-dart-hashes.nix", 161 dart_version=dart_version, 162 channel=channel, 163 + platform=platform, 164 + ) 165 stderr = nix_build_to_fail(code) 166 167 pattern = re.compile(r"got:\s+(.+?)\n") ··· 171 172 173 def get_flutter_hash_and_src(flutter_version): 174 + code = load_code("get-flutter.nix", flutter_version=flutter_version, hash="") 175 176 stderr = nix_build_to_fail(code) 177 pattern = re.compile(r"got:\s+(.+?)\n") 178 + flutter_hash_value = pattern.findall(stderr)[0] 179 180 code = load_code( 181 + "get-flutter.nix", flutter_version=flutter_version, hash=flutter_hash_value 182 + ) 183 184 + return (flutter_hash_value, nix_build(code)) 185 186 187 def get_pubspec_lock(flutter_compact_version, flutter_src): ··· 189 "get-pubspec-lock.nix", 190 flutter_compact_version=flutter_compact_version, 191 flutter_src=flutter_src, 192 + hash="", 193 + ) 194 195 stderr = nix_build_to_fail(code) 196 pattern = re.compile(r"got:\s+(.+?)\n") 197 + pubspec_lock_hash = pattern.findall(stderr)[0] 198 199 code = load_code( 200 "get-pubspec-lock.nix", 201 flutter_compact_version=flutter_compact_version, 202 flutter_src=flutter_src, 203 + hash=pubspec_lock_hash, 204 + ) 205 206 pubspec_lock_file = nix_build(code) 207 208 + with Path(pubspec_lock_file).open("r", encoding="utf-8") as f: 209 pubspec_lock_yaml = f.read() 210 211 return yaml.safe_load(pubspec_lock_yaml) 212 213 + 214 def get_engine_swiftshader_rev(engine_version): 215 + with urllib.request.urlopen( 216 + f"https://github.com/flutter/flutter/raw/{engine_version}/DEPS" 217 + ) as f: 218 + deps = f.read().decode("utf-8") 219 + pattern = re.compile( 220 + r"Var\('swiftshader_git'\) \+ '\/SwiftShader\.git' \+ '@' \+ \'([0-9a-fA-F]{40})\'\," 221 + ) 222 + return pattern.findall(deps)[0] 223 + 224 225 def get_engine_swiftshader_hash(engine_swiftshader_rev): 226 code = load_code( 227 "get-engine-swiftshader.nix", 228 engine_swiftshader_rev=engine_swiftshader_rev, 229 + hash="", 230 + ) 231 232 stderr = nix_build_to_fail(code) 233 pattern = re.compile(r"got:\s+(.+?)\n") 234 return pattern.findall(stderr)[0] 235 236 + 237 def write_data( 238 + nixpkgs_flutter_version_directory, 239 + flutter_version, 240 + channel, 241 + engine_hash, 242 + engine_hashes, 243 + engine_swiftshader_hash, 244 + engine_swiftshader_rev, 245 + dart_version, 246 + dart_hash, 247 + flutter_hash, 248 + artifact_hashes, 249 + pubspec_lock, 250 + ): 251 + with Path(f"{nixpkgs_flutter_version_directory}/data.json").open( 252 + "w", encoding="utf-8" 253 + ) as f: 254 + f.write( 255 + json.dumps( 256 + { 257 + "version": flutter_version, 258 + "engineVersion": engine_hash, 259 + "engineSwiftShaderHash": engine_swiftshader_hash, 260 + "engineSwiftShaderRev": engine_swiftshader_rev, 261 + "channel": channel, 262 + "engineHashes": engine_hashes, 263 + "dartVersion": dart_version, 264 + "dartHash": dart_hash, 265 + "flutterHash": flutter_hash, 266 + "artifactHashes": artifact_hashes, 267 + "pubspecLock": pubspec_lock, 268 + }, 269 + indent=2, 270 + ).strip() 271 + + "\n" 272 + ) 273 274 275 def update_all_packages(): 276 versions_directory = f"{NIXPKGS_ROOT}/pkgs/development/compilers/flutter/versions" 277 + versions = [d.name for d in Path(versions_directory).iterdir()] 278 + versions = sorted( 279 + versions, 280 + key=lambda x: (int(x.split("_")[0]), int(x.split("_")[1])), 281 + reverse=True, 282 + ) 283 284 new_content = [ 285 "flutterPackages-bin = recurseIntoAttrs (callPackage ../development/compilers/flutter { });", 286 + "flutterPackages-source = recurseIntoAttrs (", 287 + " callPackage ../development/compilers/flutter { useNixpkgsEngine = true; }", 288 + ");", 289 "flutterPackages = flutterPackages-bin;", 290 "flutter = flutterPackages.stable;", 291 + ] + [ 292 + f"flutter{version.replace('_', '')} = flutterPackages.v{version};" 293 + for version in versions 294 + ] 295 296 + with Path(f"{NIXPKGS_ROOT}/pkgs/top-level/all-packages.nix").open( 297 + "r", encoding="utf-8" 298 + ) as file: 299 lines = file.read().splitlines(keepends=True) 300 301 start = -1 302 end = -1 303 for i, line in enumerate(lines): 304 + if ( 305 + "flutterPackages-bin = recurseIntoAttrs (callPackage ../development/compilers/flutter { });" 306 + in line 307 + ): 308 start = i 309 if start != -1 and len(line.strip()) == 0: 310 end = i ··· 312 313 if start != -1 and end != -1: 314 del lines[start:end] 315 + lines[start:start] = [f" {line}\n" for line in new_content] 316 317 + with Path(f"{NIXPKGS_ROOT}/pkgs/top-level/all-packages.nix").open( 318 + "w", encoding="utf-8" 319 + ) as file: 320 file.write("".join(lines)) 321 322 ··· 327 engine_hash = None 328 dart_version = None 329 330 + releases = json.load( 331 + urllib.request.urlopen( 332 + "https://storage.googleapis.com/flutter_infra_release/releases/releases_linux.json" 333 + ) 334 + ) 335 336 if not channel: 337 + channel = "stable" 338 339 if not flutter_version: 340 + release_hash = releases["current_release"][channel] 341 release = next( 342 filter( 343 + lambda release: release["hash"] == release_hash, releases["releases"] 344 + ) 345 + ) 346 + flutter_version = release["version"] 347 348 + tags = ( 349 + subprocess.Popen( 350 + ["git", "ls-remote", "--tags", "https://github.com/flutter/flutter.git"], 351 + stdout=subprocess.PIPE, 352 + text=True, 353 + ) 354 + .communicate()[0] 355 + .strip() 356 + ) 357 358 try: 359 + flutter_hash = ( 360 + next( 361 + filter( 362 + lambda line: line.endswith(f"refs/tags/{flutter_version}"), 363 + tags.splitlines(), 364 + ) 365 + ) 366 + .split("refs")[0] 367 + .strip() 368 + ) 369 370 + engine_hash = ( 371 + urllib.request.urlopen( 372 + f"https://github.com/flutter/flutter/raw/{flutter_hash}/bin/internal/engine.version" 373 + ) 374 + .read() 375 + .decode("utf-8") 376 + .strip() 377 + ) 378 except StopIteration: 379 + sys.exit(f"Couldn't find Engine hash for Flutter version: {flutter_version}") 380 381 try: 382 dart_version = next( 383 filter( 384 + lambda release: release["version"] == flutter_version, 385 + releases["releases"], 386 + ) 387 + )["dart_sdk_version"] 388 389 if " " in dart_version: 390 + dart_version = dart_version.split(" ")[2][:-1] 391 except StopIteration: 392 + sys.exit(f"Couldn't find Dart version for Flutter version: {flutter_version}") 393 394 return (flutter_version, engine_hash, dart_version, channel) 395 396 397 def main(): 398 + parser = argparse.ArgumentParser(description="Update Flutter in Nixpkgs") 399 + parser.add_argument("--version", type=str, help="Specify Flutter version") 400 + parser.add_argument("--channel", type=str, help="Specify Flutter release channel") 401 + parser.add_argument( 402 + "--artifact-hashes", action="store_true", help="Whether to get artifact hashes" 403 + ) 404 args = parser.parse_args() 405 406 + (flutter_version, engine_hash, dart_version, channel) = find_versions( 407 + args.version, args.channel 408 + ) 409 410 + flutter_compact_version = "_".join(flutter_version.split(".")[:2]) 411 412 if args.artifact_hashes: 413 print( 414 + json.dumps(get_artifact_hashes(flutter_compact_version), indent=2).strip() 415 + + "\n" 416 + ) 417 return 418 419 + print( 420 + f"Flutter version: {flutter_version} ({flutter_compact_version}) on ({channel})" 421 + ) 422 print(f"Engine hash: {engine_hash}") 423 print(f"Dart version: {dart_version}") 424 ··· 427 428 nixpkgs_flutter_version_directory = f"{NIXPKGS_ROOT}/pkgs/development/compilers/flutter/versions/{flutter_compact_version}" 429 430 + if Path(f"{nixpkgs_flutter_version_directory}/data.json").exists(): 431 + Path(f"{nixpkgs_flutter_version_directory}/data.json").unlink() 432 + Path(nixpkgs_flutter_version_directory).mkdir(parents=True, exist_ok=True) 433 434 update_all_packages() 435 ··· 448 artifact_hashes={}, 449 engine_hashes={}, 450 engine_swiftshader_hash=FAKE_HASH, 451 + engine_swiftshader_rev="0", 452 + **common_data_args, 453 + ) 454 455 pubspec_lock = get_pubspec_lock(flutter_compact_version, flutter_src) 456 ··· 459 artifact_hashes={}, 460 engine_hashes={}, 461 engine_swiftshader_hash=FAKE_HASH, 462 + engine_swiftshader_rev="0", 463 + **common_data_args, 464 + ) 465 466 artifact_hashes = get_artifact_hashes(flutter_compact_version) 467 ··· 470 artifact_hashes=artifact_hashes, 471 engine_hashes={}, 472 engine_swiftshader_hash=FAKE_HASH, 473 + engine_swiftshader_rev="0", 474 + **common_data_args, 475 + ) 476 477 engine_hashes = get_engine_hashes(engine_hash, flutter_version) 478 ··· 481 artifact_hashes=artifact_hashes, 482 engine_hashes=engine_hashes, 483 engine_swiftshader_hash=FAKE_HASH, 484 + engine_swiftshader_rev="0", 485 + **common_data_args, 486 + ) 487 488 engine_swiftshader_rev = get_engine_swiftshader_rev(engine_hash) 489 engine_swiftshader_hash = get_engine_swiftshader_hash(engine_swiftshader_rev) ··· 494 engine_hashes=engine_hashes, 495 engine_swiftshader_hash=engine_swiftshader_hash, 496 engine_swiftshader_rev=engine_swiftshader_rev, 497 + **common_data_args, 498 + ) 499 500 501 if __name__ == "__main__":
+37 -37
pkgs/development/compilers/flutter/versions/3_32/data.json
··· 1 { 2 - "version": "3.32.6", 3 - "engineVersion": "72f2b18bb094f92f62a3113a8075240ebb59affa", 4 "engineSwiftShaderHash": "sha256-ATVcuxqPHqHOWYyO7DoX9LdgUiO3INUi7m9Mc6ccc1M=", 5 "engineSwiftShaderRev": "d040a5bab638bf7c226235c95787ba6288bb6416", 6 "channel": "stable", 7 "engineHashes": { 8 "aarch64-linux": { 9 - "aarch64-linux": "sha256-MjWz+aveIDXygAejZiNGFZluR0gjpS62h16UcFGz7FA=", 10 - "x86_64-linux": "sha256-MjWz+aveIDXygAejZiNGFZluR0gjpS62h16UcFGz7FA=" 11 }, 12 "x86_64-linux": { 13 - "aarch64-linux": "sha256-jWM+egf2tZVR8bnBXSHiXOG0CbkEjxEqxwPnaR7tJKk=", 14 - "x86_64-linux": "sha256-jWM+egf2tZVR8bnBXSHiXOG0CbkEjxEqxwPnaR7tJKk=" 15 } 16 }, 17 "dartVersion": "3.8.1", ··· 21 "x86_64-darwin": "sha256-S3iGDVLollApke2SnXAcV919qsDTVmz5Gf9fTletr00=", 22 "aarch64-darwin": "sha256-haHQks9N1mBIqRsYg9sOLw7ra7gC708gsTWfKxvIK1c=" 23 }, 24 - "flutterHash": "sha256-YxApWMp6Ax1ZNOH/7kgeXgiaBcXN7Ves4TFUImFtd3s=", 25 "artifactHashes": { 26 "android": { 27 - "aarch64-darwin": "sha256-thfXrVn6nWlQg23yDHiNAx6XebQkV80tkckONwmfjaU=", 28 - "aarch64-linux": "sha256-fM90NqMpD4SkrjZfDXvHjMNdGiaDqX2T+A4cNNZkplk=", 29 - "x86_64-darwin": "sha256-thfXrVn6nWlQg23yDHiNAx6XebQkV80tkckONwmfjaU=", 30 - "x86_64-linux": "sha256-fM90NqMpD4SkrjZfDXvHjMNdGiaDqX2T+A4cNNZkplk=" 31 }, 32 "fuchsia": { 33 - "aarch64-darwin": "sha256-Lh6z51v14kZIGxriaKDdOn5fAKyANm8FAzIozoOiAZg=", 34 - "aarch64-linux": "sha256-Lh6z51v14kZIGxriaKDdOn5fAKyANm8FAzIozoOiAZg=", 35 - "x86_64-darwin": "sha256-Lh6z51v14kZIGxriaKDdOn5fAKyANm8FAzIozoOiAZg=", 36 - "x86_64-linux": "sha256-Lh6z51v14kZIGxriaKDdOn5fAKyANm8FAzIozoOiAZg=" 37 }, 38 "ios": { 39 - "aarch64-darwin": "sha256-zCR8wt7QZHl9UFOhkU8KFkyRbaUitXJHTiMLOe+M5/g=", 40 - "aarch64-linux": "sha256-zCR8wt7QZHl9UFOhkU8KFkyRbaUitXJHTiMLOe+M5/g=", 41 - "x86_64-darwin": "sha256-zCR8wt7QZHl9UFOhkU8KFkyRbaUitXJHTiMLOe+M5/g=", 42 - "x86_64-linux": "sha256-zCR8wt7QZHl9UFOhkU8KFkyRbaUitXJHTiMLOe+M5/g=" 43 }, 44 "linux": { 45 - "aarch64-darwin": "sha256-dSXB6GFQZjHoyiDStAnohYtzFIrVWmD3DfQ0b+cGwcU=", 46 - "aarch64-linux": "sha256-dSXB6GFQZjHoyiDStAnohYtzFIrVWmD3DfQ0b+cGwcU=", 47 - "x86_64-darwin": "sha256-9ds2C7XBIvnzbgwcBPwJhaF/l/t+uZQEiuwQg2WIVkE=", 48 - "x86_64-linux": "sha256-9ds2C7XBIvnzbgwcBPwJhaF/l/t+uZQEiuwQg2WIVkE=" 49 }, 50 "macos": { 51 - "aarch64-darwin": "sha256-Qybdtwy8MfPEsCJUHxlV62fZyEAClOHM4thsEw4nmvg=", 52 - "aarch64-linux": "sha256-Qybdtwy8MfPEsCJUHxlV62fZyEAClOHM4thsEw4nmvg=", 53 - "x86_64-darwin": "sha256-Qybdtwy8MfPEsCJUHxlV62fZyEAClOHM4thsEw4nmvg=", 54 - "x86_64-linux": "sha256-Qybdtwy8MfPEsCJUHxlV62fZyEAClOHM4thsEw4nmvg=" 55 }, 56 "universal": { 57 - "aarch64-darwin": "sha256-37CxKej4SB4Qm3aJVkf3SK0uiimLYSGJBAOwqWStmEY=", 58 - "aarch64-linux": "sha256-7p4CTx///0ND5xUpb9uGbBgaLeClt/aGoSm6mE56ySk=", 59 - "x86_64-darwin": "sha256-sjrzv4jJ28RViNaC7jG4utnerBj3521kXfT8CAgGOLI=", 60 - "x86_64-linux": "sha256-B9gqS5lfLy8pYjP7N52jLqZmroukuAS/ed0xP5xspeg=" 61 }, 62 "web": { 63 - "aarch64-darwin": "sha256-iLAX0UCh+ZTsSggKj29cUm+8CIEJfXj+iWiTV1ndfrU=", 64 - "aarch64-linux": "sha256-iLAX0UCh+ZTsSggKj29cUm+8CIEJfXj+iWiTV1ndfrU=", 65 - "x86_64-darwin": "sha256-iLAX0UCh+ZTsSggKj29cUm+8CIEJfXj+iWiTV1ndfrU=", 66 - "x86_64-linux": "sha256-iLAX0UCh+ZTsSggKj29cUm+8CIEJfXj+iWiTV1ndfrU=" 67 }, 68 "windows": { 69 - "x86_64-darwin": "sha256-7M6lLznB1FwQi4e4O6r5IWRxYFaXhfdkSx3rN2GZr5c=", 70 - "x86_64-linux": "sha256-7M6lLznB1FwQi4e4O6r5IWRxYFaXhfdkSx3rN2GZr5c=" 71 } 72 }, 73 "pubspecLock": {
··· 1 { 2 + "version": "3.32.7", 3 + "engineVersion": "39d6d6e699e51b2874210e14cddf1a22fb9524b2", 4 "engineSwiftShaderHash": "sha256-ATVcuxqPHqHOWYyO7DoX9LdgUiO3INUi7m9Mc6ccc1M=", 5 "engineSwiftShaderRev": "d040a5bab638bf7c226235c95787ba6288bb6416", 6 "channel": "stable", 7 "engineHashes": { 8 "aarch64-linux": { 9 + "aarch64-linux": "sha256-3cqYwwQlnHPMRoeRLsru+Xk9rMiAaLZ6rBxdJttJSW0=", 10 + "x86_64-linux": "sha256-3cqYwwQlnHPMRoeRLsru+Xk9rMiAaLZ6rBxdJttJSW0=" 11 }, 12 "x86_64-linux": { 13 + "aarch64-linux": "sha256-8jXbz7gQZhaoU2Cs6uAbR5xF22HzBxMghA4edm/7oa4=", 14 + "x86_64-linux": "sha256-8jXbz7gQZhaoU2Cs6uAbR5xF22HzBxMghA4edm/7oa4=" 15 } 16 }, 17 "dartVersion": "3.8.1", ··· 21 "x86_64-darwin": "sha256-S3iGDVLollApke2SnXAcV919qsDTVmz5Gf9fTletr00=", 22 "aarch64-darwin": "sha256-haHQks9N1mBIqRsYg9sOLw7ra7gC708gsTWfKxvIK1c=" 23 }, 24 + "flutterHash": "sha256-fPCa9JHvQGP47uo6LHbGC2aMMwdX+AOEZfvIyZ3M2/U=", 25 "artifactHashes": { 26 "android": { 27 + "aarch64-darwin": "sha256-Gs4SLCLh/6e/n8lu6pTujksW/MqIieWymF151N5dDnw=", 28 + "aarch64-linux": "sha256-aTVHfbG6V4T2/SDbxdCEYo3+7EryjK6sAUL4FF4AmUM=", 29 + "x86_64-darwin": "sha256-Gs4SLCLh/6e/n8lu6pTujksW/MqIieWymF151N5dDnw=", 30 + "x86_64-linux": "sha256-aTVHfbG6V4T2/SDbxdCEYo3+7EryjK6sAUL4FF4AmUM=" 31 }, 32 "fuchsia": { 33 + "aarch64-darwin": "sha256-cKUp9CQq10Ls3dOcB3wPdnnwVK26RG0JWn0n4TsWigc=", 34 + "aarch64-linux": "sha256-cKUp9CQq10Ls3dOcB3wPdnnwVK26RG0JWn0n4TsWigc=", 35 + "x86_64-darwin": "sha256-cKUp9CQq10Ls3dOcB3wPdnnwVK26RG0JWn0n4TsWigc=", 36 + "x86_64-linux": "sha256-cKUp9CQq10Ls3dOcB3wPdnnwVK26RG0JWn0n4TsWigc=" 37 }, 38 "ios": { 39 + "aarch64-darwin": "sha256-EvzvRyR2aRomFPiz7WfGyhg0JiOHzCIi6xEDbLeIGAQ=", 40 + "aarch64-linux": "sha256-EvzvRyR2aRomFPiz7WfGyhg0JiOHzCIi6xEDbLeIGAQ=", 41 + "x86_64-darwin": "sha256-EvzvRyR2aRomFPiz7WfGyhg0JiOHzCIi6xEDbLeIGAQ=", 42 + "x86_64-linux": "sha256-EvzvRyR2aRomFPiz7WfGyhg0JiOHzCIi6xEDbLeIGAQ=" 43 }, 44 "linux": { 45 + "aarch64-darwin": "sha256-eLGFwZxd4P9NSnHhOssAvjWea+ahuPUtIi4BrsOxZDE=", 46 + "aarch64-linux": "sha256-eLGFwZxd4P9NSnHhOssAvjWea+ahuPUtIi4BrsOxZDE=", 47 + "x86_64-darwin": "sha256-WhDM+gxvSWsQ0RyaInKH3obabboMfBtfBPZPx6379kc=", 48 + "x86_64-linux": "sha256-WhDM+gxvSWsQ0RyaInKH3obabboMfBtfBPZPx6379kc=" 49 }, 50 "macos": { 51 + "aarch64-darwin": "sha256-3QXe7KTjh9noCdZnCRbo6bXuif7dhQ75mk6/lyydSck=", 52 + "aarch64-linux": "sha256-3QXe7KTjh9noCdZnCRbo6bXuif7dhQ75mk6/lyydSck=", 53 + "x86_64-darwin": "sha256-3QXe7KTjh9noCdZnCRbo6bXuif7dhQ75mk6/lyydSck=", 54 + "x86_64-linux": "sha256-3QXe7KTjh9noCdZnCRbo6bXuif7dhQ75mk6/lyydSck=" 55 }, 56 "universal": { 57 + "aarch64-darwin": "sha256-Z7UTqCTESwcpv0yxzTEMThkQMNfisOCnhC7sltY0dUA=", 58 + "aarch64-linux": "sha256-VIMu52o7BIEkxt4h0u4sILcrgKg85TY+3ieQl290icM=", 59 + "x86_64-darwin": "sha256-/jOrwEy6EWCx8cS9MyIEI4NqO2H8Rs/VV7N6RmCyPWM=", 60 + "x86_64-linux": "sha256-mcQYpXo8E/j4j4OYIwlcx6xpiyYbnKXrwfT+rl6W4Zw=" 61 }, 62 "web": { 63 + "aarch64-darwin": "sha256-2nnM91LPjdxuU2uWCdE2tFoZ75N0L5DWlJa75KCulY8=", 64 + "aarch64-linux": "sha256-2nnM91LPjdxuU2uWCdE2tFoZ75N0L5DWlJa75KCulY8=", 65 + "x86_64-darwin": "sha256-2nnM91LPjdxuU2uWCdE2tFoZ75N0L5DWlJa75KCulY8=", 66 + "x86_64-linux": "sha256-2nnM91LPjdxuU2uWCdE2tFoZ75N0L5DWlJa75KCulY8=" 67 }, 68 "windows": { 69 + "x86_64-darwin": "sha256-boajU3GH29bhgDT+emE3gIQjAtuon1OUi1gGBH6iq/4=", 70 + "x86_64-linux": "sha256-boajU3GH29bhgDT+emE3gIQjAtuon1OUi1gGBH6iq/4=" 71 } 72 }, 73 "pubspecLock": {