github.com/falafeljan/pkger@v0.18.0/pkging/pkgtest/ref.go (about)

     1  package pkgtest
     2  
     3  import (
     4  	"crypto/rand"
     5  	"encoding/hex"
     6  	"io/ioutil"
     7  	"os"
     8  	"path/filepath"
     9  	"runtime"
    10  
    11  	"github.com/markbates/pkger/here"
    12  )
    13  
    14  type Ref struct {
    15  	here.Info
    16  	root string
    17  }
    18  
    19  func NewRef() (*Ref, error) {
    20  	her, err := here.Package("github.com/markbates/pkger")
    21  	if err != nil {
    22  		return nil, err
    23  	}
    24  	root := filepath.Join(
    25  		her.Module.Dir,
    26  		"pkging",
    27  		"pkgtest",
    28  		"testdata",
    29  		"ref",
    30  	)
    31  
    32  	return newRef(root)
    33  }
    34  
    35  func newRef(root string) (*Ref, error) {
    36  	if _, err := os.Stat(root); err != nil {
    37  		return nil, err
    38  	}
    39  
    40  	b := make([]byte, 10)
    41  	_, err := rand.Read(b)
    42  	if err != nil {
    43  		return nil, err
    44  	}
    45  
    46  	dir := filepath.Dir(root)
    47  	dir = filepath.Join(dir, hex.EncodeToString(b))
    48  
    49  	ref := &Ref{
    50  		Info: here.Info{
    51  			ImportPath: "app",
    52  			Dir:        dir,
    53  			Name:       "app",
    54  			Module: here.Module{
    55  				Main:      true,
    56  				Path:      "app",
    57  				Dir:       dir,
    58  				GoMod:     filepath.Join(dir, "go.mod"),
    59  				GoVersion: runtime.Version(),
    60  			},
    61  		},
    62  
    63  		root: root,
    64  	}
    65  
    66  	if err := os.MkdirAll(dir, 0755); err != nil {
    67  		return nil, err
    68  	}
    69  
    70  	for _, n := range []string{"go.mod", "go.sum"} {
    71  		b, err = ioutil.ReadFile(filepath.Join(root, n))
    72  		if err != nil {
    73  			return nil, err
    74  		}
    75  
    76  		f, err := os.Create(filepath.Join(dir, n))
    77  		if err != nil {
    78  			return nil, err
    79  		}
    80  
    81  		if _, err := f.Write(b); err != nil {
    82  			return nil, err
    83  		}
    84  
    85  		if err := f.Close(); err != nil {
    86  			return nil, err
    87  		}
    88  	}
    89  
    90  	return ref, nil
    91  }