mirror of
https://github.com/nix-community/nixvim.git
synced 2025-11-08 19:46:06 +01:00
91 lines
2.7 KiB
Python
Executable file
91 lines
2.7 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
"""
|
|
Extract maintainers from changed plugin files.
|
|
|
|
This script extracts the maintainer extraction logic from the tag-maintainers workflow
|
|
for easier testing and validation.
|
|
"""
|
|
|
|
import argparse
|
|
import json
|
|
import subprocess
|
|
import sys
|
|
from pathlib import Path
|
|
from typing import List
|
|
|
|
|
|
def run_nix_eval(file: str, *args: str) -> str:
|
|
"""Run a Nix evaluation expression and return the result."""
|
|
try:
|
|
result = subprocess.run(
|
|
["nix-instantiate", "--eval", "--strict", "--json", file] + list(args),
|
|
capture_output=True,
|
|
text=True,
|
|
check=True,
|
|
)
|
|
return result.stdout.strip()
|
|
except subprocess.CalledProcessError as e:
|
|
print(f"Error running Nix evaluation: {e}", file=sys.stderr)
|
|
print(f"Stderr: {e.stderr}", file=sys.stderr)
|
|
sys.exit()
|
|
|
|
|
|
def extract_maintainers(changed_files: List[str], pr_author: str) -> List[str]:
|
|
"""Extract maintainers from changed plugin files."""
|
|
if not changed_files:
|
|
print("No plugin files changed. No maintainers to tag.", file=sys.stderr)
|
|
return []
|
|
|
|
print("Finding maintainers for changed files...", file=sys.stderr)
|
|
|
|
file = Path(__file__).parent / "extract-maintainers.nix"
|
|
result = run_nix_eval(
|
|
file, "--argstr", "changedFilesJson", json.dumps(changed_files)
|
|
)
|
|
|
|
try:
|
|
maintainers = json.loads(result)
|
|
except json.JSONDecodeError:
|
|
print(f"Error parsing Nix evaluation result: {result}", file=sys.stderr)
|
|
return []
|
|
|
|
filtered_maintainers = [m for m in maintainers if m != pr_author]
|
|
|
|
if not filtered_maintainers:
|
|
print(
|
|
"No maintainers found for changed files (or only the PR author is a maintainer).",
|
|
file=sys.stderr,
|
|
)
|
|
return []
|
|
else:
|
|
print(
|
|
f"Found maintainers to notify: {' '.join(filtered_maintainers)}",
|
|
file=sys.stderr,
|
|
)
|
|
return filtered_maintainers
|
|
|
|
|
|
def main() -> None:
|
|
"""Main function to handle command line arguments and run the extraction."""
|
|
parser = argparse.ArgumentParser(
|
|
description="Extract maintainers from changed plugin files"
|
|
)
|
|
parser.add_argument(
|
|
"--changed-files",
|
|
help="Newline-separated list of changed files",
|
|
default="",
|
|
)
|
|
parser.add_argument(
|
|
"--pr-author",
|
|
required=True,
|
|
help="GitHub username of the PR author",
|
|
)
|
|
|
|
args = parser.parse_args()
|
|
changed_files = [f.strip() for f in args.changed_files.split("\n") if f.strip()]
|
|
maintainers = extract_maintainers(changed_files, args.pr_author)
|
|
print(" ".join(maintainers))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|