summaryrefslogtreecommitdiff
path: root/trunk/src/pkg-clean
diff options
context:
space:
mode:
authorkarltk <karltk@gentoo.org>2002-08-11 00:29:04 +0000
committerkarltk <karltk@gentoo.org>2002-08-11 00:29:04 +0000
commit9c526f54968557dc7bcdd16e2619fd9f972818c3 (patch)
treeec5ae08d8226f8ff0b70576eaace97179ed15199 /trunk/src/pkg-clean
downloadgentoolkit-9c526f54968557dc7bcdd16e2619fd9f972818c3.tar.gz
Initial revision
svn path=/; revision=2
Diffstat (limited to 'trunk/src/pkg-clean')
-rw-r--r--trunk/src/pkg-clean/AUTHORS0
-rw-r--r--trunk/src/pkg-clean/ChangeLog0
-rw-r--r--trunk/src/pkg-clean/README0
-rw-r--r--trunk/src/pkg-clean/pkg-clean100
4 files changed, 100 insertions, 0 deletions
diff --git a/trunk/src/pkg-clean/AUTHORS b/trunk/src/pkg-clean/AUTHORS
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/trunk/src/pkg-clean/AUTHORS
diff --git a/trunk/src/pkg-clean/ChangeLog b/trunk/src/pkg-clean/ChangeLog
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/trunk/src/pkg-clean/ChangeLog
diff --git a/trunk/src/pkg-clean/README b/trunk/src/pkg-clean/README
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/trunk/src/pkg-clean/README
diff --git a/trunk/src/pkg-clean/pkg-clean b/trunk/src/pkg-clean/pkg-clean
new file mode 100644
index 0000000..e311f43
--- /dev/null
+++ b/trunk/src/pkg-clean/pkg-clean
@@ -0,0 +1,100 @@
+#!/usr/bin/python
+# vim: set ts=4 sw=4:
+# Copyright 2002 Gentoo Technologies, Inc.
+# Distributed under the terms of the GNU General Public License, v2 or later
+# Author: Leo Lipelis <aeoo@gentoo.org>
+# Author: Karl Trygve Kalleberg <karltk@gentoo.org>
+
+import commands
+import re
+import sys
+import string
+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 = string.atoi(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 = string.atoi(j)
+ if idx == 0:
+ break
+
+ full_path = pkg_hash[pkg_core][idx-1][PKG]
+ ebuild = string.replace(full_path, "/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()