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 }