Product SiteDocumentation Site

Dependency Comparisons

Dependency sets, first introduced in Chapter 15, Programming RPM with C on C programming, allow you to compare the dependencies between two packages. One of the most common uses for this is to compare a package file against a version on disk to see if the package file holds a newer version of a package than the one installed.
You can call dsOfHeader on a header object to get the default dependency set for the header. Armed with dependency sets from two headers, you can compare the sets to see which package is newer using simple code like the following:
file_h = ts.hdrFromFdno(fd)
file_ds = file_h.dsOfHeader()
inst_ds = inst_h.dsOfHeader()
if file_ds.EVR() >= inst_ds.EVR():
    print "Package file is same or newer, OK to upgrade."
else:
    print "Package file is older than installed version."
Pulling this all together, Listing 17-5 provides a Python script that compares a package file against an installed package, reporting on which is newer.
Listing 17-5: vercompare.py

#!/usr/bin/python
# Reads in package header, compares to installed package.
# Usage:
# python vercompare.py rpm_file.rpm
#
import os
import sys

import rpm
def readRpmHeader(ts, filename):
    """ Read an rpm header. """
    fd = os.open(filename, os.O_RDONLY)
    try:
        h = ts.hdrFromFdno(fd)
    finally:
        os.close(fd)
    return h

ts = rpm.TransactionSet()
h = readRpmHeader( ts, sys.argv[1] )
pkg_ds = h.dsOfHeader()
for inst_h in ts.dbMatch('name', h['name']):
    inst_ds = inst_h.dsOfHeader()
    if pkg_ds.EVR() >= inst_ds.EVR():
        print "Package file is same or newer, OK to upgrade."
    else:
        print "Package file is older than installed version."

Cross-Reference
The Python script in Listing 17-5 is essentially the same as the longer C program vercompare.c in Listing 16-4 in Chapter 15, Programming RPM with C .
This script takes in a package file name on the command line, loads in the header for that package, and looks up all packages of the same name installed in the RPM database. For each match, this script compares the packages to see which is newer.
You can modify this script, for example, to print out a message if a package isn't installed.