diff --git a/doc/stdenv/meta.chapter.md b/doc/stdenv/meta.chapter.md index 7f57eda791ea..cfcc5549e8d1 100644 --- a/doc/stdenv/meta.chapter.md +++ b/doc/stdenv/meta.chapter.md @@ -47,6 +47,10 @@ Release branch. Used to specify that a package is not going to receive updates t The package’s homepage. Example: `https://www.gnu.org/software/hello/manual/` +### `repository` {#var-meta-repository} + +A webpage where the package's source code can be viewed. `https` links are preferred if available. Automatically set to a default value if the package uses a `fetchFrom*` fetcher for its `src`. Example: `https://github.com/forthy42/gforth` + ### `downloadPage` {#var-meta-downloadPage} The page where a link to the current version can be found. Example: `https://ftp.gnu.org/gnu/hello/` diff --git a/pkgs/development/coq-modules/serapi/default.nix b/pkgs/development/coq-modules/serapi/default.nix index f48cce55d4dc..d993bbdf1020 100644 --- a/pkgs/development/coq-modules/serapi/default.nix +++ b/pkgs/development/coq-modules/serapi/default.nix @@ -71,7 +71,8 @@ in if version == "8.11.0+0.11.1" then version else builtins.replaceStrings [ "+" ] [ "." ] version }.tbz"; - sha256 = release."${version}".sha256; + # abort/syntax error will fail package set eval, but throw is "fine" + sha256 = release."${version}".sha256 or (throw "Unknown version '${version}'"); }; patches = diff --git a/pkgs/stdenv/generic/check-meta.nix b/pkgs/stdenv/generic/check-meta.nix index 63c853e3dc31..eb4482be7894 100644 --- a/pkgs/stdenv/generic/check-meta.nix +++ b/pkgs/stdenv/generic/check-meta.nix @@ -296,6 +296,10 @@ let str ]; downloadPage = str; + repository = union [ + (listOf str) + str + ]; changelog = union [ (listOf str) str @@ -444,7 +448,29 @@ let let outputs = attrs.outputs or [ "out" ]; in - { + optionalAttrs (attrs ? src.meta.homepage || attrs ? srcs && isList attrs.srcs && any (src: src ? meta.homepage) attrs.srcs) { + # should point to an http-browsable source tree, if available. + # fetchers like fetchFromGitHub set it automatically. + # this could be handled a lot easier if we nulled it instead + # of having it be undefined, but that wouldn't match the + # other attributes. + repository = let + getSrcs = attrs: + if attrs ? src + then + [ attrs.src ] + else + lib.filter (src: src ? meta.homepage) attrs.srcs; + getHomePages = srcs: map (src: src.meta.homepage) srcs; + unlist = list: + if lib.length list == 1 + then + lib.elemAt list 0 + else + list; + in + unlist (getHomePages (getSrcs attrs)); + } // { # `name` derivation attribute includes cross-compilation cruft, # is under assert, and is sanitized. # Let's have a clean always accessible version here.