From 31922e8ea81d0c69efb2a96621c1b57278453fc2 Mon Sep 17 00:00:00 2001 From: Christian Kern Date: Fri, 27 Feb 2015 13:46:51 +0100 Subject: [PATCH] Modify the create tarball script, to completely automate the tarball creation. Also add gitattributes file, to make git recognize this file as text (and not binary). --- scripts/.gitattributes | 1 + scripts/create_tarball.sh | 386 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------------------------------------------------- 2 files changed, 284 insertions(+), 103 deletions(-) create mode 100644 scripts/.gitattributes diff --git a/scripts/.gitattributes b/scripts/.gitattributes new file mode 100644 index 0000000..cda06ad --- /dev/null +++ b/scripts/.gitattributes @@ -0,0 +1 @@ +create_tarball.sh diff diff --git a/scripts/create_tarball.sh b/scripts/create_tarball.sh index e1bad56..fb84532 100755 --- a/scripts/create_tarball.sh +++ b/scripts/create_tarball.sh @@ -23,47 +23,74 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +#function for printing usage usage() { -echo "Create a tarball of the project. Specify the project root with"; -echo "-d parameter."; -echo ""; -echo "Version number and project name is automatically derived from CMakeLists.txt in the project root."; -echo "Tarball that will be created: [PROJECT_NAME]_[VERSION_NUMBER].tar.gz"; -echo "Example call (from the scripts directory as working directory):"; -echo "$0 -d ../"; -echo ""; -echo "Usage: $0 [-d ]" 1>&2; exit 1; + echo "Create a tarball of the project. Specify the project root with the"; + echo "-d parameter. Optionally, specify the -v switch to get verbose output"; + echo "and/or the -q switch, for non-interactive (without user inputs)"; + echo "processing."; + echo ""; + echo "Version number and project name is automatically derived from CMakeLists.txt"; + echo "in the project's root."; + echo "Tarball name: [PROJECT_NAME]_[VERSION_NUMBER].tar.gz"; + echo "Example call (from the scripts directory as working directory):"; + echo "$0 -d ../"; + echo ""; + echo "Usage: $0 [-d ] [-v] [-q]" 1>&2; exit 1; } +#check if all dependencies are fulfilled +for DEPENDENCY in rsync pdflatex bibtex cp tar mktemp cd grep cmake find file echo python realpath sed +do + command -v $DEPENDENCY >/dev/null 2>&1 || { echo >&2 "This script requires $DEPENDENCY but it's not installed. Exiting."; exit 1; } +done -while getopts ":d:" o; do - case "${o}" in +#get command line options +while getopts "d:vq" o; do + case "${o}" in d) - d=${OPTARG} - ;; + d=${OPTARG} + ;; + v) + v=1 + ;; + q) + q=1 + ;; *) - usage - ;; - esac + usage + ;; + esac done shift $((OPTIND-1)) +#used as wrapper, for switching between verbose and normal mode +redirect_cmd() { + if [ -z "${v}" ]; then + "$@" > /dev/null 2>&1 + else + "$@" + fi +} + +#user has to specify directory if [ -z "${d}" ]; then - usage + usage fi +#the specified directory has to exist if [ ! -d "$d" ]; then - echo "Error, directory $d does not exist or is not a directory!" - echo "" - usage + echo "--> ! Error, directory $d does not exist or is not a directory!" + echo "" + usage fi CMAKEFILE="$d/CMakeLists.txt" if [ ! -f "$CMAKEFILE" ]; then - echo "Error, could no locate CMakeLists.txt" - echo "" - usage + echo "--> ! Error, could no locate CMakeLists.txt" + echo "" + usage fi #derive version number from cmake script @@ -71,109 +98,262 @@ VERSION_MAJOR=`cat $CMAKEFILE | grep EMBB_BASE_VERSION_MAJOR | sed "s/^[^0-9]*\( VERSION_MINOR=`cat $CMAKEFILE | grep EMBB_BASE_VERSION_MINOR | sed "s/^[^0-9]*\([0-9]\+\)[^0-9]*$/\1/g"` VERSION_PATCH=`cat $CMAKEFILE | grep EMBB_BASE_VERSION_PATCH | sed "s/^[^0-9]*\([0-9]\+\)[^0-9]*$/\1/g"` VERSION_NUMBER="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}" + +#generate tarball name PROJECT_NAME=`cat $CMAKEFILE | grep project.*\(.*\) | sed "s/^[^(]*(\([^)]*\)).*$/\1/g" | tr '[:upper:]' '[:lower:]'` n="${PROJECT_NAME}-${VERSION_NUMBER}" TARBALL_NAME="${n}.tar.gz" +#verify that tarball doesn't allow forbidden characters if ! [[ $TARBALL_NAME =~ ^[a-zA-Z0-9|\.|\_|-]+$ ]]; then - echo "Want to create tarball with name $TARBALL_NAME." >&2 - echo 'Filename not valid, only a-z, A-Z, .,- and _ characters are allowed' >&2 # write to stderr - exit 1 + echo "--> Want to create tarball with name $TARBALL_NAME." >&2 + echo '--> ! Filename not valid, only a-z, A-Z, .,- and _ characters are allowed' >&2 # write to stderr + exit 1 fi -echo "Do you wish to create a tarball with the name $TARBALL_NAME in the current directory?" -select yn in "Yes" "No"; do - case $yn in - Yes ) break;; - No ) echo Leaving tarball creation; exit;; - esac -done +if [ -z "${q}" ]; then + #in interactive mode, ask the user if the tarball shall be created with this filename + echo "--> Do you wish to create a tarball with the name $TARBALL_NAME in the current directory?" + select yn in "Yes" "No"; do + case $yn in + Yes ) break;; + No ) echo Leaving tarball creation; exit 1;; + esac + done +else + echo "--> Tarball with name $TARBALL_NAME will be created." +fi +#check if file with the tarball_name already exists. In interactive mode, ask the user if this file shall be deleted. Otherwise just exit. if [ -f "$TARBALL_NAME" ]; then - echo "File $TARBALL_NAME exists. Delete file?" - select yn in "Yes" "No"; do - case $yn in - Yes ) break;; - No ) echo Leaving tarball creation; exit;; - esac - done - rm $TARBALL_NAME - if [ -f "$TARBALL_NAME" ]; then - echo "Could not delete $TARBALL_NAME" - exit - fi + if [ -z "${q}" ]; then + echo "--> File $TARBALL_NAME exists. Delete file?" + select yn in "Yes" "No"; do + case $yn in + Yes ) break;; + No ) echo Leaving tarball creation; exit 1;; + esac + done + rm $TARBALL_NAME + if [ -f "$TARBALL_NAME" ]; then + echo "Could not delete $TARBALL_NAME" + exit 1 + fi + else + echo "--> ! File $TARBALL_NAME exists. Delete first. Exiting." + exit 1; + fi fi - - +#temporary directory for doxygen +MYTMPDIR_DOXY_BUILD=`mktemp -d` +#temporary directory for building other things (e.g. Latex or integrating snippets into examples) +MYTMPDIR_BUILD=`mktemp -d` +#temporary target directory, from this the tarball will be created MYTMPDIR=`mktemp -d` -echo "Using temporary directory $MYTMPDIR" + +echo "--> Creating temporary directories $MYTMPDIR $MYTMPDIR_BUILD $MYTMPDIR_DOXY_BUILD" +#install traps, deleting the temporary directories when exiting trap "rm -rf $MYTMPDIR" EXIT +trap "rm -rf $MYTMPDIR_DOXY_BUILD" EXIT +trap "rm -rf $MYTMPDIR_BUILD" EXIT + +PROJECT_DIR_FULLPATH=`realpath ${d}` + -echo "Calling rsync to temporary folder" - -rsync \ - --exclude ".git" \ - --exclude ".gitignore" \ - --exclude "build*/" \ - --exclude "scripts/*.tar.gz" \ - --exclude "scripts/cpplint.py" \ - --exclude "scripts/create_tarball.sh" \ - --exclude "scripts/insert_license.sh" \ - --exclude "scripts/license.*" \ - --exclude "scripts/license_*" \ - --exclude "scripts/remove_license.sh" \ - --exclude "mtapi/MTAPI.mm" \ - --exclude ".cproject" \ - --exclude ".gitattributes" \ - --exclude ".project" \ - --exclude "*.blg" \ - --exclude "*.fls" \ - --exclude "*.bbl" \ - --exclude "*.fdb_latexmk" \ - --exclude "*.log" \ - --exclude "*.out" \ - --exclude "*.toc" \ - --exclude "*.aux" \ - --exclude "doc/tutorial/sty" \ - --exclude "doc/tutorial/pics" \ - --exclude "doc/tutorial/content" \ - --exclude "doc/tutorial/*.tex" \ - --exclude "doc/tutorial/*.bib" \ - --exclude "doc/reference/*.xml" \ - --exclude "doc/reference/*.dox" \ - --exclude "doc/reference/*.in" \ - --exclude "doc/reference/header.html" \ - --exclude "doc/reference/*.css" \ - --exclude "doc/examples/insert_snippets.py" \ - --exclude ".travis.yml" \ - --archive --recursive ${d} $MYTMPDIR/${n} - -echo "Replace version number in README" +echo "--> Generating Doxygen" + +REMEMBER_CUR_DIR=$(pwd) +cd $MYTMPDIR_DOXY_BUILD +echo "---> Initialize CMake" +redirect_cmd cmake $PROJECT_DIR_FULLPATH +echo "---> Call CMake with target Doxygen" +redirect_cmd cmake --build . --target doxygen +REFMAN_TEXFILE="$MYTMPDIR_DOXY_BUILD/latex/refman.tex" +DO_CREATE_LATEXDOC=true + +if [ ! -f "$REFMAN_TEXFILE" ]; then + echo "---> ! Could not find doxygen tex source $REFMAN_TEXFILE. Leaving tarball creation." + exit 1; +fi + +#to resolve all references, pdf and bibtex have to be run more than once. With 4 runs, we should get everything right. +PDFRUNS=4 + +echo "---> Build Doxygen PDF reference" + + +if [ "$DO_CREATE_LATEXDOC" = true ] ; then + cd "$MYTMPDIR_DOXY_BUILD/latex" + for ((i=1; i<=$PDFRUNS; i++)); do + echo "----> LaTeX Run ($i/$PDFRUNS)" + redirect_cmd pdflatex refman.tex + redirect_cmd bibtex refman + done +fi + + +cd $REMEMBER_CUR_DIR + +echo "--> Calling rsync to temporary folder 1/2 ($MYTMPDIR)" + +#this is the rsync, to the folder from which the tarball will be created later. Exclude everything, that should not be in the tarball. Also exclude things, that are generated somewhere else, like examples. +redirect_cmd rsync \ + --exclude ".git" \ + --exclude ".gitignore" \ + --exclude ".gitattributes" \ + --exclude "build*/" \ + --exclude "scripts/*.tar.gz" \ + --exclude "scripts/cpplint.py" \ + --exclude "scripts/create_tarball.sh" \ + --exclude "scripts/insert_license.sh" \ + --exclude "scripts/license.*" \ + --exclude "scripts/license_*" \ + --exclude "scripts/remove_license.sh" \ + --exclude "mtapi/MTAPI.mm" \ + --exclude ".cproject" \ + --exclude ".gitattributes" \ + --exclude ".project" \ + --exclude "*.blg" \ + --exclude "*.fls" \ + --exclude "*.bbl" \ + --exclude "*.fdb_latexmk" \ + --exclude "*.log" \ + --exclude "*.out" \ + --exclude "*.toc" \ + --exclude "*.aux" \ + --exclude "doc/tutorial/sty" \ + --exclude "doc/tutorial/pics" \ + --exclude "doc/tutorial/content" \ + --exclude "doc/tutorial/*.tex" \ + --exclude "doc/tutorial/*.bib" \ + --exclude "doc/reference/*.xml" \ + --exclude "doc/reference/*.dox" \ + --exclude "doc/reference/*.in" \ + --exclude "doc/reference/header.html" \ + --exclude "doc/reference/*.css" \ + --exclude "doc/examples" \ + --exclude "doc/examples/insert_snippets.py" \ + --exclude ".travis.yml" \ + --archive --recursive ${d} $MYTMPDIR/${n} + +echo "--> Replace version number in README" README_FILE="$MYTMPDIR/${n}/README.md" +#replace version number in readme if [ -f $README_FILE ]; then - sed -i "s/\[VERSION_NUMBER_TEMPLATE\]/$VERSION_NUMBER/g" $README_FILE + sed -i "s/\[VERSION_NUMBER_TEMPLATE\]/$VERSION_NUMBER/g" $README_FILE +fi + +echo "--> Calling rsync to temporary folder 2/2 ($MYTMPDIR_BUILD)" + +#doing a rsync to another temporary folder, which will be used to build things, like e.g. the tutorial pdf. +redirect_cmd rsync \ + --archive --recursive ${d} $MYTMPDIR_BUILD + +echo "--> Generating Tutorial PDF" +TUTORIAL_TEX_DIR="$MYTMPDIR_BUILD/doc/tutorial" +REMEMBER_CUR_DIR=$(pwd) +TUTORIAL_PDF_SOURCE="$TUTORIAL_TEX_DIR/tutorial.pdf" +TUTORIAL_PDF_TARGET="$MYTMPDIR/${n}/doc/tutorial/tutorial.pdf" + +if [ -f "$TUTORIAL_TEX_DIR/tutorial.tex" ]; then + + cd $TUTORIAL_TEX_DIR + for ((i=1; i<=$PDFRUNS; i++)); do + + echo "---> LaTeX Run ($i/$PDFRUNS)" + redirect_cmd pdflatex tutorial.tex + redirect_cmd bibtex tutorial + done + if [ -f "$TUTORIAL_PDF_SOURCE" ]; then + cp $TUTORIAL_PDF_SOURCE $TUTORIAL_PDF_TARGET + fi +fi +cd $REMEMBER_CUR_DIR + +REFMAN_TARGET="$MYTMPDIR/${n}/doc/reference/reference.pdf" +REFMAN_SOURCE="$MYTMPDIR_DOXY_BUILD/latex/refman.pdf" + +echo "--> Integrating Example Snippets" +REMEMBER_CUR_DIR=$(pwd) + +EXAMPLES_DIR="$MYTMPDIR_BUILD/doc/examples" +INTEGRATE_SNIPPETS_SCRIPT="insert_snippets.py" +EXAMPLES_TARGET_DIR="$MYTMPDIR/${n}/doc/" + +if [ -f $EXAMPLES_DIR/$INTEGRATE_SNIPPETS_SCRIPT ]; then + cd $EXAMPLES_DIR + + + echo "---> Calling integrate script" + redirect_cmd python insert_snippets.py + + if [ -d $EXAMPLES_TARGET_DIR ]; then + echo "---> Copy integrated examples back" + #The examples have been integrated. Copy the integrated source files. + redirect_cmd rsync --archive --recursive $EXAMPLES_DIR $EXAMPLES_TARGET_DIR \ + --exclude=*snippet.h \ + --exclude=*fragmented.h \ + --exclude=*snippet.cc \ + --exclude=*fragmented.cc \ + --exclude=*$INTEGRATE_SNIPPETS_SCRIPT + fi fi -echo "Checking line endings" +cd $REMEMBER_CUR_DIR + +echo "--> Copy reference manual" +if [ -f $REFMAN_SOURCE ]; then + cp $REFMAN_SOURCE $REFMAN_TARGET +else + echo "--> ! Could not find doxygen pdf document $REFMAN_SOURCE. Exiting" + exit 1; +fi +if [ -d $MYTMPDIR_DOXY_BUILD/html ]; then + redirect_cmd rsync --archive --recursive $MYTMPDIR_DOXY_BUILD/html/ $MYTMPDIR/${n}/doc/reference/doxygen_html_generated +else + echo "Doxygen HTML was not generated. Tarball will not contain HTML reference documentation. Exiting." + exit 1; +fi + +echo "--> Checking line endings" + +#check for files, that have windows file endings. Those are forbidden. WINLINES=`find $MYTMPDIR/${n} -not -type d -exec file "{}" ";" | grep CRLF` if [ -n "$WINLINES" ]; then - echo "Detected Dos line endings in following files:" - echo "$WINLINES" - echo "Warning: The project guidelines forbid Dos line endings. Continue creating tarball?" - select yn in "Yes" "No"; do - case $yn in - Yes ) break;; - No ) echo Leaving tarball creation; exit;; - esac - done -fi - -echo "Calling tar" + echo "Detected Dos line endings in following files:" + echo "$WINLINES" + echo "Error: The project guidelines forbid Dos line endings. Exiting." + exit 1; +fi + +#sanity check... verify, that expected targets are there, otherwise abort... +if ! [ -f $MYTMPDIR/${n}/doc/examples/main.cc ]; then + echo "--> ! Examples missing. Exiting." + exit 1; +fi + +if ! [ -f $MYTMPDIR/${n}/doc/tutorial/tutorial.pdf ]; then + echo "--> ! Tutorial PDF missing. Exiting." + exit 1; +fi + +if ! [ -f $MYTMPDIR/${n}/doc/reference/reference.pdf ]; then + echo "--> ! Reference PDF documentation missing. Exiting." + exit 1; +fi + +if ! [ -f $MYTMPDIR/${n}/doc/reference/doxygen_html_generated/index.html ]; then + echo "--> ! Reference HTML documentation missing. Exiting." + exit 1; +fi + +#finally, build the tarball. +echo "--> Calling tar" tar -czf $TARBALL_NAME -C $MYTMPDIR ${n} -echo "Done. Created $TARBALL_NAME." +echo "--> Done. Created $TARBALL_NAME." -- libgit2 0.26.0