From ca0837c04fafd23c54607187f2e5dd2b223ca056 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20W=C3=A4ckerlin?= Date: Fri, 16 Jun 2017 11:06:31 +0000 Subject: [PATCH] added template for bash scripts; added dependency-graph.sh to get project dependencies --- scripts/bootstrap.sh | 5 ++ scripts/dependency-graph.sh | 153 ++++++++++++++++++++++++++++++++++++ scripts/template.sh | 121 ++++++++++++++++++++++++++++ 3 files changed, 279 insertions(+) create mode 100755 scripts/dependency-graph.sh create mode 100755 scripts/template.sh diff --git a/scripts/bootstrap.sh b/scripts/bootstrap.sh index d23e9d9..df6d848 100755 --- a/scripts/bootstrap.sh +++ b/scripts/bootstrap.sh @@ -138,6 +138,8 @@ GENERATED FILES * 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 + * dependency-graph.sh - script to draw project dependencies + * template.sh - generic template for bash scripts * 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 @@ -549,6 +551,8 @@ copy rpmsign.exp copy build-resource-file.sh copy sql-to-dot.sed copy mac-create-app-bundle.sh +copy dependency-graph.sh +copy template.sh AUTHOR=$(gpg -K 2>/dev/null | sed -n 's,uid *\(\[ultimate\] *\)\?,,p' | head -1) if test -z "${AUTHOR}"; then AUTHOR="FIRSTNAME LASTNAME (URL) " @@ -1785,6 +1789,7 @@ dist_pkgdata_DATA = @PACKAGE_ICON@ ax_check_qt.m4 bootstrap.sh \\ build-resource-file.sh \\ ax_init_standard_project.m4 \\ mac-create-app-bundle.sh resolve-debbuilddeps.sh \\ + dependency-graph.sh template.sh \\ sql-to-dot.sed dist_doc_DATA = AUTHORS NEWS README COPYING INSTALL ChangeLog diff --git a/scripts/dependency-graph.sh b/scripts/dependency-graph.sh new file mode 100755 index 0000000..70db7be --- /dev/null +++ b/scripts/dependency-graph.sh @@ -0,0 +1,153 @@ +#!/bin/bash -e + +# template for bash scripts + +# internal use only +append_msg() { + if test $# -ne 0; then + echo -en ":\e[0m \e[1m$*" + fi + echo -e "\e[0m" +} + +# write a notice +notice() { + if test $# -eq 0; then + return + fi + echo -e "\e[1m$*\e[0m" 1>&3 +} + +# write error message +error() { + echo -en "\e[1;31merror" 1>&2 + append_msg $* 1>&2 +} + +# write a warning message +warning() { + echo -en "\e[1;33mwarning" 1>&2 + append_msg $* 1>&2 +} + +# write a success message +success() { + echo -en "\e[1;32msuccess" 1>&2 + append_msg $* 1>&2 +} + +# commandline parameter evaluation +files=${0%/*}/configure.ac +while test $# -gt 0; do + case "$1" in + (--help|-h) less < + +OPTIONS + + --help, -h show this help + + list of zero or more configure.ac files + (default: ${files}) + +DESCRIPTION + + Evaluates dependencies of all the given configure.ac file. By + default takes the local configure.ac. Outputs a graphwiz dot file + with the dependencies. Solid lines are required dependencies, dotted + lines are optional dependencies. + +EXAMPLE + + Evaluate all dependencies between all local subversion and git + projects, if they are in the path ~/svn and ~/git: + + $0 ~/svn/*/configure.ac ~/git/*/configure.ac + +EOF + exit;; + (*) files=$*; break;; + esac + if test $# -eq 0; then + error "missing parameter, try $0 --help"; exit 1 + fi + shift; +done + +# run a command, print the result and abort in case of error +# option: --no-check: ignore the result, continue in case of error +run() { + check=1 + while test $# -gt 0; do + case "$1" in + (--no-check) check=0;; + (*) break;; + esac + shift; + done + echo -en "\e[1m-> running:\e[0m $* ..." + result=$($* 2>&1) + res=$? + if test $res -ne 0; then + if test $check -eq 1; then + error "failed with return code: $res" + if test -n "$result"; then + echo "$result" + fi + exit 1 + else + warning "ignored return code: $res" + fi + else + success + fi +} + +# error handler +function traperror() { + set +x + local err=($1) # error status + local line="$2" # LINENO + local linecallfunc="$3" + local command="$4" + local funcstack="$5" + for e in ${err[@]}; do + if test -n "$e" -a "$e" != "0"; then + 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 + exit $e + fi + done + success + exit 0 +} + +# catch errors +trap 'traperror "$? ${PIPESTATUS[@]}" $LINENO $BASH_LINENO "$BASH_COMMAND" "${FUNCNAME[@]}" "${FUNCTION}"' ERR SIGINT INT TERM EXIT + +########################################################################################## + +echo "digraph G {" +for file in $files; do + if ! test -e $file; then + error "file $file not found"; exit 1 + fi + sed -n ' + /^ *m4_define(x_package_name, */ {s///;s/ *).*//;h;s/.*/& [shape=doublecircle];/p} + /^ *AX_REQUIRE_QT/ {s/.*/qt -> /;G;s/\n//;s/.*/&;/p} + /^ *AX_PKG_REQUIRE(\[\?\([^],]\+\)\]\?, \[\?\([^],]\+\)\]\?.*/ {s//\2 -> /;G;s/\n//;s/.*/&;/p} + /^ *AX_PKG_REQUIRE(\[\?\([^],]\+\)\]\?.*/ {s//\1 -> /;G;s/\n//;s/.*/&;/p} + /^ *AX_CHECK_QT/ {s/.*/qt -> /;G;s/\n//;s/.*/& [style=dotted];/p} + /^ *AX_PKG_CHECK(\[\?\([^],]\+\)\]\?, \[\?\([^],]\+\)\]\?.*/ {s//\2 -> /;G;s/\n//;s/.*/& [style=dotted];/p} + /^ *AX_PKG_CHECK(\[\?\([^],]\+\)\]\?.*/ {s//\1 -> /;G;s/\n//;s/.*/& [style=dotted];/p} + ' $file +done +echo "}" diff --git a/scripts/template.sh b/scripts/template.sh new file mode 100755 index 0000000..85eeba0 --- /dev/null +++ b/scripts/template.sh @@ -0,0 +1,121 @@ +#!/bin/bash -e + +# template for bash scripts + +# internal use only +append_msg() { + if test $# -ne 0; then + echo -en ":\e[0m \e[1m$*" + fi + echo -e "\e[0m" +} + +# write a notice +notice() { + if test $# -eq 0; then + return + fi + echo -e "\e[1m$*\e[0m" 1>&3 +} + +# write error message +error() { + echo -en "\e[1;31merror" 1>&2 + append_msg $* 1>&2 +} + +# write a warning message +warning() { + echo -en "\e[1;33mwarning" 1>&2 + append_msg $* 1>&2 +} + +# write a success message +success() { + echo -en "\e[1;32msuccess" 1>&2 + append_msg $* 1>&2 +} + +# commandline parameter evaluation +while test $# -gt 0; do + case "$1" in + (--help|-h) less < running:\e[0m $* ..." + result=$($* 2>&1) + res=$? + if test $res -ne 0; then + if test $check -eq 1; then + error "failed with return code: $res" + if test -n "$result"; then + echo "$result" + fi + exit 1 + else + warning "ignored return code: $res" + fi + else + success + fi +} + +# error handler +function traperror() { + set +x + local err=($1) # error status + local line="$2" # LINENO + local linecallfunc="$3" + local command="$4" + local funcstack="$5" + for e in ${err[@]}; do + if test -n "$e" -a "$e" != "0"; then + 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 + exit $e + fi + done + success + exit 0 +} + +# catch errors +trap 'traperror "$? ${PIPESTATUS[@]}" $LINENO $BASH_LINENO "$BASH_COMMAND" "${FUNCNAME[@]}" "${FUNCTION}"' ERR SIGINT INT TERM EXIT + +########################################################################################## +