]> pilppa.org Git - familiar-h63xx-build.git/blob - org.handhelds.familiar/contrib/buildscripts/openzaurus/feed-split/ipkg-split-feeds-koen-subfeeds
ppp-dialin: don't error out in postinst if ppp user already exists. Fixes Bug #1625.
[familiar-h63xx-build.git] / org.handhelds.familiar / contrib / buildscripts / openzaurus / feed-split / ipkg-split-feeds-koen-subfeeds
1 #!/usr/bin/python2.3
2 # Given a Package and a package, write a script which copies
3 # the packages into a 'base' feed and 'x' feed.
4
5 import sys, os
6 import ipkg
7 import getopt
8 import re
9 import stat
10
11 sys.stderr.write("Remember now, this program doesn't copy package-specific files correctly\n")
12 progname = os.path.basename(sys.argv[0])
13 verbose = 0
14
15 def usage():
16      sys.stderr.write("%s [-h] Packages basefeed xfeed ofeed \n" % (progname)) 
17      sys.exit(-1)
18
19 (opts, remaining_args) = getopt.getopt(sys.argv[1:], "hv")
20 for (optkey, optval) in opts:
21      if optkey == '-h': 
22           usage()
23      if optkey == '-v':
24           verbose = 1
25
26 if len(remaining_args)  != 4:
27     usage()
28
29 packagefiles, basefeed, xfeed, ofeed = remaining_args
30
31 packagedir = os.path.dirname(packagefiles)
32
33 pkgs = ipkg.Packages()
34 for p in packagefiles.split(','):
35   pkgs.read_packages_file(p)
36
37 package = None
38
39 alldepends = {}
40
41 print pkgs.packages.keys()
42 for name in pkgs.packages.keys():
43     depends = pkgs.packages[name].depends
44     alldepends[name] = []
45     if depends:
46         for d1 in depends.split(","):
47           d1 = re.sub(r'\(.*?\)', '', d1)
48           for depend in d1.split(" "):
49                 alldepends[name].append(depend)
50     alldepends[name] = filter(None, alldepends[name])
51     # for 'provides:', create a duplicate name.  Merge all packages.
52     provides = pkgs.packages[name].provides
53     if provides:
54       p1 = re.sub(r' +', '', provides)
55       for p2 in p1.split(','):
56         if alldepends.has_key(p2):
57             for pkg in alldepends[name]:
58                 if not pkg in alldepends[p2]:
59                     alldepends[p2].append(pkg)
60         else:
61             alldepends[p2] = alldepends[name]
62     #print name,alldepends[name]
63
64 def add_depends(p):
65     skip = 0
66     if not len(p): 
67         print "# got led to a null package name"
68         return 1
69     if not alldepends.has_key(p):
70         print "# %s not found in Packages" % p
71         return 0
72     for p1 in alldepends[p]:
73         if not len(p1):
74             print "# found a null package name in alldepends", p, alldepends[p]
75         elif skip:
76             skip = 0
77         elif p1 == '|':# choose the first of alternative packages.
78             skip = 1
79         elif p1[-1] == '*':
80             searchfor = p1[0:-1]
81             searchforlen = len(searchfor)
82             for p2 in pkgs.packages.keys():
83                 if p2[0:searchforlen] == searchfor:
84                     depends.append(p2)
85                     break # any one will do.
86         else:
87             if not p1 in depends:
88                 depends.append(p1)
89                 if not add_depends(p1): return 0
90     return 1
91
92 def get_target_in_subfeeds (subfeeds, target, package):
93     for regex, (match_group, sub_target) in subfeeds.items():
94         if match_group:
95             m = re.match (regex, package)
96             if m:
97                 sub_target_extra_qualifier = m.group(1)
98                 return os.path.join (target, sub_target % (sub_target_extra_qualifier))
99         else:
100             if re.match (regex, package):
101               return os.path.join (target, sub_target)
102     return target
103
104 packages = pkgs.packages.keys()
105 packages.sort()
106
107 subfeeds = {".*-dev(_.*)?":(False, "dev"),".*-locale-(.*)(_.*)?":(True, "locale/%s"), ".*-doc(_.*)?":(False, "doc")}
108
109 for p in packages:
110     depends = []
111     if not add_depends(p):
112         print "#   dropping %s" % p
113         print "#  ",pkgs.packages[p].maintainer
114         continue
115     if verbose: print '# package:',p,' depends on:', depends
116
117     x = p.startswith('gpe-')
118     x += p.startswith('gconv-')
119     x += p.startswith('gtk')
120     x += p.startswith('xserver')        
121     x += 'libx11-6' in depends
122     x += 'gtk+' in depends
123     x += 'xserver' in depends
124
125     o = p.startswith('opie')
126     o += p.startswith('qt')
127     o += p.startswith('qp')
128     o += 'libqte1' in depends
129     o += 'libqte2' in depends
130     o += 'libqpe1' in depends
131
132     if x:
133         tofn  = get_target_in_subfeeds (subfeeds, xfeed, p)
134     elif o:
135         tofn = get_target_in_subfeeds (subfeeds, ofeed, p)
136     else:
137         tofn  = get_target_in_subfeeds (subfeeds, basefeed, p)
138
139
140     fromfn = os.path.join(packagedir, pkgs.packages[p].filename)
141     tofn = os.path.join(tofn, pkgs.packages[p].filename)
142     fromstat = os.stat(fromfn)
143
144     try:
145         tostat = os.stat(tofn)
146     except:
147         tostat = None
148
149     if 0 or (not tostat or tostat[stat.ST_SIZE] != fromstat[stat.ST_SIZE] or
150         tostat[stat.ST_MTIME] != fromstat[stat.ST_MTIME]):
151         print "mkdir -p `dirname %s`" % (tofn)
152         print "cp -af ",fromfn,tofn