import sys
from tempfile import mkdtemp
from os import mkdir, system
+import os.path
import rpm
def compare_header(refspec, altspec):
+ warnings = []
+
refhdr = refspec.packages()[0].header()
althdr = altspec.packages()[0].header()
alturl = althdr[rpm.RPMTAG_URL]
if refver != altver:
- print "WARNING: different version: '%s': '%s' != '%s': '%s'" % (refname, refver, altname, altver)
+ warnings.append("different version: '%s': '%s' != '%s': '%s'" % (refname, refver, altname, altver))
- if refver != altver:
- print "WARNING: different license: '%s': '%s' != '%s': '%s'" % (refname, reflic, altname, altlic)
+ if reflic != altlic:
+ warnings.append("different license: '%s': '%s' != '%s': '%s'" % (refname, reflic, altname, altlic))
- if refver != altver:
- print "WARNING: different URL: '%s': '%s' != '%s': '%s'" % (refname, refurl, altname, alturl)
+ if refurl != alturl:
+ warnings.append("different URL: '%s': '%s' != '%s': '%s'" % (refname, refurl, altname, alturl))
+
+ return warnings
def compare_sources(refspec, altspec):
+ warnings = []
refsrc = []
altsrc = []
refsrcname = []
for s in refsrc:
if not s[1] in altsrcname:
- print "WARNING: missing source: '%s'" % s[1]
+ warnings.append("missing source: '%s'" % s[1])
for s in altsrc:
if not s[1] in refsrcname:
- print "WARNING: extra source: '%s'" % s[1]
+ warnings.append("extra source: '%s'" % s[1])
for s1 in refsrc:
for s2 in altsrc:
if s1[1] != s2[1]:
continue
if s1[0] != s2[0]:
- print "WARNING: different base URI for source '%s': '%s' != '%s'" % (s1[1], s1[0], s2[0])
+ warnings.append("different base URI for source '%s': '%s' != '%s'" % (s1[1], s1[0], s2[0]))
+
+ return warnings
def compare_patches(refspec, altspec):
+ warnings = []
refpatch = []
altpatch = []
for src in refspec.sources():
for p in refpatch:
if not p in altpatch:
- print "WARNING missing patch '%s'" % p
+ warnings.append("missing patch '%s'" % p)
for p in altpatch:
if not p in refpatch:
- print "WARNING extra patch '%s'" % p
+ warnings.append("extra patch '%s'" % p)
+
+ return warnings
+
+
+def compare_specs(refspec, altspec):
+ warnings = []
+
+ for w in compare_header(refspec, altspec):
+ warnings.append(w)
+ for w in compare_sources(refspec, altspec):
+ warnings.append(w)
+ for w in compare_patches(refspec, altspec):
+ warnings.append(w)
+
+ return warnings
+
+def load_suppressions(file):
+ if not os.path.exists(file):
+ return []
+
+ supp = []
+ s = open(suppressionfile)
+ try:
+ while 1:
+ line = s.readline()
+ if not line:
+ break;
+ if line[0] == '#':
+ continue
+
+ line = line[0:-1]
+ supp.append(line)
+ finally:
+ s.close()
+
+ return supp
+
+
scratchdir = mkdtemp("rpm-source-compare")
-if len(sys.argv) != 3:
- print "syntax: %s REFERENCE-SPEC ALTERNATE-SPEC" % sys.argv[0]
+if len(sys.argv) != 4:
+ print "syntax: %s REFERENCE-SPEC ALTERNATE-SPEC SUPPRESSIONS" % sys.argv[0]
sys.exit(1)
refspecfile = sys.argv[1]
altspecfile = sys.argv[2]
+suppressionfile = sys.argv[3]
ts = rpm.ts()
refspec = ts.parseSpec(refspecfile)
altspec = ts.parseSpec(altspecfile)
+suppressions = load_suppressions(suppressionfile)
+
-compare_header(refspec, altspec)
-compare_sources(refspec, altspec)
-compare_patches(refspec, altspec)
+warnings = []
+for w in compare_specs(refspec, altspec):
+ if not w in suppressions:
+ warnings.append(w)
+if len(warnings) == 0:
+ print "PASS"
+else:
+ for w in warnings:
+ print "WARNING %s" % w