Change main vars to be compatible with goreleaser

And also various smaller cleanup and optimizations.
This commit is contained in:
2018-05-07 01:39:32 +01:00
parent c16b23b685
commit 15fb686368
2 changed files with 67 additions and 37 deletions

View File

@@ -1,8 +1,17 @@
NAME = casecmp NAME = casecmp
BINARY = bin/${NAME} BINARY = bin/${NAME}
SOURCES = $(shell find . -name '*.go' -o -name 'VERSION' -o -name 'README.md')
VERSION ?= $(shell cat VERSION) 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_DIR = releases
RELEASE_TARGETS = \ RELEASE_TARGETS = \
$(RELEASE_DIR)/$(NAME)-$(VERSION)_darwin_386.tar.gz \ $(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_386.zip \
$(RELEASE_DIR)/$(NAME)-$(VERSION)_windows_amd64.zip $(RELEASE_DIR)/$(NAME)-$(VERSION)_windows_amd64.zip
RELEASE_ASSETS = \ RELEASE_ASSETS = \
README.md README.md \
LICENSE
$(BINARY): $(SOURCES) $(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 .PHONY: build
build: $(BINARY) build: $(BINARY)
@@ -36,7 +49,7 @@ clean:
.PHONY: docker .PHONY: docker
docker: docker:
docker build -t "$(WHOAMI)/$(NAME)" . docker build -t "$(shell whoami)/$(NAME)" .
.PHONY: release .PHONY: release
release: $(RELEASE_TARGETS) release: $(RELEASE_TARGETS)

81
main.go
View File

@@ -1,8 +1,8 @@
package main package main
import ( import (
"bytes"
"fmt" "fmt"
"io"
"log" "log"
"net/http" "net/http"
"os" "os"
@@ -11,47 +11,57 @@ import (
"gopkg.in/alecthomas/kingpin.v2" "gopkg.in/alecthomas/kingpin.v2"
) )
// Name of application. var (
var Name = "casecmp" name = "casecmp"
version = "dev"
// Version gets populated with version at build-time. commit = "unknown"
var Version string date = "unknown"
defaultPort = "8080"
// DefaultPort that service runs on. )
var DefaultPort = "8080"
// Argument parsing setup. // Argument parsing setup.
var ( var (
port = kingpin.Flag("port", "Port to listen to.").Short('p'). portFlag = kingpin.Flag("port", "Port to listen to.").Short('p').
Default("").String() Default("").String()
bind = kingpin.Flag("bind", "Bind address.").Short('b'). bindFlag = kingpin.Flag("bind", "Bind address.").Short('b').
Default("0.0.0.0").String() Default("0.0.0.0").String()
version = kingpin.Flag("version", "Print version info."). versionFlag = kingpin.Flag("version", "Print version info.").
Short('v').Bool() Short('v').Bool()
) )
func indexHandler(w http.ResponseWriter, r *http.Request) { func indexHandler(w http.ResponseWriter, r *http.Request) {
resp := Name + " " + Version + "\n" + scheme := "http"
"\n" + if r.TLS != nil {
"Case-insensitive string comparison, as an API. Because ¯\\_(ツ)_/¯\n" + scheme = "https"
"\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"
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) { func casecmpHandler(w http.ResponseWriter, r *http.Request) {
a := r.FormValue("a") a := r.FormValue("a")
b := r.FormValue("b") b := r.FormValue("b")
resp := "0" resp := "0"
if strings.EqualFold(string(a), string(b)) { if strings.EqualFold(string(a), string(b)) {
resp = "1" 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) { func rootHandler(w http.ResponseWriter, r *http.Request) {
@@ -68,22 +78,29 @@ func rootHandler(w http.ResponseWriter, r *http.Request) {
} }
func printVersion() { 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() { func startServer() {
http.HandleFunc("/", rootHandler) http.HandleFunc("/", rootHandler)
if *port == "" { if *portFlag == "" {
envPort := os.Getenv("PORT") envPort := os.Getenv("PORT")
if envPort != "" { if envPort != "" {
*port = envPort *portFlag = envPort
} else { } else {
*port = DefaultPort *portFlag = defaultPort
} }
} }
address := *bind + ":" + *port address := *bindFlag + ":" + *portFlag
fmt.Println("Listening on " + address) fmt.Println("Listening on " + address)
log.Fatal(http.ListenAndServe(address, nil)) log.Fatal(http.ListenAndServe(address, nil))
} }
@@ -91,7 +108,7 @@ func startServer() {
func main() { func main() {
kingpin.Parse() kingpin.Parse()
if *version { if *versionFlag {
printVersion() printVersion()
} else { } else {
startServer() startServer()