~fishinthecalculator/guix-dev-tools

guix-dev-tools/src/build-dependents -rwxr-xr-x 1.3 KiB
6b219cc9Giacomo Leidi Release v0.5.10. a month ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/usr/bin/env python3

import os
import re
import subprocess
from argparse import ArgumentParser

def parse_args():
    parser = ArgumentParser()
    parser.add_argument('-p', '--packages', nargs='+', default=[], required=True)
    parser.add_argument('-e', '--excluded-packages', nargs='+', default=[])
    return parser.parse_args()

def guix(args):
    return subprocess.run(["guix_dev", *args], check=True, capture_output=True).stdout.decode()

def guix_build(args):
    return subprocess.run(["build", *args], check=True, capture_output=True).stdout.decode()

def guix_refresh(pkgs):
    refreshed = guix(["refresh", "--list-dependent", *pkgs]).strip().split("\n")
    dependents = re.sub("Building the following.*dependent packages are rebuilt: ", "", refreshed[-1])
    return dependents.strip().split(" ")

def filter_excluded(pkgs, excluded):
    filtered = set()
    for p in pkgs:
        if p.split("@")[0] in excluded:
            print(f"Excluding {p}")
            continue
        filtered.add(p)
    return filtered

def main():
    args = parse_args()
    excluded = set(args.excluded_packages)
    pkgs = set(args.packages)
    if pkgs:
        pkgs.update(guix_refresh(pkgs))
        pkgs = filter_excluded(pkgs, excluded)
        print(f"Building {' '.join(pkgs)}")
        os.execvp("build", args=["-k", "-K", *pkgs])

if __name__ == "__main__":
    main()