From 63b7f1147176ce5cfd21c3b74094fcc8154298df Mon Sep 17 00:00:00 2001 From: Luke Kingland Date: Mon, 22 Mar 2021 23:41:07 +0900 Subject: [PATCH] feat: create templates archive on go generate --- Makefile | 24 ++++++++++------- generate.go | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 9 deletions(-) create mode 100644 generate.go diff --git a/Makefile b/Makefile index 3db429469..e08d374a6 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,9 @@ REPO := quay.io/boson/func -BIN := func -DARWIN=$(BIN)_darwin_amd64 -LINUX=$(BIN)_linux_amd64 -WINDOWS=$(BIN)_windows_amd64.exe +BIN := func +DARWIN :=$(BIN)_darwin_amd64 +LINUX :=$(BIN)_linux_amd64 +WINDOWS :=$(BIN)_windows_amd64.exe CODE := $(shell find . -name '*.go') DATE := $(shell date -u +"%Y%m%dT%H%M%SZ") @@ -14,6 +14,8 @@ VTAG := $(shell git tag --points-at HEAD) # unless explicitly, synchronously tagging as is done in ci.yaml VERS ?= $(shell [ -z $(VTAG) ] && echo 'tip' || echo $(VTAG) ) +LDFLAGS := -X main.date=$(DATE) -X main.vers=$(VERS) -X main.hash=$(HASH) + build: all all: $(BIN) @@ -33,16 +35,20 @@ linux: $(LINUX) ## Build for Linux windows: $(WINDOWS) ## Build for Windows $(BIN): $(CODE) ## Build using environment defaults - env CGO_ENABLED=0 go build -ldflags "-X main.date=$(DATE) -X main.vers=$(VERS) -X main.hash=$(HASH)" ./cmd/$(BIN) + go generate + env CGO_ENABLED=0 go build -ldflags "$(LDFLAGS)" ./cmd/$(BIN) $(DARWIN): - env CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o $(DARWIN) -ldflags "-X main.date=$(DATE) -X main.vers=$(VERS) -X main.hash=$(HASH)" ./cmd/$(BIN) + go generate + env CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o $(DARWIN) -ldflags "$(LDFLAGS)" ./cmd/$(BIN) $(LINUX): - env CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o $(LINUX) -ldflags "-X main.date=$(DATE) -X main.vers=$(VERS) -X main.hash=$(HASH)" ./cmd/$(BIN) + go generate + env CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o $(LINUX) -ldflags "$(LDFLAGS)" ./cmd/$(BIN) $(WINDOWS): - env CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o $(WINDOWS) -ldflags "-X main.date=$(DATE) -X main.vers=$(VERS) -X main.hash=$(HASH)" ./cmd/$(BIN) + go generate + env CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o $(WINDOWS) -ldflags "$(LDFLAGS)" ./cmd/$(BIN) test: test-binary test-node test-python test-quarkus test-go @@ -102,5 +108,5 @@ cluster: ## Set up a local cluster for integraiton tests. ./hack/allocate.sh && ./hack/configure.sh clean: - rm -f $(BIN) $(WINDOWS) $(LINUX) $(DARWIN) + rm -f $(BIN) $(WINDOWS) $(LINUX) $(DARWIN) $(TEMPLATES) -rm -f coverage.out diff --git a/generate.go b/generate.go new file mode 100644 index 000000000..11c9ce673 --- /dev/null +++ b/generate.go @@ -0,0 +1,77 @@ +// +build generate + +package main + +import ( + "archive/tar" + "compress/gzip" + "fmt" + "io" + "io/fs" + "os" + "path/filepath" +) + +const ( + archive = "templates.tgz" + files = "templates" +) + +// on 'go generate' create templates archive (tar -czf templates.tgz templates) +func main() { + if err := create(archive, files); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} + +func create(name, source string) (err error) { + // Create file on disk + tarball, err := os.Create(name) + if err != nil { + return + } + defer tarball.Close() + + // A gzip compressor which writes to the file + compressor := gzip.NewWriter(tarball) + defer compressor.Close() + + // A tar writer which writes to gzip compressor + w := tar.NewWriter(compressor) + defer w.Close() + + // File walking function which writes tar entries for each file. + return filepath.WalkDir(source, func(path string, d fs.DirEntry, e error) (err error) { + if e != nil { + return e // abort on any failed ReadDir calls. + } + + // Header + fi, err := d.Info() + if err != nil { + return + } + h, err := tar.FileInfoHeader(fi, d.Name()) + if err != nil { + return + } + h.Name = filepath.ToSlash(path) + if err = w.WriteHeader(h); err != nil { + return + } + + // Done if directory + if d.IsDir() { + return + } + + // Data + data, err := os.Open(path) + if err != nil { + return + } + _, err = io.Copy(w, data) + return + }) +}