#!/usr/bin/python import os, subprocess, tempfile, shutil, sys, gzip def get_archive_map(archive_root): """Generate a archive map from a Debian-style package archive directory. return: mapping: package -> release -> (component, version) """ map = {} currpkg = None currversion = None for release in os.listdir(archive_root + "/dists"): for comp in os.listdir(archive_root + "/dists/" + release): compdir = archive_root + "/dists/" + release + "/" + comp if not os.path.isdir(compdir): continue srcfile = compdir + "/binary-i386/Packages.gz" for line in gzip.open(srcfile): line = line.strip() if not line: if (not currpkg) or (not currversion): print >> sys.stderr, "Error: end of package record without all data available" sys.exit(1) map.setdefault(currpkg, {})[release] = (comp, currversion) currpkg = None currversion = None continue attr = line.split(":", 1) if len(attr) < 2: continue if attr[0] == "Package": if currpkg: print >> sys.stderr, "Error: read two Packages: lines in a row" sys.exit(1) currpkg = attr[1].strip() if attr[0] == "Version": if currversion: print >> sys.stderr, "Error: read two Version: lines in a row" sys.exit(1) currversion = attr[1].strip() # remove epochs colpos = currversion.find(':') if colpos >= 0: currversion = currversion[colpos+1:] return map def get_desktop_files(deb): dpkg = subprocess.Popen(['dpkg', '-c', deb], stdout=subprocess.PIPE) files = [f.split()[-1] for f in dpkg.stdout if os.path.splitext(f.strip())[1] in ['.desktop', '.directory', '.server'] and f.startswith('-')] if dpkg.wait() == 0: return files else: print >> sys.stderr, 'Invalid deb: %s' % deb return [] def server_file_has_domain(f): for line in open(f): if line.find('ubuntu-gettext-domain="') > 0: return True return False def gkey_file_has_domain(f): for line in open(f): if line.startswith('X-Ubuntu-Gettext-Domain') > 0: return True return False def file_has_domain(f): if f.endswith('.server'): return server_file_has_domain(f) else: return gkey_file_has_domain(f) archive_map = get_archive_map("/srv/archive.ubuntu.com/ubuntu") distroversion = 'dapper' td = tempfile.mkdtemp() try: for path, dirs, files in os.walk('.'): for f in files: if not f.endswith('.deb') or f.endswith('_amd64.deb') or \ f.endswith('_powerpc.deb') or f.startswith('gnome-app-install'): continue (pkg, version, suffix) = f.split('_') if archive_map.get(pkg, {}).get(distroversion, [None, ''])[1] != version: continue pathname = os.path.join(path,f) files = get_desktop_files(pathname) if files: dir = os.path.join(td, f) os.mkdir(dir) assert subprocess.call(['dpkg', '-x', pathname, dir]) == 0 for f in files: if not file_has_domain(os.path.join(dir, f)): print pathname, f shutil.rmtree(dir) finally: if td: shutil.rmtree(td)