···
#! /usr/bin/env nix-shell
#! nix-shell -i python3 -p python3Packages.pyyaml
6
-
import urllib.request
11
+
import urllib.request
12
+
from pathlib import Path
17
-
FAKE_HASH = 'sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='
16
+
FAKE_HASH = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
19
-
NIXPKGS_ROOT = subprocess.Popen(['git',
22
-
stdout=subprocess.PIPE,
23
-
text=True).communicate()[0].strip()
20
+
["git", "rev-parse", "--show-toplevel"], stdout=subprocess.PIPE, text=True
def load_code(name, **kwargs):
27
-
with open(f"{NIXPKGS_ROOT}/pkgs/development/compilers/flutter/update/{name}.in", 'r') as f:
29
+
f"{NIXPKGS_ROOT}/pkgs/development/compilers/flutter/update/{name}.in"
30
+
).open("r", encoding="utf-8") as f:
30
-
for (key, value) in kwargs.items():
33
+
for key, value in kwargs.items():
code = code.replace(f"@{key}@", value)
···
38
-
temp = tempfile.NamedTemporaryFile(mode='w')
41
-
os.fsync(temp.fileno())
41
+
with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", delete=False) as temp:
44
+
os.fsync(temp.fileno())
45
+
temp_name = temp.name
process = subprocess.Popen(
···
49
-
f"with import {NIXPKGS_ROOT} {{}}; callPackage {temp.name} {{}}"],
53
+
f"with import {NIXPKGS_ROOT} {{}}; callPackage {temp_name} {{}}",
60
+
Path(temp_name).unlink() # Clean up the temporary file
return process.stdout.read().strip().splitlines()[0]
def nix_build_to_fail(code):
60
-
temp = tempfile.NamedTemporaryFile(mode='w')
63
-
os.fsync(temp.fileno())
66
+
with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", delete=False) as temp:
69
+
os.fsync(temp.fileno())
70
+
temp_name = temp.name
process = subprocess.Popen(
···
72
-
f"with import {NIXPKGS_ROOT} {{}}; callPackage {temp.name} {{}}"],
79
+
f"with import {NIXPKGS_ROOT} {{}}; callPackage {temp_name} {{}}",
···
94
+
Path(temp_name).unlink() # Clean up the temporary file
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)
100
+
"get-engine-hashes.nix",
101
+
nixpkgs_root=NIXPKGS_ROOT,
102
+
flutter_version=flutter_version,
103
+
engine_version=engine_version,
stderr = nix_build_to_fail(code)
98
-
rf"/nix/store/.*-flutter-engine-source-{engine_version}-(.+?-.+?)-(.+?-.+?).drv':\n\s+specified: .*\n\s+got:\s+(.+?)\n")
109
+
rf"/nix/store/.*-flutter-engine-source-{engine_version}-(.+?-.+?)-(.+?-.+?).drv':\n\s+specified: .*\n\s+got:\s+(.+?)\n"
matches = pattern.findall(stderr)
···
def sort_dict_recursive(d):
108
-
k: sort_dict_recursive(v) if isinstance(
109
-
v, dict) else v for k, v in sorted(
111
-
result_dict = sort_dict_recursive(result_dict)
120
+
k: sort_dict_recursive(v) if isinstance(v, dict) else v
121
+
for k, v in sorted(d.items())
124
+
return sort_dict_recursive(result_dict)
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)
129
+
"get-artifact-hashes.nix",
130
+
nixpkgs_root=NIXPKGS_ROOT,
131
+
flutter_compact_version=flutter_compact_version,
stderr = nix_build_to_fail(code)
124
-
r"/nix/store/.*-flutter-artifacts-(.+?)-(.+?).drv':\n\s+specified: .*\n\s+got:\s+(.+?)\n")
137
+
r"/nix/store/.*-flutter-artifacts-(.+?)-(.+?).drv':\n\s+specified: .*\n\s+got:\s+(.+?)\n"
matches = pattern.findall(stderr)
···
def sort_dict_recursive(d):
134
-
k: sort_dict_recursive(v) if isinstance(
135
-
v, dict) else v for k, v in sorted(
137
-
result_dict = sort_dict_recursive(result_dict)
148
+
k: sort_dict_recursive(v) if isinstance(v, dict) else v
149
+
for k, v in sorted(d.items())
152
+
return sort_dict_recursive(result_dict)
def get_dart_hashes(dart_version, channel):
156
+
platforms = ["x86_64-linux", "aarch64-linux", "x86_64-darwin", "aarch64-darwin"]
for platform in platforms:
dart_version=dart_version,
stderr = nix_build_to_fail(code)
pattern = re.compile(r"got:\s+(.+?)\n")
···
def get_flutter_hash_and_src(flutter_version):
166
-
flutter_version=flutter_version,
174
+
code = load_code("get-flutter.nix", flutter_version=flutter_version, hash="")
stderr = nix_build_to_fail(code)
pattern = re.compile(r"got:\s+(.+?)\n")
171
-
hash = pattern.findall(stderr)[0]
178
+
flutter_hash_value = pattern.findall(stderr)[0]
175
-
flutter_version=flutter_version,
181
+
"get-flutter.nix", flutter_version=flutter_version, hash=flutter_hash_value
178
-
return (hash, nix_build(code))
184
+
return (flutter_hash_value, nix_build(code))
def get_pubspec_lock(flutter_compact_version, flutter_src):
···
flutter_compact_version=flutter_compact_version,
stderr = nix_build_to_fail(code)
pattern = re.compile(r"got:\s+(.+?)\n")
190
-
hash = pattern.findall(stderr)[0]
197
+
pubspec_lock_hash = pattern.findall(stderr)[0]
flutter_compact_version=flutter_compact_version,
203
+
hash=pubspec_lock_hash,
pubspec_lock_file = nix_build(code)
200
-
with open(pubspec_lock_file, 'r') as f:
208
+
with Path(pubspec_lock_file).open("r", encoding="utf-8") as f:
pubspec_lock_yaml = f.read()
return yaml.safe_load(pubspec_lock_yaml)
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]
215
+
with urllib.request.urlopen(
216
+
f"https://github.com/flutter/flutter/raw/{engine_version}/DEPS"
218
+
deps = f.read().decode("utf-8")
219
+
pattern = re.compile(
220
+
r"Var\('swiftshader_git'\) \+ '\/SwiftShader\.git' \+ '@' \+ \'([0-9a-fA-F]{40})\'\,"
222
+
return pattern.findall(deps)[0]
def get_engine_swiftshader_hash(engine_swiftshader_rev):
"get-engine-swiftshader.nix",
engine_swiftshader_rev=engine_swiftshader_rev,
stderr = nix_build_to_fail(code)
pattern = re.compile(r"got:\s+(.+?)\n")
return pattern.findall(stderr)[0]
223
-
nixpkgs_flutter_version_directory,
228
-
engine_swiftshader_hash,
229
-
engine_swiftshader_rev,
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")
238
+
nixpkgs_flutter_version_directory,
243
+
engine_swiftshader_hash,
244
+
engine_swiftshader_rev,
251
+
with Path(f"{nixpkgs_flutter_version_directory}/data.json").open(
252
+
"w", encoding="utf-8"
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,
def update_all_packages():
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)
277
+
versions = [d.name for d in Path(versions_directory).iterdir()]
280
+
key=lambda x: (int(x.split("_")[0]), int(x.split("_")[1])),
"flutterPackages-bin = recurseIntoAttrs (callPackage ../development/compilers/flutter { });",
"flutterPackages-source = recurseIntoAttrs (callPackage ../development/compilers/flutter { useNixpkgsEngine = true; });",
"flutterPackages = flutterPackages-bin;",
"flutter = flutterPackages.stable;",
262
-
] + [f"flutter{version.replace('_', '')} = flutterPackages.v{version};" for version in versions]
290
+
f"flutter{version.replace('_', '')} = flutterPackages.v{version};"
291
+
for version in versions
264
-
with open(f"{NIXPKGS_ROOT}/pkgs/top-level/all-packages.nix", 'r') as file:
294
+
with Path(f"{NIXPKGS_ROOT}/pkgs/top-level/all-packages.nix").open(
295
+
"r", encoding="utf-8"
lines = file.read().splitlines(keepends=True)
for i, line in enumerate(lines):
270
-
if "flutterPackages-bin = recurseIntoAttrs (callPackage ../development/compilers/flutter { });" in line:
303
+
"flutterPackages-bin = recurseIntoAttrs (callPackage ../development/compilers/flutter { });"
if start != -1 and len(line.strip()) == 0:
···
if start != -1 and end != -1:
278
-
lines[start:start] = [f" {l}\n" for l in new_content]
313
+
lines[start:start] = [f" {line}\n" for line in new_content]
280
-
with open(f"{NIXPKGS_ROOT}/pkgs/top-level/all-packages.nix", 'w') as file:
315
+
with Path(f"{NIXPKGS_ROOT}/pkgs/top-level/all-packages.nix").open(
316
+
"w", encoding="utf-8"
file.write("".join(lines))
···
291
-
releases = json.load(urllib.request.urlopen(
292
-
"https://storage.googleapis.com/flutter_infra_release/releases/releases_linux.json"))
328
+
releases = json.load(
329
+
urllib.request.urlopen(
330
+
"https://storage.googleapis.com/flutter_infra_release/releases/releases_linux.json"
298
-
hash = releases['current_release'][channel]
338
+
release_hash = releases["current_release"][channel]
301
-
lambda release: release['hash'] == hash,
302
-
releases['releases']))
303
-
flutter_version = release['version']
341
+
lambda release: release["hash"] == release_hash, releases["releases"]
344
+
flutter_version = release["version"]
305
-
tags = subprocess.Popen(['git',
308
-
'https://github.com/flutter/flutter.git'],
309
-
stdout=subprocess.PIPE,
310
-
text=True).communicate()[0].strip()
348
+
["git", "ls-remote", "--tags", "https://github.com/flutter/flutter.git"],
349
+
stdout=subprocess.PIPE,
313
-
flutter_hash = next(
315
-
lambda line: line.endswith(f'refs/tags/{flutter_version}'),
316
-
tags.splitlines())).split('refs')[0].strip()
360
+
lambda line: line.endswith(f"refs/tags/{flutter_version}"),
318
-
engine_hash = urllib.request.urlopen(f'https://github.com/flutter/flutter/raw/{flutter_hash}/bin/internal/engine.version').read().decode('utf-8').strip()
369
+
urllib.request.urlopen(
370
+
f"https://github.com/flutter/flutter/raw/{flutter_hash}/bin/internal/engine.version"
321
-
f"Couldn't find Engine hash for Flutter version: {flutter_version}")
377
+
sys.exit(f"Couldn't find Engine hash for Flutter version: {flutter_version}")
326
-
lambda release: release['version'] == flutter_version,
327
-
releases['releases']))['dart_sdk_version']
382
+
lambda release: release["version"] == flutter_version,
383
+
releases["releases"],
385
+
)["dart_sdk_version"]
330
-
dart_version = dart_version.split(' ')[2][:-1]
388
+
dart_version = dart_version.split(" ")[2][:-1]
333
-
f"Couldn't find Dart version for Flutter version: {flutter_version}")
390
+
sys.exit(f"Couldn't find Dart version for Flutter version: {flutter_version}")
return (flutter_version, engine_hash, dart_version, channel)
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')
396
+
parser = argparse.ArgumentParser(description="Update Flutter in Nixpkgs")
397
+
parser.add_argument("--version", type=str, help="Specify Flutter version")
398
+
parser.add_argument("--channel", type=str, help="Specify Flutter release channel")
399
+
parser.add_argument(
400
+
"--artifact-hashes", action="store_true", help="Whether to get artifact hashes"
args = parser.parse_args()
346
-
(flutter_version, engine_hash, dart_version, channel) = find_versions(args.version, args.channel)
404
+
(flutter_version, engine_hash, dart_version, channel) = find_versions(
405
+
args.version, args.channel
348
-
flutter_compact_version = '_'.join(flutter_version.split('.')[:2])
408
+
flutter_compact_version = "_".join(flutter_version.split(".")[:2])
353
-
get_artifact_hashes(flutter_compact_version),
354
-
indent=2).strip() +
412
+
json.dumps(get_artifact_hashes(flutter_compact_version), indent=2).strip()
358
-
print(f"Flutter version: {flutter_version} ({flutter_compact_version}) on ({channel})")
418
+
f"Flutter version: {flutter_version} ({flutter_compact_version}) on ({channel})"
print(f"Engine hash: {engine_hash}")
print(f"Dart version: {dart_version}")
···
nixpkgs_flutter_version_directory = f"{NIXPKGS_ROOT}/pkgs/development/compilers/flutter/versions/{flutter_compact_version}"
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)
428
+
if Path(f"{nixpkgs_flutter_version_directory}/data.json").exists():
429
+
Path(f"{nixpkgs_flutter_version_directory}/data.json").unlink()
430
+
Path(nixpkgs_flutter_version_directory).mkdir(parents=True, exist_ok=True)
···
engine_swiftshader_hash=FAKE_HASH,
388
-
engine_swiftshader_rev='0',
389
-
**common_data_args)
449
+
engine_swiftshader_rev="0",
450
+
**common_data_args,
pubspec_lock = get_pubspec_lock(flutter_compact_version, flutter_src)
···
engine_swiftshader_hash=FAKE_HASH,
398
-
engine_swiftshader_rev='0',
399
-
**common_data_args)
460
+
engine_swiftshader_rev="0",
461
+
**common_data_args,
artifact_hashes = get_artifact_hashes(flutter_compact_version)
···
artifact_hashes=artifact_hashes,
engine_swiftshader_hash=FAKE_HASH,
408
-
engine_swiftshader_rev='0',
409
-
**common_data_args)
471
+
engine_swiftshader_rev="0",
472
+
**common_data_args,
engine_hashes = get_engine_hashes(engine_hash, flutter_version)
···
artifact_hashes=artifact_hashes,
engine_hashes=engine_hashes,
engine_swiftshader_hash=FAKE_HASH,
418
-
engine_swiftshader_rev='0',
419
-
**common_data_args)
482
+
engine_swiftshader_rev="0",
483
+
**common_data_args,
engine_swiftshader_rev = get_engine_swiftshader_rev(engine_hash)
engine_swiftshader_hash = get_engine_swiftshader_hash(engine_swiftshader_rev)
···
engine_hashes=engine_hashes,
engine_swiftshader_hash=engine_swiftshader_hash,
engine_swiftshader_rev=engine_swiftshader_rev,
430
-
**common_data_args)
495
+
**common_data_args,
if __name__ == "__main__":