code.gitea.io/gitea@v1.22.3/tests/integration/git_helper_for_declarative_test.go (about) 1 // Copyright 2019 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package integration 5 6 import ( 7 "context" 8 "fmt" 9 "net" 10 "net/http" 11 "net/url" 12 "os" 13 "path" 14 "path/filepath" 15 "strconv" 16 "testing" 17 "time" 18 19 "code.gitea.io/gitea/modules/git" 20 "code.gitea.io/gitea/modules/setting" 21 "code.gitea.io/gitea/modules/ssh" 22 "code.gitea.io/gitea/modules/util" 23 "code.gitea.io/gitea/tests" 24 25 "github.com/stretchr/testify/assert" 26 ) 27 28 func withKeyFile(t *testing.T, keyname string, callback func(string)) { 29 tmpDir := t.TempDir() 30 31 err := os.Chmod(tmpDir, 0o700) 32 assert.NoError(t, err) 33 34 keyFile := filepath.Join(tmpDir, keyname) 35 err = ssh.GenKeyPair(keyFile) 36 assert.NoError(t, err) 37 38 err = os.WriteFile(path.Join(tmpDir, "ssh"), []byte("#!/bin/bash\n"+ 39 "ssh -o \"UserKnownHostsFile=/dev/null\" -o \"StrictHostKeyChecking=no\" -o \"IdentitiesOnly=yes\" -i \""+keyFile+"\" \"$@\""), 0o700) 40 assert.NoError(t, err) 41 42 // Setup ssh wrapper 43 os.Setenv("GIT_SSH", path.Join(tmpDir, "ssh")) 44 os.Setenv("GIT_SSH_COMMAND", 45 "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o IdentitiesOnly=yes -i \""+keyFile+"\"") 46 os.Setenv("GIT_SSH_VARIANT", "ssh") 47 48 callback(keyFile) 49 } 50 51 func createSSHUrl(gitPath string, u *url.URL) *url.URL { 52 u2 := *u 53 u2.Scheme = "ssh" 54 u2.User = url.User("git") 55 u2.Host = net.JoinHostPort(setting.SSH.ListenHost, strconv.Itoa(setting.SSH.ListenPort)) 56 u2.Path = gitPath 57 return &u2 58 } 59 60 func onGiteaRun[T testing.TB](t T, callback func(T, *url.URL)) { 61 defer tests.PrepareTestEnv(t, 1)() 62 s := http.Server{ 63 Handler: testWebRoutes, 64 } 65 66 u, err := url.Parse(setting.AppURL) 67 assert.NoError(t, err) 68 listener, err := net.Listen("tcp", u.Host) 69 i := 0 70 for err != nil && i <= 10 { 71 time.Sleep(100 * time.Millisecond) 72 listener, err = net.Listen("tcp", u.Host) 73 i++ 74 } 75 assert.NoError(t, err) 76 u.Host = listener.Addr().String() 77 78 defer func() { 79 ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) 80 s.Shutdown(ctx) 81 cancel() 82 }() 83 84 go s.Serve(listener) 85 // Started by config go ssh.Listen(setting.SSH.ListenHost, setting.SSH.ListenPort, setting.SSH.ServerCiphers, setting.SSH.ServerKeyExchanges, setting.SSH.ServerMACs) 86 87 callback(t, u) 88 } 89 90 func doGitClone(dstLocalPath string, u *url.URL) func(*testing.T) { 91 return func(t *testing.T) { 92 assert.NoError(t, git.CloneWithArgs(context.Background(), git.AllowLFSFiltersArgs(), u.String(), dstLocalPath, git.CloneRepoOptions{})) 93 exist, err := util.IsExist(filepath.Join(dstLocalPath, "README.md")) 94 assert.NoError(t, err) 95 assert.True(t, exist) 96 } 97 } 98 99 func doPartialGitClone(dstLocalPath string, u *url.URL) func(*testing.T) { 100 return func(t *testing.T) { 101 assert.NoError(t, git.CloneWithArgs(context.Background(), git.AllowLFSFiltersArgs(), u.String(), dstLocalPath, git.CloneRepoOptions{ 102 Filter: "blob:none", 103 })) 104 exist, err := util.IsExist(filepath.Join(dstLocalPath, "README.md")) 105 assert.NoError(t, err) 106 assert.True(t, exist) 107 } 108 } 109 110 func doGitCloneFail(u *url.URL) func(*testing.T) { 111 return func(t *testing.T) { 112 tmpDir := t.TempDir() 113 assert.Error(t, git.Clone(git.DefaultContext, u.String(), tmpDir, git.CloneRepoOptions{})) 114 exist, err := util.IsExist(filepath.Join(tmpDir, "README.md")) 115 assert.NoError(t, err) 116 assert.False(t, exist) 117 } 118 } 119 120 func doGitInitTestRepository(dstPath string) func(*testing.T) { 121 return func(t *testing.T) { 122 // Init repository in dstPath 123 assert.NoError(t, git.InitRepository(git.DefaultContext, dstPath, false, git.Sha1ObjectFormat.Name())) 124 // forcibly set default branch to master 125 _, _, err := git.NewCommand(git.DefaultContext, "symbolic-ref", "HEAD", git.BranchPrefix+"master").RunStdString(&git.RunOpts{Dir: dstPath}) 126 assert.NoError(t, err) 127 assert.NoError(t, os.WriteFile(filepath.Join(dstPath, "README.md"), []byte(fmt.Sprintf("# Testing Repository\n\nOriginally created in: %s", dstPath)), 0o644)) 128 assert.NoError(t, git.AddChanges(dstPath, true)) 129 signature := git.Signature{ 130 Email: "test@example.com", 131 Name: "test", 132 When: time.Now(), 133 } 134 assert.NoError(t, git.CommitChanges(dstPath, git.CommitChangesOptions{ 135 Committer: &signature, 136 Author: &signature, 137 Message: "Initial Commit", 138 })) 139 } 140 } 141 142 func doGitAddRemote(dstPath, remoteName string, u *url.URL) func(*testing.T) { 143 return func(t *testing.T) { 144 _, _, err := git.NewCommand(git.DefaultContext, "remote", "add").AddDynamicArguments(remoteName, u.String()).RunStdString(&git.RunOpts{Dir: dstPath}) 145 assert.NoError(t, err) 146 } 147 } 148 149 func doGitPushTestRepository(dstPath string, args ...string) func(*testing.T) { 150 return func(t *testing.T) { 151 _, _, err := git.NewCommand(git.DefaultContext, "push", "-u").AddArguments(git.ToTrustedCmdArgs(args)...).RunStdString(&git.RunOpts{Dir: dstPath}) 152 assert.NoError(t, err) 153 } 154 } 155 156 func doGitPushTestRepositoryFail(dstPath string, args ...string) func(*testing.T) { 157 return func(t *testing.T) { 158 _, _, err := git.NewCommand(git.DefaultContext, "push").AddArguments(git.ToTrustedCmdArgs(args)...).RunStdString(&git.RunOpts{Dir: dstPath}) 159 assert.Error(t, err) 160 } 161 } 162 163 func doGitAddSomeCommits(dstPath, branch string) func(*testing.T) { 164 return func(t *testing.T) { 165 doGitCheckoutBranch(dstPath, branch)(t) 166 167 assert.NoError(t, os.WriteFile(filepath.Join(dstPath, fmt.Sprintf("file-%s.txt", branch)), []byte(fmt.Sprintf("file %s", branch)), 0o644)) 168 assert.NoError(t, git.AddChanges(dstPath, true)) 169 signature := git.Signature{ 170 Email: "test@test.test", 171 Name: "test", 172 } 173 assert.NoError(t, git.CommitChanges(dstPath, git.CommitChangesOptions{ 174 Committer: &signature, 175 Author: &signature, 176 Message: fmt.Sprintf("update %s", branch), 177 })) 178 } 179 } 180 181 func doGitCreateBranch(dstPath, branch string) func(*testing.T) { 182 return func(t *testing.T) { 183 _, _, err := git.NewCommand(git.DefaultContext, "checkout", "-b").AddDynamicArguments(branch).RunStdString(&git.RunOpts{Dir: dstPath}) 184 assert.NoError(t, err) 185 } 186 } 187 188 func doGitCheckoutBranch(dstPath string, args ...string) func(*testing.T) { 189 return func(t *testing.T) { 190 _, _, err := git.NewCommandContextNoGlobals(git.DefaultContext, git.AllowLFSFiltersArgs()...).AddArguments("checkout").AddArguments(git.ToTrustedCmdArgs(args)...).RunStdString(&git.RunOpts{Dir: dstPath}) 191 assert.NoError(t, err) 192 } 193 } 194 195 func doGitMerge(dstPath string, args ...string) func(*testing.T) { 196 return func(t *testing.T) { 197 _, _, err := git.NewCommand(git.DefaultContext, "merge").AddArguments(git.ToTrustedCmdArgs(args)...).RunStdString(&git.RunOpts{Dir: dstPath}) 198 assert.NoError(t, err) 199 } 200 } 201 202 func doGitPull(dstPath string, args ...string) func(*testing.T) { 203 return func(t *testing.T) { 204 _, _, err := git.NewCommandContextNoGlobals(git.DefaultContext, git.AllowLFSFiltersArgs()...).AddArguments("pull").AddArguments(git.ToTrustedCmdArgs(args)...).RunStdString(&git.RunOpts{Dir: dstPath}) 205 assert.NoError(t, err) 206 } 207 }