Files
home-manager/lib/python/check-duplicate-maintainers.py
Austin Horstman fea021792d treefmt: format Python with ruff
Add ruff to the tree formatter so Python sources are kept consistently
formatted by 'nix fmt' and the CI format check. Test fixtures under
tests/modules are excluded since some are intentionally invalid Python.
Reformats the existing lib/python and tests scripts accordingly.
2026-06-19 10:00:25 -05:00

85 lines
2.6 KiB
Python
Executable File

#! /usr/bin/env nix-shell
#! nix-shell -i python3 -p python3
"""
Check for duplicate maintainers between home-manager and nixpkgs
This script compares the maintainers in home-manager with those in nixpkgs
to identify duplicates that should be removed from home-manager.
"""
import json
import subprocess
import sys
from pathlib import Path
def main():
print("🔍 Checking for duplicate maintainers between HM and nixpkgs...")
# Get home-manager maintainers
hm_result = subprocess.run(
["nix", "eval", "--file", "modules/lib/maintainers.nix", "--json"],
capture_output=True,
text=True,
check=True,
)
hm_maintainers = json.loads(hm_result.stdout)
hm_github_users = set()
for name, data in hm_maintainers.items():
if "github" in data:
hm_github_users.add(data["github"])
# Read nixpkgs revision from flake.lock to ensure consistency between local and CI
flake_lock_path = Path("flake.lock")
with open(flake_lock_path, "r") as f:
flake_lock = json.load(f)
nixpkgs_rev = flake_lock["nodes"]["nixpkgs"]["locked"]["rev"]
print(f"📌 Using nixpkgs from flake.lock: {nixpkgs_rev[:7]}")
# Get nixpkgs maintainers from the locked revision
nixpkgs_result = subprocess.run(
[
"nix",
"eval",
f"github:NixOS/nixpkgs/{nixpkgs_rev}#lib.maintainers",
"--json",
],
capture_output=True,
text=True,
check=True,
)
nixpkgs_maintainers = json.loads(nixpkgs_result.stdout)
nixpkgs_github_users = set()
for name, data in nixpkgs_maintainers.items():
if isinstance(data, dict) and "github" in data:
nixpkgs_github_users.add(data["github"])
# Find duplicates
duplicates = hm_github_users.intersection(nixpkgs_github_users)
if duplicates:
print(
f"❌ Found {len(duplicates)} duplicate maintainers between HM and nixpkgs:"
)
for github_user in sorted(duplicates):
# Find the HM attribute name for this github user
hm_attr = None
for attr_name, data in hm_maintainers.items():
if data.get("github") == github_user:
hm_attr = attr_name
break
print(f" - {github_user} (HM attribute: {hm_attr})")
print()
print(
"These maintainers should be removed from HM maintainers file to avoid duplication."
)
print("They can be referenced directly from nixpkgs instead.")
sys.exit(1)
else:
print("✅ No duplicate maintainers found")
if __name__ == "__main__":
main()