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