Skip to content

Instantly share code, notes, and snippets.

@eternnoir
Created August 27, 2013 00:12
Show Gist options
  • Save eternnoir/6348241 to your computer and use it in GitHub Desktop.
Save eternnoir/6348241 to your computer and use it in GitHub Desktop.
Atchlinux find biggest pkg
#!/usr/bin/env python
#
# bigpkg : find packages that require a lot of space on your system
# v0.4.0 (2011-07-29)
#
# Copyright (c) 2009-2011 by Allan McRae <allan@archlinux.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Credits: Allan McRae for the initial script. markbabc and Karol for contributions
#
import os, re
LOCAL_DB_PATH="/var/lib/pacman/local"
def adjust_space(pkg, size):
size_l = len(size)
spaces = (16-size_l)*" "
return "{0}:{1}{2}".format(size, spaces, pkg)
def find_pkg_size(size, options=["KB", "MB", "GB"], count=0):
if size >= 1024:
count += 1
return find_pkg_size(size/1024, options, count)
else:
if count == 0: return "{0:7,} {1}".format(size, options[count])
else: return "{0:7,.2f} {1}".format(size, options[count])
def strip_versioning(pkg):
r = re.compile('[^=,^<,^>]+')
m = r.match(pkg)
return m.group()
def parse_package_info(pkg, dir):
pkg_deps[pkg] = []
pkg_provides[pkg] = []
pkg_size[pkg] = 0
file = LOCAL_DB_PATH + "/" + dir + "/desc"
f = open(file, "r")
while 1:
line = f.readline();
if len(line) == 0:
break
if line[0:9] == "%DEPENDS%":
while 1:
line = f.readline();
if len(line) == 1:
break
pkg_deps[pkg].append(strip_versioning(line.strip()))
if line[0:10] == "%PROVIDES%":
while 1:
line = f.readline();
if len(line) == 1:
break
pkg_provides[pkg].append(strip_versioning(line.strip()))
if line[0:6] == "%SIZE%":
line = f.readline();
pkg_size[pkg] = int(line)/1024
f.close()
pkg_list = []
pkg_deps = {}
pkg_provides = {}
pkg_size = {}
for dir in os.listdir(LOCAL_DB_PATH):
pkg = dir[0:dir.rfind("-",0,dir.rfind("-"))]
pkg_list.append(pkg)
parse_package_info(pkg, dir)
pkg_deptree = {}
for pkg in pkg_list:
pkg_deptree[pkg] = pkg_deps[pkg]
for dep in pkg_deptree[pkg]:
if dep in pkg_deps:
for rdep in pkg_deps[dep]:
if not rdep in pkg_deptree[pkg]:
pkg_deptree[pkg].append(rdep);
else:
for key in pkg_provides:
if dep in pkg_provides[key]:
pkg_deptree[pkg][pkg_deptree[pkg].index(dep)] = key
dep = key
break
for rdep in pkg_deps[dep]:
if not rdep in pkg_deptree[pkg]:
pkg_deptree[pkg].append(rdep);
needed_by = {}
for pkg in pkg_list:
needed_by[pkg] = 0
for pkg in pkg_list:
for dep in pkg_deptree[pkg]:
needed_by[dep] += 1
pkg_usage = {}
for pkg in pkg_list:
if needed_by[pkg] == 0:
pkg_usage[pkg] = pkg_size[pkg]
for dep in pkg_deps[pkg]:
pkg_usage[pkg] += pkg_size[dep] / needed_by[dep]
pkg_usage = [ [v[1],v[0]] for v in pkg_usage.items()]
pkg_usage.sort()
print(" SIZE PKG")
for pkg in range(len(pkg_usage)):
print("{0}".format(adjust_space(pkg_usage[pkg][1], find_pkg_size(round(pkg_usage[pkg][0])))))
print(" SIZE PKG")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment