#!/usr/bin/python2.3 # Given a Package and a package, write a script which copies # the packages into a 'base' feed and 'x' feed. import sys, os import ipkg import getopt import re import stat sys.stderr.write("Remember now, this program doesn't copy package-specific files correctly\n") progname = os.path.basename(sys.argv[0]) verbose = 0 def usage(): sys.stderr.write("%s [-h] Packages basefeed xfeed ofeed \n" % (progname)) sys.exit(-1) (opts, remaining_args) = getopt.getopt(sys.argv[1:], "hv") for (optkey, optval) in opts: if optkey == '-h': usage() if optkey == '-v': verbose = 1 if len(remaining_args) != 4: usage() packagefiles, basefeed, xfeed, ofeed = remaining_args packagedir = os.path.dirname(packagefiles) pkgs = ipkg.Packages() for p in packagefiles.split(','): pkgs.read_packages_file(p) package = None alldepends = {} print pkgs.packages.keys() for name in pkgs.packages.keys(): depends = pkgs.packages[name].depends alldepends[name] = [] if depends: for d1 in depends.split(","): d1 = re.sub(r'\(.*?\)', '', d1) for depend in d1.split(" "): alldepends[name].append(depend) alldepends[name] = filter(None, alldepends[name]) # for 'provides:', create a duplicate name. Merge all packages. provides = pkgs.packages[name].provides if provides: p1 = re.sub(r' +', '', provides) for p2 in p1.split(','): if alldepends.has_key(p2): for pkg in alldepends[name]: if not pkg in alldepends[p2]: alldepends[p2].append(pkg) else: alldepends[p2] = alldepends[name] #print name,alldepends[name] def add_depends(p): skip = 0 if not len(p): print "# got led to a null package name" return 1 if not alldepends.has_key(p): print "# %s not found in Packages" % p return 0 for p1 in alldepends[p]: if not len(p1): print "# found a null package name in alldepends", p, alldepends[p] elif skip: skip = 0 elif p1 == '|':# choose the first of alternative packages. skip = 1 elif p1[-1] == '*': searchfor = p1[0:-1] searchforlen = len(searchfor) for p2 in pkgs.packages.keys(): if p2[0:searchforlen] == searchfor: depends.append(p2) break # any one will do. else: if not p1 in depends: depends.append(p1) if not add_depends(p1): return 0 return 1 def get_target_in_subfeeds (subfeeds, target, package): for regex, (match_group, sub_target) in subfeeds.items(): if match_group: m = re.match (regex, package) if m: sub_target_extra_qualifier = m.group(1) return os.path.join (target, sub_target % (sub_target_extra_qualifier)) else: if re.match (regex, package): return os.path.join (target, sub_target) return target packages = pkgs.packages.keys() packages.sort() subfeeds = {".*-dev(_.*)?":(False, "dev"),".*-locale-(.*)(_.*)?":(True, "locale/%s"), ".*-doc(_.*)?":(False, "doc")} for p in packages: depends = [] if not add_depends(p): print "# dropping %s" % p print "# ",pkgs.packages[p].maintainer continue if verbose: print '# package:',p,' depends on:', depends x = p.startswith('gpe-') x += p.startswith('gconv-') x += p.startswith('gtk') x += p.startswith('xserver') x += 'libx11-6' in depends x += 'gtk+' in depends x += 'xserver' in depends o = p.startswith('opie') o += p.startswith('qt') o += p.startswith('qp') o += 'libqte1' in depends o += 'libqte2' in depends o += 'libqpe1' in depends if x: tofn = get_target_in_subfeeds (subfeeds, xfeed, p) elif o: tofn = get_target_in_subfeeds (subfeeds, ofeed, p) else: tofn = get_target_in_subfeeds (subfeeds, basefeed, p) fromfn = os.path.join(packagedir, pkgs.packages[p].filename) tofn = os.path.join(tofn, pkgs.packages[p].filename) fromstat = os.stat(fromfn) try: tostat = os.stat(tofn) except: tostat = None if 0 or (not tostat or tostat[stat.ST_SIZE] != fromstat[stat.ST_SIZE] or tostat[stat.ST_MTIME] != fromstat[stat.ST_MTIME]): print "mkdir -p `dirname %s`" % (tofn) print "cp -av ",fromfn,tofn