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

Reply via email to