generate default.nix from lock file
This commit is contained in:
parent
c183b44f4d
commit
351bfefbc3
3 changed files with 37 additions and 61 deletions
31
default.nix
31
default.nix
|
|
@ -1,14 +1,27 @@
|
|||
|
||||
{ pkgs ? import <nixpkgs> {} }:
|
||||
let
|
||||
inherit (pkgs) fetchgit fetchFromGitHub callPackages;
|
||||
inherit (pkgs) fetchgit fetchzip callPackages lib;
|
||||
|
||||
manifest = (builtins.fromJSON (builtins.readFile ./repos.json)).repos;
|
||||
lockedRevisions = (builtins.fromJSON (builtins.readFile ./repos.json.lock)).repos;
|
||||
|
||||
repoSource = name: attr:
|
||||
let
|
||||
revision = lockedRevisions.${name};
|
||||
in if lib.hasPrefix "https://github.com" attr.url then
|
||||
fetchzip {
|
||||
url = "${attr.url}/archive/${revision.rev}.zip";
|
||||
inherit (revision) sha256;
|
||||
}
|
||||
else
|
||||
fetchgit {
|
||||
inherit (attr) url;
|
||||
inherit (revision) rev sha256;
|
||||
};
|
||||
|
||||
createRepo = (name: attr: callPackages (repoSource name attr) {});
|
||||
|
||||
in {
|
||||
repos = {
|
||||
mic92 = callPackages (fetchFromGitHub {
|
||||
owner = "Mic92";
|
||||
repo = "nur-packages";
|
||||
sha256 = "1sk41q80z6rzrnnzbpkj9jmr9qcsxvh92q7v1jl60f5ms4q0ipx2";
|
||||
rev = "8d61d40bf8e17555e81eeabfa7e5d4ac6e01ac37";
|
||||
}) {};
|
||||
};
|
||||
repos = lib.mapAttrs createRepo manifest;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,7 +14,6 @@ import tempfile
|
|||
from enum import Enum, auto
|
||||
from urllib.parse import urlparse, urljoin, ParseResult
|
||||
|
||||
|
||||
ROOT = Path(__file__).parent.parent
|
||||
LOCK_PATH = ROOT.joinpath("repos.json.lock")
|
||||
MANIFEST_PATH = ROOT.joinpath("repos.json")
|
||||
|
|
@ -81,22 +80,6 @@ class Repo():
|
|||
self.sha256 = sha256
|
||||
self.type = RepoType.from_url(url)
|
||||
|
||||
def nix_expression(self) -> str:
|
||||
if self.type == RepoType.GITHUB:
|
||||
parts = Path(self.url.path).parts
|
||||
return f""" {self.name} = callPackages (fetchFromGitHub {{
|
||||
owner = "{parts[1]}";
|
||||
repo = "{parts[2]}";
|
||||
sha256 = "{self.sha256}";
|
||||
rev = "{self.rev}";
|
||||
}}) {{}};"""
|
||||
else:
|
||||
return f""" {self.name} = callPackages (fetchgit {{
|
||||
url = "{self.url}";
|
||||
sha256 = "{self.sha256}";
|
||||
rev = "{self.rev}";
|
||||
}}) {{}};"""
|
||||
|
||||
|
||||
def prefetch_git(url: str) -> Tuple[str, Path]:
|
||||
with tempfile.TemporaryDirectory() as tempdir:
|
||||
|
|
@ -137,38 +120,22 @@ def update(name: str, url: ParseResult, locked_repo: Optional[Repo]) -> Repo:
|
|||
callPackages {path} {{}}
|
||||
""")
|
||||
f.flush()
|
||||
res = subprocess.call([
|
||||
"nix-env", "-f", f.name, "-qa", "*", "--meta", "--xml",
|
||||
"--drv-path", "--show-trace"
|
||||
], stdout=subprocess.PIPE)
|
||||
res = subprocess.call(
|
||||
[
|
||||
"nix-env", "-f", f.name, "-qa", "*", "--meta", "--xml",
|
||||
"--drv-path", "--show-trace"
|
||||
],
|
||||
stdout=subprocess.PIPE)
|
||||
if res != 0:
|
||||
raise NurError(f"{name} does not evaluate")
|
||||
return repo
|
||||
|
||||
|
||||
def generate_nix_expression(repos: List[Repo]) -> str:
|
||||
expressions = []
|
||||
for repo in repos:
|
||||
expressions.append(repo.nix_expression())
|
||||
|
||||
joined = "\n\n".join(expressions)
|
||||
|
||||
return f"""
|
||||
{{ pkgs ? import <nixpkgs> {{}} }}:
|
||||
let
|
||||
inherit (pkgs) fetchgit fetchFromGitHub callPackages;
|
||||
in {{
|
||||
repos = {{
|
||||
{joined}
|
||||
}};
|
||||
}}
|
||||
"""
|
||||
|
||||
|
||||
def update_lock_file(repos: List[Repo]):
|
||||
locked_repos = {}
|
||||
for repo in repos:
|
||||
locked_repos[repo.url.geturl()] = dict(rev=repo.rev, sha256=repo.sha256)
|
||||
locked_repos[repo.name] = dict(
|
||||
rev=repo.rev, sha256=repo.sha256, url=repo.url.geturl())
|
||||
|
||||
tmp_file = str(LOCK_PATH) + "-new"
|
||||
with open(tmp_file, "w") as lock_file:
|
||||
|
|
@ -191,7 +158,9 @@ def main() -> None:
|
|||
|
||||
for name, repo in manifest["repos"].items():
|
||||
url = urlparse(repo["url"])
|
||||
repo_json = lock_manifest["repos"].get(url.geturl(), None)
|
||||
repo_json = lock_manifest["repos"].get(name, None)
|
||||
if repo_json and repo_json["url"] != url.geturl():
|
||||
repo_json = None
|
||||
locked_repo = None
|
||||
if repo_json is not None:
|
||||
locked_repo = Repo(
|
||||
|
|
@ -208,15 +177,8 @@ def main() -> None:
|
|||
if locked_repo:
|
||||
repos.append(locked_repo)
|
||||
|
||||
default_nix_temp = str(MANIFEST_PATH) + "-new"
|
||||
with open(default_nix_temp, "w") as f:
|
||||
f.write(generate_nix_expression(repos))
|
||||
|
||||
shutil.move(default_nix_temp, ROOT.joinpath("default.nix"))
|
||||
|
||||
update_lock_file(repos)
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
|
|
|||
|
|
@ -1,8 +1,9 @@
|
|||
{
|
||||
"repos": {
|
||||
"https://github.com/Mic92/nur-packages": {
|
||||
"rev": "8d61d40bf8e17555e81eeabfa7e5d4ac6e01ac37",
|
||||
"sha256": "1sk41q80z6rzrnnzbpkj9jmr9qcsxvh92q7v1jl60f5ms4q0ipx2"
|
||||
"mic92": {
|
||||
"rev": "cb5d8ace477bafa013b8f4a764b622ca606fa40e",
|
||||
"sha256": "0il7pg1xxk1m2pd8z911amnnlqibh52qbgyfzb51g680la5x4pma",
|
||||
"url": "https://github.com/Mic92/nur-packages"
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue