#!/bin/bash
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.
#


GIT() {
    CMD git "$@"
}


OSM_git_checkout() {

    # Updates all the branches in the local repo (clones if it does not exist)
    if [ -d $OSM_MDG ]; then
        INFO "reusing existing workspace"
        cd $OSM_MDG
        GIT fetch --all --tags
        #git checkout master  #to make sure that we are in the right branch before pulling the code
        #git pull
    else
        INFO "cloning MDG $OSM_MDG from $OSM_GIT_URL/$OSM_MDG"
        GIT clone $OSM_GIT_URL/$OSM_MDG
        cd $OSM_MDG
        for remote in `git branch -r |grep -v /HEAD`; do GIT branch --track ${remote#origin/} $remote; done
    fi
    
    if [ $# -gt 0 ]; then
        if [ "$1" = "checkout" ]; then
            INFO "Code to compile: '$2'"
            GIT checkout $2
        else
            INFO "Code to compile: gerrit refspec '$1', commit-id: '$2'"
            GIT fetch origin $1 || FATAL "git fetch origin '$1' didn't work"
            GIT checkout -f $2 || FATAL "git checkout -f '$2' didn't work"
        fi
    else
        INFO "Code to compile: master"
        GIT checkout master
    fi

}

