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