* Drop the iso_checksum_type & iso_checksum_url fields In favor of simply using iso_checksum that will know what to do. * fix after master merge * Update builder_test.go * Update builder_test.go * Update builder_test.go * Update builder_test.go * Update builder_test.go * remove checksum lowercasing tests * Update builder_test.go * Update builder_test.go * better docs * Update builder_test.go * even better docs * Update config.go * Update builder_test.go * Update step_create_vmx_test.go * make generate * better docs * fix imports * up tests * Update _ISOConfig-required.html.md * Update builder_test.go * don't use sha1.Sum("none") as a caching path * Update builder_test.go * better docs * Update iso_config_test.go remove ISOChecksumType/ISOChecksumURL references * Update step_download_test.go * add iso_checksum_url and iso_checksum_type fixers + tests * add concrete examples of checksum values * add examples of checksumming from local file * update go-getter dep * up deps * use new go-getter version * up ESX5Driver.VerifyChecksum: use go-getter's checksumming * ISOConfig.Prepare: get checksum there in case we need it as a string in ESX5Driver.VerifyChecksum * Update iso_config.go * get go-getter from v2 branch * Update driver_esx5.go add more comments * Update driver_esx5.go * show better error message when the checksum is invalid * Update builder_test.go put in a valid checksum to fix tests, checksum is md5("packer") * Update builder_test.go test invalid and valid checksum * more test updating * fix default md5 string to be a valid md5 * TestChecksumFileNameMixedCaseBug: use 'file:' prefix for file checksumming * Update iso_config_test.go * Update iso_config_test.go * Update builder_test.go * Update builder_test.go * Update builder_test.go * Update CHANGELOG.md * Update CHANGELOG.md * Update go.mod * Update go.mod * Update CHANGELOG.md
91 lines
1.7 KiB
Go
91 lines
1.7 KiB
Go
package facts
|
|
|
|
import (
|
|
"bufio"
|
|
"bytes"
|
|
"io"
|
|
"os"
|
|
"reflect"
|
|
"strings"
|
|
|
|
"golang.org/x/tools/go/analysis"
|
|
)
|
|
|
|
type Generator int
|
|
|
|
// A list of known generators we can detect
|
|
const (
|
|
Unknown Generator = iota
|
|
Goyacc
|
|
Cgo
|
|
Stringer
|
|
)
|
|
|
|
var (
|
|
// used by cgo before Go 1.11
|
|
oldCgo = []byte("// Created by cgo - DO NOT EDIT")
|
|
prefix = []byte("// Code generated ")
|
|
suffix = []byte(" DO NOT EDIT.")
|
|
nl = []byte("\n")
|
|
crnl = []byte("\r\n")
|
|
)
|
|
|
|
func isGenerated(path string) (Generator, bool) {
|
|
f, err := os.Open(path)
|
|
if err != nil {
|
|
return 0, false
|
|
}
|
|
defer f.Close()
|
|
br := bufio.NewReader(f)
|
|
for {
|
|
s, err := br.ReadBytes('\n')
|
|
if err != nil && err != io.EOF {
|
|
return 0, false
|
|
}
|
|
s = bytes.TrimSuffix(s, crnl)
|
|
s = bytes.TrimSuffix(s, nl)
|
|
if bytes.HasPrefix(s, prefix) && bytes.HasSuffix(s, suffix) {
|
|
text := string(s[len(prefix) : len(s)-len(suffix)])
|
|
switch text {
|
|
case "by goyacc.":
|
|
return Goyacc, true
|
|
case "by cmd/cgo;":
|
|
return Cgo, true
|
|
}
|
|
if strings.HasPrefix(text, `by "stringer `) {
|
|
return Stringer, true
|
|
}
|
|
if strings.HasPrefix(text, `by goyacc `) {
|
|
return Goyacc, true
|
|
}
|
|
|
|
return Unknown, true
|
|
}
|
|
if bytes.Equal(s, oldCgo) {
|
|
return Cgo, true
|
|
}
|
|
if err == io.EOF {
|
|
break
|
|
}
|
|
}
|
|
return 0, false
|
|
}
|
|
|
|
var Generated = &analysis.Analyzer{
|
|
Name: "isgenerated",
|
|
Doc: "annotate file names that have been code generated",
|
|
Run: func(pass *analysis.Pass) (interface{}, error) {
|
|
m := map[string]Generator{}
|
|
for _, f := range pass.Files {
|
|
path := pass.Fset.PositionFor(f.Pos(), false).Filename
|
|
g, ok := isGenerated(path)
|
|
if ok {
|
|
m[path] = g
|
|
}
|
|
}
|
|
return m, nil
|
|
},
|
|
RunDespiteErrors: true,
|
|
ResultType: reflect.TypeOf(map[string]Generator{}),
|
|
}
|