File: merge_package_lists

package info (click to toggle)
debian-cd 3.2.3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 10,848 kB
  • sloc: sh: 6,129; perl: 4,129; makefile: 413
file content (233 lines) | stat: -rwxr-xr-x 7,869 bytes parent folder | download | duplicates (2)
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