Newer
Older
#!/bin/bash
set -e
#This script can:
# - extract a tag or a commit from the PHYEX repository
# - merge code from common and model specific directories
# - apply mnh_expand tool
# - push the result in a new branch of the repository
###### CONFIGURATION
repository_https=https://github.com/QuentinRodier/PHYEX.git
repository_ssh=git@github.com:QuentinRodier/PHYEX.git
PHYEXTOOLSDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
###### COMMAND LINE ARGUMENTS
function usage {
echo "Usage: $0 [-h] [-c CHECKOUT_POINT] [-m MODEL] [-D OPTION [-D OPTION [...]]]] \\"
echo " [-s SUBDIR [-s SUBDIR [...]]] [-v [-v [-v]]] DIRECTORY"
echo "DIRECTORY directory containing the script result"
echo "-c CHECKOUT_POINT git object to checkout, can be a specific commit"
echo " or a tag with the following syntax: tags/TAG where TAG is the tag name"
echo "-m MODEL merge the code under the common directory with the code specific to MODEL model"
echo "-D OPTION option to use with mnh_expand"
echo " BE CARREFULL, a space between -D and the option is required here"
echo "-p push the result as a new branch"
echo "-s SUB subdiretory or file (under src) to consider when merging and applying mnh_expand"
echo "--renameFf rename .F90 into .f90"
echo "--ssh use ssh instead of https for git cloning"
echo "-v add verbosity (up to 3 -v)"
echo ""
echo "* If the -c option is not provided, DIRECTORY must already contain files and directory as if"
echo " it was the result of a git checkout"
echo "* If the -m option is used, directory tree is modified, only relevant code is kept"
echo "* If no -D options are used, mnh_expand is not called at all"
echo "* -s options are mandatory for -m, -D and -p options"
echo "* -p option is allowed only if -c and -m options are provided"
echo ""
echo "To use mnh_expand... it must be installed (alongside the filepp tool)"
}
full_command="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}") $@"
separator='_' #- be carrefull, gmkpack (at least on belenos) has multiple allergies (':', '.', '@')
#- seprator must be in sync with prep_code.sh separator
directory=""
checkout_point=""
mnh_expand_options=""
model=""
push=0
subs=""
renameFf=0
verbose=0
repository=$repository_https
while [ -n "$1" ]; do
case "$1" in
'-h') usage;;
'-c') checkout_point="$2"; shift;;
'-m') model="$2"; shift;;
'-D') mnh_expand_options="$mnh_expand_options -D$2"; shift;;
'-s') subs="$subs $2"; shift;;
'-p') push=1;;
'--renameFf') renameFf=1;;
'--ssh') repository=$repository_ssh;;
'-v') verbose=$(($verbose+1));;
*) directory="$1";;
esac
shift
done
if [ $verbose -ge 3 ]; then
set -x
fi
###### BRANCH OR NOT BRANCH
if [ -n "${checkout_point-}" -a -n "${model-}" -a $push == 1 ]; then
branch=${model}${separator}${checkout_point}
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
fi
###### WORKING DIRECTORY
if [ -z "${directory-}" ]; then
echo "A directory must be provided on command line (use -h option to get help)"
exit 1
fi
if [ -z "${checkout_point-}" ]; then
[ $verbose -gt 0 ] && echo "No checkout point provided, we use the content of $directory directory"
if [ ! -d $directory/src ]; then
echo "$directory must be filled with files and directories as if it was obtained through a checkout"
exit 2
fi
cd $directory
from='dir'
else
[ $verbose -gt 0 ] && echo "Clone and checkout $checkout_point into $directory directory"
if [ -d $directory ]; then
echo "$directory already exists, suppress it before executing the script (or remove the -c option)"
exit 3
fi
git clone $repository $directory
cd $directory
if [ -n "${branch-}" ]; then
if [ $(git ls-remote --heads origin SR_GPU | wc -l) -eq 1 ]; then
echo "$branch branch already exists on remote"
exit 4
fi
branch="-b $branch"
fi
git checkout $branch $checkout_point
from='git'
fi
###### RENAME .F90 into .f90
if [ $renameFf -eq 1 ]; then
find . -type f -name \*.F90 -print0 | \
while IFS= read -r -d '' file; do
mv -- "$file" "${file%.F90}.f90"
done
fi
###### MERGE
if [ -n "${model-}" ]; then
if [ ! -d src/$model ]; then
echo "src/$model directory does not exist"
exit 5
fi
if [ -z "${subs-}" ]; then
echo "It is not possible to merge common and model specific codes if no subs are provided"
exit 6
fi
[ $verbose -gt 0 ] && echo "Merge common code and $model specific code"
files=$(\ls -A) #files to suppress at the end
#Merge
for sub in $subs; do
[ $verbose -gt 1 ] && echo "Merging $sub directory/file"
if [ -e $sub ]; then
echo "$sub must not exist in the repository root, this is a limitation of the script"
exit 7
fi
[ -e src/common/$sub ] && mv src/common/$sub .
[ -e src/$model/$sub ] && cp -rlf src/$model/$sub . && rm -rf src/$model/$sub
done

RIETTE Sébastien
committed
#Supression of unwanted files
if [ -f src/$model/filesToSuppress.txt ]; then
#Some files can be present in the common directory but are not wanted for a model export
#because these files are already existing elsewhere in the model source code
while read -r line; do
filename=$(echo $line | sed -e 's/^[[:space:]]*//' | sed -e 's/[[:space:]]*$//') #trim
[ -f "$filename" ] && rm -f "$filename"
done < src/$model/filesToSuppress.txt
fi
#Cleaning
[ $verbose -gt 0 ] && echo "Cleaning unrelevant files"
#multiple checks to prevent error
if [ $from == 'git' -a ! $(git config --get remote.origin.url) == "$repository" ]; then
echo "Not inside the right git!!!!!!!!!!!!!!!!"
exit 8
fi
for file in $files; do
if [ $from == 'dir' -o $(git ls-files --error-unmatch $file 2>/dev/null | wc -l) -gt 0 ] ; then
[ $verbose -gt 1 ] && echo "Suppression of $file"
rm -rf $file
fi
done
fi
###### MNH_EXPAND
if [ -n "${mnh_expand_options-}" ]; then
[ $verbose -gt 0 ] && echo "Applying mnh_expand"
function apply_mnh_expand () {
if grep mnh_expand $1 > /dev/null 2>&1 ; then
[ $verbose -gt 1 ] && echo "Applying mnh_expand on $1"
$PHYEXTOOLSDIR/correct_indent.py $1 "detect"
mnh_expand -DMNH_EXPAND_NOCPP $mnh_expand_options $1_EXPAND > tempo_mnh_expand

RODIER Quentin
committed
rm -f $1_EXPAND
$PHYEXTOOLSDIR/correct_indent.py tempo_mnh_expand "indent"
mv tempo_mnh_expand_CORRECT_INDENT $1
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
fi
}
if [ -n "${model-}" ]; then
reps=$subs
else
reps=""
for sub in $subs; do
reps="$reps src/*/$sub"
done
fi
for rep in $reps; do
if [ -d $rep ]; then
#find $rep -type f | while read file; do
find $rep -type f -not -name '.*.swp' | while read file; do
apply_mnh_expand "$file"
done
fi
done
fi
###### PUSH
if [ -n "${branch-}" ]; then
[ $verbose -gt 0 ] && echo "commit and push"
git add -A
git commit -m "Version '$checkout_point' of source code ready for inclusion into $model source tree" -m "$full_command"
git push -u origin HEAD
fi
[ $verbose -gt 0 ] && echo "Finished!"
exit 0