To get your local Golang repo's sym-linked at your GOPATH and local changes available...
---
Every now and then working on my favorite new programming language Golang, I have inter-dependent changes among different packages. To confirm their as-required working state, I'd like the GOPATH to provide the compiled object with local-changes included.
The utility I've been using to push local package changes to GOPATH provided object is following "goenv_alpha" bash function as a shell-profile provided utility.
Say, I've a golang project "github.com/abhishekkr/goshare" which utilizes "github.com/abhishekkr/goshare/httpd", "github.com/abhishekkr/goshare/zeromq" and few more.
If I make some local changes at "{PROJECTS}/goshare" and "{PROJECTS}/goshare/httpd". To push those into GOPATH provided package for testing, following commands using below function "goenv_alpha" shell-util would do the job...
goenv_link(){
if [ $# -ne 2 ]; then
echo "Links up current dir to it's go-get location in GOPATH"
echo "SYNTAX: goenv_linkme "
return 1
fi
_REPO_DIR=$1
_REPO_URL=$2
_TMP_PWD=$PWD
cd $_REPO_DIR
if [ -d "${GOPATH}/src/${_REPO_URL}" ]; then
echo "$_REPO_URL already exists at GOPATH $GOPATH"
go get "${_REPO_URL}"
return 1
fi
_REPO_BASEDIR=$(dirname "${GOPATH}/src/${_REPO_URL}")
if [ ! -d "${_REPO_BASEDIR}" ]; then
mkdir -p "${_REPO_BASEDIR}/src"
fi
ln -sf "${PWD}" "${GOPATH}/src/${_REPO_URL}"
go get "${_REPO_URL}"
cd $_TMP_PWD
}
alias goenv_linkme="goenv_link $PWD"
---
Every now and then working on my favorite new programming language Golang, I have inter-dependent changes among different packages. To confirm their as-required working state, I'd like the GOPATH to provide the compiled object with local-changes included.
The utility I've been using to push local package changes to GOPATH provided object is following "goenv_alpha" bash function as a shell-profile provided utility.
Say, I've a golang project "github.com/abhishekkr/goshare" which utilizes "github.com/abhishekkr/goshare/httpd", "github.com/abhishekkr/goshare/zeromq" and few more.
If I make some local changes at "{PROJECTS}/goshare" and "{PROJECTS}/goshare/httpd". To push those into GOPATH provided package for testing, following commands using below function "goenv_alpha" shell-util would do the job...
$ goenv_alpha "{PROJECTS}/goshare" "github.com/abhishekkr/goshare"
$ goenv_alpha "{PR..}/goshare/httpd" "github.com/abhishekkr/goshare/httpd"
These commands will ask you to make a backup file for current existing version of package resource from GOPATH, you can give any name... which will be asked while restoring or you can leave it empty to avoid creating a backup file.
~
~
You can undo the pushing of local changes inclusive package resource if you have created a backup file for earlier existing file.
Following commands utilizes the below provided shell-util function "goenv_alpha_undo".
This will list you the names of backup files present if any, then you can provide the name of your chosen backup file and restore to that package state.
~
~
goenv_alpha(){ _TMP_PWD=$PWD if [ $# -ne 2 ]; then echo "Provide Alpha changes usable as any other go package." echo "Just the import path changes to 'alpha/'" echo "SYNTAX: goenv_alphareturn 1 fi _REPO_DIR=$1 _REPO_URL=$2 cd $_REPO_DIR _PKG_PARENT_NAME=$(dirname $PWD) _PKG_NAME=$(basename $PWD) " _PKG_NAME_IN_REPO=$(basename $_REPO_URL) if [ $_PKG_NAME_IN_REPO != $_PKG_NAME ]; then echo "Path for creating alpha doesn't match the import 'url' for it." return 1 fi `go build -work . 2> /tmp/$_PKG_NAME` _BUILD_PATH=`cat /tmp/$_PKG_NAME | sed 's/WORK=//'` if [ ! -d $_BUILD_PATH ]; then echo "An error occured while building, it's recorded at /tmp/$_PKG_NAME" return 1 fi rm -f /tmp/$_PKG_NAME _CURRENT_OBJECT_PATH="${GOPATH}/pkg/${GOOS}_${GOARCH}" _CURRENT_OBJECT="${_CURRENT_OBJECT_PATH}/${_REPO_URL}.a" _NEW_OBJECT="${_BUILD_PATH}/_${_PKG_PARENT_NAME}/${_PKG_NAME}.a" echo "Do you wanna backup current object? If yes enter a filename for it: " read GO_ALPHA_BACKUP if [ ! -z $GO_ALPHA_BACKUP ]; then mv $_CURRENT_OBJECT "${_CURRENT_OBJECT_PATH}/${_REPO_URL}/${GO_ALPHA_BACKUP}.backup" fi mv $_NEW_OBJECT $_CURRENT_OBJECT cd $_TMP_PWD echo "\nAlpha changes have been updated at ${_CURRENT_OBJECT}." }
~
You can undo the pushing of local changes inclusive package resource if you have created a backup file for earlier existing file.
Following commands utilizes the below provided shell-util function "goenv_alpha_undo".
$ goenv_alpha_undo "{PROJECTS}/goshare" "github.com/abhishekkr/goshare"
$ goenv_alpha_undo "{PR..}/goshare/httpd" "github.com/abhishekkr/goshare/httpd"
This will list you the names of backup files present if any, then you can provide the name of your chosen backup file and restore to that package state.
~
goenv_alpha_undo(){ _TMP_PWD=$PWD if [ $# -ne 2 ]; then echo "Provide Alpha changes usable as any other go package." echo "Just the import path changes to 'alpha/'" echo "SYNTAX: goenv_alphareturn 1 " fi _REPO_DIR=$1
_REPO_URL=$2 cd $_REPO_DIR _PKG_PARENT_NAME=$(dirname $PWD) _PKG_NAME=$(basename $PWD) _PKG_NAME_IN_REPO=$(basename $_REPO_URL) if [ $_PKG_NAME_IN_REPO != $_PKG_NAME ]; then echo "Path for creating alpha doesn't match the import 'url' for it." return 1 fi _CURRENT_OBJECT_PATH="${GOPATH}/pkg/${GOOS}_${GOARCH}" _CURRENT_OBJECT="${_CURRENT_OBJECT_PATH}/${_REPO_URL}.a" _BACKUP_OBJECT="${_BUILD_PATH}/_${_PKG_PARENT_NAME}/${_PKG_NAME}.a" echo "Available package files are:" ls -1 $_CURRENT_OBJECT_PATH/$_REPO_URL | grep $_PKG_NAME | grep -v grep echo "Enter your backup filename for it: " read GO_ALPHA_BACKUP if [ -z $GO_ALPHA_BACKUP ]; then echo "\nNo Backup file was entered." ; return 1 fi mv "${_CURRENT_OBJECT_PATH}/${_REPO_URL}/${GO_ALPHA_BACKUP}" $_CURRENT_OBJECT cd $_TMP_PWD echo "\nAlpha changes have been reverted with the provided backup file." }
~
The full [WIP] shell-profile for golang utilities is at:
https://github.com/abhishekkr/tux-svc-mux/blob/master/shell_profile/a.golang.sh