123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- #!/usr/bin/env python
- # OpenEmbedded pkgdata utility
- #
- # Written by: Paul Eggleton <paul.eggleton@linux.intel.com>
- #
- # Copyright 2012 Intel Corporation
- #
- # This program is free software; you can redistribute it and/or modify
- # it under the terms of the GNU General Public License version 2 as
- # published by the Free Software Foundation.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License along
- # with this program; if not, write to the Free Software Foundation, Inc.,
- # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- #
- #
- # Currently only has one function - mapping of packages to their dev/dbg/doc/locale etc.
- # counterparts ("glob" command). Could be extended in future to perform other useful querying
- # functions on the pkgdata though.
- #
- import sys
- import os
- import os.path
- import fnmatch
- import re
- def usage():
- print("syntax: pkgdata-util glob [-d] <pkgdatadir> <vendor-os> <pkglist> \"<globs>\"");
- def glob(args):
- if len(args) < 4:
- usage()
- sys.exit(1)
- pkgdata_dir = args[0]
- target_suffix = args[1]
- pkglist_file = args[2]
- globs = args[3].split()
- if target_suffix.startswith("-"):
- target_suffix = target_suffix[1:]
- skipregex = re.compile("-locale-|^locale-base-|-dev$|-doc$|-dbg$|-staticdev$|^kernel-module-")
- mappedpkgs = set()
- with open(pkglist_file, 'r') as f:
- for line in f:
- fields = line.rstrip().split()
- if len(fields) < 2:
- continue
- pkg = fields[0]
- arch = fields[1]
- multimach_target_sys = "%s-%s" % (arch, target_suffix)
- # Skip packages for which there is no point applying globs
- if skipregex.search(pkg):
- if debug:
- print("%s -> !!" % pkg)
- continue
- # Skip packages that already match the globs, so if e.g. a dev package
- # is already installed and thus in the list, we don't process it any further
- # Most of these will be caught by skipregex already, but just in case...
- already = False
- for g in globs:
- if fnmatch.fnmatchcase(pkg, g):
- already = True
- break
- if already:
- if debug:
- print("%s -> !" % pkg)
- continue
- # Define some functions
- def revpkgdata(pkgn):
- return os.path.join(pkgdata_dir, multimach_target_sys, "runtime-reverse", pkgn)
- def fwdpkgdata(pkgn):
- return os.path.join(pkgdata_dir, multimach_target_sys, "runtime", pkgn)
- def readpn(pkgdata_file):
- pn = ""
- with open(pkgdata_file, 'r') as f:
- for line in f:
- if line.startswith("PN:"):
- pn = line.split(': ')[1].rstrip()
- return pn
- def readrenamed(pkgdata_file):
- renamed = ""
- pn = os.path.basename(pkgdata_file)
- with open(pkgdata_file, 'r') as f:
- for line in f:
- if line.startswith("PKG_%s:" % pn):
- renamed = line.split(': ')[1].rstrip()
- return renamed
- # Main processing loop
- for g in globs:
- mappedpkg = ""
- # First just try substitution (i.e. packagename -> packagename-dev)
- newpkg = g.replace("*", pkg)
- revlink = revpkgdata(newpkg)
- if os.path.exists(revlink):
- mappedpkg = os.path.basename(os.readlink(revlink))
- fwdfile = fwdpkgdata(mappedpkg)
- if os.path.exists(fwdfile):
- mappedpkg = readrenamed(fwdfile)
- if not os.path.exists(fwdfile + ".packaged"):
- mappedpkg = ""
- else:
- revlink = revpkgdata(pkg)
- if os.path.exists(revlink):
- # Check if we can map after undoing the package renaming (by resolving the symlink)
- origpkg = os.path.basename(os.readlink(revlink))
- newpkg = g.replace("*", origpkg)
- fwdfile = fwdpkgdata(newpkg)
- if os.path.exists(fwdfile):
- mappedpkg = readrenamed(fwdfile)
- else:
- # That didn't work, so now get the PN, substitute that, then map in the other direction
- pn = readpn(revlink)
- newpkg = g.replace("*", pn)
- fwdfile = fwdpkgdata(newpkg)
- if os.path.exists(fwdfile):
- mappedpkg = readrenamed(fwdfile)
- if not os.path.exists(fwdfile + ".packaged"):
- mappedpkg = ""
- else:
- # Package doesn't even exist...
- if debug:
- print "%s is not a valid package!" % (pkg)
- break
- if mappedpkg:
- if debug:
- print "%s (%s) -> %s" % (pkg, g, mappedpkg)
- mappedpkgs.add(mappedpkg)
- else:
- if debug:
- print "%s (%s) -> ?" % (pkg, g)
- if debug:
- print "------"
- print("\n".join(mappedpkgs))
- # Too lazy to use getopt
- debug = False
- noopt = False
- args = []
- for arg in sys.argv[1:]:
- if arg == "--":
- noopt = True
- else:
- if not noopt:
- if arg == "-d":
- debug = True
- continue
- args.append(arg)
- if len(args) < 1:
- usage()
- sys.exit(1)
- if args[0] == "glob":
- glob(args[1:])
- else:
- usage()
- sys.exit(1)
|