generate default.nix from lock file

This commit is contained in:
Jörg Thalheim 2018-06-29 12:14:48 +01:00
parent c183b44f4d
commit 351bfefbc3
3 changed files with 37 additions and 61 deletions

View file

@ -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;
}

View file

@ -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()

View file

@ -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"
}
}
}