Intercept reads to CR0, CR3, CR4 and writes to CR0, CR3, CR4, and CR8.
[freebsd-src/fkvm-freebsd.git] / release / scripts / package-split.py
blob6eb5953f40cc64b269fc94ecef2575aa925526bf
1 #!/usr/local/bin/python
3 # This script generates a master INDEX file for the CD images built by the
4 # FreeBSD release engineers. Each disc is given a list of desired packages.
5 # Dependencies of these packages are placed on either the same disc or an
6 # earlier disc. The resulting master INDEX file is then written out.
8 # Usage: package-split.py <INDEX> <master INDEX>
10 # $FreeBSD$
12 import os
13 import sys
15 try:
16 arch = os.environ["PKG_ARCH"]
17 except:
18 arch = os.uname()[4]
19 print "Using arch %s" % (arch)
21 if 'PKG_VERBOSE' in os.environ:
22 verbose = 1
23 else:
24 verbose = 0
26 # List of packages for disc1. This just includes packages sysinstall can
27 # install as a distribution
28 def disc1_packages():
29 pkgs = ['lang/perl5.8']
30 pkgs.extend(['x11/xorg',
31 'devel/imake'])
32 if arch == 'i386':
33 pkgs.append('emulators/linux_base-fc4')
34 return pkgs
36 # List of packages for disc2. This includes packages that the X desktop
37 # menu depends on (if it still exists) and other "nice to have" packages.
38 # For architectures that use a separate livefs, this is actually disc3.
39 def disc2_packages():
40 # X Desktops
41 if arch == 'ia64':
42 pkgs = ['x11/gnome2-lite',
43 'x11/kde-lite']
44 else:
45 pkgs = ['x11/gnome2',
46 'x11/kde3']
47 pkgs.extend(['x11-wm/afterstep',
48 'x11-wm/windowmaker',
49 'x11-wm/fvwm2',
50 # "Nice to have"
51 'archivers/unzip',
52 'astro/xearth',
53 'devel/gmake',
54 'editors/emacs',
55 'editors/vim-lite',
56 'emulators/mtools',
57 'graphics/png',
58 'graphics/xv',
59 'irc/xchat',
60 'mail/exim',
61 'mail/fetchmail',
62 'mail/mutt',
63 'mail/pine4',
64 'mail/popd',
65 'mail/xfmail',
66 'mail/postfix',
67 'net/cvsup-without-gui',
68 'net/rsync',
69 'net/samba3',
70 'news/slrn',
71 'news/tin',
72 'ports-mgmt/portupgrade',
73 'print/a2ps-letter',
74 'print/apsfilter',
75 'print/ghostscript-gnu-nox11',
76 'print/gv',
77 'print/psutils-letter',
78 'shells/bash',
79 'shells/pdksh',
80 'shells/zsh',
81 'security/sudo',
82 'www/links',
83 'www/lynx',
84 'x11/rxvt',
85 # Formerly on disc3
86 'ports-mgmt/portaudit'])
87 return pkgs
89 # The list of desired packages
90 def desired_packages():
91 disc1 = disc1_packages()
92 disc2 = disc2_packages()
93 return [disc1, disc2]
95 # Suck the entire INDEX file into a two different dictionaries. The first
96 # dictionary maps port names (origins) to package names. The second
97 # dictionary maps a package name to a list of its dependent packages.
98 PACKAGE_COL=0
99 ORIGIN_COL=1
100 DEPENDS_COL=8
102 def load_index(index):
103 deps = {}
104 pkgs = {}
105 line_num = 1
106 for line in index:
107 fields = line.split('|')
108 name = fields[PACKAGE_COL]
109 if name in deps:
110 sys.stderr.write('%d: Duplicate package %s\n' % (line_num, name))
111 sys.exit(1)
112 origin = fields[ORIGIN_COL].replace('/usr/ports/', '', 1)
113 if origin in pkgs:
114 sys.stderr.write('%d: Duplicate port %s\n' % (line_num, origin))
115 sys.exit(1)
116 deps[name] = fields[DEPENDS_COL].split()
117 pkgs[origin] = name
118 line_num = line_num + 1
119 return (deps, pkgs)
121 # Layout the packages on the various CD images. Here's how it works. We walk
122 # each disc in the list of discs. Within each disc we walk the list of ports.
123 # For each port, we add the package name to a dictionary with the value being
124 # the current disc number. We also add all of the dependent packages. If
125 # a package is already in the dictionary when we go to add it, we just leave
126 # the dictionary as it is. This means that each package ends up on the first
127 # disc that either lists it or contains it as a dependency.
128 def layout_discs(discs, pkgs, deps):
129 disc_num = 1
130 layout = {}
131 for disc in discs:
132 for port in disc:
133 if port not in pkgs:
134 sys.stderr.write('Disc %d: Unable to find package for %s\n' %
135 (disc_num, port))
136 continue
137 pkg = pkgs[port]
138 pkg_list = [pkg] + deps[pkg]
139 for pkg in pkg_list:
140 if pkg not in layout:
141 if verbose:
142 print "--> Adding %s to Disc %d" % (pkg, disc_num)
143 layout[pkg] = disc_num
144 disc_num = disc_num + 1
145 return layout
147 # Generate a master INDEX file based on the generated layout. The way this
148 # works is that for each INDEX line, we check to see if the package is in the
149 # layout. If it is, we put that INDEX line into the master INDEX and append
150 # a new field with the disc number to the line.
151 def generate_index(index, layout, master_index):
152 for line in index:
153 pkg = line.split('|')[PACKAGE_COL]
154 if pkg in layout:
155 new_line = '%s|%d\n' % (line.splitlines()[0], layout[pkg])
156 master_index.write(new_line)
158 # Verify the command line arguments
159 if len(sys.argv) != 3:
160 sys.stderr.write('Invalid number of arguments\n')
161 sys.stderr.write('Usage: package-split.py <source INDEX> <master INDEX>\n')
162 sys.exit(1)
164 print "Loading %s..." % (sys.argv[1])
165 index = file(sys.argv[1])
166 (deps, pkgs) = load_index(index)
167 discs = desired_packages()
168 layout = layout_discs(discs, pkgs, deps)
169 index.seek(0)
170 print "Generating %s..." % (sys.argv[2])
171 master_index = file(sys.argv[2], 'w')
172 generate_index(index, layout, master_index)
173 index.close()
174 master_index.close()