| 1 | #!/usr/bin/python
|
|---|
| 2 | # $Id: ipkg-show-deps,v 1.2 2004/03/06 13:08:33 pb Exp $
|
|---|
| 3 |
|
|---|
| 4 | import sys, os, posixpath
|
|---|
| 5 | from glob import glob
|
|---|
| 6 | import commands
|
|---|
| 7 | import ipkg
|
|---|
| 8 | import getopt
|
|---|
| 9 | import string
|
|---|
| 10 | import re
|
|---|
| 11 |
|
|---|
| 12 | verbose = 0
|
|---|
| 13 |
|
|---|
| 14 | def usage():
|
|---|
| 15 | sys.stderr.write("%s [-p Packages] package ...\n" % (sys.argv[0],))
|
|---|
| 16 | sys.exit(-1)
|
|---|
| 17 |
|
|---|
| 18 | packages_filename = "Packages"
|
|---|
| 19 | (opts, remaining_args) = getopt.getopt(sys.argv[1:], "hp:")
|
|---|
| 20 | for (optkey, optval) in opts:
|
|---|
| 21 | if optkey == '-h':
|
|---|
| 22 | usage()
|
|---|
| 23 | if optkey == '-p':
|
|---|
| 24 | packages_filename = optval
|
|---|
| 25 |
|
|---|
| 26 | if ( not remaining_args ):
|
|---|
| 27 | usage()
|
|---|
| 28 |
|
|---|
| 29 | packages = ipkg.Packages()
|
|---|
| 30 | packages.read_packages_file(packages_filename)
|
|---|
| 31 |
|
|---|
| 32 | required = {}
|
|---|
| 33 | provider_hash = {}
|
|---|
| 34 |
|
|---|
| 35 | def split_list(str):
|
|---|
| 36 | r = []
|
|---|
| 37 | l = string.split(str, ",")
|
|---|
| 38 | for i in l:
|
|---|
| 39 | ll = string.split(i, "|")
|
|---|
| 40 | for ii in ll:
|
|---|
| 41 | ii = string.strip(ii)
|
|---|
| 42 | r.append(ii)
|
|---|
| 43 | return r
|
|---|
| 44 |
|
|---|
| 45 | for i in packages.packages.keys():
|
|---|
| 46 | p = packages.packages[i]
|
|---|
| 47 | if not provider_hash.has_key(p.package):
|
|---|
| 48 | provider_hash[p.package] = []
|
|---|
| 49 | provider_hash[p.package].append(p)
|
|---|
| 50 | if p.provides:
|
|---|
| 51 | provides = string.split(p.provides, ",")
|
|---|
| 52 | for prov in provides:
|
|---|
| 53 | prov = string.strip(prov)
|
|---|
| 54 | if not provider_hash.has_key(prov):
|
|---|
| 55 | provider_hash[prov] = []
|
|---|
| 56 | provider_hash[prov].append(p)
|
|---|
| 57 |
|
|---|
| 58 | def find_package(name):
|
|---|
| 59 | if provider_hash.has_key(name):
|
|---|
| 60 | return provider_hash[name]
|
|---|
| 61 | return None
|
|---|
| 62 |
|
|---|
| 63 | def recurse(pkg):
|
|---|
| 64 | required[pkg.package] = 1
|
|---|
| 65 | if pkg.depends:
|
|---|
| 66 | deps = split_list(pkg.depends)
|
|---|
| 67 | for dep in deps:
|
|---|
| 68 | dep = re.sub("\s*\(.*\)", "", dep)
|
|---|
| 69 | dep = re.sub("\*$", "", dep)
|
|---|
| 70 | newpkgs = find_package(dep)
|
|---|
| 71 | if newpkgs:
|
|---|
| 72 | for newpkg in newpkgs:
|
|---|
| 73 | if required.has_key(newpkg.package):
|
|---|
| 74 | return
|
|---|
| 75 | recurse(newpkgs[0])
|
|---|
| 76 | else:
|
|---|
| 77 | sys.stderr.write("unsatisfied dependency of %s on '%s'\n" % (pkg.package, dep))
|
|---|
| 78 |
|
|---|
| 79 | for root in remaining_args:
|
|---|
| 80 | pkgs = find_package(root)
|
|---|
| 81 | if not pkgs:
|
|---|
| 82 | sys.stderr.write("Can't find root package '%s'\n" % root)
|
|---|
| 83 | sys.exit(-1)
|
|---|
| 84 | for p in pkgs:
|
|---|
| 85 | recurse(p)
|
|---|
| 86 |
|
|---|
| 87 | for pkg in required.keys():
|
|---|
| 88 | print pkg
|
|---|
| 89 |
|
|---|