Login
Log in using an SSO provider:
Fedora Account System
Red Hat Associate
Red Hat Customer
Login using a Red Hat Bugzilla account
Forgot Password
Create an Account
Red Hat Bugzilla – Attachment 30556 Details for
Bug 51582
Many files are owned by multiple packages
Home
New
Search
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh90 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
[?]
This site requires JavaScript to be enabled to function correctly, please enable it.
Stripped down script that only looks for duplicate files
rpmdbcheck.py (text/plain), 5.72 KB, created by
Peter Bowen
on 2001-09-01 20:59:35 UTC
(
hide
)
Description:
Stripped down script that only looks for duplicate files
Filename:
MIME Type:
Creator:
Peter Bowen
Created:
2001-09-01 20:59:35 UTC
Size:
5.72 KB
patch
obsolete
>#!/usr/bin/python ># licensed under the GPL, by Peter Bowen <pzb@scyld.com> ># based on graphgen.py by Adrian Likins <alikins@redhat.com> ># ># none of that fancy commandline parsing or ease of use stuff here, change "dbpath" to ># point to a rpmdb that you are interested in ># ># useage: ># ./rpmdbcheck.py > foo.out ># > >import rpm >import sys >import re > ># Path to rpm database >dbpath = '/usr/lib/rpmdb/i386-redhat-linux/redhat' >#dbpath = '/var/lib/rpm' > ># Exceptions: these are supposed to be owned by multiple packages ># the key is a regex and the value is the list of packages that should own the file >filter_packages = {} > ># Per Bug #51586 >filter_packages['^/usr/share/locale/[^/]*/LC_MESSAGES/Lokkit\.mo$'] = ['gnome-lokkit', 'lokkit'] ># Per Bug #51594 >filter_packages['^/etc/rc[0-6]\.d$'] = ['chkconfig', 'initscripts'] ># Per Bug #52004 >filter_packages['^/usr/X11R6/man/man1/XF86_Accel\.1x\.gz$'] = ['XFree86-3DLabs', 'XFree86-8514', 'XFree86-AGX', 'XFree86-Mach32', 'XFree86-Mach64', 'XFree86-Mach8', 'XFree86-P9000', 'XFree86-S3', 'XFree86-S3V', 'XFree86-W32'] >filter_packages['^/usr/X11R6/man/man1/XF86_S3\.1x\.gz$'] = ['XFree86-S3', 'XFree86-S3V'] >filter_packages['^/usr/X11R6/man/man5/XF86Config-3\.5x\.gz$'] = ['XFree86-3DLabs', 'XFree86-8514', 'XFree86-AGX', 'XFree86-FBDev', 'XFree86-Mach32', 'XFree86-Mach64', 'XFree86-Mach8', 'XFree86-Mono', 'XFree86-P9000', 'XFree86-S3', 'XFree86-S3V', 'XFree86-SVGA', 'XFree86-VGA16', 'XFree86-W32'] > >def isRequirement(deps, pkg1, pkg2, fp): > if pkg1 == pkg2: > return 1 > for deppkg in deps[pkg2]: > if fp.count(deppkg) == 0: > fp.append(deppkg) > if isRequirement(deps, pkg1, deppkg, fp): > return 1 > return 0 > >def removeDeps(deps, pkgList): > for pkgi in pkgList: > for pkgn in pkgList: > found_deps = [] > if pkgi != pkgn and pkgi != "" and pkgn != "": > if isRequirement(deps, pkgi, pkgn, found_deps): > pos = pkgList.index(pkgn) > pkgList[pos] = "" > newList = pkgList[:] > pkgList = [] > for pkg in newList: > if pkg != "": > pkgList.append(pkg) > return pkgList > >def listPackages(db): > headerList = [] > list = [] > if "firstkey" in dir(db): > key = db.firstkey() > h = db[key] > else: > iterator = db.match(0) > h = iterator.next() > > while (h): > name = h['name'] > epoch = h['epoch'] > if epoch == None: > epoch = "" > version = h['version'] > release = h['release'] > > headerList.append(h) > list.append([name, version, release, epoch]) > if "nextkey" in dir(db): > key = db.nextkey(key) > if key: > h = db[key] > else: > h = None > else: > h = iterator.next() > > list.sort() > return headerList > > >def findDepLocal(db, dep): > header = None > if dep[0] == '/': > # Treat it as a file dependency > try: > hdr_arry = db.findbyfile(dep) > except: > hdr_arry = [] > > for n in hdr_arry: > header = db[n] > type = 0 > break > > else: > # Try it first as a package name > try: > hdr_arry = db.findbyname(dep) > except: > hdr_arry = [] > for n in hdr_arry: > header = db[n] > type = 1 > break > else: > # else try it as a soname > try: > hdr_arry = db.findbyprovides(dep) > except: > hdr_arry = [] > for n in hdr_arry: > header = db[n] > type = 2 > break > > if header != None: > return (header,type) > else: > return (None,None) > > >if __name__ == "__main__": > > import sys > import string > > requires = {} > provides = {} > filenames = {} > filemodes= {} ># CONFIG > rpm.addMacro("_dbpath", dbpath) > db = rpm.opendb() > headerList = listPackages(db) > > # build a list of requires > for header in headerList: > name = header['name'] > foo = header['requirename'] > requires[name] = foo > bar = header['filenames'] > filenames[name] = bar > baz = header['filemodes'] > filemodes[name] = baz > > #figure out which packages are needed to meet those > package_requires = {} > for package_name in requires.keys(): > reqs = requires[package_name] > package_requires[package_name] = ['basesystem'] > if reqs and len(reqs): > for i in reqs: > (pkg,type) = findDepLocal(db,i) > if pkg: > pkgname = pkg['name'] > package_requires[package_name].append(pkgname) > else: > if string.find(i, "rpmlib(") != 0: > print "Failed to find match for dep: %s" % i > > for blip in package_requires.keys(): > new_list = [] > tmp_list = package_requires[blip] > d = {} > for i in tmp_list: > d[i] = i > new_list = d.values() > package_requires[blip] = new_list > package_requires[blip].sort() > > found_files = {} > for package_name in requires.keys(): > fnames = filenames[package_name] > fmodes = filemodes[package_name] > if fnames and fmodes and len(fnames) and len(fmodes): > for fn in range(len(fnames)): > if (fmodes[fn] & 070000) != 040000: > if found_files.has_key(fnames[fn]): > found_files[fnames[fn]].append(package_name) > found_files[fnames[fn]].sort() > else: > found_files[fnames[fn]] = [package_name] > > print "Files owned by multiple packages" > ffiles_keys = found_files.keys() > ffiles_keys.sort() > for file in ffiles_keys: > if len(found_files[file]) > 1: > orig_pkgs = found_files[file][:] > skip = 0 > for excpt in filter_packages.keys(): > fre = re.compile(excpt) > if fre.search(file) and orig_pkgs == filter_packages[excpt]: > skip = 1 > if not skip: > found_files[file] = removeDeps(package_requires, found_files[file]) > if len(found_files[file]) == 1: > pos = orig_pkgs.index(found_files[file][0]) > del orig_pkgs[pos] > if len(orig_pkgs) > 1: > do_str = "do" > else: > do_str = "does" > print "%s (only %s should own it, but %s also %s)" % (file, found_files[file], orig_pkgs, do_str) > else: > for foo in found_files[file]: > pos = orig_pkgs.index(foo) > del orig_pkgs[pos] > if len(orig_pkgs) > 0: > extra_str = ", plus %s, " % orig_pkgs > else: > extra_str = " all " > print "%s (one of %s should own it, but they%sdo currently)" % (file, found_files[file], extra_str) >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 51582
:
27455
|
27456
| 30556