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