diff --git a/COPYING b/COPYING index caeca07..88798ab 120000 --- a/COPYING +++ b/COPYING @@ -1 +1 @@ -/usr/share/automake-1.14/COPYING \ No newline at end of file +/usr/share/automake-1.15/COPYING \ No newline at end of file diff --git a/ChangeLog b/ChangeLog index f9a7fd2..a5d69bc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2015-12-21 22:14 marc + + * sql-to-dot.sed, test/runtests.sh, webtester.desktop.in: build in + docker + +2015-12-21 21:27 marc + + * ChangeLog, src/commands.hxx: new command to set + offline-storage-path + 2015-11-16 12:37 marc * doc/doxyfile.in: SVG must not be interactive for embedding in diff --git a/INSTALL b/INSTALL index f812f5a..ddcdb76 120000 --- a/INSTALL +++ b/INSTALL @@ -1 +1 @@ -/usr/share/automake-1.14/INSTALL \ No newline at end of file +/usr/share/automake-1.15/INSTALL \ No newline at end of file diff --git a/ax_init_standard_project.m4 b/ax_init_standard_project.m4 index eef210e..0e41482 100644 --- a/ax_init_standard_project.m4 +++ b/ax_init_standard_project.m4 @@ -13,6 +13,7 @@ m4_define(x_least, m4_ifdef([x_least_diff], mrw_esyscmd_s([ for path in . .. ../..; do if svn info $path 2>&1 > /dev/null; then SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') + if test -z "${SVN_REVISION}"; then SVN_REVISION=0; fi break; fi done @@ -22,6 +23,7 @@ m4_define(x_least, m4_ifdef([x_least_diff], mrw_esyscmd_s([ for path in . .. ../..; do if svn info $path 2>&1 > /dev/null; then SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') + if test -z "${SVN_REVISION}"; then SVN_REVISION=0; fi break; fi done @@ -36,6 +38,7 @@ m4_define(x_minor_diff, mrw_esyscmd_s([ for path in . .. ../..; do if svn info $path 2>&1 > /dev/null; then SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') + if test -z "${SVN_REVISION}"; then SVN_REVISION=0; fi break; fi; done @@ -87,16 +90,19 @@ AC_DEFUN([AX_ADD_MAKEFILE_TARGET_DEP], [ fi ]) -# Same as AC_SUBST, but adds -Dname="value" option to CPPFLAGS +# Same as AC_SUBST, but adds -Dname="value" option to CPPFLAGS and a +# notz only a @name@ replacement, but also a @name_ENCODED@ one to be +# used in code. # - parameters: # $1 = variable name AC_DEFUN([AX_SUBST], [ + [$1]_ENCODED=$(echo "${$1}" | awk 1 ORS='\\n' | sed 's,\\n$,,') + [$1]_ENCODED=${[$1]_ENCODED//\"/\\\"} + [$1]_ENCODED=${[$1]_ENCODED//\'/\'\"\'\"\'} + [$1]_ENCODED=${[$1]_ENCODED//#/\\#} + AM_CPPFLAGS+=" '-D$1=\"${[$1]_ENCODED}\"'" AC_SUBST([$1]) - tmp_var=$(echo "${$1}" | awk 1 ORS='\\n' | sed 's,\\n$,,') - tmp_var=${tmp_var//\"/\\\"} - tmp_var=${tmp_var//\'/\'\"\'\"\'} - tmp_var=${tmp_var//#/\\#} - AM_CPPFLAGS+=" '-D$1=\"${tmp_var}\"'" + AC_SUBST([$1]_ENCODED) AC_SUBST(AM_CPPFLAGS) ]) @@ -164,14 +170,18 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [ AX_SUBST(BUILD_NUMBER) BUILD_DATE=$(LANG= date +"%a, %d %b %Y %H:%M:%S %z") AX_SUBST(BUILD_DATE) - if test -f "${PROJECT_NAME}-logo.png"; then - PROJECT_LOGO="${PROJECT_NAME}-logo.png" + if test -f "${PACKAGE_NAME}.desktop.in"; then + PACKAGE_DESKTOP="${PACKAGE_NAME}.desktop" fi - AX_SUBST(PROJECT_LOGO) - if test -f "${PROJECT_NAME}-icon.png"; then - PROJECT_ICON="${PROJECT_NAME}-icon.png" + AX_SUBST(PACKAGE_DESKTOP) + if test -f "${PACKAGE_NAME}-logo.png"; then + PACKAGE_LOGO="${PACKAGE_NAME}-logo.png" fi - AX_SUBST(PROJECT_ICON) + AX_SUBST(PACKAGE_LOGO) + if test -f "${PACKAGE_NAME}-icon.png"; then + PACKAGE_ICON="${PACKAGE_NAME}-icon.png" + fi + AX_SUBST(PACKAGE_ICON) AC_ARG_ENABLE(pedantic, [AS_HELP_STRING([--enable-pedantic], @@ -200,6 +210,10 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [ else AM_CPPFLAGS="${AM_CPPFLAGS} -DQT_NO_DEBUG_OUTPUT -DQT_NO_DEBUG" fi + + if test -f ${PACKAGE_NAME}.desktop.in; then + AC_CONFIG_FILES([${PACKAGE_NAME}.desktop]) + fi AC_CONFIG_FILES([makefile]) AX_ADD_MAKEFILE_TARGET_DEP([clean-am], [clean-standard-project-targets], [makefile.in]) @@ -342,7 +356,7 @@ EOF # use this in configure.ac to support debian packages AC_DEFUN([AX_USE_DEBIAN_PACKAGING], [ - README_DEB=$(tail -n +3 README | sed -e 's/^$/./g' -e 's/^/ /g') + README_DEB=$(tail -n +3 README | sed -e 's/^ *$/./g' -e 's/^/ /g') AC_SUBST(README_DEB) _AM_SUBST_NOTMAKE([README_DEB]) AC_CONFIG_FILES([debian/changelog debian/control]) diff --git a/bootstrap.sh b/bootstrap.sh index f3bc743..39e31b7 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -20,7 +20,7 @@ DEFAULT_PROJECT_NAME=${PROJECT_PATH##*/} configure=0 build=0 docker=0 -buildtarget="distcheck" +buildtarget="" overwrite=0 rebuild=0 rebuildfiles=() @@ -28,8 +28,9 @@ while test $# -gt 0; do case "$1" in (--configure|-c) configure=1;; (--docker|-d) docker=1;; - (--build|-b) configure=1; build=1;; - (--target|-t) shift; configure=1; build=1; buildtarget="$1";; + (--build|-b) configure=1; build=1; buildtarget+=" distcheck";; + (--target|-t) shift; configure=1; build=1; buildtarget+=" $1";; + (--clean) shift; configure=1; build=1; buildtarget+=" maintainer-clean";; (--overwrite|-o) overwrite=1;; (--rebuild|-r) rebuild=1;; (--rebuild-file|-f) shift; rebuildfiles+=("$1");; @@ -110,17 +111,20 @@ GENERATED FILES * resolve-rpmbuilddeps.sh - script to install RPM package dependencies * build-in-docker.sh - script to build the project encapsulated in a docker container * build-resource-file.sh - build resource.qrc file from a resource directory + * sql-to-dot.sed - script to convert SQL schema files to graphviz dot in doxygen * mac-create-app-bundle.sh - script to create apple mac os-x app-bundle + * test/runtests.sh - template file to run test scripts, i.e. docker based * AUTHORS - replace your name in AUTHORS before first run * NEWS - empty file add your project's news * README - add project description (first line is header, followed by an empty line) * configure.ac - global configuration file template * makefile.am - global makefile template + * ${DEFAULT_PROJECT_NAME}.desktop.in - linux desktop file * src/makefile.am - if you enabled AX_USE_CXX * src/version.hxx - if you enabled AX_USE_CXX * src/version.cxx - if you enabled AX_USE_CXX * html/makefile.am - if you enabled AX_BUILD_HTML - * scripts/makefile.in - if you enabled AX_USE_SCRIPTS + * scripts/makefile.am - if you enabled AX_USE_SCRIPTS * doc/makefile.am - if you enabled AX_USE_DOXYGEN * doc/doxyfile.in - if you enabled AX_USE_DOXYGEN * test/makefile.am - if you enabled AX_BUILD_TEST or AX_USE_CPPUNIT @@ -320,7 +324,7 @@ checkdir() { checkfile() { exists=0 - if test -f "$1"; then + if test -f "$1" -o -f "$1".in; then exists=1 fi test $exists -eq 1 @@ -332,7 +336,7 @@ to() { case "$1" in (--condition) shift # test for a tag, abort if not set if ! testtag "$1"; then - return + return 0 fi;; (--mode) shift # test for a tag, abort if not set mode="$1";; @@ -373,7 +377,14 @@ copy() { # file already exists and must not be rebuilt return fi - run cp "${0%/*}/$1" "$1" + local source="${0%/*}/$1" + if ! test -r "${source}"; then + source="../${source}" + if ! test -r "${source}"; then + source="${0%/*}/$1" + fi + fi + run cp "${source}" "$1" if test $exists -eq 0; then run svn add "$1" run svn propset svn:keywords "Id" "$1" @@ -402,6 +413,12 @@ doxyadd() { fi } +# Check if we are in subversion root, if so, create trunk, branches, tags: +if test "$(LANG= svn info | sed -n 's,Relative URL: *,,p')" = "^/"; then + svn mkdir trunk branches tags + cd trunk +fi + # Initialize the environment: copy ${MY_NAME} copy ax_init_standard_project.m4 @@ -411,6 +428,7 @@ copy resolve-debbuilddeps.sh copy resolve-rpmbuilddeps.sh copy build-in-docker.sh copy build-resource-file.sh +copy sql-to-dot.sed copy mac-create-app-bundle.sh AUTHOR=$(gpg -K | sed -n 's,uid *,,p' | sort | head -1) if test -z "${AUTHOR}"; then @@ -427,8 +445,7 @@ ${DEFAULT_PROJECT_NAME} add description for ${DEFAULT_PROJECT_NAME} EOF -to configure.ac < use given docker image instead of ${img}" + echo " -t, --targets targets specify build targets, default: ${targets}" + echo " -r, --repo add given apt repository" + echo " -k, --key add public key from url" + echo " -e, --env = set environment variable in docker" + echo " -d, --dir access given directory read only" + echo " -p, --package install extra debian packages" + echo " -c, --cmd execute commands as root in docker" + echo + echo " The options -r -k -e -d -p -c can be repeated several times." + echo + echo " The options -r -p -c allow an if-then-else contruct" + echo " depending on the operating system:" + echo " ::::::" + echo " :::" + echo " Read as: On linux type use else use " + echo " That means: If the distributer ID or codename in lsb_release" + echo " matches regular expression , then is replaced, else is replaced." + echo " The three colons are for splitting from and part." + echo " E.g.: Install package curl on wheezy and npm on olter systems:" + echo " $0 -p Debian|precise:::curl:::npm" + echo + echo "EXAMPLE:" + echo + echo "$0 -i mwaeckerlin/ubuntu:trusty-i386 \\" + echo " -t deb \\" + echo " -e ANDROID_HOME=/opt/local/android \\" + echo " -d /opt/local/android \\" + echo " -r universe \\" + echo " -r https://dev.marc.waeckerlin.org/repository \\" + echo " -k https://dev.marc.waeckerlin.org/repository/PublicKey \\" + echo " -p mrw-c++" + echo + exit 0 + ;; + (-i|--image) shift; + img="$1" + ;; + (-t|--targets) shift; + targets="$1" + ;; + (-r|--repo) shift; + repos+=("$1") + ;; + (-k|--key) shift; + keys+=("$1") + ;; + (-e|--env) shift; + envs+=("-e $1") + ;; + (-d|--dirs) shift; + dirs+=("-v $1:$1:ro") + ;; + (-p|--package) shift; + packages+=("$1") + ;; + (-c|--cmd) shift; + commands+=("$1") + ;; + (*) + echo "**** ERROR: unknown option '$1', try --help" 1>&2 + exit 1 + ;; + esac + if test $# -eq 0; then + echo "**** ERROR: missing value, try --help" 2>61 + exit 1 + fi + shift +done -DOCKER_ID=$(docker run -d -v $(pwd):/workdir -w /workdir ubuntu sleep infinity) -trap "docker rm -f ${DOCKER_ID}" INT TERM EXIT -docker exec ${DOCKER_ID} apt-get install -y software-properties-common apt-transport-https dpkg-dev -docker exec ${DOCKER_ID} apt-add-repository universe -docker exec ${DOCKER_ID} apt-add-repository https://dev.marc.waeckerlin.org/repository -wget -O- https://dev.marc.waeckerlin.org/repository/PublicKey \ - | docker exec -i ${DOCKER_ID} apt-key add - +function traperror() { + set +x + local DOCKER_ID="$1" + local err=($2) # error status + local line="$3" # LINENO + local linecallfunc="$4" + local command="$5" + local funcstack="$6" + for e in ${err[@]}; do + if test -n "$e" -a "$e" != "0"; then + echo "<---" + echo "ERROR: line $line - command '$command' exited with status: $e (${err[@]})" + if [ "${funcstack}" != "main" -o "$linecallfunc" != "0" ]; then + echo -n " ... Error at ${funcstack} " + if [ "$linecallfunc" != "" ]; then + echo -n "called at line $linecallfunc" + fi + echo + fi + echo "**** Entering docker container ${DOCKER_ID}, exit with Ctrl-D" + echo -n " ... cleanup docker: " + docker rm -f "${DOCKER_ID}" + echo "returning status: $e" + echo "--->" + exit $e + fi + done + echo -n " SUCCESS ... cleanup docker: " + docker rm -f "${DOCKER_ID}" + exit 0 +} + +function ifthenelse() { + arg="$1" + shift + cmd="$*" + if test "${arg/:::/}" = "${arg}"; then + docker exec ${DOCKER_ID} bash -c "${cmd//ARG/${arg}}" + else + os="${arg%%:::*}" + thenpart="${arg#*:::}" + if test "${thenpart/:::/}" = "${thenpart}"; then + docker exec ${DOCKER_ID} bash -c 'os="'$os'"; if [[ "$(lsb_release -is)-$(lsb_release -cs)-$(dpkg --print-architecture)" =~ ${os} ]]; then '"${cmd//ARG/${thenpart}}"'; fi' + else + elsepart="${thenpart##*:::}" + thenpart="${thenpart%:::*}" + if test -n "${thenpart}"; then + docker exec ${DOCKER_ID} bash -c 'os="'$os'"; if [[ "$(lsb_release -is)-$(lsb_release -cs)-$(dpkg --print-architecture)" =~ ${os} ]]; then '"${cmd//ARG/${thenpart}}"'; else '"${cmd//ARG/${elsepart}}"'; fi' + else + docker exec ${DOCKER_ID} bash -c 'os="'$os'"; if [[ "$(lsb_release -is)-$(lsb_release -cs)-$(dpkg --print-architecture)" =~ ${os} ]]; then true; else '"${cmd//ARG/${elsepart}}"'; fi' + fi + fi + fi +} + +set -x + +docker pull $img +DOCKER_ID=$(docker run -d ${dirs[@]} ${envs[@]} -w /workdir $img sleep infinity) +trap 'traperror '"${DOCKER_ID}"' "$? ${PIPESTATUS[@]}" $LINENO $BASH_LINENO "$BASH_COMMAND" "${FUNCNAME[@]}" "${FUNCTION}"' SIGINT INT TERM EXIT +docker exec ${DOCKER_ID} apt-get update +docker exec ${DOCKER_ID} apt-get upgrade -y +docker exec ${DOCKER_ID} apt-get install -y python-software-properties software-properties-common apt-transport-https dpkg-dev lsb-release || \ + docker exec ${DOCKER_ID} apt-get install -y software-properties-common apt-transport-https dpkg-dev lsb-release || \ + docker exec ${DOCKER_ID} apt-get install -y python-software-properties apt-transport-https dpkg-dev lsb-release; +for repo in "${repos[@]}"; do + ifthenelse "${repo}" "apt-add-repository ARG" +done +for key in "${keys[@]}"; do + wget -O- "$key" \ + | docker exec -i ${DOCKER_ID} apt-key add - +done docker exec ${DOCKER_ID} apt-get update +docker exec ${DOCKER_ID} apt-get upgrade +for package in "${packages[@]}"; do + ifthenelse "${package}" "apt-get install -y --force-yes ARG" +done +for command in "${commands[@]}"; do + ifthenelse "${command}" "ARG" +done docker exec ${DOCKER_ID} ./resolve-debbuilddeps.sh docker exec -u $(id -u) ${DOCKER_ID} svn upgrade || true -docker exec -u $(id -u) ${DOCKER_ID} ./bootstrap.sh -t "all check distcheck" +docker exec -u $(id -u) ${DOCKER_ID} ./bootstrap.sh -t "${targets}" diff --git a/resolve-debbuilddeps.sh b/resolve-debbuilddeps.sh index a05c5ac..1fd672c 100755 --- a/resolve-debbuilddeps.sh +++ b/resolve-debbuilddeps.sh @@ -11,25 +11,31 @@ ## 45678901234567890123456789012345678901234567890123456789012345678901234567890 SCHROOTNAME="$1" +if test -n "${SCHROOTNAME}"; then + DO="schroot -c "${SCHROOTNAME}" --" + SUDO="schroot -c "${SCHROOTNAME}" -u root -d / --" +else + DO="" + if grep -q '/docker/' /proc/1/cgroup; then + SUDO="" + else + SUDO="sudo" + fi +fi function install() { - if test -n "${SCHROOTNAME}"; then - if schroot -c "${SCHROOTNAME}" -u root -d / -- apt-get -y install $*; then - return 0 - fi + if ${SUDO} apt-get -y install $*; then + return 0 else - if apt-get -y install $*; then - return 0 - fi + return 1 fi - return 1 } TO_INSTALL= if test -e debian/control.in -a ! -e debian/control; then for f in $(sed -n 's, *AX_DEB_DEPEND_IFEXISTS(\([^)]*\)).*,\1,p' configure.ac); do - if test -n "$(apt-cache policy -q ${f})" && ! dpkg -l "${f}"; then + if test -n "$(${DO} apt-cache policy -q ${f})" && ! ${DO} dpkg -l "${f}"; then TO_INSTALL+=" ${f}" fi done @@ -38,13 +44,8 @@ if test -e debian/control.in -a ! -e debian/control; then sed 's,@[^@]*@, dummytext,g' > debian/control fi -if test -n "${SCHROOTNAME}"; then - schroot -c "${SCHROOTNAME}" -u root -d / -- apt-get -y install dpkg-dev - DEPS=$(schroot -c "${SCHROOTNAME}" -- dpkg-checkbuilddeps 2>&1 || true) -else - apt-get -y install dpkg-dev - DEPS=$(dpkg-checkbuilddeps 2>&1 || true) -fi +install dpkg-dev +DEPS=$(LANG= ${DO} dpkg-checkbuilddeps 2>&1 || true) DEPS=$(echo "$DEPS" | sed -n '/Unmet build dependencies/ { s,.*Unmet build dependencies: ,,g; s, ([^)]*),,g; s, *| *,|,g; p}') for pa in ${DEPS}; do diff --git a/src/version.cxx b/src/version.cxx index c87b294..03073bb 100644 --- a/src/version.cxx +++ b/src/version.cxx @@ -30,10 +30,10 @@ namespace NAMESPACE { return README; } std::string logo() { - return PROJECT_LOGO; + return PACKAGE_LOGO; } std::string icon() { - return PROJECT_ICON; + return PACKAGE_ICON; } const std::string WHAT("#(@) " PACKAGE_STRING); const std::string IDENT("$Id: " PACKAGE_STRING);