aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xpythoneggs.py132
1 files changed, 103 insertions, 29 deletions
diff --git a/pythoneggs.py b/pythoneggs.py
index b748f60..4cf2245 100755
--- a/pythoneggs.py
+++ b/pythoneggs.py
@@ -1,20 +1,20 @@
#!/usr/bin/env python
from getopt import getopt
-from os.path import basename, dirname, splitext
+from os.path import basename, dirname, isdir, 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 +22,9 @@ for o, a in opts:
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 +32,68 @@ for o, a in opts:
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)
+ #if Requires:
+ # if get_python_lib(plat_specific=1) in f or get_python_lib() in f:
+ # print 'python(abi) >= %s' % Version
+ lower = f.lower()
+ name = 'python(abi)'
+ if py_abi and lower.endswith('.py'):
+ if not name in py_deps:
+ py_deps[name] = []
+ 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 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.project_name
+ 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 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)
@@ -67,17 +103,55 @@ for f in stdin.readlines():
depsextras.remove(dep)
deps = depsextras
for dep in deps:
+ name = 'pythonegg(%s)' % dep.project_name
+ 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] = []
+ 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.project_name)
+ 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.project_name, '==', spec[1])
+ else:
+ print 'Requires:\t%s %s %s' % (dep.project_name, spec[0], spec[1])
+ print '%%description\t%s' % extra
+ print '%s extra for %s python egg' % (extra, dist.project_name)
+ 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.project_name
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]:
+ for spec in py_deps[name]:
+ print '%s %s %s' % (name, spec[0], spec[1])
+ else:
+ print name