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