This nightmare compares files changed, attrs changed, and pings maintainers
This commit is contained in:
parent
040c33717c
commit
8333409bd0
146
maintainers.sh
Executable file
146
maintainers.sh
Executable file
|
@ -0,0 +1,146 @@
|
|||
#!/usr/bin/env nix-shell
|
||||
#!nix-shell -i bash -p jq -p curl
|
||||
|
||||
set -euxo pipefail
|
||||
|
||||
statuses_url=$(curl --fail -L "https://api.github.com/repos/nixos/nixpkgs/pulls/$1" \
|
||||
| jq -r .statuses_url)
|
||||
|
||||
changed_url=$(curl --fail -L "$statuses_url" \
|
||||
| jq -r '.[] | select (.state == "success" and .description == "^.^!" and .target_url != "") | .target_url' | head -n1 \
|
||||
| sed -e 's#gist.github.com#api.github.com/gists#' \
|
||||
)
|
||||
changed_text_url=$(curl --fail -L "$changed_url" \
|
||||
| jq -r '.files."Changed Paths".raw_url')
|
||||
|
||||
if [ "x$changed_url" == "x" ]; then
|
||||
echo "Nothing changed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
(
|
||||
cat <<EOF
|
||||
let
|
||||
pkgs = import ./default.nix {};
|
||||
|
||||
EOF
|
||||
echo 'changedattrs = ['
|
||||
curl --fail -L "$changed_text_url" \
|
||||
| cut -f2 \
|
||||
| sort | uniq \
|
||||
| sed -e 's/\./" "/g' | sed -e 's/^/[ "/' | sed -e 's/$/" ]/'
|
||||
echo '];
|
||||
|
||||
changedpaths = ['
|
||||
|
||||
curl --fail -L "https://github.com/NixOS/nixpkgs/pull/$1.patch" \
|
||||
| grep "^+++ b/" | sed -e "s/^+++ b//" \
|
||||
| sed -e 's/^/"/' | sed -e 's/$/"/' \
|
||||
| sort | uniq
|
||||
|
||||
echo '];'
|
||||
|
||||
cat <<'EOF'
|
||||
|
||||
anyMatchingFile = filename:
|
||||
let
|
||||
matching = builtins.filter
|
||||
(changed: pkgs.lib.strings.hasSuffix changed filename)
|
||||
changedpaths;
|
||||
in (builtins.length matching) > 0;
|
||||
|
||||
anyMatchingFiles = files:
|
||||
(builtins.length (builtins.filter anyMatchingFile files)) > 0;
|
||||
|
||||
enrichedAttrs = builtins.map
|
||||
(path: {
|
||||
path = path;
|
||||
name = "pkgs.${builtins.concatStringsSep "." path}";
|
||||
})
|
||||
changedattrs;
|
||||
|
||||
validPackageAttributes = builtins.filter
|
||||
(pkg:
|
||||
if (pkgs.lib.attrsets.hasAttrByPath pkg.path pkgs) then
|
||||
(if (builtins.tryEval (pkgs.lib.attrsets.attrByPath pkg.path null pkgs)).success
|
||||
then true
|
||||
else builtins.trace "Failed to access ${pkg.name} even though it exists" false)
|
||||
else builtins.trace "Failed to locate ${pkg.name}." false
|
||||
)
|
||||
enrichedAttrs;
|
||||
|
||||
attrsWithPackages = builtins.map
|
||||
(pkg: pkg // { package = pkgs.lib.attrsets.attrByPath pkg.path null pkgs; })
|
||||
validPackageAttributes;
|
||||
|
||||
attrsWithMaintainers = builtins.map
|
||||
(pkg: pkg // { maintainers = (pkg.package.meta or {}).maintainers or []; })
|
||||
attrsWithPackages;
|
||||
|
||||
attrsWeCanPing = builtins.filter
|
||||
(pkg: if (builtins.length pkg.maintainers) > 0
|
||||
then true
|
||||
else builtins.trace "Package has no maintainers: ${pkg.name}" false
|
||||
)
|
||||
attrsWithMaintainers;
|
||||
|
||||
relevantFilenames = drv:
|
||||
(pkgs.lib.lists.unique
|
||||
(builtins.map
|
||||
(pos: pos.file)
|
||||
(builtins.filter (x: x != null)
|
||||
[
|
||||
(builtins.unsafeGetAttrPos "maintainers" (drv.meta or {}))
|
||||
(builtins.unsafeGetAttrPos "src" drv)
|
||||
# broken because name is always set in stdenv:
|
||||
# # A hack to make `nix-env -qa` and `nix search` ignore broken packages.
|
||||
# # TODO(@oxij): remove this assert when something like NixOS/nix#1771 gets merged into nix.
|
||||
# name = assert validity.handled; name + lib.optionalString
|
||||
#(builtins.unsafeGetAttrPos "name" drv)
|
||||
(builtins.unsafeGetAttrPos "pname" drv)
|
||||
(builtins.unsafeGetAttrPos "version" drv)
|
||||
]
|
||||
)));
|
||||
|
||||
attrsWithFilenames = builtins.map
|
||||
(pkg: pkg // { filenames = relevantFilenames pkg.package; })
|
||||
attrsWithMaintainers;
|
||||
|
||||
attrsWithModifiedFiles = builtins.filter
|
||||
(pkg: anyMatchingFiles pkg.filenames)
|
||||
attrsWithFilenames;
|
||||
|
||||
listToPing = pkgs.lib.lists.flatten
|
||||
(builtins.map
|
||||
(pkg:
|
||||
builtins.map
|
||||
(maintainer: {
|
||||
handle = maintainer.github;
|
||||
packageName = pkg.name;
|
||||
dueToFiles = pkg.filenames;
|
||||
})
|
||||
pkg.maintainers
|
||||
)
|
||||
attrsWithModifiedFiles);
|
||||
|
||||
byMaintainer = pkgs.lib.lists.foldr
|
||||
(ping: collector: collector // { "${ping.handle}" = [ { inherit (ping) packageName dueToFiles; } ] ++ (collector."${ping.handle}" or []); })
|
||||
{}
|
||||
listToPing;
|
||||
|
||||
textForPackages = packages:
|
||||
pkgs.lib.strings.concatStringsSep ", " (
|
||||
builtins.map
|
||||
(pkg: pkg.packageName)
|
||||
packages);
|
||||
|
||||
textPerMaintainer = pkgs.lib.attrsets.mapAttrs
|
||||
(maintainer: packages: "- @${maintainer} for ${textForPackages packages}")
|
||||
byMaintainer;
|
||||
|
||||
text = pkgs.lib.strings.concatStringsSep "\n" (builtins.attrValues textPerMaintainer);
|
||||
in builtins.trace text ""
|
||||
EOF
|
||||
) > data.nix
|
||||
|
||||
nix-instantiate --eval ./data.nix
|
Loading…
Reference in a new issue