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