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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
#!/usr/bin/python
# Copyright 1999-2003 Gentoo Technologies, Inc.
# Distributed under the terms of the GNU General Public License v2
# $Header$
# Author: Leo Lipelis <aeoo@gentoo.org>
# Author: Karl Trygve Kalleberg <karltk@gentoo.org>
import commands
import re
import sys
import time
import os
# constants for package tuples that are stored in pkg_hash
PKG_TIME = 0 # number of seconds for ctime function
PKG = 1 # package full path as accepted by ebuild
PKG_NAME = 2 # package name as accepted by emerge
(status, pkg_files) = commands.getstatusoutput(
"find /var/db/pkg -iname '*.ebuild' -printf '%T@ %p\n' | sort -n")
pkg_file_list = pkg_files.splitlines()
pkg_hash = {}
for time_pkg_pair in pkg_file_list:
(pkg_time, pkg) = time_pkg_pair.split()
pkg_time = int(pkg_time)
# This covers developer trees with not-accepted categories
tmp_name = re.match(r'/var/db/pkg/(.*/.*)/.*', pkg)
if not tmp_name: continue
pkg_name = tmp_name.group(1)
tmp_core = re.match(r'(.*)-\d.*', pkg_name)
if not tmp_core: continue
pkg_core = tmp_core.group(1)
if pkg_hash.has_key(pkg_core):
pkg_hash[pkg_core].append((pkg_time, pkg, pkg_name))
else:
pkg_hash[pkg_core] = [(pkg_time, pkg, pkg_name)]
total_len = len(pkg_hash.keys())
curpkg = 0
tmpname = os.tmpnam()
assume_yes = 0
if len(sys.argv) > 1:
if sys.argv[1] in ["-y", "--yes"]:
assume_yes = 1
elif sys.argv[1] in ["-h", "--help"]:
print """pkg-clean [options]
-y, --yes Don't ask for individual confirmation before unmerging; assume yes.
"""
sys.exit(0)
for pkg_core in pkg_hash.keys():
print "Examining %s:" % (pkg_core)
if len(pkg_hash[pkg_core]) < 2:
continue
unmerged_indexes = []
curpkg += 1
choices = ""
idx = 1
for pkg_tuple in pkg_hash[pkg_core]:
choices += " %d \"%s %s\" 0" % \
(idx, time.ctime(pkg_tuple[PKG_TIME]),
pkg_tuple[PKG_NAME])
idx += 1
params = "dialog --separate-output --backtitle \"pkg-clean processing package %d of %d\" " % ( curpkg, total_len)
params += "--checklist \"Select which package(s) to unmerge\" 20 70 12" + choices
res = os.system(params + " 2> " + tmpname)
if res:
sys.exit(0)
ins = open(tmpname)
for j in ins.readlines():
idx = int(j)
if idx == 0:
break
full_path = pkg_hash[pkg_core][idx-1][PKG]
ebuild = full_path.replace("/var/db/pkg/", "")
if not assume_yes:
params = "dialog --backtitle \"" + ebuild + "\" " + \
"--yesno \"Are you sure you want to unmerge " + ebuild + " ?\" 20 70"
res = os.system(params)
else:
res = 0
if res == 0:
(status, unmerge_out) = commands.getstatusoutput(
"ebuild %s unmerge" % (full_path))
print unmerge_out
time.sleep(2)
if status != 0:
sys.exit(status)
ins.close()
|