#!/usr/bin/python
#---------------------------------------------------------------
# Project         : Mandrake Linux
# Module          : rpmlint
# File            : rpmdiff
# Version         : $Id: rpmdiff,v 1.2 2003/05/09 12:25:45 flepied Exp $
# Author          : Frederic Lepied
# Created On      : Sat Feb  9 21:24:33 2002
# Purpose         : rewritting of rpmdiff to show the use of the
#                 Pkg lib.
#---------------------------------------------------------------

import rpm
import sys
import os
import stat
import site

if not os.path.exists('Pkg.py') and os.path.isdir("/usr/share/rpmlint"):
    site.addsitedir("/usr/share/rpmlint")

import Pkg

# constants

TAGS = [ (rpm.RPMTAG_NAME, 'NAME'),
         (rpm.RPMTAG_SUMMARY, 'SUMMARY'),
         (rpm.RPMTAG_DESCRIPTION, 'DESCRIPTION'),
         (rpm.RPMTAG_GROUP, 'GROUP'),
         (rpm.RPMTAG_LICENSE, 'LICENSE'),
         (rpm.RPMTAG_URL, 'URL'),
         (rpm.RPMTAG_PREIN, 'PREIN'),
         (rpm.RPMTAG_POSTIN, 'POSTIN'),
         (rpm.RPMTAG_PREUN, 'PREUN'),
         (rpm.RPMTAG_POSTUN, 'POSTUN'),
         ]

FILEIDX = [ ('S', 4),
            ('M', 0),
            ('5', 5),
            ('D', None),
            ('L', 3),
            ('U', 1),
            ('G', 2),
            ('T', 6)
            ]

FORMAT = '%-11s%s'

ADDED   = 'added'
REMOVED = 'removed'
CHANGED = 'S.5....T'

# code starts here

# load a package from a file or from the installed ones
def load_pkg(name, tmpdir='/tmp'):
    st=os.stat(name)
    if stat.S_ISREG(st[stat.ST_MODE]):
        try:
            return Pkg.Pkg(name, tmpdir)
        except TypeError:
            pass
    return Pkg.InstalledPkg(name)

# compares 2 lists
def cmp_list(old, new, name):
    if old != new:
        if not old:
            print FORMAT % (ADDED, name)
        elif not new:
            print FORMAT % (REMOVED, name)
        else:
            print FORMAT % (CHANGED, name)

def main():
    if len(sys.argv) != 3:
        print "usage: %s <old package> <new package>" % sys.argv[0]
        sys.exit(1)

    old = load_pkg(sys.argv[1])
    new = load_pkg(sys.argv[2])

    old_files = old.files().keys()
    new_files = new.files().keys()
    files = old_files + new_files

    files.sort()
    previous = None

    for s in TAGS:
        old_tag = old[s[0]]
        new_tag = new[s[0]]
        if old_tag != new_tag:
            if old_tag == None:
                print FORMAT % (ADDED, s[1])
            elif new_tag == None:
                print FORMAT % (REMOVED, s[1])
            else:
                print FORMAT % ('S.5.....', s[1])

    cmp_list(old.prereq(), new.prereq(), 'PREREQ')
    cmp_list(old.requires(), new.requires(), 'REQUIRES')
    cmp_list(old.provides(), new.provides(), 'PROVIDES')
    cmp_list(old.conflicts(), new.conflicts(), 'CONFLICTS')

    old_files = old.files()
    new_files = new.files()
    
    for f in files:
        diff = 0
        if f == previous:
            continue
        previous = f
        try:
            old_file = old_files[f]
        except KeyError:
            old_file = None
        try:
            new_file = new_files[f]
        except KeyError:
            new_file = None
            
        if not old_file:
            print FORMAT % (ADDED, f)
        elif not new_file:
            print FORMAT % (REMOVED, f)
        else:
            format = ''
            for idx in range(0, len(FILEIDX)):
                entry = FILEIDX[idx]
                if entry[1] != None and old_file[entry[1]] != new_file[entry[1]]:
                    format = format + entry[0]
                    diff = 1
                else:
                    format = format + '.'
            if diff:
                print FORMAT % (format, f)

if __name__ == '__main__':
    main()
    
# rpmdiff ends here
#
# Local variables:
# mode: python
# End:
