thomas: server rpmdircmp,NONE,1.1

cvs at kolab.org cvs at kolab.org
Thu Mar 13 17:48:23 CET 2008


Author: thomas

Update of /kolabrepository/server
In directory doto:/tmp/cvs-serv19234

Added Files:
	rpmdircmp 
Log Message:
Python script to generate "Packages in the OpenPKG based Kolab server release:"
(the list of removed/added/updated/unchanged packages in the release notes)


--- NEW FILE: rpmdircmp ---
#!/usr/bin/env python
#
# Copyright (C) 2008 by Intevation GmbH
# Authors:
# Thomas Arendsen Hein <thomas at intevation.de>
#
# This program is free software under the GPL (>=v2)

"""
rpmdircmp olddir newdir

Prints list of removed/added/updated/unchanged rpm packages
"""

import sys, os

_packagermap = {
    'OpenPKG Foundation e.V.': 'OpenPKG'
}
_packagercache = {}

def rpmpackager(rpmdir, rpm):
    if rpm in _packagercache:
        packager = _packagercache[rpm]
    else:
        name = os.path.join(rpmdir, rpm)
        rpmcall = os.popen("rpm -qp --qf '%%{packager}' '%s'" % name)
        packager = _packagermap.get(rpmcall.read(), 'Kolab')
        rpmcall.close()
        _packagercache[rpm] = packager
    return packager

def rpmdir2list(rpmdir):
    """Returns list of all .src.rpm files in the given directory.

    The list contains tuples: (name, version, release, packager)
    """
    rpms = []
    dirlist = os.listdir(rpmdir)
    todo = len(dirlist)
    sys.stderr.write("Checking %s ...\n" % rpmdir)
    for rpm in dirlist:
        sys.stderr.write("%d ...    \r" % todo)
        todo -= 1
        if rpm.endswith('.src.rpm'):
            entry = rpm[:-len('src.rpm')-1].rsplit('-', 2)
            entry.append(rpmpackager(rpmdir, rpm))
            rpms.append(tuple(entry))
    sys.stderr.write('OK.        \n')
    return rpms

def rpmsets(rpmdir):
    names = {}
    rpms = rpmdir2list(rpmdir)
    for rpm in rpms:
        names[rpm[0]] = rpm
    return set(rpms), set(names), names

if len(sys.argv[1:]) != 2:
    sys.stderr.write("%s\n" % __doc__)
else:
    oldrpms, oldnames, olddict = rpmsets(sys.argv[1])
    newrpms, newnames, newdict = rpmsets(sys.argv[2])

    removed = [olddict[name] for name in list(oldnames.difference(newnames))]
    added = [newdict[name] for name in list(newnames.difference(oldnames))]
    updated = list(newrpms.difference(oldrpms).difference(added))
    unchanged = list(oldrpms.intersection(newrpms))

    sys.stdout.write('    Packages in the OpenPKG based Kolab server release:\n\n')

    for packager in ['Kolab', 'OpenPKG']:
        sys.stdout.write('    - %s packages:\n\n' % packager)

        for title, rpms in [
            ('Removed', removed),
            ('Added', added),
            ('Updated', updated),
            ('Unchanged', unchanged),
        ]:
            wrote_title = False
            rpms.sort()
            for rpm in rpms:
                if rpm[3] == packager:
                    if not wrote_title:
                        sys.stdout.write("      %s:\n\n" % title)
                        wrote_title = True
                    sys.stdout.write("\t%s-%s-%s\n" % rpm[:3])
            if wrote_title:
                sys.stdout.write("\n")






More information about the commits mailing list