mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-06-12 04:35:41 +03:00

This builds upon Yureka's work to build electron from source. A lot of the newly introduced changes to the chromium derivation and update script are 1-to-1 copies or slight derivates of that work. Especially the newly added depot_tools.py to resolve the DEPS files does most of the heavy lifting and is an ever so slightly modified version of that section Yureka implemented in electron's update.py. Some coordination between the chromium and electron maintainers should allow us to deduplicate a lot of the duplicated code fairly easily in the future. That just wasn't a goal with this commit, due to time constraints and the urgency to switch away from the release tarballs. Instead of taking just a few hours for a tarball to be available for download after a release, it now takes multiple days at least. At the time of writing, roughly a week after M131 was released, the tarball is still not available. It's unclear if it will ever be. Reason for this are CI issues on Google's side. Note that virtually every release contains some security critical fixes. Also note that this commit is written with a lot of conditionals so the electron derivation doesn't change (just yet). The new update.mjs update script is still very much work-in-progress but gets the job done. Co-Authored-By: Yureka <yuka@yuka.dev>
122 lines
3.6 KiB
Python
Executable file
122 lines
3.6 KiB
Python
Executable file
#! /usr/bin/env nix-shell
|
|
#! nix-shell -i python -p python3
|
|
"""
|
|
This is a heavily simplified variant of electron's update.py
|
|
for use in ./update.mjs and should not be called manually.
|
|
|
|
It resolves chromium's DEPS file recursively when called with
|
|
a working depot_tools checkout and a ref to fetch and prints
|
|
the result as JSON to stdout.
|
|
"""
|
|
import base64
|
|
import json
|
|
from typing import Optional
|
|
from urllib.request import urlopen
|
|
|
|
import sys
|
|
|
|
if len(sys.argv) != 3:
|
|
print("""This internal script has been called with the wrong amount of parameters.
|
|
This script is not supposed to be called manually.
|
|
Refer to ./update.mjs instead.""")
|
|
exit(1)
|
|
|
|
_, depot_tools_checkout, chromium_version = sys.argv
|
|
|
|
sys.path.append(depot_tools_checkout)
|
|
import gclient_eval
|
|
import gclient_utils
|
|
|
|
|
|
class Repo:
|
|
fetcher: str
|
|
args: dict
|
|
|
|
def __init__(self) -> None:
|
|
self.deps: dict = {}
|
|
self.hash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
|
|
|
|
def get_deps(self, repo_vars: dict, path: str) -> None:
|
|
print(
|
|
"evaluating " + json.dumps(self, default=vars, sort_keys=True),
|
|
file=sys.stderr,
|
|
)
|
|
|
|
deps_file = self.get_file("DEPS")
|
|
evaluated = gclient_eval.Parse(deps_file, vars_override=repo_vars, filename="DEPS")
|
|
|
|
repo_vars = dict(evaluated.get("vars", {})) | repo_vars
|
|
|
|
prefix = f"{path}/" if evaluated.get("use_relative_paths", False) else ""
|
|
|
|
self.deps = {
|
|
prefix + dep_name: repo_from_dep(dep)
|
|
for dep_name, dep in evaluated.get("deps", {}).items()
|
|
if (
|
|
gclient_eval.EvaluateCondition(dep["condition"], repo_vars)
|
|
if "condition" in dep
|
|
else True
|
|
)
|
|
and repo_from_dep(dep) != None
|
|
}
|
|
|
|
for key in evaluated.get("recursedeps", []):
|
|
dep_path = prefix + key
|
|
if dep_path in self.deps and dep_path != "src/third_party/squirrel.mac":
|
|
self.deps[dep_path].get_deps(repo_vars, dep_path)
|
|
|
|
def flatten_repr(self) -> dict:
|
|
return {"fetcher": self.fetcher, "hash": self.hash, **self.args}
|
|
|
|
def flatten(self, path: str) -> dict:
|
|
out = {path: self.flatten_repr()}
|
|
for dep_path, dep in self.deps.items():
|
|
out |= dep.flatten(dep_path)
|
|
return out
|
|
|
|
def get_file(self, filepath: str) -> str:
|
|
raise NotImplementedError
|
|
|
|
|
|
class GitilesRepo(Repo):
|
|
def __init__(self, url: str, rev: str) -> None:
|
|
super().__init__()
|
|
self.fetcher = "fetchFromGitiles"
|
|
self.args = {
|
|
"url": url,
|
|
"rev": rev,
|
|
}
|
|
|
|
def get_file(self, filepath: str) -> str:
|
|
return base64.b64decode(
|
|
urlopen(
|
|
f"{self.args['url']}/+/{self.args['rev']}/{filepath}?format=TEXT"
|
|
).read()
|
|
).decode("utf-8")
|
|
|
|
|
|
def repo_from_dep(dep: dict) -> Optional[Repo]:
|
|
if "url" in dep:
|
|
url, rev = gclient_utils.SplitUrlRevision(dep["url"])
|
|
return GitilesRepo(url, rev)
|
|
else:
|
|
# Not a git dependency; skip
|
|
return None
|
|
|
|
|
|
|
|
chromium = GitilesRepo("https://chromium.googlesource.com/chromium/src.git", chromium_version)
|
|
chromium.get_deps(
|
|
{
|
|
**{
|
|
f"checkout_{platform}": platform == "linux" or platform == "x64" or platform == "arm64" or platform == "arm"
|
|
for platform in ["ios", "chromeos", "android", "mac", "win", "linux"]
|
|
},
|
|
**{
|
|
f"checkout_{arch}": True
|
|
for arch in ["x64", "arm64", "arm", "x86", "mips", "mips64"]
|
|
},
|
|
},
|
|
"",
|
|
)
|
|
print(json.dumps(chromium.flatten("src")))
|