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>tokarchuk/v1.17
parent
d087f4fb73
commit
48abe41ea8
@ -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) |
||||
} |
||||
} |
@ -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) |
||||
} |
||||
} |
@ -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) |
||||
} |
||||
} |
@ -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 new issue