| // 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{} |
| |
| 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) |
| } |