From 351bfefbc3aac8392cd5c0faeaa9cbdfea942a0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Thalheim?= Date: Fri, 29 Jun 2018 12:14:48 +0100 Subject: [PATCH] generate default.nix from lock file --- default.nix | 31 +++++++++++++++++-------- nur/update.py | 60 +++++++++---------------------------------------- repos.json.lock | 7 +++--- 3 files changed, 37 insertions(+), 61 deletions(-) diff --git a/default.nix b/default.nix index 593162c5a..3ab8965af 100644 --- a/default.nix +++ b/default.nix @@ -1,14 +1,27 @@ { pkgs ? import {} }: 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; } diff --git a/nur/update.py b/nur/update.py index 05bb48aa4..ed9ec22ec 100755 --- a/nur/update.py +++ b/nur/update.py @@ -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 {{}} }}: -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() diff --git a/repos.json.lock b/repos.json.lock index 8dd8ba9c4..97c88f181 100644 --- a/repos.json.lock +++ b/repos.json.lock @@ -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" } } } \ No newline at end of file