#!/bin/bash #------------------------------------------------------------------------------ # ========= | # \\ / F ield | OpenFOAM: The Open Source CFD Toolbox # \\ / O peration | # \\ / A nd | www.openfoam.com # \\/ M anipulation | #------------------------------------------------------------------------------ # Copyright (C) 2019 OpenCFD Ltd. #------------------------------------------------------------------------------ # License # This file is part of OpenFOAM. # # OpenFOAM is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # OpenFOAM is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # # You should have received a copy of the GNU General Public License # along with OpenFOAM. If not, see . # # Script # foamPackRelease [OPTION] # # Description # Simple script generator for packing OpenFOAM sources and submodules # # $ foamPackRelease -output=some/path origin/master > create-tar # $ bash ./create-tar # # Or directly: # # $ foamPackRelease -tgz origin/master | bash # # Done as two-step process to allow further manual adjustments as required #------------------------------------------------------------------------------ Script="${0##*/}" usage() { exec 1>&2 while [ "$#" -gt 0 ]; do echo "$1"; shift; done cat < create-tar sh ./create-tar $Script -tgz origin/master | bash USAGE exit 1 } # Report error and exit die() { exec 1>&2 echo echo "Error encountered:" while [ "$#" -ge 1 ]; do echo " $1"; shift; done echo echo "See '${0##*/} -help' for usage" echo exit 1 } #------------------------------------------------------------------------------- outputDir="." versionSeparator='_' unset compress skipModules skipPatchNum while [ "$#" -gt 0 ] do case "$1" in -h | -help*) usage ;; -output) [ "$#" -ge 2 ] || usage "'$1' option requires an argument" outputDir="$2" shift ;; -output=*) outputDir="${1#*=}" ;; -no-modules) skipModules=true ;; -no-patch) skipPatchNum=true ;; -compress=*) compress="${1#*=}" ;; -sep=*) versionSeparator="${1#*=}" ;; -tgz) compress="${1#*-}" ;; -*) usage "unknown option: '$*'" ;; *) break ;; esac shift done commit="$1" [ "$#" -eq 1 ] && [ -n "$commit" ] || usage "Requires one argument" # Failsafe patch, version separator : "${versionSeparator:=_}" #------------------------------------------------------------------------------- # Resolve the output directory outputDir="$(cd "$outputDir" 2>/dev/null && pwd -L)" || \ die "Cannot resolve output directory" [ -w "$outputDir" ] || \ die "Output directory non-writable: $outputDir" echo "Using outputDir=$outputDir" 1>&2 #------------------------------------------------------------------------------- # Locate the git repository # Locate git-dir via rev-parse findGitDir() { ( if cd "$1" 2>/dev/null && \ git rev-parse --is-inside-work-tree > /dev/null 2>&1 then git rev-parse --show-toplevel 2>/dev/null fi ) } echo "Find git repository ... from script location" 1>&2 gitbase=$(findGitDir "${0%/*}") ##DEBUG unset gitbase if [ -z "$gitbase" ] then echo "Find git repository ... from current directory" 1>&2 gitbase=$(findGitDir "$PWD") fi [ -d "$gitbase" ] || die "Could not locate a git directory" echo "Detected git repository at $gitbase" 1>&2 # Resolve the given commit-ish to a real commit number. # Eg, origin/master on input, SHA1 on output head="$(git --git-dir="$gitbase/.git" rev-parse "$commit")" [ -n "$head" ] || die "Could resolve requested start point $commit" echo "Resolved $commit as $head" 1>&2 #------------------------------------------------------------------------------- # Determine the API and PATCH numbers. # Extract from META-INFO/api-info unset api patch sha1 # Grab the sha1 for the file sha1=$(git --git-dir="$gitbase/.git" ls-tree "$head" META-INFO/api-info | \ awk '{ if ($2 == "blob") { print $3 }}') [ -n "$sha1" ] || die "Could locate git content for META-INFO/api-info" # The api and patch api="$(git --git-dir="$gitbase/.git" show "$sha1" | sed -ne s/api=//p)" patch="$(git --git-dir="$gitbase/.git" show "$sha1" | sed -ne s/patch=//p)" [ -n "$api" ] || die "Could resolve api value" # Determine the BUILD information from git, as per wmakeBuildInfo. build="$(git --git-dir="$gitbase/.git" log -1 --date=short --format='%h=%ad' 2>/dev/null|sed 's/-//g;s/=/-/')" echo "Detected api, patch, build as '$api', '$patch', '$build'" 1>&2 # Define the output names dirPrefix="OpenFOAM-v${api}" tarName="OpenFOAM-v${api}" if [ "$skipPatchNum" = true ] then echo "Ignoring patch number for output name" 1>&2 elif [ "${patch:-0}" -gt 0 ] then tarName="${tarName}${versionSeparator}${patch}" fi echo 1>&2 echo "Tar-file name: $tarName.tar" 1>&2 echo "Directory name: $dirPrefix/" 1>&2 echo 1>&2 #------------------------------------------------------------------------------- # Create main tar echo '#!/bin/bash' echo "cd '$gitbase/' || exit" echo "api='$api'" echo "patch='${patch:-0}'" echo "build='$build'" echo "head='$head'" echo "outputDir='$outputDir'" echo "dirPrefix='$dirPrefix'" echo "tarName='$tarName'" # Note - directory separator '/' encoded as '@' for manifest name echo 'manifest="${dirPrefix}@META-INFO@manifest.txt"' echo 'buildInfo="${dirPrefix}@META-INFO@build-info"' echo '#--------' echo 'set -x' echo 'umask 0022' echo 'git -c tar.umask=user archive --format=tar --prefix="$dirPrefix/" -o "$outputDir/$tarName.tar" "$head"' # Tag build information with underscore to distinguish from "real" build # information when git is available. echo 'echo build="${build:+_}$build" > "$outputDir/$buildInfo"' echo '{' echo ' echo api="$api"' echo ' echo patch="$patch"' echo ' echo head="$head"' echo ' echo' echo ' git ls-tree -r "$head"' echo '} > "$outputDir/$manifest"' #------------------------------------------------------------------------------ # Add in mpdules if [ "$skipModules" != true ] then git --git-dir="$gitbase/.git" ls-tree "$head" modules/ | \ while read mode gittype sha1 module do [ "$gittype" == commit ] || continue echo echo "module=\""$module"\"" echo "commit=\""$sha1"\"" echo "tarModule=\""$tarName-${module##*/}"\"" echo echo 'if pushd "$module"; then' echo 'git -c tar.umask=user archive --format=tar --prefix="$dirPrefix/$module/" -o "$outputDir/$tarModule.tar" "$commit"' echo 'tar -Af "$outputDir/$tarName.tar" "$outputDir/$tarModule.tar"' echo 'rm -f "$outputDir/$tarModule.tar"' echo '{' echo ' echo' echo ' echo "$module"' echo ' echo commit="$commit"' echo ' echo' echo ' git ls-tree -r "$commit"' echo '} >> "$outputDir/$manifest"' echo 'popd; fi' done fi #------------------------------------------------------------------------------ # Add in build-info and manifest files # Decode '@' in the names as '/' directory separator echo echo '{ echo; echo "# End"; } >> "$outputDir/$manifest"' echo echo "echo 'Adding build-info and manifest files'" echo 'if pushd "$outputDir"; then' echo "tar --owner=root --group=root --append --transform='s|@|/|g' -v -f \"\$tarName.tar\" \"\$buildInfo\" \"\$manifest\"" echo 'rm -f "$buildInfo" "$manifest"' echo 'popd; fi' echo echo "# End of creating archive" echo #------------------------------------------------------------------------------ # Compression case "$compress" in ('') echo "No compression requested" 1>&2 ;; (gz | gzip) echo "Using gzip compression" 1>&2 echo 'gzip -9 "$outputDir/$tarName.tar"' echo echo '# End of compression' ;; (tgz) echo "Using gzip compression with tgz ending" 1>&2 echo 'gzip -c -9 "$outputDir/$tarName.tar" > "$outputDir/$tarName.tgz"' echo 'rm -f "$outputDir/$tarName.tar"' echo echo '# End of compression' ;; (bz | bzip | bzip2) echo "Using bzip2 compression" 1>&2 echo 'bzip2 -9 "$outputDir/$tarName.tar"' echo echo '# End of compression' ;; (xz) echo "Using xz compression" 1>&2 echo 'xz -9 "$outputDir/$tarName.tar"' echo echo '# End of compression' ;; (*) echo "Unknown compression scheme: $compress" 1>&2 ;; esac #------------------------------------------------------------------------------