]> code.delx.au - monosys/blob - bin/pacorphan
pacorphan improvements
[monosys] / bin / pacorphan
1 #!/usr/bin/python
2
3 import codecs
4 import subprocess
5 import os
6 import sys
7
8 PACORPHAN_PATH = os.path.expanduser("~/.pacorphan")
9
10 keep_pkg_list = []
11 mark_explicit_list = []
12 need_install_list = []
13 unneeded_pkg_list = []
14 installed_pkg_list = []
15 explicit_pkg_list = []
16
17 def strip_comment(line):
18 pos = line.find("#")
19 if pos >= 0:
20 line = line[:pos]
21 return line.strip()
22
23 for dirpath, dirnames, filenames in os.walk(PACORPHAN_PATH):
24 for filename in filenames:
25 if filename.startswith("."):
26 continue
27 filename = os.path.join(dirpath, filename)
28 for pkg in codecs.open(filename, "r", "utf-8"):
29 pkg = strip_comment(pkg)
30 if pkg in keep_pkg_list:
31 print("# Duplicate entry: " + pkg)
32 if pkg:
33 keep_pkg_list.append(pkg.strip())
34
35 for pkg in subprocess.check_output(["pacman", "-Qq"]).decode("utf-8").split():
36 installed_pkg_list.append(pkg.strip())
37
38 for pkg in subprocess.check_output(["pacman", "-Qtq"]).decode("utf-8").split():
39 unneeded_pkg_list.append(pkg.strip())
40
41 for pkg in subprocess.check_output(["pacman", "-Qeq"]).decode("utf-8").split():
42 explicit_pkg_list.append(pkg.strip())
43
44
45 for pkg in keep_pkg_list:
46 if pkg in unneeded_pkg_list:
47 unneeded_pkg_list.remove(pkg)
48
49 if pkg in explicit_pkg_list:
50 explicit_pkg_list.remove(pkg)
51 else:
52 if pkg in installed_pkg_list:
53 mark_explicit_list.append(pkg)
54 else:
55 need_install_list.append(pkg)
56
57
58 if unneeded_pkg_list:
59 print("# Found packages to remove")
60 print("sudo pacman -R " + " ".join(unneeded_pkg_list))
61 print()
62
63 if explicit_pkg_list:
64 print("# Found explicitly installed packages to keep")
65 print("echo " + " ".join(explicit_pkg_list) + " | tr ' ' '\\n' >> ~/.pacorphan/keep")
66 print()
67
68 if mark_explicit_list:
69 print("# Found packages which should be marked as explicitly installed")
70 print("sudo pacman -D --asexplicit " + " ".join(mark_explicit_list))
71 print()
72
73 if need_install_list:
74 print("# Found packages which should be installed")
75 print("sudo pacman -S " + " ".join(need_install_list))
76 print()
77