RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Per Øyvind Karlsen Root: /v/rpm/cvs Email: pkarl...@rpm5.org Module: rpm Date: 25-Jan-2011 22:54:40 Branch: rpm-5_4 Handle: 2011012521544000 Modified files: (Branch: rpm-5_4) rpm/scripts pythoneggs.py Log: sync with mandriva version Summary: Revision Changes Path 1.1.2.1 +126 -29 rpm/scripts/pythoneggs.py ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/scripts/pythoneggs.py ============================================================================ $ cvs diff -u -r1.1 -r1.1.2.1 pythoneggs.py --- rpm/scripts/pythoneggs.py 19 Oct 2010 02:46:52 -0000 1.1 +++ rpm/scripts/pythoneggs.py 25 Jan 2011 21:54:40 -0000 1.1.2.1 @@ -1,20 +1,30 @@ #!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright 2010 Per Ãyvind Karlsen <peroyv...@mandriva.org> +# +# This program is free software. It may be redistributed and/or modified under +# the terms of the LGPL version 2.1 (or later). +# +# RPM5 python (egg) dependency generator. +# + from getopt import getopt -from os.path import basename, dirname, splitext +from os.path import basename, dirname, isdir, sep, splitext from sys import argv, stdin, version -from pkg_resources import PathMetadata, Distribution +from pkg_resources import Distribution, FileMetadata, PathMetadata from distutils.sysconfig import get_python_lib -opts, args = getopt(argv[1:], 'hPRSECO', - ['help', 'provides', 'requires', 'suggests', 'enhances', 'conflicts', 'obsoletes']) +opts, args = getopt(argv[1:], 'hPRSCOE', + ['help', 'provides', 'requires', 'suggests', 'conflicts', 'obsoletes', 'extras']) Provides = False Requires = False Suggests = False -Enhances = False Conflicts = False Obsoletes = False +Extras = False for o, a in opts: if o in ('-h', '--help'): @@ -22,9 +32,9 @@ print '-P, --provides\tPrint Provides' print '-R, --requires\tPrint Requires' print '-S, --suggests\tPrint Suggests' - print '-E, --enhances\tPrint Enhances (unused)' print '-C, --conflicts\tPrint Conflicts' print '-O, --obsoletes\tPrint Obsoletes (unused)' + print '-E, --extras\tPrint Extras ' exit(1) elif o in ('-P', '--provides'): Provides = True @@ -32,32 +42,76 @@ Requires = True elif o in ('-S', '--suggests'): Suggests = True - elif o in ('-E', '--enhances'): - Enhances = True elif o in ('-C', '--conflicts'): Conflicts = True elif o in ('-O', '--obsoletes'): Obsoletes = True + elif o in ('-E', '--extras'): + Extras = True -Version = version[:3] -for f in stdin.readlines(): +if Requires: + py_abi = True +else: + py_abi = False +py_deps = {} +if args: + files = args +else: + files = stdin.readlines() +for f in files: f = f.strip() - # FIXME: get other versions as well... - if Provides: - if "/usr/lib/libpython%s.so" % Version in f or \ - "/usr/lib64/libpython%s.so" % Version in f: - print "python(abi) == %s" % Version - if Requires: - if get_python_lib(plat_specific=1) in f or get_python_lib() in f: - print "python(abi) >= %s" % Version - if f.endswith('.egg') or f.endswith('.egg-info') or f.endswith('.egg-link'): - base_dir = dirname(f) - metadata = PathMetadata(base_dir, f) - dist_name = splitext(basename(f))[0] - dist = Distribution(base_dir,project_name=dist_name,metadata=metadata) + lower = f.lower() + name = 'python(abi)' + # add dependency based on path, versioned if within versioned python directory + if py_abi and (lower.endswith('.py') or lower.endswith('.pyc') or lower.endswith('.pyo')): + if not name in py_deps: + py_deps[name] = [] + purelib = get_python_lib(standard_lib=1, plat_specific=0).split(version[:3])[0] + platlib = get_python_lib(standard_lib=1, plat_specific=1).split(version[:3])[0] + for lib in (purelib, platlib): + if lib in f: + spec = ('==',f.split(lib)[1].split(sep)[0]) + if not spec in py_deps[name]: + py_deps[name].append(spec) + # Determine provide, requires, conflicts & suggests based on egg metadata + if lower.endswith('.egg') or \ + lower.endswith('.egg-info') or \ + lower.endswith('.egg-link'): + dist_name = basename(f) + if isdir(f): + path_item = dirname(f) + metadata = PathMetadata(path_item, f) + else: + path_item = f + metadata = FileMetadata(f) + dist = Distribution.from_location(path_item, dist_name, metadata) if Provides: - print 'pythonegg(%s) = %s' % (dist.project_name, dist.version) + # If egg metadata says package name is python, we provide python(abi) + if dist.key == 'python': + name = 'python(abi)' + if not name in py_deps: + py_deps[name] = [] + py_deps[name].append(('==', dist.py_version)) + name = 'pythonegg(%s)' % dist.key + if not name in py_deps: + py_deps[name] = [] + if dist.version: + spec = ('==', dist.version) + if not spec in py_deps[name]: + py_deps[name].append(spec) if Requires or (Suggests and dist.extras): + name = 'python(abi)' + # If egg metadata says package name is python, we don't add dependency on python(abi) + if dist.key == 'python': + py_abi = False + if name in py_deps: + py_deps.pop(name) + elif py_abi and dist.py_version: + if not name in py_deps: + py_deps[name] = [] + spec = ('==', dist.py_version) + if not spec in py_deps[name]: + py_deps[name].append(spec) deps = dist.requires() if Suggests: depsextras = dist.requires(extras=dist.extras) @@ -66,18 +120,61 @@ if dep in deps: depsextras.remove(dep) deps = depsextras + # add requires/suggests based on egg metadata for dep in deps: + name = 'pythonegg(%s)' % dep.key + for spec in dep.specs: + if spec[0] != '!=': + if not name in py_deps: + py_deps[name] = [] + if not spec in py_deps[name]: + py_deps[name].append(spec) if not dep.specs: - print 'pythonegg(%s)' % dep.project_name - else: + py_deps[name] = [] + # Unused, for automatic sub-package generation based on 'extras' from egg metadata + # TODO: implement in rpm later, or...? + if Extras: + deps = dist.requires() + extras = dist.extras + print extras + for extra in extras: + print '%%package\textras-%s' % extra + print 'Summary:\t%s extra for %s python egg' % (extra, dist.key) + print 'Group:\t\tDevelopment/Python' + depsextras = dist.requires(extras=[extra]) + for dep in reversed(depsextras): + if dep in deps: + depsextras.remove(dep) + deps = depsextras + for dep in deps: for spec in dep.specs: - if spec[0] != '!=': - print 'pythonegg(%s) %s' % (dep.project_name, ' '.join(spec)) + if spec[0] == '!=': + print 'Conflicts:\t%s %s %s' % (dep.key, '==', spec[1]) + else: + print 'Requires:\t%s %s %s' % (dep.key, spec[0], spec[1]) + print '%%description\t%s' % extra + print '%s extra for %s python egg' % (extra, dist.key) + print '%%files\t\textras-%s\n' % extra if Conflicts: # Should we really add conflicts for extras? # Creating a meta package per extra with suggests on, which has # the requires/conflicts in stead might be a better solution... for dep in dist.requires(extras=dist.extras): + name = dep.key for spec in dep.specs: if spec[0] == '!=': - print 'pythonegg(%s) == %s' % (dep.project_name, spec[1]) + if not name in py_deps: + py_deps[name] = [] + spec = ('==', spec[1]) + if not spec in py_deps[name]: + py_deps[name].append(spec) +names = py_deps.keys() +names.sort() +for name in names: + if py_deps[name]: + # Print out versioned provides, requires, suggests, conflicts + for spec in py_deps[name]: + print '%s %s %s' % (name, spec[0], spec[1]) + else: + # Print out unversioned provides, requires, suggests, conflicts + print name @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org