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