[Qa-jenkins-scm] [jenkins.debian.net] 01/01: reproducible Arch Linux: only detect package state once, then cache and reuse the result and the resulting HTML
Holger Levsen
holger at layer-acht.org
Sun Nov 26 21:07:54 UTC 2017
This is an automated email from the git hooks/post-receive script.
holger pushed a commit to branch master
in repository jenkins.debian.net.
commit b0c15dd0a554fde2f0f8974b8fb48f09c11bab22
Author: Holger Levsen <holger at layer-acht.org>
Date: Sun Nov 26 21:07:21 2017 +0000
reproducible Arch Linux: only detect package state once, then cache and reuse the result and the resulting HTML
Signed-off-by: Holger Levsen <holger at layer-acht.org>
---
bin/reproducible_html_archlinux.sh | 252 ++++++++++++++++++++++---------------
1 file changed, 151 insertions(+), 101 deletions(-)
diff --git a/bin/reproducible_html_archlinux.sh b/bin/reproducible_html_archlinux.sh
index 6e688e5..e4e13a5 100755
--- a/bin/reproducible_html_archlinux.sh
+++ b/bin/reproducible_html_archlinux.sh
@@ -61,114 +61,164 @@ for REPOSITORY in $ARCHLINUX_REPOS ; do
continue
fi
let TESTED+=1
- echo " <tr>" >> $HTML_BUFFER
- echo " <td>$REPOSITORY</td>" >> $HTML_BUFFER
- echo " <td>$PKG</td>" >> $HTML_BUFFER
- echo " <td>" >> $HTML_BUFFER
- if [ -z "$(cd $ARCHLINUX_PKG_PATH/ ; ls *.pkg.tar.xz.html 2>/dev/null)" ] ; then
- if [ ! -z "$(egrep '^error: failed to prepare transaction \(conflicting dependencies\)' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
- HTML_TARGET=${HTML_DEPWAIT[0]}
- let NR_DEPWAIT+=1
- echo " <img src=\"/userContent/static/weather-snow.png\" alt=\"depwait icon\" /> could not resolve dependencies as there are conflicts" >> $HTML_BUFFER
- elif [ ! -z "$(egrep '==> ERROR: (Could not resolve all dependencies|.pacman. failed to install missing dependencies)' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
- HTML_TARGET=${HTML_DEPWAIT[1]}
- let NR_DEPWAIT+=1
- echo " <img src=\"/userContent/static/weather-snow.png\" alt=\"depwait icon\" /> could not resolve dependencies" >> $HTML_BUFFER
- elif [ ! -z "$(egrep '^error: unknown package: ' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
- HTML_TARGET=${HTML_404[0]}
- let NR_404+=1
- echo " <img src=\"/userContent/static/weather-severe-alert.png\" alt=\"404 icon\" /> unknown package" >> $HTML_BUFFER
- elif [ ! -z "$(egrep '==> ERROR: (Failure while downloading|One or more PGP signatures could not be verified|One or more files did not pass the validity check|Integrity checks \(.*\) differ in size from the source array)' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
- HTML_TARGET=${HTML_404[0]}
- REASON="download failed"
- EXTRA_REASON=""
- let NR_404+=1
- if [ ! -z "$(grep 'FAILED (unknown public key' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
- HTML_TARGET=${HTML_404[6]}
- EXTRA_REASON="to verify source with PGP due to unknown public key"
- elif [ ! -z "$(grep 'The requested URL returned error: 404' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
- HTML_TARGET=${HTML_404[3]}
- EXTRA_REASON="with 404 - file not found"
- elif [ ! -z "$(grep 'The requested URL returned error: 403' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
- HTML_TARGET=${HTML_404[2]}
- EXTRA_REASON="with 403 - forbidden"
- elif [ ! -z "$(grep 'The requested URL returned error: 500' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
- HTML_TARGET=${HTML_404[4]}
- EXTRA_REASON="with 500 - internal server error"
- elif [ ! -z "$(grep 'The requested URL returned error: 503' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
- HTML_TARGET=${HTML_404[5]}
- EXTRA_REASON="with 503 - service unavailable"
- elif [ ! -z "$(egrep '==> ERROR: One or more PGP signatures could not be verified' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
- HTML_TARGET=${HTML_404[7]}
- EXTRA_REASON="to verify source with PGP signatures"
- elif [ ! -z "$(grep 'SSL certificate problem: unable to get local issuer certificate' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
- HTML_TARGET=${HTML_404[1]}
- EXTRA_REASON="with SSL certificate problem"
- elif [ ! -z "$(egrep '==> ERROR: One or more files did not pass the validity check' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
- HTML_TARGET=${HTML_404[8]}
- REASON="downloaded ok but failed to verify source"
- elif [ ! -z "$(egrep '==> ERROR: Integrity checks \(.*\) differ in size from the source array' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
- HTML_TARGET=${HTML_404[9]}
- REASON="Integrity checks differ in size from the source array"
- fi
- echo " <img src=\"/userContent/static/weather-severe-alert.png\" alt=\"404 icon\" /> $REASON $EXTRA_REASON" >> $HTML_BUFFER
- elif [ ! -z "$(egrep '==> ERROR: (install file .* does not exist or is not a regular file|The download program wget is not installed)' $ARCHLINUX_PKG_PATH/build1.log)" ] ; then
- HTML_TARGET=${HTML_FTBFS[0]}
- let NR_FTBFS+=1
- echo " <img src=\"/userContent/static/weather-storm.png\" alt=\"ftbfs icon\" /> failed to build, requirements not met" >> $HTML_BUFFER
- elif [ ! -z "$(egrep '==> ERROR: A failure occurred in check' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
- HTML_TARGET=${HTML_FTBFS[1]}
- let NR_FTBFS+=1
- echo " <img src=\"/userContent/static/weather-storm.png\" alt=\"ftbfs icon\" /> failed to build while running tests" >> $HTML_BUFFER
- elif [ ! -z "$(egrep '==> ERROR: A failure occurred in (build|package|prepare)' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
- HTML_TARGET=${HTML_FTBFS[2]}
- let NR_FTBFS+=1
- echo " <img src=\"/userContent/static/weather-storm.png\" alt=\"ftbfs icon\" /> failed to build" >> $HTML_BUFFER
- elif [ ! -z "$(egrep 'makepkg was killed by timeout after' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
- HTML_TARGET=${HTML_FTBFS[3]}
- let NR_FTBFS+=1
- echo " <img src=\"/userContent/static/weather-storm.png\" alt=\"ftbfs icon\" /> failed to build, killed by timeout" >> $HTML_BUFFER
- else
- echo " probably failed to build from source, please investigate" >> $HTML_BUFFER
- HTML_TARGET=$HTML_UNKNOWN
- let NR_UNKNOWN+=1
- # or is it reproducible???
- fi
+ if [ -n "$(cd $ARCHLINUX_PKG_PATH/ ; ls *.state 2>/dev/null)" ] ; then
+ STATE="$(cat $ARCHLINUX_PKG_PATH/pkg.state 2>&1)"
+ case $STATE in
+ GOOD) let NR_GOOD+=1
+ HTML_TARGET=$HTML_GOOD
+ ;;
+ FTBR) let NR_FTBR+=1
+ HTML_TARGET=$HTML_FTBR
+ ;;
+ FTBFS*) let NR_FTBFS+=1
+ SUBSTATE=$(echo $STATE | cut -d "_" -f2)
+ HTML_TARGET=${HTML_FTBFS[$SUBSTATE]}
+ ;;
+ 404*) let NR_404+=1
+ SUBSTATE=$(echo $STATE | cut -d "_" -f2)
+ HTML_TARGET=${HTML_404[$SUBSTATE]}
+ ;;
+ DEPWAIT*) let NR_DEPWAIT+=1
+ SUBSTATE=$(echo $STATE | cut -d "_" -f2)
+ HTML_TARGET=${HTML_DEPWAIT[$SUBSTATE]}
+ ;;
+ UNKNOWN) let NR_UNKNOWN+=1
+ HTML_TARGET=$HTML_UNKNOWN
+ ;;
+ *) exit 1 ;;
+ esac
+ cat $ARCHLINUX_PKG_PATH/pkg.html >> $HTML_TARGET
else
- HTML_TARGET=$HTML_GOOD
- for ARTIFACT in $(cd $ARCHLINUX_PKG_PATH/ ; ls *.pkg.tar.xz.html) ; do
- if [ ! -z "$(grep 'build reproducible in our test framework' $ARCHLINUX_PKG_PATH/$ARTIFACT)" ] ; then
- echo " <img src=\"/userContent/static/weather-clear.png\" alt=\"reproducible icon\" /> <a href=\"/archlinux/$REPOSITORY/$PKG/$ARTIFACT\">${ARTIFACT:0:-5}</a> is reproducible in our current test framework<br />" >> $HTML_BUFFER
- else
- HTML_TARGET=$HTML_FTBR
- # this shouldnt happen, but (for now) it does, so lets at least mark them…
+ echo " <tr>" >> $HTML_BUFFER
+ echo " <td>$REPOSITORY</td>" >> $HTML_BUFFER
+ echo " <td>$PKG</td>" >> $HTML_BUFFER
+ echo " <td>" >> $HTML_BUFFER
+ #
+ #
+ if [ -z "$(cd $ARCHLINUX_PKG_PATH/ ; ls *.pkg.tar.xz.html 2>/dev/null)" ] ; then
+ if [ ! -z "$(egrep '^error: failed to prepare transaction \(conflicting dependencies\)' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
+ HTML_TARGET=${HTML_DEPWAIT[0]}
+ let NR_DEPWAIT+=1
+ echo DEPWAIT_= > $ARCHLINUX_PKG_PATH/pkg.state
+ echo " <img src=\"/userContent/static/weather-snow.png\" alt=\"depwait icon\" /> could not resolve dependencies as there are conflicts" >> $HTML_BUFFER
+ elif [ ! -z "$(egrep '==> ERROR: (Could not resolve all dependencies|.pacman. failed to install missing dependencies)' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
+ HTML_TARGET=${HTML_DEPWAIT[1]}
+ let NR_DEPWAIT+=1
+ echo DEPWAIT_1 > $ARCHLINUX_PKG_PATH/pkg.state
+ echo " <img src=\"/userContent/static/weather-snow.png\" alt=\"depwait icon\" /> could not resolve dependencies" >> $HTML_BUFFER
+ elif [ ! -z "$(egrep '^error: unknown package: ' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
+ HTML_TARGET=${HTML_404[0]}
+ let NR_404+=1
+ echo 404_0 > $ARCHLINUX_PKG_PATH/pkg.state
+ echo " <img src=\"/userContent/static/weather-severe-alert.png\" alt=\"404 icon\" /> unknown package" >> $HTML_BUFFER
+ elif [ ! -z "$(egrep '==> ERROR: (Failure while downloading|One or more PGP signatures could not be verified|One or more files did not pass the validity check|Integrity checks \(.*\) differ in size from the source array)' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
+ HTML_TARGET=${HTML_404[0]}
+ REASON="download failed"
EXTRA_REASON=""
- if [ ! -z "$(grep 'class="source">.BUILDINFO' $ARCHLINUX_PKG_PATH/$ARTIFACT)" ] ; then
- EXTRA_REASON=" with variations in .BUILDINFO"
+ let NR_404+=1
+ echo 404_0 > $ARCHLINUX_PKG_PATH/pkg.state
+ if [ ! -z "$(grep 'FAILED (unknown public key' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
+ HTML_TARGET=${HTML_404[6]}
+ echo 404_6 > $ARCHLINUX_PKG_PATH/pkg.state
+ EXTRA_REASON="to verify source with PGP due to unknown public key"
+ elif [ ! -z "$(grep 'The requested URL returned error: 404' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
+ HTML_TARGET=${HTML_404[3]}
+ echo 404_3 > $ARCHLINUX_PKG_PATH/pkg.state
+ EXTRA_REASON="with 404 - file not found"
+ elif [ ! -z "$(grep 'The requested URL returned error: 403' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
+ HTML_TARGET=${HTML_404[2]}
+ echo 404_2 > $ARCHLINUX_PKG_PATH/pkg.state
+ EXTRA_REASON="with 403 - forbidden"
+ elif [ ! -z "$(grep 'The requested URL returned error: 500' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
+ HTML_TARGET=${HTML_404[4]}
+ echo 404_4 > $ARCHLINUX_PKG_PATH/pkg.state
+ EXTRA_REASON="with 500 - internal server error"
+ elif [ ! -z "$(grep 'The requested URL returned error: 503' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
+ HTML_TARGET=${HTML_404[5]}
+ echo 404_5 > $ARCHLINUX_PKG_PATH/pkg.state
+ EXTRA_REASON="with 503 - service unavailable"
+ elif [ ! -z "$(egrep '==> ERROR: One or more PGP signatures could not be verified' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
+ HTML_TARGET=${HTML_404[7]}
+ echo 404_7 > $ARCHLINUX_PKG_PATH/pkg.state
+ EXTRA_REASON="to verify source with PGP signatures"
+ elif [ ! -z "$(grep 'SSL certificate problem: unable to get local issuer certificate' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
+ HTML_TARGET=${HTML_404[1]}
+ echo 404_1 > $ARCHLINUX_PKG_PATH/pkg.state
+ EXTRA_REASON="with SSL certificate problem"
+ elif [ ! -z "$(egrep '==> ERROR: One or more files did not pass the validity check' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
+ HTML_TARGET=${HTML_404[8]}
+ echo 404_8 > $ARCHLINUX_PKG_PATH/pkg.state
+ REASON="downloaded ok but failed to verify source"
+ elif [ ! -z "$(egrep '==> ERROR: Integrity checks \(.*\) differ in size from the source array' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
+ HTML_TARGET=${HTML_404[9]}
+ echo 404_9 > $ARCHLINUX_PKG_PATH/pkg.state
+ REASON="Integrity checks differ in size from the source array"
fi
- echo " <img src=\"/userContent/static/weather-showers-scattered.png\" alt=\"unreproducible icon\" /> <a href=\"/archlinux/$REPOSITORY/$PKG/$ARTIFACT\">${ARTIFACT:0:-5}</a> is unreproducible$EXTRA_REASON<br />" >> $HTML_BUFFER
+ echo " <img src=\"/userContent/static/weather-severe-alert.png\" alt=\"404 icon\" /> $REASON $EXTRA_REASON" >> $HTML_BUFFER
+ elif [ ! -z "$(egrep '==> ERROR: (install file .* does not exist or is not a regular file|The download program wget is not installed)' $ARCHLINUX_PKG_PATH/build1.log)" ] ; then
+ HTML_TARGET=${HTML_FTBFS[0]}
+ let NR_FTBFS+=1
+ echo FTBFS_0 > $ARCHLINUX_PKG_PATH/pkg.state
+ echo " <img src=\"/userContent/static/weather-storm.png\" alt=\"ftbfs icon\" /> failed to build, requirements not met" >> $HTML_BUFFER
+ elif [ ! -z "$(egrep '==> ERROR: A failure occurred in check' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
+ HTML_TARGET=${HTML_FTBFS[1]}
+ let NR_FTBFS+=1
+ echo FTBFS_1 > $ARCHLINUX_PKG_PATH/pkg.state
+ echo " <img src=\"/userContent/static/weather-storm.png\" alt=\"ftbfs icon\" /> failed to build while running tests" >> $HTML_BUFFER
+ elif [ ! -z "$(egrep '==> ERROR: A failure occurred in (build|package|prepare)' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
+ HTML_TARGET=${HTML_FTBFS[2]}
+ let NR_FTBFS+=1
+ echo FTBFS_2 > $ARCHLINUX_PKG_PATH/pkg.state
+ echo " <img src=\"/userContent/static/weather-storm.png\" alt=\"ftbfs icon\" /> failed to build" >> $HTML_BUFFER
+ elif [ ! -z "$(egrep 'makepkg was killed by timeout after' $ARCHLINUX_PKG_PATH/build1.log $ARCHLINUX_PKG_PATH/build2.log 2>/dev/null)" ] ; then
+ HTML_TARGET=${HTML_FTBFS[3]}
+ let NR_FTBFS+=1
+ echo FTBFS_3 > $ARCHLINUX_PKG_PATH/pkg.state
+ echo " <img src=\"/userContent/static/weather-storm.png\" alt=\"ftbfs icon\" /> failed to build, killed by timeout" >> $HTML_BUFFER
+ else
+ echo " probably failed to build from source, please investigate" >> $HTML_BUFFER
+ HTML_TARGET=$HTML_UNKNOWN
+ let NR_UNKNOWN+=1
+ echo UNKNOWN > $ARCHLINUX_PKG_PATH/pkg.state
fi
- done
- # we only count source packages for now…
- if [ "$HTML_TARGET" = "$HTML_FTBR" ] ; then
- let NR_FTBR+=1
else
- let NR_GOOD+=1
+ HTML_TARGET=$HTML_GOOD
+ for ARTIFACT in $(cd $ARCHLINUX_PKG_PATH/ ; ls *.pkg.tar.xz.html) ; do
+ if [ ! -z "$(grep 'build reproducible in our test framework' $ARCHLINUX_PKG_PATH/$ARTIFACT)" ] ; then
+ echo " <img src=\"/userContent/static/weather-clear.png\" alt=\"reproducible icon\" /> <a href=\"/archlinux/$REPOSITORY/$PKG/$ARTIFACT\">${ARTIFACT:0:-5}</a> is reproducible in our current test framework<br />" >> $HTML_BUFFER
+ else
+ HTML_TARGET=$HTML_FTBR
+ # this shouldnt happen, but (for now) it does, so lets at least mark them…
+ EXTRA_REASON=""
+ if [ ! -z "$(grep 'class="source">.BUILDINFO' $ARCHLINUX_PKG_PATH/$ARTIFACT)" ] ; then
+ EXTRA_REASON=" with variations in .BUILDINFO"
+ fi
+ echo " <img src=\"/userContent/static/weather-showers-scattered.png\" alt=\"unreproducible icon\" /> <a href=\"/archlinux/$REPOSITORY/$PKG/$ARTIFACT\">${ARTIFACT:0:-5}</a> is unreproducible$EXTRA_REASON<br />" >> $HTML_BUFFER
+ fi
+ done
+ # we only count source packages for now…
+ if [ "$HTML_TARGET" = "$HTML_FTBR" ] ; then
+ let NR_FTBR+=1
+ echo FTBR > $ARCHLINUX_PKG_PATH/pkg.state
+ else
+ let NR_GOOD+=1
+ echo GOOD > $ARCHLINUX_PKG_PATH/pkg.state
+ fi
fi
+ echo " </td>" >> $HTML_BUFFER
+ echo " <td>$(LANG=C TZ=UTC ls --full-time $ARCHLINUX_PKG_PATH/build1.log | cut -d ':' -f1-2 | cut -d " " -f6- ) UTC</td>" >> $HTML_BUFFER
+ for LOG in build1.log build2.log ; do
+ if [ -f $ARCHLINUX_PKG_PATH/$LOG ] ; then
+ get_filesize $ARCHLINUX_PKG_PATH/$LOG
+ echo " <td><a href=\"/archlinux/$REPOSITORY/$PKG/$LOG\">$LOG</a> ($SIZE)</td>" >> $HTML_BUFFER
+ else
+ echo " <td> </td>" >> $HTML_BUFFER
+ fi
+ done
+ echo " </tr>" >> $HTML_BUFFER
+ cat $HTML_BUFFER >> $HTML_TARGET
+ mv $HTML_BUFFER $ARCHLINUX_PKG_PATH/pkg.html
fi
- echo " </td>" >> $HTML_BUFFER
- echo " <td>$(LANG=C TZ=UTC ls --full-time $ARCHLINUX_PKG_PATH/build1.log | cut -d ':' -f1-2 | cut -d " " -f6- ) UTC</td>" >> $HTML_BUFFER
- for LOG in build1.log build2.log ; do
- if [ -f $ARCHLINUX_PKG_PATH/$LOG ] ; then
- get_filesize $ARCHLINUX_PKG_PATH/$LOG
- echo " <td><a href=\"/archlinux/$REPOSITORY/$PKG/$LOG\">$LOG</a> ($SIZE)</td>" >> $HTML_BUFFER
- else
- echo " <td> </td>" >> $HTML_BUFFER
- fi
- done
- echo " </tr>" >> $HTML_BUFFER
- cat $HTML_BUFFER >> $HTML_TARGET
- rm $HTML_BUFFER > /dev/null
done
# prepare stats per repository
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/qa/jenkins.debian.net.git
More information about the Qa-jenkins-scm
mailing list