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