SF.net SVN: gar:[22910] csw/mgar/gar/v2/lib/python/compare_catalog.py
cgrzemba at users.sourceforge.net
cgrzemba at users.sourceforge.net
Tue Jan 28 17:20:57 CET 2014
Revision: 22910
http://sourceforge.net/p/gar/code/22910
Author: cgrzemba
Date: 2014-01-28 16:20:56 +0000 (Tue, 28 Jan 2014)
Log Message:
-----------
use argparse, add out of order pkg compare
Modified Paths:
--------------
csw/mgar/gar/v2/lib/python/compare_catalog.py
Modified: csw/mgar/gar/v2/lib/python/compare_catalog.py
===================================================================
--- csw/mgar/gar/v2/lib/python/compare_catalog.py 2014-01-28 12:36:44 UTC (rev 22909)
+++ csw/mgar/gar/v2/lib/python/compare_catalog.py 2014-01-28 16:20:56 UTC (rev 22910)
@@ -2,55 +2,108 @@
import cjson
import logging
-import optparse
+import argparse
import urllib2
import sys
+import re
logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s')
logger = logging.getLogger(__name__)
+remote_scheme = ['http','https']
+local_scheme = ['file']
+
+def prepareCatListFromURI(uri):
+ catlst = []
+ if '://' in uri:
+ scheme = uri.split(':')[0]
+ if scheme in remote_scheme:
+ logger.info("fetch remote %s", uri)
+ data = urllib2.urlopen(uri).read()
+ catlst = cjson.decode(data)
+ for e in catlst:
+ del e[9]
+ return catlst
+ elif scheme in local_scheme:
+ uri = re.sub('.*://','',uri)
+ else:
+ logger.error('unsupported URI format')
+ sys.exit(4)
+ with open(uri) as lcat:
+ logger.info("fetch local %s", uri)
+ for line in lcat: # skip 4 lines header '# CREATIONDATE'
+ if line.startswith("# CREATIONDATE"):
+ break
+ for line in lcat:
+ if line.startswith("-----BEGIN PGP SIGNATURE"):
+ break
+ catlst.append(line.rstrip().split(' '))
+ return catlst
+
+def compareOutOfOrder(a_catlst, b_catlst, idx):
+ a_pkgName2Idx = {}
+ i = idx
+ for j in range(idx,len(a_catlst)):
+ a_pkgName2Idx[a_catlst[j][0]] = j
+ # import pdb; pdb.set_trace()
+ while i < len(b_catlst):
+ if b_catlst[i][0] in a_pkgName2Idx:
+ if b_catlst[i] != a_catlst[a_pkgName2Idx[b_catlst[i][0]]]:
+ logger.warning("pkgs different at {0},{1}: {2} {3}".format(i,a_pkgName2Idx[b_catlst[i][0]],a_catlst[a_pkgName2Idx[b_catlst[i][0]]],b_catlst[i]))
+ sys.exit(1)
+ else:
+ logger.warning("not in acat: %s", b_catlst[i])
+ sys.exit(1)
+ i += 1
+ b_pkgName2Idx = {}
+ for j in range(idx,len(b_catlst)):
+ b_pkgName2Idx[b_catlst[j][0]] = j
+ # import pdb; pdb.set_trace()
+ i = idx
+ while i < len(a_catlst):
+ if a_catlst[i][0] not in b_pkgName2Idx:
+ logger.warning("not in bcat: %s", a_catlst[i])
+ sys.exit(1)
+ i += 1
+
def main():
- parser = optparse.OptionParser()
- parser.add_option("-v","--verbose", dest="verbose", action="store_true",default=False)
- parser.add_option("-a","--existing-catalog", dest="oldcatalog",
- help='set URI of existing catalog', metavar = 'catalog')
- parser.add_option("-b","--new-catalog", dest="newcatalog",
- help='set URI of catalog to generate', metavar = 'catalog')
- options, args = parser.parse_args()
+ parser = argparse.ArgumentParser()
+ parser.add_argument("-v","--verbose", dest="verbose", action="store_true",default=False)
+ parser.add_argument("acat",help="catalog URI")
+ parser.add_argument("bcat",help="catalog URI")
+ args = parser.parse_args()
opterror = False
- if options.verbose:
+ if args.verbose:
logger.setLevel(logging.INFO)
- if options.debug:
- logger.setLevel(logging.DEBUG)
- if options.newcatalog is None or options.oldcatalog is None:
- logger.error("mandatory option missing")
+ if args.acat is None or args.bcat is None:
+ logger.error("mandatory args 'acat' 'bcat' missing")
sys.exit(2)
- oldcat = options.oldcatalog
- newcat = options.newcatalog
- logger.info(" compare %s with %s", oldcat, newcat)
- data = urllib2.urlopen(oldcat).read()
- a_catlst = cjson.decode(data)
- for e in a_catlst:
- del e[9]
- b_catlst = []
- with open(newcat) as nc:
- for i in range(4): # skip 4 lines header
- nc.readline()
- for cl in nc.readlines():
- if "-----BEGIN" == cl.split(' ')[0]:
- break
- b_catlst.append(cl.rstrip().split(' '))
+ logger.info("fetch cat_a %s", args.acat)
+ a_catlst = prepareCatListFromURI(args.acat)
+
+ logger.info("fetch cat_b %s", args.bcat)
+ b_catlst = prepareCatListFromURI(args.bcat)
+
+ logger.info("compare ...")
if len(a_catlst) != len(b_catlst):
- logger.warning("a has %d, b has %d packges",len(a_catlst),len(b_catlst))
- sys.exit(1)
+ logger.warning("a has %d, b has %d packages",len(a_catlst),len(b_catlst))
+ # sys.exit(1)
for i in range(len(b_catlst)):
- if b_catlst[i] != a_catlst[i] :
- logger.warning("a is {0}, b is {1}".format(a_catlst[i],b_catlst[i]))
- sys.exit(1)
+ try:
+ if b_catlst[i] != a_catlst[i] :
+ if b_catlst[i][0] != a_catlst[i][0]:
+ logger.warning("packages out of order: A: %s; B: %s",a_catlst[i][0], b_catlst[i][0])
+ compareOutOfOrder(a_catlst, b_catlst, i)
+ break
+ else:
+ logger.warning("pkgs different: {0} {1}".format(a_catlst[i],b_catlst[i]))
+ sys.exit(1)
+ except IndexError as e:
+ logger.info("package %s not in acat", b_catlst[i])
# import pdb; pdb.set_trace()
- logger.debug("catalogs are same")
+ logger.info("catalogs are same")
sys.exit(0)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the devel
mailing list