From 15fb68636816337787d536acb19ac72a947791e5 Mon Sep 17 00:00:00 2001 From: Jim Myhrberg Date: Mon, 7 May 2018 01:39:32 +0100 Subject: [PATCH] Change main vars to be compatible with goreleaser And also various smaller cleanup and optimizations. --- Makefile | 23 ++++++++++++---- main.go | 81 ++++++++++++++++++++++++++++++++++---------------------- 2 files changed, 67 insertions(+), 37 deletions(-) diff --git a/Makefile b/Makefile index 7a099c9..e3ab657 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,17 @@ NAME = casecmp BINARY = bin/${NAME} -SOURCES = $(shell find . -name '*.go' -o -name 'VERSION' -o -name 'README.md') + VERSION ?= $(shell cat VERSION) -WHOAMI ?= $(shell whoami) +COMMIT = $(shell git show --format="%h" --no-patch) +DATE = $(shell date +%Y-%m-%dT%T%z) + +SOURCES = $(shell find . \ + -name '*.go' \ + -o -name 'LICENSE' \ + -o -name 'Makefile' \ + -o -name 'README.md' \ + -o -name 'VERSION') + RELEASE_DIR = releases RELEASE_TARGETS = \ $(RELEASE_DIR)/$(NAME)-$(VERSION)_darwin_386.tar.gz \ @@ -16,10 +25,14 @@ RELEASE_TARGETS = \ $(RELEASE_DIR)/$(NAME)-$(VERSION)_windows_386.zip \ $(RELEASE_DIR)/$(NAME)-$(VERSION)_windows_amd64.zip RELEASE_ASSETS = \ - README.md + README.md \ + LICENSE $(BINARY): $(SOURCES) - go build -o ${BINARY} -ldflags "-X main.Version=${VERSION}" + go build -o ${BINARY} -ldflags \ "\ + -X main.version=${VERSION} \ + -X main.commit=${COMMIT} \ + -X main.date=${DATE}" .PHONY: build build: $(BINARY) @@ -36,7 +49,7 @@ clean: .PHONY: docker docker: - docker build -t "$(WHOAMI)/$(NAME)" . + docker build -t "$(shell whoami)/$(NAME)" . .PHONY: release release: $(RELEASE_TARGETS) diff --git a/main.go b/main.go index 9e7ff2b..5a4fc58 100644 --- a/main.go +++ b/main.go @@ -1,8 +1,8 @@ package main import ( + "bytes" "fmt" - "io" "log" "net/http" "os" @@ -11,47 +11,57 @@ import ( "gopkg.in/alecthomas/kingpin.v2" ) -// Name of application. -var Name = "casecmp" - -// Version gets populated with version at build-time. -var Version string - -// DefaultPort that service runs on. -var DefaultPort = "8080" +var ( + name = "casecmp" + version = "dev" + commit = "unknown" + date = "unknown" + defaultPort = "8080" +) // Argument parsing setup. var ( - port = kingpin.Flag("port", "Port to listen to.").Short('p'). - Default("").String() - bind = kingpin.Flag("bind", "Bind address.").Short('b'). - Default("0.0.0.0").String() - version = kingpin.Flag("version", "Print version info."). - Short('v').Bool() + portFlag = kingpin.Flag("port", "Port to listen to.").Short('p'). + Default("").String() + bindFlag = kingpin.Flag("bind", "Bind address.").Short('b'). + Default("0.0.0.0").String() + versionFlag = kingpin.Flag("version", "Print version info."). + Short('v').Bool() ) func indexHandler(w http.ResponseWriter, r *http.Request) { - resp := Name + " " + Version + "\n" + - "\n" + - "Case-insensitive string comparison, as an API. Because ¯\\_(ツ)_/¯\n" + - "\n" + - "Example usage:\n" + - "curl -X POST -F \"a=Foo Bar\" -F \"b=FOO BAR\" " + - "http://" + r.Host + "/\n" + - "curl -X POST http://" + r.Host + "/?a=Foo%%20Bar&b=FOO%%20BAR" + scheme := "http" + if r.TLS != nil { + scheme = "https" + } - io.WriteString(w, resp) + _, err := fmt.Fprintf(w, `%s %s + +Case-insensitive string comparison, as an API. Because ¯\_(ツ)_/¯ + +Example usage: +curl -X POST -F "a=Foo Bar" -F "b=FOO BAR" %s://%s/ +curl -X POST "%s://%s/?a=Foo+Bar&b=FOO+BAR"`, + name, version, scheme, r.Host, scheme, r.Host) + + if err != nil { + log.Fatal(err) + } } func casecmpHandler(w http.ResponseWriter, r *http.Request) { a := r.FormValue("a") b := r.FormValue("b") - resp := "0" + if strings.EqualFold(string(a), string(b)) { resp = "1" } - fmt.Fprintf(w, resp) + _, err := fmt.Fprintf(w, resp) + + if err != nil { + log.Fatal(err) + } } func rootHandler(w http.ResponseWriter, r *http.Request) { @@ -68,22 +78,29 @@ func rootHandler(w http.ResponseWriter, r *http.Request) { } func printVersion() { - fmt.Println(Name + " " + Version) + var buffer bytes.Buffer + buffer.WriteString(fmt.Sprintf("%s %s", name, version)) + + if commit != "unknown" { + buffer.WriteString(fmt.Sprintf(" (%s)", commit)) + } + + fmt.Println(buffer.String()) } func startServer() { http.HandleFunc("/", rootHandler) - if *port == "" { + if *portFlag == "" { envPort := os.Getenv("PORT") if envPort != "" { - *port = envPort + *portFlag = envPort } else { - *port = DefaultPort + *portFlag = defaultPort } } - address := *bind + ":" + *port + address := *bindFlag + ":" + *portFlag fmt.Println("Listening on " + address) log.Fatal(http.ListenAndServe(address, nil)) } @@ -91,7 +108,7 @@ func startServer() { func main() { kingpin.Parse() - if *version { + if *versionFlag { printVersion() } else { startServer()