RemovingOldPackageVersions

#  GPL v2 code.
#  Original author: Radim Kolar <hsn/at/cybermail.net>
#  Home page: http://home.tiscali.cz/~cz210552/
#
#  Modifications by Craig Box & Perry Lorier
#
#  APT-SMARTCLEAN
#
#  This programs cleans APT package cache directory. Unlike apt-get autoclean,
#  it leaves in cache directory only last version of package even if this
#  package is no longer available for download. This is less aggressive
#  cleaning than autoclean does.
#
#  ARGUMENTS -s  ... dry run
#            dir1 dir2 .. dirX ... operate on these directories
#
#  Changelog
#
#    VERSION 1 - 18 Aug 2003 First version
#    VERSION 2 - 05 Oct 2006 Update for Ubuntu MOTU use.
#                Now takes directories to run on as command line parameters.

import os
import sys

def cleanaptcache(dryrun=0,dirs=('/var/cache/apt/archives/','/var/cache/apt/archives/partial/')):
    for dir in dirs:
       packages={} # versions
       fnames={}   # file names
       for file in os.listdir(dir):
          if file[-4:] != '.deb': continue
          parsed=file.split('_')
          if len(parsed) != 3: continue
          parsed[1]=parsed[1].replace('%3a',':')
          if parsed[0] in packages:
              print 'Found',parsed[0],parsed[1],'have',packages[parsed[0]]
              argz=['dpkg','--compare-versions',parsed[1],'lt',packages[parsed[0]]]
              rc=os.spawnvp(os.P_WAIT,'dpkg',argz)
              if rc==2: continue
              if rc==0:
                 print "Deleting",file
                 if not dryrun: os.unlink(dir+os.sep+file)
                 continue
              elif rc==1:
                 print "Deleting",fnames[parsed[0]]
                 if not dryrun: os.unlink(dir+os.sep+fnames[parsed[0]])

          packages[parsed[0]]=parsed[1]
          fnames[parsed[0]]=file


if __name__=="__main__":
        #working dpkg test
        sys.stdout.write("Running on Debian-")
        sys.stdout.flush()
        rc=os.spawnlp(os.P_WAIT,'dpkg','dpkg','--print-architecture')
        if rc!=0:
                print "No working dpkg found! Are you running Debian?"
                sys.exit(rc)
        if len(sys.argv)>1 and sys.argv[1]=='-s':
                dryrun=1
                print "Dry run is enabled. Not deleting anything."
                dirs=sys.argv[2:]
        else:
                dryrun=0
                dirs=sys.argv[1:]
        if dirs==[]:
                print "Please specify a directory."
                sys.exit(rc);
                # uncomment to work on default cache dirs if no dirs specified 
                # dirs=('/var/cache/apt/archives/','/var/cache/apt/archives/partial/')
        cleanaptcache(dryrun,dirs)

RemovingOldPackageVersions (last edited 2010-02-07 00:23:12 by newacct)