mirror of https://github.com/ethereum/go-ethereum
build: use golangci-lint (#20295)
* build: use golangci-lint This changes build/ci.go to download and run golangci-lint instead of gometalinter. * core/state: fix unnecessary conversion * p2p/simulations: fix lock copying (found by go vet) * signer/core: fix unnecessary conversions * crypto/ecies: remove unused function cmpPublic * core/rawdb: remove unused function print * core/state: remove unused function xTestFuzzCutter * core/vm: disable TestWriteExpectedValues in a different way * core/forkid: remove unused function checksum * les: remove unused type proofsData * cmd/utils: remove unused functions prefixedNames, prefixFor * crypto/bn256: run goimports * p2p/nat: fix goimports lint issue * cmd/clef: avoid using unkeyed struct fields * les: cancel context in testRequest * rlp: delete unreachable code * core: gofmt * internal/build: simplify DownloadFile for Go 1.11 compatibility * build: remove go test --short flag * .travis.yml: disable build cache * whisper/whisperv6: fix ineffectual assignment in TestWhisperIdentityManagement * .golangci.yml: enable goconst and ineffassign linters * build: print message when there are no lint issues * internal/build: refactor download a bitpull/20309/head
parent
7c4a4eb58a
commit
689486449d
@ -0,0 +1,45 @@ |
||||
# This file configures github.com/golangci/golangci-lint. |
||||
|
||||
run: |
||||
timeout: 2m |
||||
tests: true |
||||
# default is true. Enables skipping of directories: |
||||
# vendor$, third_party$, testdata$, examples$, Godeps$, builtin$ |
||||
skip-dirs-use-default: true |
||||
|
||||
linters: |
||||
disable-all: true |
||||
enable: |
||||
- deadcode |
||||
- goconst |
||||
- goimports |
||||
- gosimple |
||||
- govet |
||||
- ineffassign |
||||
- misspell |
||||
# - staticcheck |
||||
- unconvert |
||||
# - unused |
||||
- varcheck |
||||
|
||||
linters-settings: |
||||
gofmt: |
||||
simplify: true |
||||
goconst: |
||||
min-len: 3 # minimum length of string constant |
||||
min-occurrences: 6 # minimum number of occurrences |
||||
|
||||
issues: |
||||
exclude-rules: |
||||
- path: crypto/blake2b/ |
||||
linters: |
||||
- deadcode |
||||
- path: crypto/bn256/cloudflare |
||||
linters: |
||||
- deadcode |
||||
- path: p2p/discv5/ |
||||
linters: |
||||
- deadcode |
||||
- path: core/vm/instructions_test.go |
||||
linters: |
||||
- goconst |
@ -0,0 +1,19 @@ |
||||
# This file contains sha256 checksums of optional build dependencies. |
||||
|
||||
95dbeab442ee2746b9acf0934c8e2fc26414a0565c008631b04addb8c02e7624 go1.13.4.src.tar.gz |
||||
|
||||
1fcbc9e36f4319eeed02beb8cfd1b3d425ffc2f90ddf09a80f18d5064c51e0cb golangci-lint-1.21.0-linux-386.tar.gz |
||||
267b4066e67139a38d29499331a002d6a29ad5be7aafc83db3b1e88f1b027f90 golangci-lint-1.21.0-linux-armv6.tar.gz |
||||
a602c1f25f90e46e621019cff0a8cb3f4e1837011f3537f15e730d6a9ebf507b golangci-lint-1.21.0-freebsd-armv7.tar.gz |
||||
2c861f8dc56b560474aa27cab0c075991628cc01af3451e27ac82f5d10d5106b golangci-lint-1.21.0-linux-amd64.tar.gz |
||||
a1c39e055280e755acaa906e7abfc20b99a5c28be8af541c57fbc44abbb20dde golangci-lint-1.21.0-linux-arm64.tar.gz |
||||
a8f8bda8c6a4136acf858091077830b1e83ad5612606cb69d5dced869ce00bd8 golangci-lint-1.21.0-linux-ppc64le.tar.gz |
||||
0a8a8c3bc660ccbca668897ab520f7ee9878f16cc8e4dd24fe46236ceec97ba3 golangci-lint-1.21.0-freebsd-armv6.tar.gz |
||||
699b07f45e216571f54002bcbd83b511c4801464a422162158e299587b095b18 golangci-lint-1.21.0-freebsd-amd64.tar.gz |
||||
980fb4993942154bb5c8129ea3b86de09574fe81b24384ebb58cd7a9d2f04483 golangci-lint-1.21.0-linux-armv7.tar.gz |
||||
f15b689088a47f20d5d3c1d945e9ee7c6238f2b84ea468b5f886cf8713dce62e golangci-lint-1.21.0-windows-386.zip |
||||
2e40ded7adcf11e59013cb15c24438b15a86526ca241edfcfdf1abd73a5280a8 golangci-lint-1.21.0-windows-amd64.zip |
||||
6052c7cfea4d6dc2fc722f6c12792a5ec087420198db495afffbc22052653bf7 golangci-lint-1.21.0-freebsd-386.tar.gz |
||||
ca00b8eacf9af14a71b908b4149606c762aa5c0eac781e74ca0abedfdfdf6c8c golangci-lint-1.21.0-linux-s390x.tar.gz |
||||
1365455940c342f95718159d89d66ad2eef19f0846c3e87023e915a3527b929f golangci-lint-1.21.0-darwin-386.tar.gz |
||||
2b2713ec5007e67883aa501eebb81f22abfab0cf0909134ba90f60a066db3760 golangci-lint-1.21.0-darwin-amd64.tar.gz |
@ -0,0 +1,149 @@ |
||||
// Copyright 2019 The go-ethereum Authors
|
||||
// This file is part of the go-ethereum library.
|
||||
//
|
||||
// The go-ethereum library is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Lesser General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// The go-ethereum library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public License
|
||||
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
package build |
||||
|
||||
import ( |
||||
"bufio" |
||||
"crypto/sha256" |
||||
"encoding/hex" |
||||
"fmt" |
||||
"io" |
||||
"io/ioutil" |
||||
"log" |
||||
"net/http" |
||||
"os" |
||||
"path/filepath" |
||||
"strings" |
||||
) |
||||
|
||||
// ChecksumDB keeps file checksums.
|
||||
type ChecksumDB struct { |
||||
allChecksums []string |
||||
} |
||||
|
||||
// MustLoadChecksums loads a file containing checksums.
|
||||
func MustLoadChecksums(file string) *ChecksumDB { |
||||
content, err := ioutil.ReadFile(file) |
||||
if err != nil { |
||||
log.Fatal("can't load checksum file: " + err.Error()) |
||||
} |
||||
return &ChecksumDB{strings.Split(string(content), "\n")} |
||||
} |
||||
|
||||
// Verify checks whether the given file is valid according to the checksum database.
|
||||
func (db *ChecksumDB) Verify(path string) error { |
||||
fd, err := os.Open(path) |
||||
if err != nil { |
||||
return err |
||||
} |
||||
defer fd.Close() |
||||
|
||||
h := sha256.New() |
||||
if _, err := io.Copy(h, bufio.NewReader(fd)); err != nil { |
||||
return err |
||||
} |
||||
fileHash := hex.EncodeToString(h.Sum(nil)) |
||||
if !db.findHash(filepath.Base(path), fileHash) { |
||||
return fmt.Errorf("invalid file hash %s", fileHash) |
||||
} |
||||
return nil |
||||
} |
||||
|
||||
func (db *ChecksumDB) findHash(basename, hash string) bool { |
||||
want := hash + " " + basename |
||||
for _, line := range db.allChecksums { |
||||
if strings.TrimSpace(line) == want { |
||||
return true |
||||
} |
||||
} |
||||
return false |
||||
} |
||||
|
||||
// DownloadFile downloads a file and verifies its checksum.
|
||||
func (db *ChecksumDB) DownloadFile(url, dstPath string) error { |
||||
if err := db.Verify(dstPath); err == nil { |
||||
fmt.Printf("%s is up-to-date\n", dstPath) |
||||
return nil |
||||
} |
||||
fmt.Printf("%s is stale\n", dstPath) |
||||
fmt.Printf("downloading from %s\n", url) |
||||
|
||||
resp, err := http.Get(url) |
||||
if err != nil || resp.StatusCode != http.StatusOK { |
||||
return fmt.Errorf("download error: code %d, err %v", resp.StatusCode, err) |
||||
} |
||||
defer resp.Body.Close() |
||||
if err := os.MkdirAll(filepath.Dir(dstPath), 0755); err != nil { |
||||
return err |
||||
} |
||||
fd, err := os.OpenFile(dstPath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644) |
||||
if err != nil { |
||||
return err |
||||
} |
||||
dst := newDownloadWriter(fd, resp.ContentLength) |
||||
_, err = io.Copy(dst, resp.Body) |
||||
dst.Close() |
||||
if err != nil { |
||||
return err |
||||
} |
||||
|
||||
return db.Verify(dstPath) |
||||
} |
||||
|
||||
type downloadWriter struct { |
||||
file *os.File |
||||
dstBuf *bufio.Writer |
||||
size int64 |
||||
written int64 |
||||
lastpct int64 |
||||
} |
||||
|
||||
func newDownloadWriter(dst *os.File, size int64) *downloadWriter { |
||||
return &downloadWriter{ |
||||
file: dst, |
||||
dstBuf: bufio.NewWriter(dst), |
||||
size: size, |
||||
} |
||||
} |
||||
|
||||
func (w *downloadWriter) Write(buf []byte) (int, error) { |
||||
n, err := w.dstBuf.Write(buf) |
||||
|
||||
// Report progress.
|
||||
w.written += int64(n) |
||||
pct := w.written * 10 / w.size * 10 |
||||
if pct != w.lastpct { |
||||
if w.lastpct != 0 { |
||||
fmt.Print("...") |
||||
} |
||||
fmt.Print(pct, "%") |
||||
w.lastpct = pct |
||||
} |
||||
return n, err |
||||
} |
||||
|
||||
func (w *downloadWriter) Close() error { |
||||
if w.lastpct > 0 { |
||||
fmt.Println() // Finish the progress line.
|
||||
} |
||||
flushErr := w.dstBuf.Flush() |
||||
closeErr := w.file.Close() |
||||
if flushErr != nil { |
||||
return flushErr |
||||
} |
||||
return closeErr |
||||
} |
@ -1,81 +0,0 @@ |
||||
// Copyright 2019 The go-ethereum Authors
|
||||
// This file is part of the go-ethereum library.
|
||||
//
|
||||
// The go-ethereum library is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Lesser General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// The go-ethereum library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public License
|
||||
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
package build |
||||
|
||||
import ( |
||||
"bytes" |
||||
"crypto/sha256" |
||||
"fmt" |
||||
"io/ioutil" |
||||
"net/http" |
||||
"os" |
||||
"path/filepath" |
||||
"strings" |
||||
) |
||||
|
||||
// EnsureGoSources ensures that path contains a file with the given SHA256 hash,
|
||||
// and if not, it downloads a fresh Go source package from upstream and replaces
|
||||
// path with it (if the hash matches).
|
||||
func EnsureGoSources(version string, hash []byte, path string) error { |
||||
// Sanity check the destination path to ensure we don't do weird things
|
||||
if !strings.HasSuffix(path, ".tar.gz") { |
||||
return fmt.Errorf("destination path (%s) must end with .tar.gz", path) |
||||
} |
||||
// If the file exists, validate it's hash
|
||||
if archive, err := ioutil.ReadFile(path); err == nil { // Go sources are ~20MB, it's fine to read all
|
||||
hasher := sha256.New() |
||||
hasher.Write(archive) |
||||
have := hasher.Sum(nil) |
||||
|
||||
if bytes.Equal(have, hash) { |
||||
fmt.Printf("Go %s [%x] available at %s\n", version, hash, path) |
||||
return nil |
||||
} |
||||
fmt.Printf("Go %s hash mismatch (have %x, want %x) at %s, deleting old archive\n", version, have, hash, path) |
||||
if err := os.Remove(path); err != nil { |
||||
return err |
||||
} |
||||
} |
||||
// Archive missing or bad hash, download a new one
|
||||
fmt.Printf("Downloading Go %s [want %x] into %s\n", version, hash, path) |
||||
|
||||
res, err := http.Get(fmt.Sprintf("https://dl.google.com/go/go%s.src.tar.gz", version)) |
||||
if err != nil || res.StatusCode != http.StatusOK { |
||||
return fmt.Errorf("failed to access Go sources: code %d, err %v", res.StatusCode, err) |
||||
} |
||||
defer res.Body.Close() |
||||
|
||||
archive, err := ioutil.ReadAll(res.Body) |
||||
if err != nil { |
||||
return err |
||||
} |
||||
// Sanity check the downloaded archive, save if checks out
|
||||
hasher := sha256.New() |
||||
hasher.Write(archive) |
||||
|
||||
if have := hasher.Sum(nil); !bytes.Equal(have, hash) { |
||||
return fmt.Errorf("downloaded Go %s hash mismatch (have %x, want %x)", version, have, hash) |
||||
} |
||||
if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil { |
||||
return err |
||||
} |
||||
if err := ioutil.WriteFile(path, archive, 0644); err != nil { |
||||
return err |
||||
} |
||||
fmt.Printf("Downloaded Go %s [%x] into %s\n", version, hash, path) |
||||
return nil |
||||
} |
Loading…
Reference in new issue