github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/engine/testutil/fakegit/fakegit.go (about)

     1  package fakegit // import "github.com/docker/docker/testutil/fakegit"
     2  
     3  import (
     4  	"fmt"
     5  	"net/http"
     6  	"net/http/httptest"
     7  	"os"
     8  	"os/exec"
     9  	"path/filepath"
    10  	"testing"
    11  
    12  	"github.com/docker/docker/testutil/fakecontext"
    13  	"github.com/docker/docker/testutil/fakestorage"
    14  )
    15  
    16  type gitServer interface {
    17  	URL() string
    18  	Close() error
    19  }
    20  
    21  type localGitServer struct {
    22  	*httptest.Server
    23  }
    24  
    25  func (r *localGitServer) Close() error {
    26  	r.Server.Close()
    27  	return nil
    28  }
    29  
    30  func (r *localGitServer) URL() string {
    31  	return r.Server.URL
    32  }
    33  
    34  // FakeGit is a fake git server
    35  type FakeGit struct {
    36  	root    string
    37  	server  gitServer
    38  	RepoURL string
    39  }
    40  
    41  // Close closes the server, implements Closer interface
    42  func (g *FakeGit) Close() {
    43  	g.server.Close()
    44  	os.RemoveAll(g.root)
    45  }
    46  
    47  // New create a fake git server that can be used for git related tests
    48  func New(c testing.TB, name string, files map[string]string, enforceLocalServer bool) *FakeGit {
    49  	c.Helper()
    50  	ctx := fakecontext.New(c, "", fakecontext.WithFiles(files))
    51  	defer ctx.Close()
    52  	curdir, err := os.Getwd()
    53  	if err != nil {
    54  		c.Fatal(err)
    55  	}
    56  	defer os.Chdir(curdir)
    57  
    58  	if output, err := exec.Command("git", "init", ctx.Dir).CombinedOutput(); err != nil {
    59  		c.Fatalf("error trying to init repo: %s (%s)", err, output)
    60  	}
    61  	err = os.Chdir(ctx.Dir)
    62  	if err != nil {
    63  		c.Fatal(err)
    64  	}
    65  	if output, err := exec.Command("git", "config", "user.name", "Fake User").CombinedOutput(); err != nil {
    66  		c.Fatalf("error trying to set 'user.name': %s (%s)", err, output)
    67  	}
    68  	if output, err := exec.Command("git", "config", "user.email", "fake.user@example.com").CombinedOutput(); err != nil {
    69  		c.Fatalf("error trying to set 'user.email': %s (%s)", err, output)
    70  	}
    71  	if output, err := exec.Command("git", "add", "*").CombinedOutput(); err != nil {
    72  		c.Fatalf("error trying to add files to repo: %s (%s)", err, output)
    73  	}
    74  	if output, err := exec.Command("git", "commit", "-a", "-m", "Initial commit").CombinedOutput(); err != nil {
    75  		c.Fatalf("error trying to commit to repo: %s (%s)", err, output)
    76  	}
    77  
    78  	root, err := os.MkdirTemp("", "docker-test-git-repo")
    79  	if err != nil {
    80  		c.Fatal(err)
    81  	}
    82  	repoPath := filepath.Join(root, name+".git")
    83  	if output, err := exec.Command("git", "clone", "--bare", ctx.Dir, repoPath).CombinedOutput(); err != nil {
    84  		os.RemoveAll(root)
    85  		c.Fatalf("error trying to clone --bare: %s (%s)", err, output)
    86  	}
    87  	err = os.Chdir(repoPath)
    88  	if err != nil {
    89  		os.RemoveAll(root)
    90  		c.Fatal(err)
    91  	}
    92  	if output, err := exec.Command("git", "update-server-info").CombinedOutput(); err != nil {
    93  		os.RemoveAll(root)
    94  		c.Fatalf("error trying to git update-server-info: %s (%s)", err, output)
    95  	}
    96  	err = os.Chdir(curdir)
    97  	if err != nil {
    98  		os.RemoveAll(root)
    99  		c.Fatal(err)
   100  	}
   101  
   102  	var server gitServer
   103  	if !enforceLocalServer {
   104  		// use fakeStorage server, which might be local or remote (at test daemon)
   105  		server = fakestorage.New(c, root)
   106  	} else {
   107  		// always start a local http server on CLI test machine
   108  		httpServer := httptest.NewServer(http.FileServer(http.Dir(root)))
   109  		server = &localGitServer{httpServer}
   110  	}
   111  	return &FakeGit{
   112  		root:    root,
   113  		server:  server,
   114  		RepoURL: fmt.Sprintf("%s/%s.git", server.URL(), name),
   115  	}
   116  }