143 lines
3.6 KiB
Python
Executable File
143 lines
3.6 KiB
Python
Executable File
#!/usr/bin/python
|
|
#---------------------------------------------------------------
|
|
# Project : Mandrake Linux
|
|
# Module : rpmlint
|
|
# File : rpmdiff
|
|
# Version : $Id$
|
|
# 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 Pkg
|
|
import rpm
|
|
import sys
|
|
import os
|
|
import stat
|
|
|
|
# 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:
|