92 lines
3.2 KiB
Nix
92 lines
3.2 KiB
Nix
{ pkgs }:
|
|
|
|
pkgs.stdenv.mkDerivation {
|
|
pname = "pkg_maintenance_check";
|
|
version = "1.0";
|
|
src = ./.;
|
|
buildPhase = ''
|
|
mkdir -p $out/bin
|
|
cat > $out/bin/checkupdates.py <<- EOF
|
|
import json
|
|
import subprocess
|
|
import requests
|
|
def get_packages_by_maintainer(target_maintainer):
|
|
try:
|
|
nix_env_command = [
|
|
"nix-env", "--meta", "--json", "-qaP"
|
|
]
|
|
jq_query = (
|
|
'to_entries[] | select(.value.meta.maintainers? // [] | '
|
|
f'any(.github == "{target_maintainer}")) | .value'
|
|
)
|
|
result = subprocess.run(
|
|
nix_env_command,
|
|
capture_output=True,
|
|
text=True,
|
|
check=True
|
|
)
|
|
filtered_packages = subprocess.run(
|
|
["jq", "-r", "-c", jq_query],
|
|
input=result.stdout,
|
|
capture_output=True,
|
|
text=True,
|
|
check=True
|
|
)
|
|
return [json.loads(pkg) for pkg in filtered_packages.stdout.strip().split('\n') if pkg]
|
|
except subprocess.CalledProcessError as e:
|
|
print(f"Error running nix-env or jq: {e}")
|
|
return []
|
|
|
|
def check_github_releases(maintained_packages):
|
|
github_api_template = "https://api.github.com/repos/{owner}/{repo}/releases/latest"
|
|
updates = []
|
|
|
|
for package in maintained_packages:
|
|
pname = package.get("pname", "unknown")
|
|
repo_url = package.get("meta", {}).get("homepage", "")
|
|
current_version = package.get("version", "unknown")
|
|
|
|
if "github.com" in repo_url:
|
|
owner_repo = repo_url.split("github.com/")[1].rstrip('/')
|
|
owner, repo = owner_repo.split('/')
|
|
api_url = github_api_template.format(owner=owner, repo=repo)
|
|
|
|
response = requests.get(api_url)
|
|
if response.status_code == 200:
|
|
latest_release = response.json()
|
|
latest_version = latest_release.get("tag_name", "").lstrip('v')
|
|
if latest_version and latest_version != current_version:
|
|
updates.append({"pkg": pname, "version": latest_version})
|
|
else:
|
|
print(f"{pname} is up to date.\n")
|
|
else:
|
|
print(f"Failed to check version for {pname} (HTTP {response.status_code}).\n")
|
|
else:
|
|
print(f"Skipping non-GitHub repository for {pname}.\n")
|
|
return updates
|
|
|
|
def notify_updates(updates):
|
|
if updates:
|
|
update_string = '\n'.join([f" {update['pkg']} -> {update['version']}" for update in updates])
|
|
subprocess.run([
|
|
"notify-send",
|
|
"--icon=/home/pagedmov/.sysflake/assets/images/nixos-icon-generic.png",
|
|
"Maintenance Update",
|
|
f"Package updates found:\n{update_string}"
|
|
])
|
|
subprocess.run(["aplay", "-q", "-N", "/home/pagedmov/.sysflake/assets/sound/login.wav"])
|
|
|
|
target_maintainer = "pagedMov"
|
|
maintained_packages = get_packages_by_maintainer(target_maintainer)
|
|
|
|
if maintained_packages:
|
|
updates = check_github_releases(maintained_packages)
|
|
notify_updates(updates)
|
|
else:
|
|
print(f"No packages maintained by {target_maintainer} were found.")
|
|
EOF
|
|
'';
|
|
buildInputs = with pkgs; [ python3Packages.requests jq ];
|
|
installPhase = ":";
|
|
}
|