diff --git a/nix_update/__init__.py b/nix_update/__init__.py index 89bbe45..93f9322 100644 --- a/nix_update/__init__.py +++ b/nix_update/__init__.py @@ -124,6 +124,12 @@ def parse_args(args: list[str]) -> Options: default=[], ) + parser.add_argument( + "--src-attr", + help="Src attribute", + default="src", + ) + a = parser.parse_args(args) extra_flags = ["--extra-experimental-features", "flakes nix-command"] if a.system: @@ -146,6 +152,7 @@ def parse_args(args: list[str]) -> Options: version=a.version, version_preference=VersionPreference.from_str(a.version), attribute=a.attribute, + source_attribute=a.src_attr, test=a.test, version_regex=a.version_regex, review=a.review, diff --git a/nix_update/eval.py b/nix_update/eval.py index 1767056..f85ea69 100644 --- a/nix_update/eval.py +++ b/nix_update/eval.py @@ -105,12 +105,19 @@ class Package: def eval_expression( escaped_import_path: str, attr: str, + source_attr: str, flake: bool, system: str | None, override_filename: str | None, ) -> str: system = f'"{system}"' if system else "builtins.currentSystem" + source_attrs = source_attr.rpartition(".") + source_attr_last = source_attrs[-1] or source_attr + source_attr_all_but_last = ( + f".{source_attrs[0]}" if source_attr_last != source_attr else "" + ) + if flake: sanitize_position = ( f""" @@ -164,8 +171,8 @@ let raw_version_position else if pkg ? isPhpExtension then raw_version_position - else if (builtins.unsafeGetAttrPos "src" pkg) != null then - sanitizePosition (builtins.unsafeGetAttrPos "src" pkg) + else if (builtins.unsafeGetAttrPos "{source_attr_last}" pkg) != null then + sanitizePosition (builtins.unsafeGetAttrPos "{source_attr_last}" pkg{source_attr_all_but_last}) else sanitizePosition (positionFromMeta pkg); in {{ @@ -174,11 +181,11 @@ in {{ inherit raw_version_position; filename = position.file; line = position.line; - urls = pkg.src.urls or null; - url = pkg.src.url or null; - rev = pkg.src.rev or null; - tag = pkg.src.tag or null; - hash = pkg.src.outputHash or null; + urls = pkg.{source_attr}.urls or null; + url = pkg.{source_attr}.url or null; + rev = pkg.{source_attr}.rev or null; + tag = pkg.{source_attr}.tag or null; + hash = pkg.{source_attr}.outputHash or null; go_modules = pkg.goModules.outputHash or null; go_modules_old = pkg.go-modules.outputHash or null; cargo_deps = pkg.cargoDeps.outputHash or null; @@ -205,7 +212,7 @@ in {{ mix_deps = pkg.mixFodDeps.outputHash or null; tests = builtins.attrNames (pkg.passthru.tests or {{}}); has_update_script = {has_update_script}; - src_homepage = pkg.src.meta.homepage or null; + src_homepage = pkg.{source_attr}.meta.homepage or null; changelog = pkg.meta.changelog or null; maintainers = pkg.meta.maintainers or null; }}""" @@ -215,6 +222,7 @@ def eval_attr(opts: Options) -> Package: expr = eval_expression( opts.escaped_import_path, opts.escaped_attribute, + opts.source_attribute, opts.flake, opts.system, opts.override_filename, diff --git a/nix_update/options.py b/nix_update/options.py index 2d07b77..ab5c305 100644 --- a/nix_update/options.py +++ b/nix_update/options.py @@ -8,6 +8,7 @@ from .version.version import VersionPreference @dataclass class Options: attribute: str + source_attribute: str = "src" flake: bool = False version: str = "stable" version_preference: VersionPreference = VersionPreference.STABLE @@ -33,4 +34,7 @@ class Options: def __post_init__(self) -> None: self.escaped_attribute = ".".join(map(json.dumps, self.attribute.split("."))) + self.escaped_source_attribute = ".".join( + map(json.dumps, self.source_attribute.split(".")) + ) self.escaped_import_path = json.dumps(self.import_path) diff --git a/nix_update/update.py b/nix_update/update.py index 82b7bc5..464bf3d 100644 --- a/nix_update/update.py +++ b/nix_update/update.py @@ -155,7 +155,7 @@ def git_prefetch(x: tuple[str, tuple[str, str]]) -> tuple[str, str]: def update_src_hash(opts: Options, filename: str, current_hash: str) -> None: - target_hash = nix_prefetch(opts, "src") + target_hash = nix_prefetch(opts, opts.source_attribute) replace_hash(filename, current_hash, target_hash)