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