diff --git a/Makefile b/Makefile index 78a0211f..0bef4c3e 100644 --- a/Makefile +++ b/Makefile @@ -15,27 +15,38 @@ PLATFORMS= \ DIST=$(shell pwd)/dist export GOPATH=$(shell pwd) +GOBIN ?= $(shell pwd)/bin +NAME=jira -build: - cd src/github.com/Netflix-Skunkworks/go-jira/jira; \ - go get -v +CURVER ?= $(shell git describe --abbrev=0 --tags) +LDFLAGS:=-X main.buildVersion=$(CURVER) +build: src/github.com/Netflix-Skunkworks/go-jira + go get -v github.com/coryb/optigo + go get -v github.com/kballard/go-shellquote + go get -v github.com/mgutz/ansi + go get -v github.com/op/go-logging + go get -v golang.org/x/crypto/ssh/terminal + go build -ldflags "$(LDFLAGS)" -o $(GOBIN)/$(NAME) jira/main.go + +src/%: + mkdir -p $(@D) + test -L $@ || ln -sf ../../.. $@ + go get -v $* cross-setup: for p in $(PLATFORMS); do \ echo "Building for $$p"; \ - cd $(GOROOT)/src && sudo GOOS=$${p/-*/} GOARCH=$${p/*-/} bash ./make.bash --no-clean; \ + cd $(GOROOT)/src && sudo GOROOT_BOOTSTRAP=$(GOROOT) GOOS=$${p/-*/} GOARCH=$${p/*-/} bash ./make.bash --no-clean; \ done all: rm -rf $(DIST); \ mkdir -p $(DIST); \ - cd src/github.com/Netflix-Skunkworks/go-jira/jira; \ - go get -d; \ for p in $(PLATFORMS); do \ echo "Building for $$p"; \ - GOOS=$${p/-*/} GOARCH=$${p/*-/} go build -v -ldflags -s -o $(DIST)/jira-$$p; \ - done + GOOS=$${p/-*/} GOARCH=$${p/*-/} go build -v -ldflags "$(LDFLAGS) -s" -o $(DIST)/$(NAME)-$$p jira/main.go ; \ + done fmt: gofmt -s -w jira @@ -43,11 +54,6 @@ fmt: install: export GOBIN=~/bin && ${MAKE} build -# need gsort on OSX (brew install coreutils) or newer sort on linux -# that supports the -V option for version sorting -SORT=gsort - -CURVER ?= $(shell git fetch --tags && git tag | $(SORT) -V | tail -1) NEWVER ?= $(shell echo $(CURVER) | awk -F. '{print $$1"."$$2"."$$3+1}') TODAY := $(shell date +%Y-%m-%d) @@ -65,9 +71,7 @@ update-changelog: tail +2 CHANGELOG.md >> CHANGELOG.md.new; \ mv CHANGELOG.md.new CHANGELOG.md; \ git commit -m "Updated Changelog" CHANGELOG.md; \ - perl -pi -e "s/version: $(CURVER)/version: $(NEWVER)/" jira/main.go; \ - git commit -m "bump version" jira/main.go; \ git tag $(NEWVER) clean: - rm -rf pkg dist bin && find src \! -path \*/go-jira\* -delete + rm -rf pkg dist bin src ./toolkit diff --git a/jira/main.go b/jira/main.go index 96d9761b..982f98d4 100644 --- a/jira/main.go +++ b/jira/main.go @@ -13,8 +13,11 @@ import ( "strings" ) -var log = logging.MustGetLogger("jira") -var format = "%{color}%{time:2006-01-02T15:04:05.000Z07:00} %{level:-5s} [%{shortfile}]%{color:reset} %{message}" +var ( + log = logging.MustGetLogger("jira") + format = "%{color}%{time:2006-01-02T15:04:05.000Z07:00} %{level:-5s} [%{shortfile}]%{color:reset} %{message}" + buildVersion string +) func main() { logBackend := logging.NewLogBackend(os.Stderr, "", 0) @@ -166,7 +169,7 @@ Command Options: op := optigo.NewDirectAssignParser(map[string]interface{}{ "h|help": usage, "version": func() { - fmt.Println("version: 0.0.14") + fmt.Println(fmt.Sprintf("version: %s", buildVersion)) os.Exit(0) }, "v|verbose+": func() { @@ -216,7 +219,7 @@ Command Options: } } - if command == "" { + if command == "" && len(args) > 0 { command = args[0] args = args[1:] } @@ -228,7 +231,9 @@ Command Options: if value, ok := opts["command"].(string); ok { command = value } else if _, ok := jiraCommands[command]; !ok || command == "" { - args = append([]string{command}, args...) + if command != "" { + args = append([]string{command}, args...) + } command = "view" } @@ -270,6 +275,13 @@ Command Options: } } + requireArgs := func(count int) { + if len(args) < count { + log.Error("Not enough arguments. %d required, %d provided", count, len(args)) + usage(false) + } + } + var err error switch command { case "login": @@ -279,6 +291,7 @@ Command Options: case "list": err = c.CmdList() case "edit": + requireArgs(1) setEditing(true) if len(args) > 0 { err = c.CmdEdit(args[0]) @@ -300,8 +313,10 @@ Command Options: } } case "editmeta": + requireArgs(1) err = c.CmdEditMeta(args[0]) case "transmeta": + requireArgs(1) err = c.CmdTransitionMeta(args[0]) case "issuelinktypes": err = c.CmdIssueLinkTypes() @@ -313,50 +328,66 @@ Command Options: setEditing(true) err = c.CmdCreate() case "transitions": + requireArgs(1) err = c.CmdTransitions(args[0]) case "blocks": + requireArgs(2) err = c.CmdBlocks(args[0], args[1]) case "dups": + requireArgs(2) if err = c.CmdDups(args[0], args[1]); err == nil { opts["resolution"] = "Duplicate" err = c.CmdTransition(args[0], "close") } case "watch": + requireArgs(1) err = c.CmdWatch(args[0]) case "transition": + requireArgs(2) setEditing(true) err = c.CmdTransition(args[0], args[1]) case "close": + requireArgs(1) setEditing(false) err = c.CmdTransition(args[0], "close") case "acknowledge": + requireArgs(1) setEditing(false) err = c.CmdTransition(args[0], "acknowledge") case "reopen": + requireArgs(1) setEditing(false) err = c.CmdTransition(args[0], "reopen") case "resolve": + requireArgs(1) setEditing(false) err = c.CmdTransition(args[0], "resolve") case "start": + requireArgs(1) setEditing(false) err = c.CmdTransition(args[0], "start") case "stop": + requireArgs(1) setEditing(false) err = c.CmdTransition(args[0], "stop") case "comment": + requireArgs(1) setEditing(true) err = c.CmdComment(args[0]) case "take": + requireArgs(1) err = c.CmdAssign(args[0], opts["user"].(string)) case "browse": + requireArgs(1) opts["browse"] = true err = c.Browse(args[0]) case "export-templates": err = c.CmdExportTemplates() case "assign": + requireArgs(2) err = c.CmdAssign(args[0], args[1]) case "view": + requireArgs(1) err = c.CmdView(args[0]) default: log.Error("Unknown command %s", command)