435c0d9fc8
This PR switches the Nomad repository from using govendor to Go modules for managing dependencies. Aspects of the Nomad workflow remain pretty much the same. The usual Makefile targets should continue to work as they always did. The API submodule simply defers to the parent Nomad version on the repository, keeping the semantics of API versioning that currently exists.
86 lines
2.2 KiB
Go
86 lines
2.2 KiB
Go
// Copyright 2017 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package cache
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"sync"
|
|
)
|
|
|
|
// Default returns the default cache to use.
|
|
func Default() (*Cache, error) {
|
|
defaultOnce.Do(initDefaultCache)
|
|
return defaultCache, defaultDirErr
|
|
}
|
|
|
|
var (
|
|
defaultOnce sync.Once
|
|
defaultCache *Cache
|
|
)
|
|
|
|
// cacheREADME is a message stored in a README in the cache directory.
|
|
// Because the cache lives outside the normal Go trees, we leave the
|
|
// README as a courtesy to explain where it came from.
|
|
const cacheREADME = `This directory holds cached build artifacts from staticcheck.
|
|
`
|
|
|
|
// initDefaultCache does the work of finding the default cache
|
|
// the first time Default is called.
|
|
func initDefaultCache() {
|
|
dir := DefaultDir()
|
|
if err := os.MkdirAll(dir, 0777); err != nil {
|
|
log.Fatalf("failed to initialize build cache at %s: %s\n", dir, err)
|
|
}
|
|
if _, err := os.Stat(filepath.Join(dir, "README")); err != nil {
|
|
// Best effort.
|
|
ioutil.WriteFile(filepath.Join(dir, "README"), []byte(cacheREADME), 0666)
|
|
}
|
|
|
|
c, err := Open(dir)
|
|
if err != nil {
|
|
log.Fatalf("failed to initialize build cache at %s: %s\n", dir, err)
|
|
}
|
|
defaultCache = c
|
|
}
|
|
|
|
var (
|
|
defaultDirOnce sync.Once
|
|
defaultDir string
|
|
defaultDirErr error
|
|
)
|
|
|
|
// DefaultDir returns the effective STATICCHECK_CACHE setting.
|
|
func DefaultDir() string {
|
|
// Save the result of the first call to DefaultDir for later use in
|
|
// initDefaultCache. cmd/go/main.go explicitly sets GOCACHE so that
|
|
// subprocesses will inherit it, but that means initDefaultCache can't
|
|
// otherwise distinguish between an explicit "off" and a UserCacheDir error.
|
|
|
|
defaultDirOnce.Do(func() {
|
|
defaultDir = os.Getenv("STATICCHECK_CACHE")
|
|
if filepath.IsAbs(defaultDir) {
|
|
return
|
|
}
|
|
if defaultDir != "" {
|
|
defaultDirErr = fmt.Errorf("STATICCHECK_CACHE is not an absolute path")
|
|
return
|
|
}
|
|
|
|
// Compute default location.
|
|
dir, err := os.UserCacheDir()
|
|
if err != nil {
|
|
defaultDirErr = fmt.Errorf("STATICCHECK_CACHE is not defined and %v", err)
|
|
return
|
|
}
|
|
defaultDir = filepath.Join(dir, "staticcheck")
|
|
})
|
|
|
|
return defaultDir
|
|
}
|