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