fork of go-git with some jj specific features
at v5.13.2 161 lines 4.3 kB view raw
1package examples 2 3import ( 4 "flag" 5 "os" 6 "os/exec" 7 "path/filepath" 8 "runtime" 9 "testing" 10) 11 12var examplesTest = flag.Bool("examples", false, "run the examples tests") 13 14var defaultURL = "https://github.com/git-fixtures/basic.git" 15 16var args = map[string][]string{ 17 "blame": {defaultURL, "CHANGELOG"}, 18 "branch": {defaultURL, tempFolder()}, 19 "checkout": {defaultURL, tempFolder(), "35e85108805c84807bc66a02d91535e1e24b38b9"}, 20 "checkout-branch": {defaultURL, tempFolder(), "branch"}, 21 "clone": {defaultURL, tempFolder()}, 22 "commit": {cloneRepository(defaultURL, tempFolder())}, 23 "context": {defaultURL, tempFolder()}, 24 "custom_http": {defaultURL}, 25 "find-if-any-tag-point-head": {cloneRepository(defaultURL, tempFolder())}, 26 "ls": {cloneRepository(defaultURL, tempFolder()), "HEAD", "vendor"}, 27 "ls-remote": {defaultURL}, 28 "merge_base": {cloneRepository(defaultURL, tempFolder()), "--is-ancestor", "HEAD~3", "HEAD^"}, 29 "open": {cloneRepository(defaultURL, tempFolder())}, 30 "progress": {defaultURL, tempFolder()}, 31 "pull": {createRepositoryWithRemote(tempFolder(), defaultURL)}, 32 "push": {setEmptyRemote(cloneRepository(defaultURL, tempFolder()))}, 33 "restore": {cloneRepository(defaultURL, tempFolder())}, 34 "revision": {cloneRepository(defaultURL, tempFolder()), "master~2^"}, 35 "sha256": {tempFolder()}, 36 "showcase": {defaultURL, tempFolder()}, 37 "sparse-checkout": {defaultURL, "vendor", tempFolder()}, 38 "tag": {cloneRepository(defaultURL, tempFolder())}, 39} 40 41// tests not working / set-up 42var ignored = map[string]bool{ 43 "azure_devops": true, 44 "ls": true, 45 "sha256": true, 46 "submodule": true, 47 "tag-create-push": true, 48} 49 50var ( 51 tempFolders = []string{} 52 53 _, callingFile, _, _ = runtime.Caller(0) 54 basepath = filepath.Dir(callingFile) 55) 56 57func TestExamples(t *testing.T) { 58 flag.Parse() 59 if !*examplesTest && os.Getenv("CI") == "" { 60 t.Skip("skipping examples tests, pass --examples to execute it") 61 return 62 } 63 64 defer deleteTempFolders() 65 66 exampleMains, err := filepath.Glob(filepath.Join(basepath, "*", "main.go")) 67 if err != nil { 68 t.Errorf("error finding tests: %s", err) 69 } 70 71 for _, main := range exampleMains { 72 dir := filepath.Dir(main) 73 _, name := filepath.Split(dir) 74 75 if ignored[name] { 76 continue 77 } 78 79 t.Run(name, func(t *testing.T) { 80 testExample(t, name, dir) 81 }) 82 } 83} 84 85func tempFolder() string { 86 path, err := os.MkdirTemp("", "") 87 CheckIfError(err) 88 89 tempFolders = append(tempFolders, path) 90 return path 91} 92 93func cloneRepository(url, folder string) string { 94 cmd := exec.Command("git", "clone", url, folder) 95 err := cmd.Run() 96 CheckIfError(err) 97 98 return folder 99} 100 101func createBareRepository(dir string) string { 102 return createRepository(dir, true) 103} 104 105func createRepository(dir string, isBare bool) string { 106 var cmd *exec.Cmd 107 if isBare { 108 cmd = exec.Command("git", "init", "--bare", dir) 109 } else { 110 cmd = exec.Command("git", "init", dir) 111 } 112 err := cmd.Run() 113 CheckIfError(err) 114 115 return dir 116} 117 118func createRepositoryWithRemote(local, remote string) string { 119 createRepository(local, false) 120 addRemote(local, remote) 121 return local 122} 123 124func setEmptyRemote(dir string) string { 125 remote := createBareRepository(tempFolder()) 126 setRemote(dir, remote) 127 return dir 128} 129 130func setRemote(local, remote string) { 131 cmd := exec.Command("git", "remote", "set-url", "origin", remote) 132 cmd.Dir = local 133 err := cmd.Run() 134 CheckIfError(err) 135} 136 137func addRemote(local, remote string) { 138 cmd := exec.Command("git", "remote", "add", "origin", remote) 139 cmd.Dir = local 140 err := cmd.Run() 141 CheckIfError(err) 142} 143 144func testExample(t *testing.T, name, dir string) { 145 arguments := append([]string{"run", dir}, args[name]...) 146 cmd := exec.Command("go", arguments...) 147 148 cmd.Stdout = os.Stdout 149 cmd.Stderr = os.Stderr 150 151 if err := cmd.Run(); err != nil { 152 t.Errorf("error running cmd %q", err) 153 } 154} 155 156func deleteTempFolders() { 157 for _, folder := range tempFolders { 158 err := os.RemoveAll(folder) 159 CheckIfError(err) 160 } 161}