// Copyright 2018 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 packagestest import ( "path" "path/filepath" ) // GOPATH is the exporter that produces GOPATH layouts. // Each "module" is put in it's own GOPATH entry to help test complex cases. // Given the two files // golang.org/repoa#a/a.go // golang.org/repob#b/b.go // You would get the directory layout // /sometemporarydirectory // ├── repoa // │ └── src // │ └── golang.org // │ └── repoa // │ └── a // │ └── a.go // └── repob // └── src // └── golang.org // └── repob // └── b // └── b.go // GOPATH would be set to // /sometemporarydirectory/repoa;/sometemporarydirectory/repob // and the working directory would be // /sometemporarydirectory/repoa/src var GOPATH = gopath{} func init() { All = append(All, GOPATH) } type gopath struct{} func (gopath) Name() string { return "GOPATH" } func (gopath) Filename(exported *Exported, module, fragment string) string { return filepath.Join(gopathDir(exported, module), "src", module, fragment) } func (gopath) Finalize(exported *Exported) error { exported.Config.Env = append(exported.Config.Env, "GO111MODULE=off") gopath := "" for module := range exported.written { if gopath != "" { gopath += string(filepath.ListSeparator) } dir := gopathDir(exported, module) gopath += dir if module == exported.primary { exported.Config.Dir = filepath.Join(dir, "src") } } exported.Config.Env = append(exported.Config.Env, "GOPATH="+gopath) return nil } func gopathDir(exported *Exported, module string) string { dir := path.Base(module) if versionSuffixRE.MatchString(dir) { dir = path.Base(path.Dir(module)) + "_" + dir } return filepath.Join(exported.temp, dir) }