#!/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.
# 
# 

HERE=$(realpath $(dirname $0))
OSM_JENKINS=$(dirname $HERE)
. $OSM_JENKINS/common/all_funcs

# SET YOU MDG repository name here
export OSM_MDG=RO
OSM_load_config


# Here is an example for how to handle an incremental build
if [ -d $OSM_MDG ]; then
	INFO "reusing existing workspace"
	cd $OSM_MDG
        git checkout master  #to make sure that we are in the right branch before pulling the code
	git pull
        # TO DO: probably it makes sense to fetch all branches, but this requires creating the branches locally
else
	INFO "cloning MDG $OSM_MDG from $OSM_GIT_URL/$OSM_MDG"
	git clone $OSM_GIT_URL/$OSM_MDG
	cd $OSM_MDG
fi

if [ $# -gt 0 ]; then
        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"
else
        INFO "Code to compile: master"
	git checkout master
fi

INFO "starting build"

rm *.pyc
python -m py_compile *.py
RC=$?
git checkout master #Cleaning the environment. It's also done at the beginning, but it's done just in case.

INFO "done, RC=$RC"
exit $RC


