Alejandro Mery
1 year ago
8 changed files with 413 additions and 11 deletions
@ -0,0 +1,59 @@ |
|||||||
|
.PHONY: all clean install generate fmt tidy |
||||||
|
.PHONY: FORCE |
||||||
|
|
||||||
|
GO ?= go
|
||||||
|
GOFMT ?= gofmt
|
||||||
|
GOFMT_FLAGS = -w -l -s
|
||||||
|
GOGENERATE_FLAGS = -v
|
||||||
|
|
||||||
|
GOPATH ?= $(shell $(GO) env GOPATH)
|
||||||
|
GOBIN ?= $(GOPATH)/bin
|
||||||
|
|
||||||
|
TOOLSDIR := $(CURDIR)/pkg/tools
|
||||||
|
TMPDIR ?= .tmp
|
||||||
|
|
||||||
|
REVIVE ?= $(GOBIN)/revive
|
||||||
|
REVIVE_CONF ?= $(TOOLSDIR)/revive.toml
|
||||||
|
REVIVE_RUN_ARGS ?= -config $(REVIVE_CONF) -formatter friendly
|
||||||
|
REVIVE_INSTALL_URL ?= github.com/mgechev/revive
|
||||||
|
|
||||||
|
GO_INSTALL_URLS = \
|
||||||
|
$(REVIVE_INSTALL_URL) \
|
||||||
|
|
||||||
|
V = 0
|
||||||
|
Q = $(if $(filter 1,$V),,@)
|
||||||
|
M = $(shell if [ "$$(tput colors 2> /dev/null || echo 0)" -ge 8 ]; then printf "\033[34;1m▶\033[0m"; else printf "▶"; fi)
|
||||||
|
|
||||||
|
GO_BUILD = $(GO) build -v
|
||||||
|
GO_BUILD_CMD = $(GO_BUILD) -o "$(OUTDIR)"
|
||||||
|
|
||||||
|
all: get generate tidy build |
||||||
|
|
||||||
|
install: |
||||||
|
$Q $(GO) install -v ./cmd/...
|
||||||
|
|
||||||
|
clean: ; $(info $(M) cleaning…) |
||||||
|
rm -rf $(TMPDIR)
|
||||||
|
|
||||||
|
$(TMPDIR)/index: $(TOOLSDIR)/gen_index.sh Makefile FORCE ; $(info $(M) generating index…) |
||||||
|
$Q mkdir -p $(@D)
|
||||||
|
$Q $< > $@~
|
||||||
|
$Q if cmp $@ $@~ 2> /dev/null >&2; then rm $@~; else mv $@~ $@; fi
|
||||||
|
|
||||||
|
$(TMPDIR)/gen.mk: $(TOOLSDIR)/gen_mk.sh $(TMPDIR)/index Makefile ; $(info $(M) generating subproject rules…) |
||||||
|
$Q mkdir -p $(@D)
|
||||||
|
$Q $< $(TMPDIR)/index > $@~
|
||||||
|
$Q if cmp $@ $@~ 2> /dev/null >&2; then rm $@~; else mv $@~ $@; fi
|
||||||
|
|
||||||
|
include $(TMPDIR)/gen.mk |
||||||
|
|
||||||
|
fmt: ; $(info $(M) reformatting sources…) |
||||||
|
$Q find . -name '*.go' | xargs -r $(GOFMT) $(GOFMT_FLAGS)
|
||||||
|
|
||||||
|
tidy: fmt |
||||||
|
|
||||||
|
generate: ; $(info $(M) running go:generate…) |
||||||
|
$Q git grep -l '^//go:generate' | sort -uV | xargs -r -n1 $(GO) generate $(GOGENERATE_FLAGS)
|
||||||
|
|
||||||
|
$(REVIVE): |
||||||
|
$Q $(GO) install -v $(REVIVE_INSTALL_URL)
|
@ -0,0 +1,63 @@ |
|||||||
|
#!/bin/sh |
||||||
|
|
||||||
|
set -eu |
||||||
|
|
||||||
|
: ${GO:=go} |
||||||
|
|
||||||
|
MODULES=$(find * -name go.mod -exec dirname '{}' \;) |
||||||
|
GROUPS="pkg cmd" |
||||||
|
BASE="$PWD" |
||||||
|
|
||||||
|
mod() { |
||||||
|
local d="${1:-.}" |
||||||
|
grep ^module "$d/go.mod" | cut -d' ' -f2 |
||||||
|
} |
||||||
|
|
||||||
|
namedir() { |
||||||
|
local d="$1" g= n= |
||||||
|
|
||||||
|
if [ "." = "$d" ]; then |
||||||
|
echo "root" |
||||||
|
return |
||||||
|
fi |
||||||
|
|
||||||
|
for g in $GROUPS; do |
||||||
|
n="${d#$g/}" |
||||||
|
if [ "x$n" != "x$d" ]; then |
||||||
|
echo "$n" | tr '/' '-' |
||||||
|
return |
||||||
|
fi |
||||||
|
done |
||||||
|
|
||||||
|
echo "$d" | tr '/' '-' |
||||||
|
} |
||||||
|
|
||||||
|
mod_replace() { |
||||||
|
local d="$1" |
||||||
|
grep "=>" "$d/go.mod" | sed -n -e "s;^.*\($ROOT_MODULE.*\)[ \t]\+=>.*;\1;p" |
||||||
|
} |
||||||
|
|
||||||
|
gen_index() { |
||||||
|
local d= n= |
||||||
|
|
||||||
|
for d; do |
||||||
|
n=$(namedir "$d") |
||||||
|
m=$(mod "$d") |
||||||
|
echo "$n:$d:$m" |
||||||
|
done |
||||||
|
} |
||||||
|
|
||||||
|
ROOT_MODULE=$(mod) |
||||||
|
INDEX=$(gen_index $MODULES) |
||||||
|
|
||||||
|
echo "$INDEX" | while IFS=: read name dir mod; do |
||||||
|
deps= |
||||||
|
for dep in $(mod_replace "$dir"); do |
||||||
|
depname=$(echo "$INDEX" | grep ":$dep$" | cut -d: -f1 | tr '\n' ',' | sed -e 's|,\+$||g') |
||||||
|
if [ -n "$depname" ]; then |
||||||
|
deps="${deps:+$deps,}$depname" |
||||||
|
fi |
||||||
|
done |
||||||
|
|
||||||
|
echo "$name:$dir:$mod:$deps" |
||||||
|
done | sort -V |
@ -0,0 +1,196 @@ |
|||||||
|
#!/bin/sh |
||||||
|
|
||||||
|
set -eu |
||||||
|
|
||||||
|
INDEX="$1" |
||||||
|
|
||||||
|
PROJECTS="$(cut -d':' -f1 "$INDEX")" |
||||||
|
COMMANDS="tidy get build test up" |
||||||
|
|
||||||
|
expand() { |
||||||
|
local prefix="$1" suffix="$2" |
||||||
|
local x= out= |
||||||
|
shift 2 |
||||||
|
|
||||||
|
for x; do |
||||||
|
out="${out:+$out }${prefix}$x${suffix}" |
||||||
|
done |
||||||
|
|
||||||
|
echo "$out" |
||||||
|
} |
||||||
|
|
||||||
|
prefixed() { |
||||||
|
local prefix="${1:+$1-}" |
||||||
|
shift |
||||||
|
expand "$prefix" "" "$@" |
||||||
|
} |
||||||
|
|
||||||
|
suffixed() { |
||||||
|
local suffix="${1:+-$1}" |
||||||
|
shift |
||||||
|
expand "" "$suffix" "$@" |
||||||
|
} |
||||||
|
|
||||||
|
# packed remove excess whitespace from lines of commands |
||||||
|
packed() { |
||||||
|
sed -e 's/^[ \t]\+//' -e 's/[ \t]\+$//' -e '/^$/d;' -e '/^#/d'; |
||||||
|
} |
||||||
|
|
||||||
|
# packet_oneline converts a multiline script into packed single-line equivalent |
||||||
|
packed_oneline() { |
||||||
|
packed | tr '\n' ';' | sed -e 's|;$||' -e 's|then;|then |g' -e 's|;[ \t]*|; |g' |
||||||
|
} |
||||||
|
|
||||||
|
gen_install_tools() { |
||||||
|
cat <<EOT |
||||||
|
for url in \$(GO_INSTALL_URLS); do \$(GO) install -v \$\$url; done |
||||||
|
EOT |
||||||
|
} |
||||||
|
|
||||||
|
gen_revive_exclude() { |
||||||
|
local self="$1" |
||||||
|
local dirs= d= |
||||||
|
|
||||||
|
dirs="$(cut -d: -f2 "$INDEX" | grep -v '^.$' || true)" |
||||||
|
if [ "." != "$self" ]; then |
||||||
|
dirs=$(echo "$dirs" | sed -n -e "s;^$self/\(.*\)$;\1;p") |
||||||
|
fi |
||||||
|
|
||||||
|
for d in $dirs; do |
||||||
|
printf -- "-exclude ./$d/... " |
||||||
|
done |
||||||
|
} |
||||||
|
|
||||||
|
for cmd in $COMMANDS; do |
||||||
|
all="$(prefixed $cmd $PROJECTS)" |
||||||
|
depsx= |
||||||
|
|
||||||
|
cat <<EOT |
||||||
|
.PHONY: $cmd $all |
||||||
|
$cmd: $all |
||||||
|
|
||||||
|
EOT |
||||||
|
|
||||||
|
# default calls |
||||||
|
case "$cmd" in |
||||||
|
tidy) |
||||||
|
call="$(cat <<-EOT | packed |
||||||
|
\$(GO) mod tidy |
||||||
|
|
||||||
|
# go vet and revive only if there are .go files |
||||||
|
# |
||||||
|
$(cat <<-EOL | packed_oneline |
||||||
|
set -e |
||||||
|
FILES="\$\$(\$(GO) list -f '{{len .GoFiles}}' ./...)" |
||||||
|
if [ -n "\$\$FILES" ]; then |
||||||
|
\$(GO) vet ./... |
||||||
|
\$(REVIVE) \$(REVIVE_RUN_ARGS) ./... |
||||||
|
fi |
||||||
|
EOL |
||||||
|
) |
||||||
|
EOT |
||||||
|
)" |
||||||
|
depsx="fmt \$(REVIVE)" |
||||||
|
;; |
||||||
|
up) |
||||||
|
call="\$(GO) get -u -v ./... |
||||||
|
\$(GO) mod tidy" |
||||||
|
;; |
||||||
|
test) |
||||||
|
call="\$(GO) $cmd ./..." |
||||||
|
;; |
||||||
|
*) |
||||||
|
call="\$(GO) $cmd -v ./..." |
||||||
|
;; |
||||||
|
esac |
||||||
|
|
||||||
|
case "$cmd" in |
||||||
|
build|test) |
||||||
|
sequential=true ;; |
||||||
|
*) |
||||||
|
sequential=false ;; |
||||||
|
esac |
||||||
|
|
||||||
|
while IFS=: read name dir mod deps; do |
||||||
|
|
||||||
|
deps=$(echo "$deps" | tr ',' ' ') |
||||||
|
|
||||||
|
# cd $dir |
||||||
|
if [ "." = "$dir" ]; then |
||||||
|
# root |
||||||
|
cd= |
||||||
|
else |
||||||
|
cd="cd '$dir'; " |
||||||
|
fi |
||||||
|
|
||||||
|
callx="$call" |
||||||
|
if [ "$name" = root ]; then |
||||||
|
# special case |
||||||
|
case "$cmd" in |
||||||
|
get) |
||||||
|
cmdx="get -tags tools" |
||||||
|
;; |
||||||
|
up) |
||||||
|
cmdx="get -tags tools -u" |
||||||
|
;; |
||||||
|
*) |
||||||
|
cmdx= |
||||||
|
;; |
||||||
|
esac |
||||||
|
|
||||||
|
[ -z "$cmdx" ] || cmdx="\$(GO) $cmdx -v ./..." |
||||||
|
|
||||||
|
if [ "up" = "$cmd" ]; then |
||||||
|
callx="$cmdx |
||||||
|
\$(GO) mod tidy |
||||||
|
$(gen_install_tools)" |
||||||
|
elif [ "get" = "$cmd" ]; then |
||||||
|
callx="$cmdx |
||||||
|
$(gen_install_tools)" |
||||||
|
elif [ -n "$cmdx" ]; then |
||||||
|
classx="$cmdx" |
||||||
|
fi |
||||||
|
|
||||||
|
fi |
||||||
|
|
||||||
|
if [ "build" = "$cmd" ]; then |
||||||
|
# special build flags for cmd/* |
||||||
|
# |
||||||
|
callx="$(cat <<-EOL | packed_oneline |
||||||
|
set -e |
||||||
|
MOD="\$\$(\$(GO) list -f '{{.ImportPath}}' ./...)" |
||||||
|
if echo "\$\$MOD" | grep -q -e '.*/cmd/[^/]\+\$\$'; then |
||||||
|
\$(GO_BUILD_CMD) ./... |
||||||
|
elif [ -n "\$\$MOD" ]; then |
||||||
|
\$(GO_BUILD) ./... |
||||||
|
fi |
||||||
|
EOL |
||||||
|
)" |
||||||
|
fi |
||||||
|
|
||||||
|
if [ "tidy" = "$cmd" ]; then |
||||||
|
# exclude submodules when running revive |
||||||
|
# |
||||||
|
exclude=$(gen_revive_exclude "$dir") |
||||||
|
if [ -n "$exclude" ]; then |
||||||
|
callx=$(echo "$callx" | sed -e "s;\(REVIVE)\);\1 $exclude;") |
||||||
|
fi |
||||||
|
fi |
||||||
|
|
||||||
|
if ! $sequential; then |
||||||
|
deps= |
||||||
|
fi |
||||||
|
|
||||||
|
cat <<EOT |
||||||
|
$cmd-$name:${deps:+ $(prefixed $cmd $deps)}${depsx:+ | $depsx} ; \$(info \$(M) $cmd: $name) |
||||||
|
$(echo "$callx" | sed -e "/^$/d;" -e "s|^|\t\$(Q) $cd|") |
||||||
|
|
||||||
|
EOT |
||||||
|
done < "$INDEX" |
||||||
|
done |
||||||
|
|
||||||
|
for x in $PROJECTS; do |
||||||
|
cat <<EOT |
||||||
|
$x: $(suffixed $x get build tidy) |
||||||
|
EOT |
||||||
|
done |
@ -0,0 +1,35 @@ |
|||||||
|
ignoreGeneratedHeader = false |
||||||
|
severity = "error" |
||||||
|
confidence = 0.8 |
||||||
|
errorCode = 1 |
||||||
|
warningCode = 0 |
||||||
|
enableAllRules = true |
||||||
|
|
||||||
|
[rule.function-length] |
||||||
|
arguments = [40,0] |
||||||
|
severity = "warning" |
||||||
|
[rule.function-result-limit] |
||||||
|
arguments = [3] |
||||||
|
[rule.argument-limit] |
||||||
|
arguments = [5] |
||||||
|
[rule.cognitive-complexity] |
||||||
|
arguments = [7] |
||||||
|
[rule.cyclomatic] |
||||||
|
arguments = [10] |
||||||
|
[rule.line-length-limit] |
||||||
|
arguments = [100] |
||||||
|
severity = "warning" |
||||||
|
[rule.comment-spacings] |
||||||
|
severity = "warning" |
||||||
|
[rule.empty-lines] |
||||||
|
severity = "warning" |
||||||
|
|
||||||
|
# Disabled rules |
||||||
|
[rule.max-public-structs] |
||||||
|
disabled = true |
||||||
|
[rule.file-header] |
||||||
|
disabled = true |
||||||
|
[rule.add-constant] |
||||||
|
disabled = true |
||||||
|
[rule.banned-characters] |
||||||
|
disabled = true |
Loading…
Reference in new issue