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>
16 arch
= os
.environ
["PKG_ARCH"]
19 print "Using arch %s" % (arch
)
21 if 'PKG_VERBOSE' in os
.environ
:
26 # List of packages for disc1. This just includes packages sysinstall can
27 # install as a distribution
29 pkgs
= ['lang/perl5.8']
30 pkgs
.extend(['x11/xorg',
33 pkgs
.append('emulators/linux_base-fc4')
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.
42 pkgs
= ['x11/gnome2-lite',
47 pkgs
.extend(['x11-wm/afterstep',
67 'net/cvsup-without-gui',
72 'ports-mgmt/portupgrade',
75 'print/ghostscript-gnu-nox11',
77 'print/psutils-letter',
86 'ports-mgmt/portaudit'])
89 # The list of desired packages
90 def desired_packages():
91 disc1
= disc1_packages()
92 disc2
= disc2_packages()
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.
102 def load_index(index
):
107 fields
= line
.split('|')
108 name
= fields
[PACKAGE_COL
]
110 sys
.stderr
.write('%d: Duplicate package %s\n' % (line_num
, name
))
112 origin
= fields
[ORIGIN_COL
].replace('/usr/ports/', '', 1)
114 sys
.stderr
.write('%d: Duplicate port %s\n' % (line_num
, origin
))
116 deps
[name
] = fields
[DEPENDS_COL
].split()
118 line_num
= line_num
+ 1
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
):
134 sys
.stderr
.write('Disc %d: Unable to find package for %s\n' %
138 pkg_list
= [pkg
] + deps
[pkg
]
140 if pkg
not in layout
:
142 print "--> Adding %s to Disc %d" % (pkg
, disc_num
)
143 layout
[pkg
] = disc_num
144 disc_num
= disc_num
+ 1
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
):
153 pkg
= line
.split('|')[PACKAGE_COL
]
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')
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
)
170 print "Generating %s..." % (sys
.argv
[2])
171 master_index
= file(sys
.argv
[2], 'w')
172 generate_index(index
, layout
, master_index
)