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