kamilsk/semaphore

View on GitHub
Makefile

Summary

Maintainability
Test Coverage
# sourced by https://github.com/octomation/makefiles

.DEFAULT_GOAL = test-with-coverage

SHELL = /bin/bash -euo pipefail

GO111MODULE = on
GOFLAGS     = -mod=vendor
GOPRIVATE   = go.octolab.net
GOPROXY     = direct
LOCAL       = $(MODULE)
MODULE      = `go list -m`
PACKAGES    = `go list ./... 2> /dev/null`
PATHS       = $(shell echo $(PACKAGES) | sed -e "s|$(MODULE)/\{0,1\}||g")
TIMEOUT     = 1s

ifeq (, $(PACKAGES))
    PACKAGES = $(MODULE)
endif

ifeq (, $(PATHS))
    PATHS = .
endif

export GO111MODULE := $(GO111MODULE)
export GOFLAGS     := $(GOFLAGS)
export GOPRIVATE   := $(GOPRIVATE)
export GOPROXY     := $(GOPROXY)

.PHONY: go-env
go-env:
    @echo "GO111MODULE: `go env GO111MODULE`"
    @echo "GOFLAGS:     $(strip `go env GOFLAGS`)"
    @echo "GOPRIVATE:   $(strip `go env GOPRIVATE`)"
    @echo "GOPROXY:     $(strip `go env GOPROXY`)"
    @echo "LOCAL:       $(LOCAL)"
    @echo "MODULE:      $(MODULE)"
    @echo "PACKAGES:    $(PACKAGES)"
    @echo "PATHS:       $(strip $(PATHS))"
    @echo "TIMEOUT:     $(TIMEOUT)"

.PHONY: deps-check
deps-check:
    @go mod verify
    @if command -v egg > /dev/null; then \
        egg deps check license; \
        egg deps check version; \
    fi

.PHONY: deps-clean
deps-clean:
    @go clean -modcache

.PHONY: deps-shake
deps-shake:
    @go mod tidy
    @if [[ "`go env GOFLAGS`" =~ -mod=vendor ]]; then go mod vendor; fi

.PHONY: module-deps
module-deps:
    @go mod download
    @if [[ "`go env GOFLAGS`" =~ -mod=vendor ]]; then go mod vendor; fi

.PHONY: update
update: selector = '{{if not (or .Main .Indirect)}}{{.Path}}{{end}}'
update:
    @if command -v egg > /dev/null; then \
        packages="`egg deps list`"; \
    else \
        packages="`go list -f $(selector) -m -mod=readonly all`"; \
    fi; \
    if [[ "`go version`" == *1.1[1-3]* ]]; then \
        go get -d -mod= -u $$packages; \
    else \
        go get -d -u $$packages; \
    fi; \
    if [[ "`go env GOFLAGS`" =~ -mod=vendor ]]; then go mod vendor; fi

.PHONY: update-all
update-all:
    @if [[ "`go version`" == *1.1[1-3]* ]]; then \
        go get -d -mod= -u ./...; \
    else \
        go get -d -u ./...; \
    fi; \
    if [[ "`go env GOFLAGS`" =~ -mod=vendor ]]; then go mod vendor; fi

.PHONY: format
format:
    @if command -v goimports > /dev/null; then \
        goimports -local $(LOCAL) -ungroup -w $(PATHS); \
    else \
        gofmt -s -w $(PATHS); \
    fi

.PHONY: go-generate
go-generate:
    @go generate $(PACKAGES)

.PHONY: lint
lint:
    @if command -v golangci-lint > /dev/null; then \
        golangci-lint run ./...; \
    else \
        go vet $(PACKAGES); \
    fi

.PHONY: test
test:
    @go test -race -timeout $(TIMEOUT) $(PACKAGES)

.PHONY: test-clean
test-clean:
    @go clean -testcache

.PHONY: test-with-coverage
test-with-coverage:
    @go test -cover -timeout $(TIMEOUT) $(PACKAGES) | column -t | sort -r

.PHONY: test-with-coverage-profile
test-with-coverage-profile:
    @go test -cover -covermode count -coverprofile c.out -timeout $(TIMEOUT) $(PACKAGES)

define go_tpl
.PHONY: go$(1)
go$(1):
    docker run \
        --rm -it \
        -v $(PWD):/src \
        -w /src \
        golang:$(1) bash
endef

render_go_tpl = $(eval $(call go_tpl,$(version)))
$(foreach version,1.11 1.12 1.13 1.14,$(render_go_tpl))


.PHONY: clean
clean: deps-clean test-clean

.PHONY: deps
deps: module-deps

.PHONY: env
env: go-env

.PHONY: generate
generate: go-generate format

.PHONY: refresh
refresh: deps-shake update deps generate format test