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  }