]> git.decadent.org.uk Git - dak.git/blob - config/debian/dinstall.functions
autodecruft: Make function look a bit nicer.
[dak.git] / config / debian / dinstall.functions
1 # -*- mode:sh -*-
2 # Timestamp. Used for dinstall stat graphs
3 function ts() {
4         echo "Archive maintenance timestamp ($1): $(date +%H:%M:%S)"
5 }
6
7 # Remove daily lock
8 function remove_daily_lock() {
9     rm -f $LOCK_DAILY
10 }
11
12 # Remove changelog lock
13 function remove_changelog_lock() {
14     rm -f $LOCK_CHANGELOG
15 }
16
17 # Remove all locks
18 function remove_all_locks() {
19     rm -f $LOCK_DAILY $LOCK_ACCEPTED
20 }
21
22 # If we error out this one is called, *FOLLOWED* by cleanup above
23 function onerror() {
24     ERRDATE=$(date "+%Y.%m.%d-%H:%M:%S")
25
26     subject="ATTENTION ATTENTION!"
27     if [ "${error}" = "false" ]; then
28         subject="${subject} (continued)"
29     else
30         subject="${subject} (interrupted)"
31     fi
32     subject="${subject} dinstall error at ${ERRDATE} in ${STAGEFILE} - (Be quiet, Brain, or I'll stab you with a Q-tip)"
33
34     if [ -r "${STAGEFILE}.log" ]; then
35         cat "${STAGEFILE}.log"
36     else
37         echo "file ${STAGEFILE}.log does not exist, sorry"
38     fi | mail -s "${subject}" -a "X-Debian: DAK" -a "From: Debian FTP Masters <ftpmaster@ftp-master.debian.org>" cron@ftp-master.debian.org
39 }
40
41 ########################################################################
42 # the actual dinstall functions follow                                 #
43 ########################################################################
44
45 # pushing merkels QA user, part one
46 function qa1() {
47     log "Telling QA user that we start dinstall"
48     ssh -2 -i ~dak/.ssh/push_merkel_qa  -o BatchMode=yes -o SetupTimeOut=90 -o ConnectTimeout=90 qa@qa.debian.org sleep 1
49 }
50
51 # Updating various files
52 function updates() {
53     log "Updating Bugs docu, Mirror list and mailing-lists.txt"
54     cd $configdir
55     $scriptsdir/update-bugdoctxt
56     $scriptsdir/update-mirrorlists
57     $scriptsdir/update-mailingliststxt
58     $scriptsdir/update-pseudopackages.sh
59 }
60
61 # The first i18n one, syncing new descriptions
62 function i18n1() {
63     log "Synchronizing i18n package descriptions"
64     # First sync their newest data
65     cd ${scriptdir}/i18nsync
66     rsync -aq --delete --delete-after ddtp-sync:/does/not/matter . || true
67
68     # Now check if we still know about the packages for which they created the files
69     # is the timestamp signed by us?
70     if $(gpgv --keyring /srv/ftp-master.debian.org/s3kr1t/dot-gnupg/pubring.gpg timestamp.gpg timestamp); then
71         # now read it. As its signed by us we are sure the content is what we expect, no need
72         # to do more here. And we only test -d a directory on it anyway.
73         TSTAMP=$(cat timestamp)
74         # do we have the dir still?
75         if [ -d ${scriptdir}/i18n/${TSTAMP} ]; then
76             # Lets check!
77             if ${scriptsdir}/ddtp-i18n-check.sh . ${scriptdir}/i18n/${TSTAMP}; then
78                 # Yay, worked, lets copy around
79                 for dir in stretch sid; do
80                     if [ -d dists/${dir}/ ]; then
81                         cd dists/${dir}/main/i18n
82                         rsync -aq --delete --delete-after --exclude Translation-en.bz2 --exclude Translation-*.diff/ . ${ftpdir}/dists/${dir}/main/i18n/.
83                     fi
84                     cd ${scriptdir}/i18nsync
85                 done
86             else
87                 echo "ARRRR, bad guys, wrong files, ARRR"
88                 echo "Arf, Arf, Arf, bad guys, wrong files, arf, arf, arf" | mail -a "X-Debian: DAK" -s "Don't you kids take anything. I'm watching you. I've got eye implants in the back of my head." -a "From: Debian FTP Masters <ftpmaster@ftp-master.debian.org>" debian-l10n-devel@lists.alioth.debian.org
89             fi
90         else
91             echo "ARRRR, missing the timestamp ${TSTAMP} directory, not updating i18n, ARRR"
92             echo "Arf, Arf, Arf, missing the timestamp ${TSTAMP} directory, not updating i18n, arf, arf, arf" | mail -a "X-Debian: DAK" -s "Lisa, if you don't like your job you don't strike. You just go in every day and do it really half-assed. That's the American way." -a "From: Debian FTP Masters <ftpmaster@ftp-master.debian.org>" debian-l10n-devel@lists.alioth.debian.org
93         fi
94     else
95         echo "ARRRRRRR, could not verify our timestamp signature, ARRR. Don't mess with our files, i18n guys, ARRRRR."
96         echo "Arf, Arf, Arf, could not verify our timestamp signature, arf. Don't mess with our files, i18n guys, arf, arf, arf" | mail -a "X-Debian: DAK" -s "You can't keep blaming yourself. Just blame yourself once, and move on." -a "From: Debian FTP Masters <ftpmaster@ftp-master.debian.org>" debian-l10n-devel@lists.alioth.debian.org
97     fi
98 }
99
100 function cruft() {
101     log "Checking for cruft in overrides"
102     dak check-overrides
103 }
104
105 function dominate() {
106     log "Removing obsolete source and binary associations"
107     dak dominate
108 }
109
110 function autocruft() {
111     log "Check for obsolete binary packages"
112     local suites=${1:-"unstable experimental"}
113     # Initially only run with -n and output into a file, to check.
114     local dstamp=$(date -u +"%Y-%m-%d_%H:%M")
115     local report=${webdir}/auto-cruft-report_${dstamp}.txt
116     echo "Report for ${dstamp}" > ${report}
117     for suite in ${suites}; do
118         dak auto-decruft -n -s ${suite} >> ${report}
119     done
120     cat ${report} | mail -a "X-Debian: DAK" -e -s "Debian archive AUTOMATIC cruft report for ${dstamp}" -a "From: Debian FTP Masters <ftpmaster@ftp-master.debian.org>" -c niels@thykier.net ftpmaster@ftp-master.debian.org
121 }
122
123 function fingerprints() {
124     log "Updating fingerprints"
125     dak import-keyring -L /srv/keyring.debian.org/keyrings/debian-keyring.gpg
126
127     OUTFILE=$(mktemp)
128     dak import-keyring --generate-users "%s" /srv/keyring.debian.org/keyrings/debian-maintainers.gpg >"${OUTFILE}"
129
130     if [ -s "${OUTFILE}" ]; then
131         /usr/sbin/sendmail -odq -oi -t -f envelope@ftp-master.debian.org <<EOF
132 From: Debian FTP Masters <ftpmaster@ftp-master.debian.org>
133 To: <debian-project@lists.debian.org>
134 Subject: Debian Maintainers Keyring changes
135 Content-Type: text/plain; charset=utf-8
136 X-Debian: DAK
137 MIME-Version: 1.0
138
139 The following changes to the debian-maintainers keyring have just been activated:
140
141 $(cat $OUTFILE)
142
143 Debian distribution maintenance software,
144 on behalf of the Keyring maintainers
145
146 EOF
147     fi
148     rm -f "$OUTFILE"
149 }
150
151 function overrides() {
152     log "Writing overrides into text files"
153     cd $overridedir
154     dak make-overrides
155 }
156
157 function mpfm() {
158     local archiveroot
159
160     log "Generating package / file mapping"
161     for archive in "${public_archives[@]}"; do
162         archiveroot="$(get_archiveroot "${archive}")"
163         dak make-pkg-file-mapping "${archive}" | bzip2 -9 > "${archiveroot}/indices/package-file.map.bz2"
164     done
165 }
166
167 function packages() {
168     log "Generating Packages and Sources files"
169     for archive in "${public_archives[@]}"; do
170         log "  Generating Packages/Sources for ${archive}"
171         dak generate-packages-sources2 -a "${archive}"
172         log "  Generating Contents for ${archive}"
173         dak contents generate -a "${archive}"
174     done
175 }
176
177 function pdiff() {
178     log "Generating pdiff files"
179     dak generate-index-diffs
180 }
181
182 function release() {
183     log "Generating Release files"
184     for archive in "${public_archives[@]}"; do
185         dak generate-releases -a "${archive}"
186     done
187 }
188
189 function dakcleanup() {
190     log "Cleanup old packages/files"
191     dak clean-suites -m 10000
192     dak clean-queues -i "$unchecked"
193 }
194
195 function mklslar() {
196     local archiveroot
197     local FILENAME=ls-lR
198
199     for archive in "${public_archives[@]}"; do
200         archiveroot="$(get_archiveroot "${archive}")"
201         cd "${archiveroot}"
202
203         log "Removing any core files ..."
204         find -type f -name core -print -delete
205
206         log "Checking symlinks ..."
207         symlinks -rd .
208
209         log "Creating recursive directory listing ... "
210         rm -f ${FILENAME}.gz
211         TZ=UTC ls -lR | gzip -9c --rsyncable > ${FILENAME}.gz
212     done
213 }
214
215 function mkmaintainers() {
216     local archiveroot
217     local indices
218
219     log 'Creating Maintainers index ... '
220
221     for archive in "${public_archives[@]}"; do
222         archiveroot="$(get_archiveroot "${archive}")"
223         indices="${archiveroot}/indices"
224         if ! [ -d "${indices}" ]; then
225             mkdir "${indices}"
226         fi
227         cd "${indices}"
228
229         dak make-maintainers -a "${archive}" ${scriptdir}/masterfiles/pseudo-packages.maintainers
230         gzip -9v --rsyncable <Maintainers >Maintainers.gz
231         gzip -9v --rsyncable <Uploaders >Uploaders.gz
232     done
233 }
234
235 function copyoverrides() {
236     log 'Copying override files into public view ...'
237
238     for ofile in ${overridedir}/override.{squeeze,wheezy,jessie,stretch,sid}.{,extra.}{main,contrib,non-free}*; do
239         bname=${ofile##*/}
240         gzip -9cv --rsyncable ${ofile} > ${indices}/${bname}.gz
241         chmod g+w ${indices}/${bname}.gz
242     done
243 }
244
245 function mkfilesindices() {
246     set +o pipefail
247     umask 002
248     cd $base/ftp/indices/files/components
249
250     ARCHLIST=$(tempfile)
251
252     log "Querying postgres"
253     local query="
254       SELECT './pool/' || c.name || '/' || f.filename AS path, a.arch_string AS arch_string
255       FROM files f
256       JOIN files_archive_map af ON f.id = af.file_id
257       JOIN component c ON af.component_id = c.id
258       JOIN archive ON af.archive_id = archive.id
259       LEFT OUTER JOIN
260         (binaries b
261          JOIN architecture a ON b.architecture = a.id)
262         ON f.id = b.file
263       WHERE archive.name = 'ftp-master'
264       ORDER BY path, arch_string
265     "
266     psql -At -c "$query" >$ARCHLIST
267
268     includedirs () {
269         perl -ne 'print; while (m,/[^/]+$,) { $_=$`; print $_ . "\n" unless $d{$_}++; }'
270     }
271     poolfirst () {
272         perl -e '@nonpool=(); while (<>) { if (m,^\./pool/,) { print; } else { push @nonpool, $_; } } print for (@nonpool);'
273     }
274
275     log "Generating sources list"
276     (
277         sed -n 's/|$//p' $ARCHLIST
278         cd $base/ftp
279         find ./dists -maxdepth 1 \! -type d
280         find ./dists \! -type d | grep "/source/"
281     ) | sort -u | gzip -9 > source.list.gz
282
283     log "Generating arch lists"
284
285     ARCHES=$( (<$ARCHLIST sed -n 's/^.*|//p'; echo amd64) | grep . | grep -v all | sort -u)
286     for a in $ARCHES; do
287         (sed -n "s/|$a$//p" $ARCHLIST
288             sed -n 's/|all$//p' $ARCHLIST
289
290             cd $base/ftp
291             find ./dists -maxdepth 1 \! -type d
292             find ./dists \! -type d | grep -E "(proposed-updates.*_$a.changes$|/main/disks-$a/|/main/installer-$a/|/Contents-$a|/binary-$a/)"
293         ) | sort -u | gzip -9 > arch-$a.list.gz
294     done
295
296     log "Generating suite lists"
297
298     suite_list () {
299         local suite_id="$(printf %d $1)"
300         local query
301         query="
302           SELECT DISTINCT './pool/' || c.name || '/' || f.filename
303           FROM
304             (SELECT sa.source AS source
305                FROM src_associations sa
306               WHERE sa.suite = $suite_id
307              UNION
308              SELECT esr.src_id
309                FROM extra_src_references esr
310                JOIN bin_associations ba ON esr.bin_id = ba.bin
311                WHERE ba.suite = $suite_id
312              UNION
313              SELECT b.source AS source
314                FROM bin_associations ba
315                JOIN binaries b ON ba.bin = b.id WHERE ba.suite = $suite_id) s
316             JOIN dsc_files df ON s.source = df.source
317             JOIN files f ON df.file = f.id
318             JOIN files_archive_map af ON f.id = af.file_id
319             JOIN component c ON af.component_id = c.id
320             JOIN archive ON af.archive_id = archive.id
321             WHERE archive.name = 'ftp-master'
322         "
323         psql -F' ' -A -t -c "$query"
324
325         query="
326           SELECT './pool/' || c.name || '/' || f.filename
327           FROM bin_associations ba
328           JOIN binaries b ON ba.bin = b.id
329           JOIN files f ON b.file = f.id
330           JOIN files_archive_map af ON f.id = af.file_id
331           JOIN component c ON af.component_id = c.id
332           JOIN archive ON af.archive_id = archive.id
333           WHERE ba.suite = $suite_id AND archive.name = 'ftp-master'
334         "
335         psql -F' ' -A -t -c "$query"
336     }
337
338     psql -F' ' -At -c "SELECT id, suite_name FROM suite" |
339     while read id suite; do
340         [ -e $base/ftp/dists/$suite ] || continue
341         (
342             (cd $base/ftp
343                 distname=$(cd dists; readlink $suite || echo $suite)
344                 find ./dists/$distname \! -type d
345                 for distdir in ./dists/*; do
346                     [ "$(readlink $distdir)" != "$distname" ] || echo $distdir
347                 done
348             )
349             suite_list $id
350         ) | sort -u | gzip -9 > suite-${suite}.list.gz
351     done
352
353     log "Finding everything on the ftp site to generate sundries"
354     (cd $base/ftp; find . \! -type d \! -name 'Archive_Maintenance_In_Progress' | sort) >$ARCHLIST
355
356     rm -f sundries.list
357     zcat *.list.gz | cat - *.list | sort -u |
358     diff - $ARCHLIST | sed -n 's/^> //p' > sundries.list
359
360     log "Generating files list"
361
362     for a in $ARCHES; do
363         (echo ./project/trace; zcat arch-$a.list.gz source.list.gz) |
364         cat - sundries.list dists.list project.list docs.list indices.list |
365         sort -u | poolfirst > ../arch-$a.files
366     done
367
368     (cd $base/ftp/
369             for dist in sid jessie stretch; do
370                     find ./dists/$dist/main/i18n/ \! -type d | sort -u | gzip -9 > $base/ftp/indices/files/components/translation-$dist.list.gz
371             done
372     )
373
374     (cat ../arch-i386.files ../arch-amd64.files; zcat suite-proposed-updates.list.gz ; zcat translation-sid.list.gz ; zcat translation-jessie.list.gz ; zcat translation-stretch.list.gz) |
375     sort -u | poolfirst > ../typical.files
376
377     rm -f $ARCHLIST
378     log "Done!"
379     set -o pipefail
380 }
381
382 function mkchecksums() {
383     local archiveroot dsynclist md5list
384
385     for archive in "${public_archives[@]}"; do
386         archiveroot="$(get_archiveroot "${archive}")"
387         dsynclist=$dbdir/dsync.${archive}.list
388         md5list=${archiveroot}/indices/md5sums
389
390         log -n "Creating md5 / dsync index file for ${archive}... "
391
392         cd "$archiveroot"
393         ${bindir}/dsync-flist -q generate $dsynclist --exclude $dsynclist --md5
394         ${bindir}/dsync-flist -q md5sums $dsynclist | gzip -9n > ${md5list}.gz
395         ${bindir}/dsync-flist -q link-dups $dsynclist || true
396     done
397 }
398
399 function mirror() {
400     local archiveroot mirrordir
401
402     log "Regenerating \"public\" mirror/ hardlink fun"
403     DATE_SERIAL=$(date +"%Y%m%d01")
404     FILESOAPLUS1=$(awk '/serial/ { print $3+1 }' ${TRACEFILE} )
405     if [ "$DATE_SERIAL" -gt "$FILESOAPLUS1" ]; then
406         SERIAL="$DATE_SERIAL"
407     else
408         SERIAL="$FILESOAPLUS1"
409     fi
410     date -u > ${TRACEFILE}
411     echo "Using dak v1" >> ${TRACEFILE}
412     echo "Running on host: $(hostname -f)" >> ${TRACEFILE}
413     echo "Archive serial: ${SERIAL}" >> ${TRACEFILE}
414
415     # Ugly "hack", but hey, it does what we want.
416     cp ${TRACEFILE} ${TRACEFILE_BDO}
417
418     for archive in "${public_archives[@]}"; do
419         archiveroot="$(get_archiveroot "${archive}")"
420         mirrordir="${archiveroot}/../mirror"
421         cd ${mirrordir}
422         rsync -aH --link-dest ${archiveroot} --delete --delete-after --delete-excluded --exclude Packages.*.new --exclude Sources.*.new  --ignore-errors ${archiveroot}/. .
423     done
424 }
425
426 function expire() {
427     log "Expiring old database dumps..."
428     cd $base/backup
429     $scriptsdir/expire_dumps -d . -p -f "dump_*"
430 }
431
432 function transitionsclean() {
433     log "Removing out of date transitions..."
434     cd $base
435     dak transitions -c -a
436 }
437
438 function dm() {
439     log "Updating DM permissions page"
440     dak acl export-per-source dm >$exportdir/dm.txt
441 }
442
443 function bts() {
444     log "Categorizing uncategorized bugs filed against ftp.debian.org"
445     sudo -u dak-unpriv dak bts-categorize
446 }
447
448 function ddaccess() {
449     # Tell our dd accessible mirror to sync itself up. Including ftp dir.
450     log "Trigger dd accessible parts sync including ftp dir"
451     ${scriptsdir}/sync-dd dd-sync dd-sync1 dd-sync2 sync
452 }
453
454 function mirrorpush() {
455     log "Checking the public archive copy"
456     cd ${mirrordir}/dists
457
458     broken=0
459     for release in $(find . -name "InRelease"); do
460         echo "Processing: ${release}"
461         subdir=${release%/InRelease}
462         while read SHASUM SIZE NAME; do
463             if ! [ -f "${subdir}/${NAME}" ]; then
464                bname=$(basename ${NAME})
465                 if [[ "${bname}" =~ ^(Packages|Sources|Translation-[a-zA-Z_]+)$ ]]; then
466                     # We don't keep unpacked files, don't check for their existance.
467                     # We might want to go and check their unpacked shasum, but right now
468                     # I don't care. I believe it should be enough if all the packed shasums
469                     # match.
470                     continue
471                 fi
472                 broken=$(( broken + 1 ))
473                 echo "File ${subdir}/${NAME} is missing"
474                 continue
475             fi
476
477            # We do have symlinks in the tree (see the contents files currently).
478            # So we use "readlink -f" to check the size of the target, as thats basically
479            # what gen-releases does
480             fsize=$(stat -c %s $(readlink -f "${subdir}/${NAME}"))
481             if [ ${fsize} -ne ${SIZE} ]; then
482                 broken=$(( broken + 1 ))
483                 echo "File ${subdir}/${NAME} has size ${fsize}, expected is ${SIZE}"
484                 continue
485             fi
486
487             fshasum=$(sha1sum $(readlink -f "${subdir}/${NAME}"))
488             fshasum=${fshasum%% *}
489             if [ "${fshasum}" != "${SHASUM}" ]; then
490                 broken=$(( broken + 1 ))
491                 echo "File ${subdir}/${NAME} has checksum ${fshasum}, expected is ${SHASUM}"
492                 continue
493             fi
494         done < <(sed '1,/SHA1:/d' "${release}" | sed '/SHA256:/,$d')
495     done
496
497     if [ $broken -gt 0 ]; then
498         log_error "Trouble with the public mirror, found ${broken} errors"
499         return 21
500     fi
501
502     log "Starting the mirrorpush"
503     date -u > /srv/ftp.debian.org/web/mirrorstart
504     echo "Using dak v1" >> /srv/ftp.debian.org/web/mirrorstart
505     echo "Running on host $(hostname -f)" >> /srv/ftp.debian.org/web/mirrorstart
506     sudo -H -u archvsync /home/archvsync/runmirrors > ~dak/runmirrors.log 2>&1 &
507     sudo -H -u archvsync /home/archvsync/runmirrors -a backports > ~dak/runmirrorsbpo.log 2>&1 &
508 }
509
510 function mirrorpush-backports() {
511     log "Syncing backports mirror"
512     sudo -u backports /home/backports/bin/update-archive
513 }
514
515 function i18n2() {
516     log "Exporting package data foo for i18n project"
517     STAMP=$(date "+%Y%m%d%H%M")
518     mkdir -p ${scriptdir}/i18n/${STAMP}
519     cd ${scriptdir}/i18n/${STAMP}
520     for suite in stable testing unstable; do
521         codename=$(dak admin s show ${suite}|grep '^Codename')
522         codename=${codename##* }
523         echo "Codename is ${codename}"
524         dak control-suite -l ${suite} >${codename}
525     done
526     echo "${STAMP}" > timestamp
527     gpg --secret-keyring /srv/ftp-master.debian.org/s3kr1t/dot-gnupg/secring.gpg --keyring /srv/ftp-master.debian.org/s3kr1t/dot-gnupg/pubring.gpg --no-options --batch --no-tty --armour --default-key 473041FA --detach-sign -o timestamp.gpg timestamp
528     rm -f md5sum
529     md5sum * > md5sum
530     cd ${webdir}/
531     ln -sfT ${scriptdir}/i18n/${STAMP} i18n
532
533     cd ${scriptdir}
534     find ./i18n -mindepth 1 -maxdepth 1 -mtime +2 -not -name "${STAMP}" -type d -print0 | xargs --no-run-if-empty -0 rm -rf
535 }
536
537 function stats() {
538     log "Updating stats data"
539     cd $configdir
540     $scriptsdir/update-ftpstats $base/log/* > $base/misc/ftpstats.data
541     R --slave --vanilla < $base/misc/ftpstats.R
542     dak stats arch-space > $webdir/arch-space
543     dak stats pkg-nums > $webdir/pkg-nums
544 }
545
546 function cleantransactions() {
547     log "Cleanup transaction ids older than 3 months"
548     cd $base/backup/
549     find -maxdepth 1 -mindepth 1 -type f -name 'txid_*' -mtime +90 -print0 | xargs -0 --no-run-if-empty rm
550 }
551
552 function logstats() {
553     $masterdir/tools/logs.py "$1"
554 }
555
556 # save timestamp when we start
557 function savetimestamp() {
558         NOW=`date "+%Y.%m.%d-%H:%M:%S"`
559         echo ${NOW} > "${dbdir}/dinstallstart"
560 }
561
562 function maillogfile() {
563     cat "$LOGFILE" | mail -a "X-Debian: DAK" -s "Log for dinstall run of ${NOW}" -a "From: Debian FTP Masters <ftpmaster@ftp-master.debian.org>" cron@ftp-master.debian.org
564 }
565
566 function renamelogfile() {
567     if [ -f "${dbdir}/dinstallstart" ]; then
568         NOW=$(cat "${dbdir}/dinstallstart")
569 #        maillogfile
570         mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
571         logstats "$logdir/dinstall_${NOW}.log"
572         bzip2 -9 "$logdir/dinstall_${NOW}.log"
573     else
574         error "Problem, I don't know when dinstall started, unable to do log statistics."
575         NOW=`date "+%Y.%m.%d-%H:%M:%S"`
576 #        maillogfile
577         mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
578         bzip2 -9 "$logdir/dinstall_${NOW}.log"
579     fi
580 }
581
582 function testingsourcelist() {
583     dak ls -s testing -f heidi -r .| egrep 'source$' > ${webdir}/testing.list
584 }
585
586 # do a last run of process-unchecked before dinstall is on.
587 function process_unchecked() {
588     log "Processing the unchecked queue"
589     UNCHECKED_WITHOUT_LOCK="-p"
590     do_unchecked
591     sync_debbugs
592 }
593
594 # Function to update a "statefile" telling people what we are doing
595 # (more or less).
596 #
597 # This should be called with the argument(s)
598 #  - Status name we want to show.
599 #
600 function state() {
601     RIGHTNOW="$(date -u +"%a %b %d %T %Z %Y (%s)")"
602     cat >"${DINSTALLSTATE}" <<EOF
603 Dinstall start: ${DINSTALLBEGIN}
604 Current action: ${1}
605 Action start: ${RIGHTNOW}
606 EOF
607 }
608
609 # extract changelogs and stuff
610 function changelogs() {
611     if lockfile -r3 $LOCK_CHANGELOG; then
612         log "Extracting changelogs"
613         dak make-changelog -e -a ftp-master
614         [ -f ${exportdir}/changelogs/filelist.yaml ] && xz -f ${exportdir}/changelogs/filelist.yaml
615         mkdir -p ${exportpublic}/changelogs
616         cd ${exportpublic}/changelogs
617         rsync -aHW --delete --delete-after --ignore-errors ${exportdir}/changelogs/. .
618         sudo -H -u staticsync /usr/local/bin/static-update-component metadata.ftp-master.debian.org >/dev/null 2>&1 &
619
620         dak make-changelog -e -a backports
621         [ -f /srv/backports-master.debian.org/export/changelogs/filelist.yaml ] && xz -f /srv/backports-master.debian.org/export/changelogs/filelist.yaml
622         mkdir -p /srv/backports-master.debian.org/rsync/export/changelogs
623         cd /srv/backports-master.debian.org/rsync/export/changelogs
624         rsync -aHW --delete --delete-after --ignore-errors /srv/backports-master.debian.org/export/changelogs/. .
625         remove_changelog_lock
626         trap remove_changelog_lock EXIT TERM HUP INT QUIT
627     fi
628 }
629
630 function gitpdiff() {
631     # Might be that we want to change this to have more than one git repository.
632     # Advantage of one is that we do not need much space in terms of storage in git itself,
633     # git gc is pretty good on our input.
634     # But it might be faster. Well, lets test.
635     log "Adjusting the git tree for pdiffs"
636     cd ${dbdir}/git/git/
637
638     # The regex needs the architectures seperated with \|
639     garchs=$(dak admin a list|sed -e ':q;N;s/\n/\\|/g;t q')
640
641     # First, get all the files we want to work on. ../dists/ is a symlink to the real dists/ we
642     # want to work with.
643     # Also, we only want contents, packages and sources.
644     for file in $(find ../dists/ -regex ".*/\(Contents-\($archs\)\|\(Packages\|Sources\)\).gz"); do
645         log "${file}"
646         basen=${file%%.gz};
647         basen=${basen##../};
648         dir=${basen%/*};
649         mkdir -p $dir;
650         zcat $file > $basen;
651     done
652
653     # Second, add all there is into git
654     cd dists
655     git add .
656     # Maybe we want to make this the same for tag and commit? But well, shouldn't matter
657     COMD=$(date  -Is)
658     TAGD=$(date +%Y-%m-%d-%H-%M)
659     git commit -m "Commit of ${COMD}"
660     git tag "${TAGD}"
661  }