1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233
|
#!/bin/sh
#
# merge_package_lists
#
# Quick, hacky script to merge the package lists for multiple arches
# together, with 2 priorities:
#
# 1. keep the ordering of the original files wherever possible
# 2. collect together instances of the same package on multiple arches
#
# expects multiple files containing lines of the form, one arch per file
#
# <arch>:<component>:<pkgname>
#
# and will output similar
#
# The files MUST be passed by filename rather than simply piped in,
# otherwise the ordering constraint will be lost
#
# Things also get quite complicated here due to considering
# source. Depending on how things are being run:
#
# 1. If we're not doing source, life is easy - simply interleave the
# binary packages
# 2. If we're *only* doing source, then we won't be called at all -
# the Makefile will just dump the sources directly into "packages"
# without needing our help
# 3. If we're doing mixed source/binary discs, then we have to work
# quite hard here. We generate the list of sources from the
# binaries given to us. For each binary, we will attempt to place
# its source *first* onto the disc so we can make nice GPL-compliant
# media. However, we also need to check whether or not that source
# has already been placed due to an *earlier* binary package (a
# different binary built from the same source, or the same for
# another arch). To allow us to so that, we need to parse the Sources
# files first to build up the src<->bin relationship. Ick... :-/
#
# An added bit of grot: to make sure that sources are placed first, we
# *temporarily* call the source architecture "aaaaaaaaaaaaaaaaaa" to force
# it to sort first, then replace it woth "source" again later. *grin*
#
# Steve McIntyre <steve@einval.com> 2006, GPL v2
BDIR=$1
ADIR=$2
ARCHES="$3"
OUT="$4"
case "$ARCHES" in
*source*) source=yes;;
*) source=no;;
esac
for ARCH in $ARCHES_NOSRC
do
list="$list $BDIR/packages.$ARCH"
done
echo "# Starting merge at "`date` >> $BDIR/list.mid
if [ $source = "yes" ] ; then
echo "DONEDONE" > $BDIR/DONE
awk -v max_size=$MAX_PKG_SIZE '
# First parse the Sources files
/^Package:/ {
srcname=$2
srcs_done++
}
/^Version:/ {
version=$2
# Cannot cope with : in output
gsub(":", "%", version)
if (srcname in versions) {
versions[srcname]=sprintf("%s:%s", versions[srcname], version)
} else {
versions[srcname] = version
}
next
}
/^Binary:/ {
bins=$0
gsub("^Binary:","",bins)
gsub(",","",bins)
nb=split(bins, binarray)
for (i=1; i <= nb; i++) {
bin2src[binarray[i]] = srcname
bins_done++
}
in_binary = 1
in_files = 0
next
}
/^Files:/ {
in_files = 1
in_binary = 0
next
}
/^ / {
if (in_files) { # Cope with multiple lines of files for source packages
size[srcname]+=$2
sizes[srcname, version]+=$2
next
}
if (in_binary) { # Cope with multi-line Binary: fields
bins=$0
gsub(",","",bins)
nb=split(bins, binarray)
for (i=1; i <= nb; i++) {
bin2src[binarray[i]] = srcname
bins_done++
}
next
}
}
# Done reading the Sources
/^DONEDONE/ {
parsed=1
printf("# Parsed Sources files: %d sources producing %d binaries\n", srcs_done, bins_done)
next
}
# Now start placing source packages, depending on the order of the binary packages
/^./ {
in_files = 0
in_binary = 0
if (parsed) {
num_sources = 0
split($0,fields,":")
arch=fields[1]
component=fields[2]
pkg=fields[3]
pkgsize=fields[4]
srcpkg=bin2src[pkg]
built_using=fields[5]
if ("" != built_using) {
num_sources = split(built_using, sources, ",")
}
if ("" == srcpkg) {
if ("main-installer" == component) {
printf("# Ignoring source for udeb %s\n", pkg)
} else {
printf("# Source for pkg %s is UNKNOWN!\n", pkg)
}
} else {
sources[++num_sources] = srcpkg
}
if (num_sources) {
for(i = 1; i <= num_sources; i++) {
source = sources[i]
if (!included[source]) {
printf("# Adding source %s at %d because of %s:%s (%s)\n",
source, FNR, arch, pkg, (i == num_sources ? "dep" : "b-u"))
included[source] = pkg
incarch[source] = arch
indexnr[source] = FNR
sourcecomp[source] = component
} else {
if (FNR < indexnr[source]) {
printf("# Updating source %s: was due to %d:%s:%s, now moved earlier because of %d:%s:%s (%s)\n",
source, indexnr[source],
incarch[source], included[source],
FNR, arch, pkg, (i == num_sources ? "dep" : "b-u"))
included[source] = pkg
incarch[source] = arch
indexnr[source] = FNR
}
}
}
}
if (size[source] <= max_size) {
# List the binary
printf("%d:%s:%s:%s:%s:<DEFAULT>\n", FNR, arch, component, pkg, pkgsize)
} else {
printf("%d:%s-DEPTOOBIG\n", FNR, $0)
}
}
}
END {
for (source in included) {
if (size[source] > max_size) {
printf("%d:aaaaaaaaaaaaaaaaaa:%s:%s-SRCTOOBIG:%d\n", indexnr[source], sourcecomp[source], source, size[source])
} else {
num_versions = split(versions[source], vers_this, ":")
for(i = 1; i <= num_versions; i++) {
printf("%d:aaaaaaaaaaaaaaaaaa:%s:%s:%d:%s\n", indexnr[source], sourcecomp[source], source, sizes[source, vers_this[i]], vers_this[i])
}
}
}
}' $ADIR/$CODENAME-source/apt-state/lists/*Sources $BDIR/DONE $list | sort -nk 1 -t : >> $BDIR/list.mid
else
# Use "<DEFAULT>" as a version for binaries - it will match up
# later in make_disc_trees.pl
awk -F : '{printf("%d:%s:%s:%s:%s:<DEFAULT>\n", FNR, $1, $2, $3, $4)}' $list | sort -nk 1 -t : >> $BDIR/list.mid
fi
echo "# Ending merge pass 1 at "`date` >> $BDIR/list.mid
# We now have all the files stuck together, with line numbers
# prepended to allow us to shuffle them properly. Remove any comments
# logged from the awk code above, then sort and remove the line numbers
# again
grep -v -e ^# -e TOOBIG $BDIR/list.mid | awk -F : '
{
if (!($4 in add)) {
pkgname[number_packages++] = $4
}
gsub("aaaaaaaaaaaaaaaaaa", "source", $2) # Undo the source sorting hack
gsub("main-installer", "main", $3)
add[$4] = add[$4] $2 ":" $3 ":" $4 ":" $5 ":" $6 " "
}
END {
for (i = 0; i < number_packages; i++) {
gsub(" $", "", add[pkgname[i]])
gsub(" ", "\n", add[pkgname[i]])
print add[pkgname[i]]
}
}' > $OUT
echo "# Ending merge pass 2 at "`date` >> $BDIR/list.mid
awk -F : '
/SRCTOOBIG/ { print $3 }
' $BDIR/list.mid > $BDIR/sourcetoobig
awk -F : '
/DEPTOOBIG/ { print $3 }
' $BDIR/list.mid > $BDIR/sourcetoobig-deps
exit 0
|