#!/usr/bin/python -tt

import sys
import os
import rpmUtils
from optparse import OptionParser


myName = "rawhide-eliminator"
myVersion = "0.90 rev 2006-02-06, Paul W. Frields <stickster@gmail.com>"

parser = OptionParser()
parser.usage = "%prog [options] directory"
parser.add_option("-a", "--ignore-arch", action="store_true",
                  dest="ignoreArch",
                  help="ignore %ARCH in packages (useful for SRPMs)")
parser.add_option("-d", "--debug", action="store_true", dest="debug",
                  help="print ugly debugging information")
parser.add_option("-r", "--remove", action="store_true", dest="remove",
                  help="remove older packages (default: off)")
parser.add_option("-z", "--zero", action="store_true", dest="zero",
                  help="replace older package with zero-byte file")
parser.add_option("-v", "--verbose", action="store_true", dest="verbose",
                  help="verbose messages to stdout")
parser.add_option("-V", "--version", action="store_true", dest="version",
                  help="show version information")
(options, args) = parser.parse_args()


if options.version:
  print myName, myVersion
  sys.exit (0)

if len(args) != 1:
  parser.error("Incorrect number of arguments")
  sys.exit (2)
else:
  if (options.remove and options.zero):
    parser.error("Options remove and zero conflict")
    sys.exit (2)

indir = args[0]

if not os.path.isdir(indir):
  print indir, "is not a directory"
  sys.exit (2)
else:  
  if indir[:1] is not '/':
    indir = indir + '/'
  if options.verbose: print "Checking pages in", indir

try:
  infiles = os.listdir(indir)
except:
  print "Couldn't read directory", indir
  sys.exit (3)

if options.debug: print len(infiles), "files found"

ts = rpmUtils.transaction.initReadOnlyTransaction()

pkglist = []
# Make a list of tuples, header and filename
for fname in infiles:
  infile = indir + fname
  try:
    hdr = rpmUtils.miscutils.hdrFromPackage(ts, infile)

    if options.verbose: print "Reading header from", infile
    pkglist.append((infile, hdr))
  except:
    print "Couldn't read header in " + infile +", skipping"

pkglist.sort()
if options.debug: print pkglist[:]

i = 0
removelist = []
while ( i < (len(pkglist)-1) ):
  if options.debug: print "i =", i
  currentpkg = rpmUtils.miscutils.pkgTupleFromHeader(pkglist[i][1])
  if options.debug: print "currentpkg =", currentpkg, "     ",
  nextpkg = rpmUtils.miscutils.pkgTupleFromHeader(pkglist[i+1][1])
  if options.debug: print "nextpkg =", nextpkg

  if (currentpkg[0] == nextpkg[0]) and ((currentpkg[1] == nextpkg[1]) or (options.ignoreArch)):
    # Same name + arch, do a compare
    currentEVR = currentpkg[2:]
    nextEVR = nextpkg[2:]
    
    if rpmUtils.miscutils.compareEVR(nextEVR, currentEVR) == 1:
      if options.debug: print nextpkg, ">", currentpkg
      removelist.append(pkglist[i][0])
      if options.debug: print "Adding", pkglist[i][0], "to removelist"
    else:
      if options.debug: print nextpkg, "<", currentpkg
      removelist.append(pkglist[i+1][0])
      if options.debug: print "Adding", pkglist[i+1][0], "to removelist"
      # since nextpkg is to be killed off, remove it and back up
      pkglist.pop(i+1)
      i = i-1


  i = i+1

for filename in removelist:
  if options.verbose: print "Removing older package", filename
  if options.remove:
    os.remove(filename)
  if options.zero:
    f = file(filename, "w")
    f.truncate(0)
    f.close()
