diff --git a/nixpkgs/nixpkgs.bzl b/nixpkgs/nixpkgs.bzl index 72df34dc2..c2d8005d3 100644 --- a/nixpkgs/nixpkgs.bzl +++ b/nixpkgs/nixpkgs.bzl @@ -167,21 +167,31 @@ _nixpkgs_package = repository_rule( ) def nixpkgs_package(*args, **kwargs): + invert_repositories(_nixpkgs_package, *args, **kwargs) + +def invert_dict(dict): + """Swap the keys and values of a dict − assuming that all values are + distinct + """ + return {value: key for (key, value) in dict.items()} + +def invert_repositories(f, *args, **kwargs): # Because of https://github.com/bazelbuild/bazel/issues/5356 we can't # directly pass a dict from strings to labels to the rule (which we'd like # for the `repositories` arguments), but we can pass a dict from labels to # strings. So we swap the keys and the values (assuming they all are # distinct). - if "repositories" in kwargs: - inversed_repositories = {value: key for (key, value) in kwargs["repositories"].items()} - kwargs.pop("repositories") - _nixpkgs_package( - repositories = inversed_repositories, - *args, - **kwargs - ) - else: - _nixpkgs_package(*args, **kwargs) + hasRepository = "repository" in kwargs and kwargs["repository"] != None + hasRepositories = "repositories" in kwargs and kwargs["repositories"] != None + if hasRepository and hasRepositories: + fail("Specify one of 'repository' or 'repositories' (but not both).") + if hasRepositories: + inversed_repositories = invert_dict(kwargs["repositories"]) + kwargs["repositories"] = inversed_repositories + if hasRepository: + repository = kwargs.pop("repository") + kwargs["repositories"] = { repository: "nixpkgs" } + f(*args, **kwargs) def nixpkgs_cc_autoconf_impl(repository_ctx): cpu_value = get_cpu_value(repository_ctx)