From 6be8e328bad746de39b9004977486b0d1a3f5bbd Mon Sep 17 00:00:00 2001 From: Irakli Nadareishvili Date: Sun, 6 Aug 2017 01:02:01 +0400 Subject: [PATCH] making couple of improvements to Chris' PR, as commented in the PR --- cmd/justgo/README.md | 21 ++++++++++ cmd/justgo/glide.yaml | 2 + cmd/justgo/go-wrapper | 97 +++++++++++++++++++++++++++++++++++++++++++ cmd/justgo/justgo.go | 18 +++++--- 4 files changed, 132 insertions(+), 6 deletions(-) create mode 100644 cmd/justgo/README.md create mode 100755 cmd/justgo/go-wrapper diff --git a/cmd/justgo/README.md b/cmd/justgo/README.md new file mode 100644 index 0000000..4510589 --- /dev/null +++ b/cmd/justgo/README.md @@ -0,0 +1,21 @@ +## Instructions for developing the CLI Interface + +If you are interested in contributing to the development of this CLI tool, +following are the instructions for setting up a dev environment: + +## Installation + +```BASH +> git clone https://github.com/inadarei/justgo.git +> cd justgo/cmd/justgo +> glide install +> ./go-wrapper install +> ./go-wrapper run +``` + +## Warning for VS Code Users + +If you are using VS Code with Go tooling, you will want to change the default +`"go.formatTool": "goreturns",` formatter to `"go.formatTool": "gofmt",` instead since the former +seems unable to properly detect the usage of uuid in the code and keeps removing the uuid package's +import statement from code, making it error-out during a build. Gofmt has no such issues. \ No newline at end of file diff --git a/cmd/justgo/glide.yaml b/cmd/justgo/glide.yaml index b21ff57..554233f 100644 --- a/cmd/justgo/glide.yaml +++ b/cmd/justgo/glide.yaml @@ -2,3 +2,5 @@ package: github.com/inadarei/justgo/cmd/justgo import: - package: github.com/urfave/cli version: ^1.19.1 +- package: github.com/satori/go.uuid + version: ^1.1.0 diff --git a/cmd/justgo/go-wrapper b/cmd/justgo/go-wrapper new file mode 100755 index 0000000..4de37ea --- /dev/null +++ b/cmd/justgo/go-wrapper @@ -0,0 +1,97 @@ +#!/bin/sh +set -e + +usage() { + base="$(basename "$0")" + cat <&2 + exit 1 +fi +# "shift" so that "$@" becomes the remaining arguments and can be passed along to other "go" subcommands easily +cmd="$1" +shift + +goDir="$(go list -e -f '{{.ImportComment}}' 2>/dev/null || true)" + +if [ -z "$goDir" -a -s .godir ]; then + goDir="$(cat .godir)" +fi + +dir="$(pwd -P)" +if [ "$goDir" ]; then + goPath="${GOPATH%%:*}" # this just grabs the first path listed in GOPATH, if there are multiple (which is the detection logic "go get" itself uses, too) + goDirPath="$goPath/src/$goDir" + mkdir -p "$(dirname "$goDirPath")" + if [ ! -e "$goDirPath" ]; then + ln -sfv "$dir" "$goDirPath" + elif [ ! -L "$goDirPath" ]; then + echo >&2 "error: $goDirPath already exists but is unexpectedly not a symlink!" + exit 1 + fi + goBin="$goPath/bin/$(basename "$goDir")" +else + goBin="$(basename "$dir")" # likely "app" +fi + +case "$cmd" in + download) + set -- go get -v -d "$@" + if [ "$goDir" ]; then set -- "$@" "$goDir"; fi + set -x; exec "$@" + ;; + + install) + set -- go install -v "$@" + if [ "$goDir" ]; then set -- "$@" "$goDir"; fi + set -x; exec "$@" + ;; + + run) + set -x; exec "$goBin" "$@" + ;; + + *) + echo >&2 'error: unknown command:' "$cmd" + usage >&2 + exit 1 + ;; +esac \ No newline at end of file diff --git a/cmd/justgo/justgo.go b/cmd/justgo/justgo.go index 88e089c..00fe354 100644 --- a/cmd/justgo/justgo.go +++ b/cmd/justgo/justgo.go @@ -9,6 +9,7 @@ import ( "os" "path/filepath" + "github.com/satori/go.uuid" "github.com/urfave/cli" ) @@ -62,23 +63,28 @@ func buildProject(path string) { fileUrl := "https://github.com/inadarei/justgo/archive/master.zip" tmpFilePath := os.TempDir() + "justgo.zip" + defer os.Remove(tmpFilePath) // Move all conflicting files to tmp dir and move them back post-build filesToMove := getConflictingFiles(path) + uniqueToken := uuid.NewV4() + uniqueTempFolder := filepath.Join(os.TempDir(), fmt.Sprintf("%s", uniqueToken)) + os.MkdirAll(uniqueTempFolder, os.ModePerm) + defer os.Remove(uniqueTempFolder) + if filesToMove != nil { for _, file := range filesToMove { srcPath := filepath.Join(path, file) - tmpFilePath := filepath.Join(os.TempDir(), file) - err := os.Rename(srcPath, tmpFilePath) + tmpMovedFilePath := filepath.Join(uniqueTempFolder, file) + err := os.Rename(srcPath, tmpMovedFilePath) abortIfErr(err) - defer os.Remove(tmpFilePath) - defer os.Rename(tmpFilePath, srcPath) + defer os.Remove(tmpMovedFilePath) + defer os.Rename(tmpMovedFilePath, srcPath) } } err = downloadFile(tmpFilePath, fileUrl) abortIfErr(err) - defer os.Remove(tmpFilePath) err = unzip(tmpFilePath, path, true) abortIfErr(err) @@ -261,4 +267,4 @@ func getConflictingFiles(path string) []string { } } return filesWithConflicts -} \ No newline at end of file +}