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