blob: 039b2d40bf6b4b053b187296f9ff13801215adc2 [file] [log] [blame]
// 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.
// +build go1.11
package packagestest
import (
"bytes"
"fmt"
"io/ioutil"
"path"
"path/filepath"
)
// Modules is the exporter that produces module layouts.
// Each "repository" is put in it's own module, and the module file generated
// will have replace directives for all other modules.
// Given the two files
// golang.org/repoa#a/a.go
// golang.org/repob#b/b.go
// You would get the directory layout
// /sometemporarydirectory
// ├── repoa
// │ ├── a
// │ │ └── a.go
// │ └── go.mod
// └── repob
// ├── b
// │ └── b.go
// └── go.mod
// and the working directory would be
// /sometemporarydirectory/repoa
var Modules = modules{}
func init() {
All = append(All, Modules)
}
type modules struct{}
func (modules) Name() string {
return "Modules"
}
func (modules) Filename(exported *Exported, module, fragment string) string {
return filepath.Join(moduleDir(exported, module), fragment)
}
func (modules) Finalize(exported *Exported) error {
exported.Config.Env = append(exported.Config.Env, "GO111MODULE=on")
for module, files := range exported.written {
dir := gopathDir(exported, module)
if module == gorootModule {
exported.Config.Env = append(exported.Config.Env, "GOROOT="+dir)
continue
}
buf := &bytes.Buffer{}
fmt.Fprintf(buf, "module %v\n", module)
// add replace directives to the paths of all other modules written
for other := range exported.written {
if other == gorootModule || other == module {
continue
}
fmt.Fprintf(buf, "replace %v => %v\n", other, moduleDir(exported, other))
}
modfile := filepath.Join(dir, "go.mod")
if err := ioutil.WriteFile(modfile, buf.Bytes(), 0644); err != nil {
return err
}
files["go.mod"] = modfile
if module == exported.primary {
exported.Config.Dir = dir
}
}
return nil
}
func moduleDir(exported *Exported, module string) string {
return filepath.Join(exported.temp, path.Base(module))
}