内容目录
./bin/d18n --defaults-extra-file test/my.cnf --database xxxxdatabasesName --table xxxtableName --limit 10 --detect
三方工具 jq
choco install jq ./bin/d18n --defaults-extra-file test/my.cnf --database xxx --table xxx --limit 10 --detect | jq .
Makefile
default: build include test/Makefile.mysql include test/Makefile.csvq include test/Makefile.sqlite include test/Makefile.postgres include test/Makefile.oracle include test/Makefile.mssql include test/Makefile.clickhouse include test/Makefile.trino include test/Makefile.hive include test/Makefile.h2 include test/Makefile.cassandra # colors compatible setting CRED:=$(shell tput setaf 1 2>/dev/null) CGREEN:=$(shell tput setaf 2 2>/dev/null) CYELLOW:=$(shell tput setaf 3 2>/dev/null) CEND:=$(shell tput sgr0 2>/dev/null) .PHONY: build build: fmt @echo "$(CGREEN)Building ...$(CEND)" @mkdir -p bin @ret=0 && for d in $$(go list -f '{{if (eq .Name "main")}}{{.ImportPath}}{{end}}' ./...); do b=$$(basename $${d}) ; go build -trimpath -o bin/$${b} $$d || ret=$$? ; done ; exit $$ret @echo "build Success!" GO_VERSION_MIN=1.16 .PHONY: go_version_check # Parse out the x.y or x.y.z version and output a single value x*10000+y*100+z (e.g., 1.9 is 10900) # that allows the three components to be checked in a single comparison. VER_TO_INT:=awk '{split(substr($$0, match ($$0, /[0-9.]+/)), a, "."); print a[1]*10000+a[2]*100+a[3]}' go_version_check: @echo "$(CGREEN)Go version check ...$(CEND)" @go version @if test $(shell go version | $(VER_TO_INT) ) -lt $(shell echo "$(GO_VERSION_MIN)" | $(VER_TO_INT)); then printf "go version $(GO_VERSION_MIN)+ required, found: "; go version; exit 1; fi .PHONY: release release: build @echo "$(CGREEN)Cross platform building for release ...$(CEND)" @mkdir -p release @for GOOS in darwin; do for GOARCH in amd64 arm64; do for d in $$(go list -f '{{if (eq .Name "main")}}{{.ImportPath}}{{end}}' ./...); do b=$$(basename $${d}) ; echo "Building $${b}.$${GOOS}-$${GOARCH} ..."; GOOS=$${GOOS} GOARCH=$${GOARCH} go build -trimpath -v -o release/$${b}.$${GOOS}-$${GOARCH} $$d 2>/dev/null; done ; done ; done @for GOOS in linux windows; do for GOARCH in amd64; do for d in $$(go list -f '{{if (eq .Name "main")}}{{.ImportPath}}{{end}}' ./...); do b=$$(basename $${d}) ; echo "Building $${b}.$${GOOS}-$${GOARCH} ..."; GOOS=$${GOOS} GOARCH=$${GOARCH} go build -trimpath -v -o release/$${b}.$${GOOS}-$${GOARCH} $$d ; done ; done ; done # Code format .PHONY: fmt fmt: go_version_check @echo "$(CGREEN)Run gofmt on all source files ...$(CEND)" @echo "gofmt -l -s -w ..." @ret=0 && for d in $$(go list -f '{{.Dir}}' ./... | grep -v /vendor/); do find $$d -name "*.go" -exec gofmt -l -s -w {} + || ret=$$? ; done ; exit $$ret #fmt: go_version_check # @echo "$(CGREEN)Run gofmt on all source files ...$(CEND)" # @echo "gofmt -l -s -w ..." # @ret=0 && for d in $$(go list -f '{{.Dir}}' ./... | grep -v /vendor/); do # gofmt -l -s -w $$d/*.go || ret=$$? ; # done ; exit $$ret .PHONY: tidy tidy: @echo "$(CGREEN)Go mod check...$(CEND)" go mod tidy .PHONY: check-diff check-diff: @./test/check-diff.sh # Run golang test cases .PHONY: test test: mask-typo fmt @echo "$(CGREEN)Run all test cases ...$(CEND)" @#go test -timeout 10m -race ./... @# modernc.org/sqlite can't pass -race @# ==956455==ERROR: ThreadSanitizer failed to allocate 0x40000 (262144) bytes at address 600008100000 (errno: 12) go test -timeout 10m ./... @if test $(shell git diff --name-only test/ | wc -l | awk '{print $1}') -gt 0; then echo "Golden test file checked diff!"; exit 2; fi @echo "test Success!" # Code Coverage # colorful coverage numerical >=90% GREEN, <80% RED, Other YELLOW .PHONY: cover cover: test @echo "$(CGREEN)Run test cover check ...$(CEND)" @go test $(shell go list ./... | grep -v parser) -coverprofile=test/coverage.data | column -t @go tool cover -html=test/coverage.data -o test/coverage.html @go tool cover -func=test/coverage.data -o test/coverage.txt @tail -n 1 test/coverage.txt | awk '{sub(/%/, "", $$NF); if($$NF < 80) {print "$(CRED)"$$0"%$(CEND)"} else if ($$NF >= 90) {print "$(CGREEN)"$$0"%$(CEND)"} else {print "$(CYELLOW)"$$0"%$(CEND)"}}' .PHONY: ci ci: cover test-mysql test-sqlite check-diff .PHONY: mask-typo mask-typo: @echo "$(CGREEN)Auto generate mask/typo.go source file ...$(CEND)" @cat COPYRIGHT > mask/typo.tmp @echo "package mask" >> mask/typo.tmp @echo "" >> mask/typo.tmp @echo "type MaskFunc func(args ...interface{}) (ret string, err error)" >> mask/typo.tmp @echo "" >> mask/typo.tmp @echo "// maskFuncs support functions list, case insensitive" >> mask/typo.tmp @echo "var maskFuncs = map[string]MaskFunc{" >> mask/typo.tmp @go doc --short d18n/mask | grep "^func" | grep '(args' | awk -F '(' '{print $$1}' | awk '{print """tolower($$2)"":", $$2","}' >> mask/typo.tmp @echo "}" >> mask/typo.tmp @mv mask/typo.tmp mask/typo.go # check docker installed DOCKER_CMD:=$(shell which podman 2>/dev/null || which docker 2>/dev/null) DOCKER_RM := $(or ${DOCKER_RM}, ${DOCKER_RM}, --rm) # read line wrap RLWRAP:=$(shell which rlwrap 2>/dev/null || echo "") .PHONY: docker-exist docker-exist: ifndef DOCKER_CMD @echo "please install docker/podman first" @exit 1 endif @echo "using $(DOCKER_CMD)" .PHONY: docker-stop docker-stop: docker-exist @${DOCKER_CMD} stop d18n-mysql 2>/dev/null || true @${DOCKER_CMD} stop d18n-postgres 2>/dev/null || true @${DOCKER_CMD} stop d18n-oracle 2>/dev/null || true @${DOCKER_CMD} stop d18n-mssql 2>/dev/null || true @${DOCKER_CMD} stop d18n-clickhouse 2>/dev/null || true @${DOCKER_CMD} stop d18n-trino 2>/dev/null || true @${DOCKER_CMD} volume prune --force .PHONY: clean clean: git clean -x -f ${DOCKER_CMD} volume prune rm -rf bin/ rm -rf release/