Generate Bindata iff TAGS="bindata" and not up-to-date (#10004)
* Only generate bindata if necessary * Only generate bindata if they are not up-to-date * generate a hash of the fileinfo and use that to keep up-to-date * Newer test is redundant * handle missing bindata and clean * Only update hash after successful write * switch to sha1 hash * Apply suggestions from code review Co-Authored-By: guillep2k <18600385+guillep2k@users.noreply.github.com> Co-authored-by: guillep2k <18600385+guillep2k@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									d087f4fb73
								
							
						
					
					
						commit
						48abe41ea8
					
				
					 11 changed files with 113 additions and 76 deletions
				
			
		
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							|  | @ -34,8 +34,11 @@ _testmain.go | ||||||
| coverage.all | coverage.all | ||||||
| 
 | 
 | ||||||
| /modules/options/bindata.go | /modules/options/bindata.go | ||||||
|  | /modules/options/bindata.go.hash | ||||||
| /modules/public/bindata.go | /modules/public/bindata.go | ||||||
|  | /modules/public/bindata.go.hash | ||||||
| /modules/templates/bindata.go | /modules/templates/bindata.go | ||||||
|  | /modules/templates/bindata.go.hash | ||||||
| 
 | 
 | ||||||
| *.db | *.db | ||||||
| *.log | *.log | ||||||
|  |  | ||||||
							
								
								
									
										5
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								Makefile
									
									
									
									
									
								
							|  | @ -52,6 +52,7 @@ CSS_SOURCES ?= $(shell find web_src/less -type f) | ||||||
| JS_DEST := public/js/index.js | JS_DEST := public/js/index.js | ||||||
| CSS_DEST := public/css/index.css | CSS_DEST := public/css/index.css | ||||||
| BINDATA_DEST := modules/public/bindata.go modules/options/bindata.go modules/templates/bindata.go | BINDATA_DEST := modules/public/bindata.go modules/options/bindata.go modules/templates/bindata.go | ||||||
|  | BINDATA_HASH := $(addsuffix .hash,$(BINDATA_DEST)) | ||||||
| 
 | 
 | ||||||
| JS_DEST_DIR := public/js | JS_DEST_DIR := public/js | ||||||
| CSS_DEST_DIR := public/css | CSS_DEST_DIR := public/css | ||||||
|  | @ -145,7 +146,7 @@ clean-all: clean | ||||||
| .PHONY: clean | .PHONY: clean | ||||||
| clean: | clean: | ||||||
| 	$(GO) clean -i ./... | 	$(GO) clean -i ./... | ||||||
| 	rm -rf $(EXECUTABLE) $(DIST) $(BINDATA_DEST) \
 | 	rm -rf $(EXECUTABLE) $(DIST) $(BINDATA_DEST) $(BINDATA_HASH) \
 | ||||||
| 		integrations*.test \
 | 		integrations*.test \
 | ||||||
| 		integrations/gitea-integration-pgsql/ integrations/gitea-integration-mysql/ integrations/gitea-integration-mysql8/ integrations/gitea-integration-sqlite/ \
 | 		integrations/gitea-integration-pgsql/ integrations/gitea-integration-mysql/ integrations/gitea-integration-mysql8/ integrations/gitea-integration-sqlite/ \
 | ||||||
| 		integrations/gitea-integration-mssql/ integrations/indexers-mysql/ integrations/indexers-mysql8/ integrations/indexers-pgsql integrations/indexers-sqlite \
 | 		integrations/gitea-integration-mssql/ integrations/indexers-mysql/ integrations/indexers-mysql8/ integrations/indexers-pgsql integrations/indexers-sqlite \
 | ||||||
|  | @ -161,7 +162,7 @@ vet: | ||||||
| 
 | 
 | ||||||
| .PHONY: generate | .PHONY: generate | ||||||
| generate: fomantic js css | generate: fomantic js css | ||||||
| 	GO111MODULE=on $(GO) generate -mod=vendor $(PACKAGES) | 	GO111MODULE=on $(GO) generate -mod=vendor -tags '$(TAGS)' $(PACKAGES) | ||||||
| 
 | 
 | ||||||
| .PHONY: generate-swagger | .PHONY: generate-swagger | ||||||
| generate-swagger: | generate-swagger: | ||||||
|  |  | ||||||
|  | @ -1,23 +0,0 @@ | ||||||
| // +build ignore
 |  | ||||||
| 
 |  | ||||||
| package main |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"log" |  | ||||||
| 	"net/http" |  | ||||||
| 
 |  | ||||||
| 	"github.com/shurcooL/vfsgen" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func main() { |  | ||||||
| 	var fsTemplates http.FileSystem = http.Dir("../../options") |  | ||||||
| 	err := vfsgen.Generate(fsTemplates, vfsgen.Options{ |  | ||||||
| 		PackageName:  "options", |  | ||||||
| 		BuildTags:    "bindata", |  | ||||||
| 		VariableName: "Assets", |  | ||||||
| 		Filename:     "bindata.go", |  | ||||||
| 	}) |  | ||||||
| 	if err != nil { |  | ||||||
| 		log.Fatal("%v", err) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  | @ -4,8 +4,6 @@ | ||||||
| 
 | 
 | ||||||
| package options | package options | ||||||
| 
 | 
 | ||||||
| //go:generate go run -mod=vendor main.go
 |  | ||||||
| 
 |  | ||||||
| type directorySet map[string][]string | type directorySet map[string][]string | ||||||
| 
 | 
 | ||||||
| func (s directorySet) Add(key string, value []string) { | func (s directorySet) Add(key string, value []string) { | ||||||
|  |  | ||||||
							
								
								
									
										9
									
								
								modules/options/options_bindata.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								modules/options/options_bindata.go
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,9 @@ | ||||||
|  | // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||||
|  | // Use of this source code is governed by a MIT-style
 | ||||||
|  | // license that can be found in the LICENSE file.
 | ||||||
|  | 
 | ||||||
|  | //+build bindata
 | ||||||
|  | 
 | ||||||
|  | package options | ||||||
|  | 
 | ||||||
|  | //go:generate go run -mod=vendor ../../scripts/generate-bindata.go ../../options options bindata.go
 | ||||||
|  | @ -1,23 +0,0 @@ | ||||||
| // +build ignore
 |  | ||||||
| 
 |  | ||||||
| package main |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"log" |  | ||||||
| 	"net/http" |  | ||||||
| 
 |  | ||||||
| 	"github.com/shurcooL/vfsgen" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func main() { |  | ||||||
| 	var fsPublic http.FileSystem = http.Dir("../../public") |  | ||||||
| 	err := vfsgen.Generate(fsPublic, vfsgen.Options{ |  | ||||||
| 		PackageName:  "public", |  | ||||||
| 		BuildTags:    "bindata", |  | ||||||
| 		VariableName: "Assets", |  | ||||||
| 		Filename:     "bindata.go", |  | ||||||
| 	}) |  | ||||||
| 	if err != nil { |  | ||||||
| 		log.Fatal("%v", err) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  | @ -18,8 +18,6 @@ import ( | ||||||
| 	"gitea.com/macaron/macaron" | 	"gitea.com/macaron/macaron" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| //go:generate go run -mod=vendor main.go
 |  | ||||||
| 
 |  | ||||||
| // Options represents the available options to configure the macaron handler.
 | // Options represents the available options to configure the macaron handler.
 | ||||||
| type Options struct { | type Options struct { | ||||||
| 	Directory   string | 	Directory   string | ||||||
|  |  | ||||||
							
								
								
									
										9
									
								
								modules/public/public_bindata.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								modules/public/public_bindata.go
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,9 @@ | ||||||
|  | // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||||
|  | // Use of this source code is governed by a MIT-style
 | ||||||
|  | // license that can be found in the LICENSE file.
 | ||||||
|  | 
 | ||||||
|  | //+build bindata
 | ||||||
|  | 
 | ||||||
|  | package public | ||||||
|  | 
 | ||||||
|  | //go:generate go run -mod=vendor  ../../scripts/generate-bindata.go ../../public public bindata.go
 | ||||||
|  | @ -1,23 +0,0 @@ | ||||||
| // +build ignore
 |  | ||||||
| 
 |  | ||||||
| package main |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"log" |  | ||||||
| 	"net/http" |  | ||||||
| 
 |  | ||||||
| 	"github.com/shurcooL/vfsgen" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func main() { |  | ||||||
| 	var fsTemplates http.FileSystem = http.Dir("../../templates") |  | ||||||
| 	err := vfsgen.Generate(fsTemplates, vfsgen.Options{ |  | ||||||
| 		PackageName:  "templates", |  | ||||||
| 		BuildTags:    "bindata", |  | ||||||
| 		VariableName: "Assets", |  | ||||||
| 		Filename:     "bindata.go", |  | ||||||
| 	}) |  | ||||||
| 	if err != nil { |  | ||||||
| 		log.Fatal("%v", err) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  | @ -2,6 +2,8 @@ | ||||||
| // Use of this source code is governed by a MIT-style
 | // Use of this source code is governed by a MIT-style
 | ||||||
| // license that can be found in the LICENSE file.
 | // license that can be found in the LICENSE file.
 | ||||||
| 
 | 
 | ||||||
|  | //+build bindata
 | ||||||
|  | 
 | ||||||
| package templates | package templates | ||||||
| 
 | 
 | ||||||
| //go:generate go run -mod=vendor main.go
 | //go:generate go run -mod=vendor ../../scripts/generate-bindata.go ../../templates templates bindata.go
 | ||||||
							
								
								
									
										86
									
								
								scripts/generate-bindata.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								scripts/generate-bindata.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,86 @@ | ||||||
|  | // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||||
|  | // Use of this source code is governed by a MIT-style
 | ||||||
|  | // license that can be found in the LICENSE file.
 | ||||||
|  | 
 | ||||||
|  | // +build ignore
 | ||||||
|  | 
 | ||||||
|  | package main | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"bytes" | ||||||
|  | 	"crypto/sha1" | ||||||
|  | 	"fmt" | ||||||
|  | 	"io/ioutil" | ||||||
|  | 	"log" | ||||||
|  | 	"net/http" | ||||||
|  | 	"os" | ||||||
|  | 	"path/filepath" | ||||||
|  | 	"strconv" | ||||||
|  | 
 | ||||||
|  | 	"github.com/shurcooL/vfsgen" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func needsUpdate(dir string, filename string) (bool, []byte) { | ||||||
|  | 	needRegen := false | ||||||
|  | 	_, err := os.Stat(filename) | ||||||
|  | 	if err != nil { | ||||||
|  | 		needRegen = true | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	oldHash, err := ioutil.ReadFile(filename + ".hash") | ||||||
|  | 	if err != nil { | ||||||
|  | 		oldHash = []byte{} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	hasher := sha1.New() | ||||||
|  | 
 | ||||||
|  | 	err = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		_, _ = hasher.Write([]byte(info.Name())) | ||||||
|  | 		_, _ = hasher.Write([]byte(info.ModTime().String())) | ||||||
|  | 		_, _ = hasher.Write([]byte(strconv.FormatInt(info.Size(), 16))) | ||||||
|  | 		return nil | ||||||
|  | 	}) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return true, oldHash | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	newHash := hasher.Sum([]byte{}) | ||||||
|  | 
 | ||||||
|  | 	if bytes.Compare(oldHash, newHash) != 0 { | ||||||
|  | 
 | ||||||
|  | 		return true, newHash | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return needRegen, newHash | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func main() { | ||||||
|  | 	if len(os.Args) != 4 { | ||||||
|  | 		log.Fatal("Insufficient number of arguments. Need: directory packageName filename") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	dir, packageName, filename := os.Args[1], os.Args[2], os.Args[3] | ||||||
|  | 
 | ||||||
|  | 	update, newHash := needsUpdate(dir, filename) | ||||||
|  | 
 | ||||||
|  | 	if !update { | ||||||
|  | 		fmt.Printf("bindata for %s already up-to-date\n", packageName) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	fmt.Printf("generating bindata for %s\n", packageName) | ||||||
|  | 	var fsTemplates http.FileSystem = http.Dir(dir) | ||||||
|  | 	err := vfsgen.Generate(fsTemplates, vfsgen.Options{ | ||||||
|  | 		PackageName:  packageName, | ||||||
|  | 		BuildTags:    "bindata", | ||||||
|  | 		VariableName: "Assets", | ||||||
|  | 		Filename:     filename, | ||||||
|  | 	}) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Fatalf("%v\n", err) | ||||||
|  | 	} | ||||||
|  | 	_ = ioutil.WriteFile(filename+".hash", newHash, 0666) | ||||||
|  | } | ||||||
		Loading…
	
		Reference in a new issue