* 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>for-closed-social
@ -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) | |||||
} |