#!/bin/bash . $GVM_ROOT/scripts/functions download_source() { GO_CACHE_PATH=$GVM_ROOT/archive/go GO_SOURCE_URL=https://go.googlecode.com/hg/ [ -d $GO_CACHE_PATH ] && return echo "Downloading Go source..." hg clone $GO_SOURCE_URL $GO_CACHE_PATH >> $GVM_ROOT/logs/go-download.log 2>&1 || display_error "Couldn't download Go source" } check_tag() { version=`hg tags -R $GO_CACHE_PATH | awk '{print $1}' | sort | grep $VERSION | head -n 1 | grep $VERSION` } update_source() { echo "Updating Go source..." hg pull -R $GO_CACHE_PATH >> $GVM_ROOT/logs/go-download.log 2>&1 || display_error "Couldn't get latest Go version info" } copy_source() { hg clone -u $version $GO_CACHE_PATH $GO_INSTALL_ROOT >> $GVM_ROOT/logs/go-$version-install.log 2>&1 || display_error "Couldn't copy source to target folder" } compile_go() { echo " * Compiling..." unset GOARCH && unset GOOS && unset GOPATH && unset GOBIN && unset GOROOT && export GOBIN=$GO_INSTALL_ROOT/bin && export PATH=$GOBIN:$PATH && export GOROOT=$GO_INSTALL_ROOT && cd $GO_INSTALL_ROOT/src && ./all.bash &> $GVM_ROOT/logs/go-$version-compile.log || (rm -rf $GO_INSTALL_ROOT && display_error "Failed to compile") } create_enviroment() { new_env_file=$GVM_ROOT/environments/$version echo "export GVM_ROOT; GVM_ROOT=\"$GVM_ROOT\"" > $new_env_file echo "export gvm_go_name; gvm_go_name=\"$version\"" >> $new_env_file echo "export gvm_pkgset_name; gvm_pkgset_name=\"global\"" >> $new_env_file echo "export GOROOT; GOROOT=\"\$GVM_ROOT/gos/$version\"" >> $new_env_file echo "export GOPATH; GOPATH=\"\$GVM_ROOT/pkgsets/$version/global\"" >> $new_env_file echo "export PATH; PATH=\"\$GVM_ROOT/pkgsets/$version/global/bin:\$GVM_ROOT/gos/$version/bin:\$GVM_ROOT/bin:\$PATH\"" >> $new_env_file . $GVM_ROOT/scripts/env/use gvm_use $version &> /dev/null gvm pkgset create global . $GVM_ROOT/scripts/env/pkgset-use gvm_pkgset_use global &> /dev/null unset GOPATH } install_go() { GO_INSTALL_ROOT=$GVM_ROOT/gos/$version trap 'rm -rf $GO_INSTALL_ROOT; display_error "Canceled!"' INT # Check for existing install [ -d $GO_INSTALL_ROOT ] && display_error "Already installed!" echo "Installing $version..." # Create the global package set folder mkdir -p $GVM_ROOT/pkgsets/$version >> $GVM_ROOT/logs/go-$version-install.log 2>&1 || display_error "Couldn't create global package set folder" copy_source compile_go create_enviroment } install_gpkg() { echo " * Installing gpkg..." goinstall github.com/moovweb/gvm/gpkg > /dev/null 2>&1 if [[ $? -ne 0 ]]; then echo "Failed to install gpkg" return 1 fi } install_gb() { if [[ "$version" == "release.r60.3" ]]; then echo " * Installing gb..." goinstall github.com/skelterjohn/go-gb/gb > /dev/null 2>&1 if [[ $? -ne 0 ]]; then echo "Failed to install gb" return 1 fi fi } install_goprotobuf() { if [[ "$version" == "release.r60.3" ]]; then echo " * Installing goprotobuf..." goinstall goprotobuf.googlecode.com/hg/proto > /dev/null 2>&1 if [[ $? -ne 0 ]]; then echo "Failed to install goprotobuf" return 1 fi cd $GVM_ROOT/gos/$version/src/pkg/goprotobuf.googlecode.com/hg/compiler make install > $GVM_ROOT/logs/$version-pb-compiler.log 2>&1 if [[ $? -ne 0 ]]; then echo "Failed to install goprotobuf compiler" return 1 fi fi } main() { VERSION=$1 trap 'display_error "Canceled!"' INT # GREEN! tput sgr0 tput setaf 2 [ -z $VERSION ] && display_error "No version specified" download_source check_tag || (update_source && check_tag) || display_error "Unrecognized Go version" install_go install_gpkg install_gb install_goprotobuf cd $GO_INSTALL_ROOT && find . > manifest tput sgr0 } main $@