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