Fix datarace on git.GlobalCommandArgs on tests (#9162)
* fix datarace on git.GlobalCommandArgs on tests * fix tests * fix tests * fix tests
This commit is contained in:
		
							parent
							
								
									9d9e6ac411
								
							
						
					
					
						commit
						7b7d382b8b
					
				
					 5 changed files with 40 additions and 23 deletions
				
			
		|  | @ -63,7 +63,6 @@ func createSSHUrl(gitPath string, u *url.URL) *url.URL { | ||||||
| 
 | 
 | ||||||
| func allowLFSFilters() []string { | func allowLFSFilters() []string { | ||||||
| 	// Now here we should explicitly allow lfs filters to run
 | 	// Now here we should explicitly allow lfs filters to run
 | ||||||
| 	globalArgs := git.GlobalCommandArgs |  | ||||||
| 	filteredLFSGlobalArgs := make([]string, len(git.GlobalCommandArgs)) | 	filteredLFSGlobalArgs := make([]string, len(git.GlobalCommandArgs)) | ||||||
| 	j := 0 | 	j := 0 | ||||||
| 	for _, arg := range git.GlobalCommandArgs { | 	for _, arg := range git.GlobalCommandArgs { | ||||||
|  | @ -74,9 +73,7 @@ func allowLFSFilters() []string { | ||||||
| 			j++ | 			j++ | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	filteredLFSGlobalArgs = filteredLFSGlobalArgs[:j] | 	return filteredLFSGlobalArgs[:j] | ||||||
| 	git.GlobalCommandArgs = filteredLFSGlobalArgs |  | ||||||
| 	return globalArgs |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func onGiteaRun(t *testing.T, callback func(*testing.T, *url.URL), prepare ...bool) { | func onGiteaRun(t *testing.T, callback func(*testing.T, *url.URL), prepare ...bool) { | ||||||
|  | @ -107,9 +104,7 @@ func onGiteaRun(t *testing.T, callback func(*testing.T, *url.URL), prepare ...bo | ||||||
| 
 | 
 | ||||||
| func doGitClone(dstLocalPath string, u *url.URL) func(*testing.T) { | func doGitClone(dstLocalPath string, u *url.URL) func(*testing.T) { | ||||||
| 	return func(t *testing.T) { | 	return func(t *testing.T) { | ||||||
| 		oldGlobals := allowLFSFilters() | 		assert.NoError(t, git.CloneWithArgs(u.String(), dstLocalPath, allowLFSFilters(), git.CloneRepoOptions{})) | ||||||
| 		assert.NoError(t, git.Clone(u.String(), dstLocalPath, git.CloneRepoOptions{})) |  | ||||||
| 		git.GlobalCommandArgs = oldGlobals |  | ||||||
| 		assert.True(t, com.IsExist(filepath.Join(dstLocalPath, "README.md"))) | 		assert.True(t, com.IsExist(filepath.Join(dstLocalPath, "README.md"))) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -170,9 +165,7 @@ func doGitCreateBranch(dstPath, branch string) func(*testing.T) { | ||||||
| 
 | 
 | ||||||
| func doGitCheckoutBranch(dstPath string, args ...string) func(*testing.T) { | func doGitCheckoutBranch(dstPath string, args ...string) func(*testing.T) { | ||||||
| 	return func(t *testing.T) { | 	return func(t *testing.T) { | ||||||
| 		oldGlobals := allowLFSFilters() | 		_, err := git.NewCommandNoGlobals(append(append(allowLFSFilters(), "checkout"), args...)...).RunInDir(dstPath) | ||||||
| 		_, err := git.NewCommand(append([]string{"checkout"}, args...)...).RunInDir(dstPath) |  | ||||||
| 		git.GlobalCommandArgs = oldGlobals |  | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -186,9 +179,7 @@ func doGitMerge(dstPath string, args ...string) func(*testing.T) { | ||||||
| 
 | 
 | ||||||
| func doGitPull(dstPath string, args ...string) func(*testing.T) { | func doGitPull(dstPath string, args ...string) func(*testing.T) { | ||||||
| 	return func(t *testing.T) { | 	return func(t *testing.T) { | ||||||
| 		oldGlobals := allowLFSFilters() | 		_, err := git.NewCommandNoGlobals(append(append(allowLFSFilters(), "pull"), args...)...).RunInDir(dstPath) | ||||||
| 		_, err := git.NewCommand(append([]string{"pull"}, args...)...).RunInDir(dstPath) |  | ||||||
| 		git.GlobalCommandArgs = oldGlobals |  | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -148,8 +148,8 @@ func lfsCommitAndPushTest(t *testing.T, dstPath string) (littleLFS, bigLFS strin | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| 		err = git.AddChanges(dstPath, false, ".gitattributes") | 		err = git.AddChanges(dstPath, false, ".gitattributes") | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| 		oldGlobals := allowLFSFilters() | 
 | ||||||
| 		err = git.CommitChanges(dstPath, git.CommitChangesOptions{ | 		err = git.CommitChangesWithArgs(dstPath, allowLFSFilters(), git.CommitChangesOptions{ | ||||||
| 			Committer: &git.Signature{ | 			Committer: &git.Signature{ | ||||||
| 				Email: "user2@example.com", | 				Email: "user2@example.com", | ||||||
| 				Name:  "User Two", | 				Name:  "User Two", | ||||||
|  | @ -163,7 +163,6 @@ func lfsCommitAndPushTest(t *testing.T, dstPath string) (littleLFS, bigLFS strin | ||||||
| 			Message: fmt.Sprintf("Testing commit @ %v", time.Now()), | 			Message: fmt.Sprintf("Testing commit @ %v", time.Now()), | ||||||
| 		}) | 		}) | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| 		git.GlobalCommandArgs = oldGlobals |  | ||||||
| 
 | 
 | ||||||
| 		littleLFS, bigLFS = commitAndPushTest(t, dstPath, prefix) | 		littleLFS, bigLFS = commitAndPushTest(t, dstPath, prefix) | ||||||
| 
 | 
 | ||||||
|  | @ -307,12 +306,12 @@ func generateCommitWithNewData(size int, repoPath, email, fullName, prefix strin | ||||||
| 
 | 
 | ||||||
| 	//Commit
 | 	//Commit
 | ||||||
| 	// Now here we should explicitly allow lfs filters to run
 | 	// Now here we should explicitly allow lfs filters to run
 | ||||||
| 	oldGlobals := allowLFSFilters() | 	globalArgs := allowLFSFilters() | ||||||
| 	err = git.AddChanges(repoPath, false, filepath.Base(tmpFile.Name())) | 	err = git.AddChangesWithArgs(repoPath, globalArgs, false, filepath.Base(tmpFile.Name())) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "", err | 		return "", err | ||||||
| 	} | 	} | ||||||
| 	err = git.CommitChanges(repoPath, git.CommitChangesOptions{ | 	err = git.CommitChangesWithArgs(repoPath, globalArgs, git.CommitChangesOptions{ | ||||||
| 		Committer: &git.Signature{ | 		Committer: &git.Signature{ | ||||||
| 			Email: email, | 			Email: email, | ||||||
| 			Name:  fullName, | 			Name:  fullName, | ||||||
|  | @ -325,7 +324,6 @@ func generateCommitWithNewData(size int, repoPath, email, fullName, prefix strin | ||||||
| 		}, | 		}, | ||||||
| 		Message: fmt.Sprintf("Testing commit @ %v", time.Now()), | 		Message: fmt.Sprintf("Testing commit @ %v", time.Now()), | ||||||
| 	}) | 	}) | ||||||
| 	git.GlobalCommandArgs = oldGlobals |  | ||||||
| 	return filepath.Base(tmpFile.Name()), err | 	return filepath.Base(tmpFile.Name()), err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -52,6 +52,14 @@ func NewCommand(args ...string) *Command { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // NewCommandNoGlobals creates and returns a new Git Command based on given command and arguments only with the specify args and don't care global command args
 | ||||||
|  | func NewCommandNoGlobals(args ...string) *Command { | ||||||
|  | 	return &Command{ | ||||||
|  | 		name: GitExecutable, | ||||||
|  | 		args: args, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // AddArguments adds new argument(s) to the command.
 | // AddArguments adds new argument(s) to the command.
 | ||||||
| func (c *Command) AddArguments(args ...string) *Command { | func (c *Command) AddArguments(args ...string) *Command { | ||||||
| 	c.args = append(c.args, args...) | 	c.args = append(c.args, args...) | ||||||
|  |  | ||||||
|  | @ -207,7 +207,12 @@ func (c *Commit) GetCommitByPath(relpath string) (*Commit, error) { | ||||||
| 
 | 
 | ||||||
| // AddChanges marks local changes to be ready for commit.
 | // AddChanges marks local changes to be ready for commit.
 | ||||||
| func AddChanges(repoPath string, all bool, files ...string) error { | func AddChanges(repoPath string, all bool, files ...string) error { | ||||||
| 	cmd := NewCommand("add") | 	return AddChangesWithArgs(repoPath, GlobalCommandArgs, all, files...) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // AddChangesWithArgs marks local changes to be ready for commit.
 | ||||||
|  | func AddChangesWithArgs(repoPath string, gloablArgs []string, all bool, files ...string) error { | ||||||
|  | 	cmd := NewCommandNoGlobals(append(gloablArgs, "add")...) | ||||||
| 	if all { | 	if all { | ||||||
| 		cmd.AddArguments("--all") | 		cmd.AddArguments("--all") | ||||||
| 	} | 	} | ||||||
|  | @ -226,7 +231,15 @@ type CommitChangesOptions struct { | ||||||
| // CommitChanges commits local changes with given committer, author and message.
 | // CommitChanges commits local changes with given committer, author and message.
 | ||||||
| // If author is nil, it will be the same as committer.
 | // If author is nil, it will be the same as committer.
 | ||||||
| func CommitChanges(repoPath string, opts CommitChangesOptions) error { | func CommitChanges(repoPath string, opts CommitChangesOptions) error { | ||||||
| 	cmd := NewCommand() | 	cargs := make([]string, len(GlobalCommandArgs)) | ||||||
|  | 	copy(cargs, GlobalCommandArgs) | ||||||
|  | 	return CommitChangesWithArgs(repoPath, cargs, opts) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // CommitChangesWithArgs commits local changes with given committer, author and message.
 | ||||||
|  | // If author is nil, it will be the same as committer.
 | ||||||
|  | func CommitChangesWithArgs(repoPath string, args []string, opts CommitChangesOptions) error { | ||||||
|  | 	cmd := NewCommandNoGlobals(args...) | ||||||
| 	if opts.Committer != nil { | 	if opts.Committer != nil { | ||||||
| 		cmd.AddArguments("-c", "user.name="+opts.Committer.Name, "-c", "user.email="+opts.Committer.Email) | 		cmd.AddArguments("-c", "user.name="+opts.Committer.Name, "-c", "user.email="+opts.Committer.Email) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -165,12 +165,19 @@ type CloneRepoOptions struct { | ||||||
| 
 | 
 | ||||||
| // Clone clones original repository to target path.
 | // Clone clones original repository to target path.
 | ||||||
| func Clone(from, to string, opts CloneRepoOptions) (err error) { | func Clone(from, to string, opts CloneRepoOptions) (err error) { | ||||||
|  | 	cargs := make([]string, len(GlobalCommandArgs)) | ||||||
|  | 	copy(cargs, GlobalCommandArgs) | ||||||
|  | 	return CloneWithArgs(from, to, cargs, opts) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // CloneWithArgs original repository to target path.
 | ||||||
|  | func CloneWithArgs(from, to string, args []string, opts CloneRepoOptions) (err error) { | ||||||
| 	toDir := path.Dir(to) | 	toDir := path.Dir(to) | ||||||
| 	if err = os.MkdirAll(toDir, os.ModePerm); err != nil { | 	if err = os.MkdirAll(toDir, os.ModePerm); err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	cmd := NewCommand("clone") | 	cmd := NewCommandNoGlobals(args...).AddArguments("clone") | ||||||
| 	if opts.Mirror { | 	if opts.Mirror { | ||||||
| 		cmd.AddArguments("--mirror") | 		cmd.AddArguments("--mirror") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue