Skip to content

Commit 511c89f

Browse files
committed
feat: add section for still failing packages to report
1 parent e30df63 commit 511c89f

File tree

4 files changed

+94
-2
lines changed

4 files changed

+94
-2
lines changed

.github/workflows/review.yml

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ jobs:
7878
runs-on: ubuntu-latest
7979
outputs:
8080
pr: ${{ steps.pr.outputs.pr }}
81+
base: ${{ steps.pr.outputs.base }}
82+
base_ref: ${{ steps.pr.outputs.base_ref }}
8183
head: ${{ steps.pr.outputs.head }}
8284
merge: ${{ steps.pr.outputs.merge }}
8385
author_id: ${{ steps.pr.outputs.author_id }}
@@ -98,6 +100,8 @@ jobs:
98100
exit 1
99101
fi
100102
echo "pr=$pr" >> "$GITHUB_OUTPUT"
103+
echo "base=$(jq -r '.base.sha' <<< "$pr")" >> "$GITHUB_OUTPUT"
104+
echo "base_ref=$(jq -r '.base.ref' <<< "$pr")" >> "$GITHUB_OUTPUT"
101105
echo "head=$(jq -r '.head.sha' <<< "$pr")" >> "$GITHUB_OUTPUT"
102106
echo "merge=$(jq -r '.merge_commit_sha' <<< "$pr")" >> "$GITHUB_OUTPUT"
103107
echo "author_id=$(jq -r '.user.id' <<< "$pr")" >> "$GITHUB_OUTPUT"
@@ -132,6 +136,7 @@ jobs:
132136
.github/actions
133137
flake.lock
134138
flake.nix
139+
generate_markdown_report.py
135140
136141
- name: setup nix
137142
uses: ./.github/actions/setup-nix
@@ -147,7 +152,7 @@ jobs:
147152

148153
- name: install packages
149154
run: |
150-
pkgs=(coreutils nixpkgs-review jq gnused)
155+
pkgs=(coreutils moreutils nixpkgs-review jq gnused generate-markdown-report)
151156
if [[ ${{ inputs.push-to-cache && vars.ATTIC_SERVER != '' && vars.ATTIC_CACHE != '' }} = true ]]; then
152157
pkgs+=(attic-client)
153158
elif [[ ${{ inputs.push-to-cache && vars.CACHIX_CACHE != '' }} = true ]]; then
@@ -173,11 +178,38 @@ jobs:
173178
--build-args="-L" \
174179
--pr-json="$PR_JSON" \
175180
$EXTRA_ARGS
181+
182+
report_json=~/.cache/nixpkgs-review/pr-${PR_NUMBER}/report.json
183+
report_md=~/.cache/nixpkgs-review/pr-${PR_NUMBER}/report.md
184+
if failed=$(jq -er '.result[].failed[]' "$report_json"); then
185+
git fetch origin "$BASE" && git switch -d "$BASE"
186+
build=()
187+
paths=()
188+
for pkg in $failed; do
189+
[[ "$(nix eval --impure --expr "import ./. {} ? ${pkg}")" = "true" ]] || continue
190+
path=$(nix eval -f. "${pkg}.outPath" --raw) || continue
191+
build+=("$pkg")
192+
paths+=("$path")
193+
done
194+
195+
if [[ ${#build[@]} -ne 0 ]]; then
196+
nix build --keep-going -L -f. ${build[@]} || true
197+
fi
198+
199+
for i in ${!build[@]}; do
200+
! nix store verify --no-contents --no-trust "${paths[i]}" || continue
201+
jq '.result[].failed -= [$pkg] | .result[].still_failing += [$pkg]' --arg pkg "${build[i]}" "$report_json" | sponge "$report_json"
202+
done
203+
fi
204+
205+
generate-markdown-report "$report_json" "$report_md" "$BASE_REF" | sponge "$report_md"
176206
working-directory: nixpkgs
177207
env:
178208
GITHUB_TOKEN: ${{ github.token }}
179209
EXTRA_ARGS: ${{ inputs.extra-args }}
180210
PR_JSON: ${{ needs.prepare.outputs.pr }}
211+
BASE: ${{ needs.prepare.outputs.base }}
212+
BASE_REF: ${{ needs.prepare.outputs.base_ref }}
181213

182214
- name: push results to cache
183215
if: ${{ inputs.push-to-cache && ((vars.ATTIC_SERVER != '' && vars.ATTIC_CACHE != '') || vars.CACHIX_CACHE != '') }}
@@ -309,7 +341,7 @@ jobs:
309341
done
310342
311343
cat report.md
312-
echo success=$(jq -s 'all(.[].result[]; .failed==[])' report_*.json) >> "$GITHUB_OUTPUT"
344+
echo success=$(jq -s 'all(.[].result[]; (.failed+.still_failing)==[])' report_*.json) >> "$GITHUB_OUTPUT"
313345
sed '1s|$| for [#'"$PR_NUMBER"'](https://github.com/NixOS/nixpkgs/pull/'"$PR_NUMBER"')|' report.md >> $GITHUB_STEP_SUMMARY
314346
env:
315347
HEAD: ${{ needs.prepare.outputs.head }}

flake.nix

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,14 @@
2626
in
2727

2828
{
29+
packages = eachSystem (pkgs: {
30+
generate-markdown-report = pkgs.writers.writePython3Bin "generate-markdown-report" {
31+
flakeIgnore = [
32+
"E501" # line too long
33+
];
34+
} (builtins.readFile ./generate_markdown_report.py);
35+
});
36+
2937
overlays.nixpkgs-review = final: prev: {
3038
inherit (nixpkgs-review.packages.${final.stdenv.hostPlatform.system}) nixpkgs-review;
3139
};
@@ -44,6 +52,7 @@
4452

4553
checks = eachSystem (pkgs: {
4654
inherit (pkgs) nixpkgs-review;
55+
packages = pkgs.linkFarm "packages" self.packages.${pkgs.stdenv.hostPlatform.system};
4756
fmt = pkgs.runCommand "fmt-check" { } ''
4857
cp -r --no-preserve=mode ${self} repo
4958
${lib.getExe self.formatter.${pkgs.stdenv.hostPlatform.system}} -C repo --ci

generate_markdown_report.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import json
2+
import re
3+
import sys
4+
5+
with open(sys.argv[1]) as f:
6+
report_json = json.load(f)
7+
with open(sys.argv[2]) as f:
8+
report_md = f.read()
9+
base = sys.argv[3]
10+
11+
aliases = {m[1]: m[2].split(", ") for m in re.finditer(r"<li>([^ ]*) \((.*)\)</li>", report_md)}
12+
13+
14+
def html_pkgs_section(emoji: str, packages: list[str], msg: str, what: str = "package") -> str:
15+
if len(packages) == 0:
16+
return ""
17+
plural = "s" if len(packages) > 1 else ""
18+
res = "<details>\n"
19+
res += f" <summary>{emoji} {len(packages)} {what}{plural} {msg}:</summary>\n <ul>\n"
20+
for pkg in packages:
21+
if pkg in aliases:
22+
pkg += f" ({", ".join(aliases[pkg])})"
23+
res += f" <li>{pkg}</li>\n"
24+
res += " </ul>\n</details>\n"
25+
return res
26+
27+
28+
msg = ""
29+
for system, report in report_json["result"].items():
30+
msg += "\n---\n"
31+
msg += f"### `{system}`\n"
32+
msg += html_pkgs_section(":fast_forward:", report["broken"], "marked as broken and skipped")
33+
msg += html_pkgs_section(
34+
":fast_forward:", report["non-existent"], "present in ofBorgs evaluation, but not found in the checkout"
35+
)
36+
msg += html_pkgs_section(":fast_forward:", report["blacklisted"], "blacklisted")
37+
msg += html_pkgs_section(":x:", report["failed"], "failed to build")
38+
msg += html_pkgs_section(":x:", report.get("still_failing", []), f"still failing to build (also failed on {base})")
39+
msg += html_pkgs_section(":white_check_mark:", report["tests"], "built", what="test")
40+
msg += html_pkgs_section(":white_check_mark:", report["built"], "built")
41+
42+
print(msg, end="")

treefmt.nix

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,15 @@
1111
"LICENSE"
1212
];
1313

14+
formatter.black = {
15+
command = lib.getExe pkgs.black;
16+
includes = [ "*.py" ];
17+
options = [
18+
"--line-length=120"
19+
"--skip-magic-trailing-comma"
20+
];
21+
};
22+
1423
formatter.nixfmt = {
1524
command = lib.getExe pkgs.nixfmt;
1625
includes = [ "*.nix" ];

0 commit comments

Comments
 (0)