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