golang.org/x/tools@v0.21.0/go/packages/packagestest/gopath.go (about)

     1  // Copyright 2018 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 packagestest
     6  
     7  import (
     8  	"path"
     9  	"path/filepath"
    10  )
    11  
    12  // GOPATH is the exporter that produces GOPATH layouts.
    13  // Each "module" is put in it's own GOPATH entry to help test complex cases.
    14  // Given the two files
    15  //
    16  //	golang.org/repoa#a/a.go
    17  //	golang.org/repob#b/b.go
    18  //
    19  // You would get the directory layout
    20  //
    21  //	/sometemporarydirectory
    22  //	├── repoa
    23  //	│   └── src
    24  //	│       └── golang.org
    25  //	│           └── repoa
    26  //	│               └── a
    27  //	│                   └── a.go
    28  //	└── repob
    29  //	    └── src
    30  //	        └── golang.org
    31  //	            └── repob
    32  //	                └── b
    33  //	                    └── b.go
    34  //
    35  // GOPATH would be set to
    36  //
    37  //	/sometemporarydirectory/repoa;/sometemporarydirectory/repob
    38  //
    39  // and the working directory would be
    40  //
    41  //	/sometemporarydirectory/repoa/src
    42  var GOPATH = gopath{}
    43  
    44  type gopath struct{}
    45  
    46  func (gopath) Name() string {
    47  	return "GOPATH"
    48  }
    49  
    50  func (gopath) Filename(exported *Exported, module, fragment string) string {
    51  	return filepath.Join(gopathDir(exported, module), "src", module, fragment)
    52  }
    53  
    54  func (gopath) Finalize(exported *Exported) error {
    55  	exported.Config.Env = append(exported.Config.Env, "GO111MODULE=off")
    56  	gopath := ""
    57  	for module := range exported.written {
    58  		if gopath != "" {
    59  			gopath += string(filepath.ListSeparator)
    60  		}
    61  		dir := gopathDir(exported, module)
    62  		gopath += dir
    63  		if module == exported.primary {
    64  			exported.Config.Dir = filepath.Join(dir, "src")
    65  		}
    66  	}
    67  	exported.Config.Env = append(exported.Config.Env, "GOPATH="+gopath)
    68  	return nil
    69  }
    70  
    71  func gopathDir(exported *Exported, module string) string {
    72  	dir := path.Base(module)
    73  	if versionSuffixRE.MatchString(dir) {
    74  		dir = path.Base(path.Dir(module)) + "_" + dir
    75  	}
    76  	return filepath.Join(exported.temp, dir)
    77  }