github.com/kdevb0x/go@v0.0.0-20180115030120-39687051e9e7/src/cmd/go/internal/load/icfg.go (about) 1 // Copyright 2017 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package load 6 7 import ( 8 "bytes" 9 "encoding/json" 10 "errors" 11 "io/ioutil" 12 ) 13 14 // DebugDeprecatedImportcfg is installed as the undocumented -debug-deprecated-importcfg build flag. 15 // It is useful for debugging subtle problems in the go command logic but not something 16 // we want users to depend on. The hope is that the "deprecated" will make that clear. 17 // We intend to remove this flag in Go 1.11. 18 var DebugDeprecatedImportcfg debugDeprecatedImportcfgFlag 19 20 type debugDeprecatedImportcfgFlag struct { 21 enabled bool 22 Import map[string]string 23 Pkg map[string]*debugDeprecatedImportcfgPkg 24 } 25 26 type debugDeprecatedImportcfgPkg struct { 27 Dir string 28 Import map[string]string 29 } 30 31 var ( 32 debugDeprecatedImportcfgMagic = []byte("# debug-deprecated-importcfg\n") 33 errImportcfgSyntax = errors.New("malformed syntax") 34 ) 35 36 func (f *debugDeprecatedImportcfgFlag) String() string { return "" } 37 38 func (f *debugDeprecatedImportcfgFlag) Set(x string) error { 39 if x == "" { 40 *f = debugDeprecatedImportcfgFlag{} 41 return nil 42 } 43 data, err := ioutil.ReadFile(x) 44 if err != nil { 45 return err 46 } 47 48 if !bytes.HasPrefix(data, debugDeprecatedImportcfgMagic) { 49 return errImportcfgSyntax 50 } 51 data = data[len(debugDeprecatedImportcfgMagic):] 52 53 f.Import = nil 54 f.Pkg = nil 55 if err := json.Unmarshal(data, &f); err != nil { 56 return errImportcfgSyntax 57 } 58 f.enabled = true 59 return nil 60 } 61 62 func (f *debugDeprecatedImportcfgFlag) lookup(parent *Package, path string) (dir, newPath string) { 63 newPath = path 64 if p := f.Import[path]; p != "" { 65 newPath = p 66 } 67 if parent != nil { 68 if p1 := f.Pkg[parent.ImportPath]; p1 != nil { 69 if p := p1.Import[path]; p != "" { 70 newPath = p 71 } 72 } 73 } 74 if p2 := f.Pkg[newPath]; p2 != nil { 75 return p2.Dir, newPath 76 } 77 return "", "" 78 }