Skip to content
Snippets Groups Projects
prep_code.sh 6.51 KiB
Newer Older
  • Learn to ignore specific revisions
  • #!/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 ) $@"
    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}
    
    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
    
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
    ###### 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
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
          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
    
      #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
          $PHYEXTOOLSDIR/correct_indent.py tempo_mnh_expand "indent"
          mv tempo_mnh_expand_CORRECT_INDENT $1
    
        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