]> git.decadent.org.uk Git - dak.git/blob - config/debian/dinstall.functions
dinstall: no longer regenerate buildd queues
[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 jessie 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 mklslar() {
199     local archiveroot
200     local FILENAME=ls-lR
201
202     for archive in "${public_archives[@]}"; do
203         archiveroot="$(get_archiveroot "${archive}")"
204         cd "${archiveroot}"
205
206         log "Removing any core files ..."
207         find -type f -name core -print -delete
208
209         log "Checking symlinks ..."
210         symlinks -rd .
211
212         log "Creating recursive directory listing ... "
213         rm -f ${FILENAME}.gz
214         TZ=UTC ls -lR | gzip -9c --rsyncable > ${FILENAME}.gz
215     done
216 }
217
218 function mkmaintainers() {
219     local archiveroot
220     local indices
221
222     log 'Creating Maintainers index ... '
223
224     for archive in "${public_archives[@]}"; do
225         archiveroot="$(get_archiveroot "${archive}")"
226         indices="${archiveroot}/indices"
227         if ! [ -d "${indices}" ]; then
228             mkdir "${indices}"
229         fi
230         cd "${indices}"
231
232         dak make-maintainers -a "${archive}" ${scriptdir}/masterfiles/pseudo-packages.maintainers
233         gzip -9v --rsyncable <Maintainers >Maintainers.gz
234         gzip -9v --rsyncable <Uploaders >Uploaders.gz
235     done
236 }
237
238 function copyoverrides() {
239     log 'Copying override files into public view ...'
240
241     for ofile in ${overridedir}/override.{squeeze,wheezy,jessie,sid}.{,extra.}{main,contrib,non-free}*; do
242         bname=${ofile##*/}
243         gzip -9cv --rsyncable ${ofile} > ${indices}/${bname}.gz
244         chmod g+w ${indices}/${bname}.gz
245     done
246 }
247
248 function mkfilesindices() {
249     set +o pipefail
250     umask 002
251     cd $base/ftp/indices/files/components
252
253     ARCHLIST=$(tempfile)
254
255     log "Querying postgres"
256     local query="
257       SELECT './pool/' || c.name || '/' || f.filename AS path, a.arch_string AS arch_string
258       FROM files f
259       JOIN files_archive_map af ON f.id = af.file_id
260       JOIN component c ON af.component_id = c.id
261       JOIN archive ON af.archive_id = archive.id
262       LEFT OUTER JOIN
263         (binaries b
264          JOIN architecture a ON b.architecture = a.id)
265         ON f.id = b.file
266       WHERE archive.name = 'ftp-master'
267       ORDER BY path, arch_string
268     "
269     psql -At -c "$query" >$ARCHLIST
270
271     includedirs () {
272         perl -ne 'print; while (m,/[^/]+$,) { $_=$`; print $_ . "\n" unless $d{$_}++; }'
273     }
274     poolfirst () {
275         perl -e '@nonpool=(); while (<>) { if (m,^\./pool/,) { print; } else { push @nonpool, $_; } } print for (@nonpool);'
276     }
277
278     log "Generating sources list"
279     (
280         sed -n 's/|$//p' $ARCHLIST
281         cd $base/ftp
282         find ./dists -maxdepth 1 \! -type d
283         find ./dists \! -type d | grep "/source/"
284     ) | sort -u | gzip -9 > source.list.gz
285
286     log "Generating arch lists"
287
288     ARCHES=$( (<$ARCHLIST sed -n 's/^.*|//p'; echo amd64) | grep . | grep -v all | sort -u)
289     for a in $ARCHES; do
290         (sed -n "s/|$a$//p" $ARCHLIST
291             sed -n 's/|all$//p' $ARCHLIST
292
293             cd $base/ftp
294             find ./dists -maxdepth 1 \! -type d
295             find ./dists \! -type d | grep -E "(proposed-updates.*_$a.changes$|/main/disks-$a/|/main/installer-$a/|/Contents-$a|/binary-$a/)"
296         ) | sort -u | gzip -9 > arch-$a.list.gz
297     done
298
299     log "Generating suite lists"
300
301     suite_list () {
302         local suite_id="$(printf %d $1)"
303         local query
304         query="
305           SELECT DISTINCT './pool/' || c.name || '/' || f.filename
306           FROM
307             (SELECT sa.source AS source
308                FROM src_associations sa
309               WHERE sa.suite = $suite_id
310              UNION
311              SELECT esr.src_id
312                FROM extra_src_references esr
313                JOIN bin_associations ba ON esr.bin_id = ba.bin
314                WHERE ba.suite = $suite_id
315              UNION
316              SELECT b.source AS source
317                FROM bin_associations ba
318                JOIN binaries b ON ba.bin = b.id WHERE ba.suite = $suite_id) s
319             JOIN dsc_files df ON s.source = df.source
320             JOIN files f ON df.file = f.id
321             JOIN files_archive_map af ON f.id = af.file_id
322             JOIN component c ON af.component_id = c.id
323             JOIN archive ON af.archive_id = archive.id
324             WHERE archive.name = 'ftp-master'
325         "
326         psql -F' ' -A -t -c "$query"
327
328         query="
329           SELECT './pool/' || c.name || '/' || f.filename
330           FROM bin_associations ba
331           JOIN binaries b ON ba.bin = b.id
332           JOIN files f ON b.file = f.id
333           JOIN files_archive_map af ON f.id = af.file_id
334           JOIN component c ON af.component_id = c.id
335           JOIN archive ON af.archive_id = archive.id
336           WHERE ba.suite = $suite_id AND archive.name = 'ftp-master'
337         "
338         psql -F' ' -A -t -c "$query"
339     }
340
341     psql -F' ' -At -c "SELECT id, suite_name FROM suite" |
342     while read id suite; do
343         [ -e $base/ftp/dists/$suite ] || continue
344         (
345             (cd $base/ftp
346                 distname=$(cd dists; readlink $suite || echo $suite)
347                 find ./dists/$distname \! -type d
348                 for distdir in ./dists/*; do
349                     [ "$(readlink $distdir)" != "$distname" ] || echo $distdir
350                 done
351             )
352             suite_list $id
353         ) | sort -u | gzip -9 > suite-${suite}.list.gz
354     done
355
356     log "Finding everything on the ftp site to generate sundries"
357     (cd $base/ftp; find . \! -type d \! -name 'Archive_Maintenance_In_Progress' | sort) >$ARCHLIST
358
359     rm -f sundries.list
360     zcat *.list.gz | cat - *.list | sort -u |
361     diff - $ARCHLIST | sed -n 's/^> //p' > sundries.list
362
363     log "Generating files list"
364
365     for a in $ARCHES; do
366         (echo ./project/trace; zcat arch-$a.list.gz source.list.gz) |
367         cat - sundries.list dists.list project.list docs.list indices.list |
368         sort -u | poolfirst > ../arch-$a.files
369     done
370
371     (cd $base/ftp/
372             for dist in sid jessie; do
373                     find ./dists/$dist/main/i18n/ \! -type d | sort -u | gzip -9 > $base/ftp/indices/files/components/translation-$dist.list.gz
374             done
375     )
376
377     (cat ../arch-i386.files ../arch-amd64.files; zcat suite-proposed-updates.list.gz ; zcat translation-sid.list.gz ; zcat translation-jessie.list.gz) |
378     sort -u | poolfirst > ../typical.files
379
380     rm -f $ARCHLIST
381     log "Done!"
382     set -o pipefail
383 }
384
385 function mkchecksums() {
386     local archiveroot dsynclist md5list
387
388     for archive in "${public_archives[@]}"; do
389         archiveroot="$(get_archiveroot "${archive}")"
390         dsynclist=$dbdir/dsync.${archive}.list
391         md5list=${archiveroot}/indices/md5sums
392
393         log -n "Creating md5 / dsync index file for ${archive}... "
394
395         cd "$archiveroot"
396         ${bindir}/dsync-flist -q generate $dsynclist --exclude $dsynclist --md5
397         ${bindir}/dsync-flist -q md5sums $dsynclist | gzip -9n > ${md5list}.gz
398         ${bindir}/dsync-flist -q link-dups $dsynclist || true
399     done
400 }
401
402 function mirror() {
403     local archiveroot
404
405     log "Regenerating \"public\" mirror/ hardlink fun"
406     DATE_SERIAL=$(date +"%Y%m%d01")
407     FILESOAPLUS1=$(awk '/serial/ { print $3+1 }' ${TRACEFILE} )
408     if [ "$DATE_SERIAL" -gt "$FILESOAPLUS1" ]; then
409         SERIAL="$DATE_SERIAL"
410     else
411         SERIAL="$FILESOAPLUS1"
412     fi
413     date -u > ${TRACEFILE}
414     echo "Using dak v1" >> ${TRACEFILE}
415     echo "Running on host: $(hostname -f)" >> ${TRACEFILE}
416     echo "Archive serial: ${SERIAL}" >> ${TRACEFILE}
417
418     # Ugly "hack", but hey, it does what we want.
419     cp ${TRACEFILE} ${TRACEFILE_BDO}
420
421     for archive in "${public_archives[@]}"; do
422         archiveroot="$(get_archiveroot "${archive}")"
423         mirrordir="${archiveroot}/../mirror"
424         cd ${mirrordir}
425         rsync -aH --link-dest ${archiveroot} --delete --delete-after --delete-excluded --exclude Packages.*.new --exclude Sources.*.new  --ignore-errors ${archiveroot}/. .
426     done
427 }
428
429 function expire() {
430     log "Expiring old database dumps..."
431     cd $base/backup
432     $scriptsdir/expire_dumps -d . -p -f "dump_*"
433 }
434
435 function transitionsclean() {
436     log "Removing out of date transitions..."
437     cd $base
438     dak transitions -c -a
439 }
440
441 function dm() {
442     log "Updating DM permissions page"
443     dak acl export-per-source dm >$exportdir/dm.txt
444 }
445
446 function bts() {
447     log "Categorizing uncategorized bugs filed against ftp.debian.org"
448     dak bts-categorize
449 }
450
451 function ddaccess() {
452     # Tell our dd accessible mirror to sync itself up. Including ftp dir.
453     log "Trigger dd accessible parts sync including ftp dir"
454     ${scriptsdir}/sync-dd ries-sync ries-sync1 ries-sync2 pool
455 }
456
457 function mirrorpush() {
458     log "Checking the public archive copy"
459     cd ${mirrordir}/dists
460
461     broken=0
462     for release in $(find . -name "InRelease"); do
463         echo "Processing: ${release}"
464         subdir=${release%/InRelease}
465         while read SHASUM SIZE NAME; do
466             if ! [ -f "${subdir}/${NAME}" ]; then
467                bname=$(basename ${NAME})
468                 if [[ "${bname}" =~ ^(Packages|Sources|Translation-[a-zA-Z_]+)$ ]]; then
469                     # We don't keep unpacked files, don't check for their existance.
470                     # We might want to go and check their unpacked shasum, but right now
471                     # I don't care. I believe it should be enough if all the packed shasums
472                     # match.
473                     continue
474                 fi
475                 broken=$(( broken + 1 ))
476                 echo "File ${subdir}/${NAME} is missing"
477                 continue
478             fi
479
480            # We do have symlinks in the tree (see the contents files currently).
481            # So we use "readlink -f" to check the size of the target, as thats basically
482            # what gen-releases does
483             fsize=$(stat -c %s $(readlink -f "${subdir}/${NAME}"))
484             if [ ${fsize} -ne ${SIZE} ]; then
485                 broken=$(( broken + 1 ))
486                 echo "File ${subdir}/${NAME} has size ${fsize}, expected is ${SIZE}"
487                 continue
488             fi
489
490             fshasum=$(sha1sum $(readlink -f "${subdir}/${NAME}"))
491             fshasum=${fshasum%% *}
492             if [ "${fshasum}" != "${SHASUM}" ]; then
493                 broken=$(( broken + 1 ))
494                 echo "File ${subdir}/${NAME} has checksum ${fshasum}, expected is ${SHASUM}"
495                 continue
496             fi
497         done < <(sed '1,/SHA1:/d' "${release}" | sed '/SHA256:/,$d')
498     done
499
500     if [ $broken -gt 0 ]; then
501         log_error "Trouble with the public mirror, found ${broken} errors"
502         return 21
503     fi
504
505     log "Starting the mirrorpush"
506     date -u > /srv/ftp.debian.org/web/mirrorstart
507     echo "Using dak v1" >> /srv/ftp.debian.org/web/mirrorstart
508     echo "Running on host $(hostname -f)" >> /srv/ftp.debian.org/web/mirrorstart
509     sudo -H -u archvsync /home/archvsync/runmirrors > ~dak/runmirrors.log 2>&1 &
510     sudo -H -u archvsync /home/archvsync/runmirrors -a backports > ~dak/runmirrorsbpo.log 2>&1 &
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}" cron@ftp-master.debian.org -- -F "Debian FTP Masters" -f ftpmaster@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 ftp-master.metadata.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  }