diff --git a/nur/channel.py b/nur/channel.py index 05d545a23..f4db2b355 100644 --- a/nur/channel.py +++ b/nur/channel.py @@ -85,6 +85,14 @@ def remove_repo(repo: Repo, path: Path) -> None: commit_files([str(repo_path)], f"{repo.name}: remove") +def update_manifest(repos: List[Repo], path: Path) -> None: + d = {} + + for repo in repos: + d[repo.name] = repo.as_json() + write_json_file(dict(repos=d), path) + + def update_channel(path: Path) -> None: manifest = load_manifest(MANIFEST_PATH, LOCK_PATH) @@ -112,6 +120,8 @@ def update_channel(path: Path) -> None: for channel_repo in channel_repos.values(): remove_repo(channel_repo, path) + update_manifest(updated_repos, path.joinpath("repos.json")) + update_lock_file(updated_repos, path.joinpath("repos.json.lock")) diff --git a/nur/manifest.py b/nur/manifest.py index a8226cec2..43c5b2bf4 100644 --- a/nur/manifest.py +++ b/nur/manifest.py @@ -38,7 +38,7 @@ class RepoType(Enum): GIT = auto() @staticmethod - def from_repo(repo: "Repo", type_: str) -> "RepoType": + def from_repo(repo: "Repo", type_: Optional[str]) -> "RepoType": if repo.submodules: return RepoType.GIT if repo.url.hostname == "github.com": @@ -55,7 +55,7 @@ class Repo: name: str, url: Url, submodules: bool, - type_: str, + supplied_type: Optional[str], file_: Optional[str], locked_version: Optional[LockedVersion], ) -> None: @@ -75,11 +75,30 @@ class Repo: ): self.locked_version = locked_version - self.type = RepoType.from_repo(self, type_) + self.supplied_type = supplied_type + self.computed_type = RepoType.from_repo(self, supplied_type) + + @property + def type(self) -> RepoType: + return self.computed_type def __repr__(self) -> str: return f"<{self.__class__.__name__} {self.name}>" + def as_json(self) -> Dict[str, Any]: + d = dict(url=self.url.geturl()) # type: Dict[str, Any] + + if self.submodules: + d["submodules"] = self.submodules + + if self.supplied_type is not None: + d["type"] = self.supplied_type + + if self.file is not None and self.file != "default.nix": + d["file"] = self.file + + return d + class Manifest: def __init__(self, repos: List[Repo]) -> None: @@ -99,7 +118,8 @@ def _load_locked_versions(path: PathType) -> Dict[str, LockedVersion]: url = urlparse(repo["url"]) rev = repo["rev"] sha256 = repo["sha256"] - locked_versions[name] = LockedVersion(url, rev, sha256) + submodules = repo.get("submodules", False) + locked_versions[name] = LockedVersion(url, rev, sha256, submodules) return locked_versions