mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-30 19:15:23 +01:00 
			
		
		
		
	* Fix partial cloning a repo (#18373) - Backport from: #18373 - Backport isn't 1-1, because the frontport had a refactor in that area, which v1.16 doesn't have. * Include diff & use copy * Add partial clone test * patch * Apply suggestions from code review * globalArgs first * avoid copy but make GlobalCMDArgs append first * please linter Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com> Co-authored-by: 6543 <6543@obermui.de>
This commit is contained in:
		
							parent
							
								
									160de9fbda
								
							
						
					
					
						commit
						42991dc89a
					
				| @ -123,6 +123,17 @@ func doGitClone(dstLocalPath string, u *url.URL) func(*testing.T) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func doPartialGitClone(dstLocalPath string, u *url.URL) func(*testing.T) { | ||||||
|  | 	return func(t *testing.T) { | ||||||
|  | 		assert.NoError(t, git.CloneWithArgs(context.Background(), u.String(), dstLocalPath, allowLFSFilters(), git.CloneRepoOptions{ | ||||||
|  | 			Filter: "blob:none", | ||||||
|  | 		})) | ||||||
|  | 		exist, err := util.IsExist(filepath.Join(dstLocalPath, "README.md")) | ||||||
|  | 		assert.NoError(t, err) | ||||||
|  | 		assert.True(t, exist) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func doGitCloneFail(u *url.URL) func(*testing.T) { | func doGitCloneFail(u *url.URL) func(*testing.T) { | ||||||
| 	return func(t *testing.T) { | 	return func(t *testing.T) { | ||||||
| 		tmpDir, err := os.MkdirTemp("", "doGitCloneFail") | 		tmpDir, err := os.MkdirTemp("", "doGitCloneFail") | ||||||
|  | |||||||
| @ -69,6 +69,12 @@ func testGit(t *testing.T, u *url.URL) { | |||||||
| 
 | 
 | ||||||
| 		t.Run("Clone", doGitClone(dstPath, u)) | 		t.Run("Clone", doGitClone(dstPath, u)) | ||||||
| 
 | 
 | ||||||
|  | 		dstPath2, err := os.MkdirTemp("", httpContext.Reponame) | ||||||
|  | 		assert.NoError(t, err) | ||||||
|  | 		defer util.RemoveAll(dstPath2) | ||||||
|  | 
 | ||||||
|  | 		t.Run("Partial Clone", doPartialGitClone(dstPath2, u)) | ||||||
|  | 
 | ||||||
| 		little, big := standardCommitAndPushTest(t, dstPath) | 		little, big := standardCommitAndPushTest(t, dstPath) | ||||||
| 		littleLFS, bigLFS := lfsCommitAndPushTest(t, dstPath) | 		littleLFS, bigLFS := lfsCommitAndPushTest(t, dstPath) | ||||||
| 		rawTest(t, &httpContext, little, big, littleLFS, bigLFS) | 		rawTest(t, &httpContext, little, big, littleLFS, bigLFS) | ||||||
|  | |||||||
| @ -59,27 +59,28 @@ func GetRepoRawDiffForFile(repo *Repository, startCommit, endCommit string, diff | |||||||
| 	ctx, _, finished := process.GetManager().AddContext(repo.Ctx, fmt.Sprintf("GetRawDiffForFile: [repo_path: %s]", repo.Path)) | 	ctx, _, finished := process.GetManager().AddContext(repo.Ctx, fmt.Sprintf("GetRawDiffForFile: [repo_path: %s]", repo.Path)) | ||||||
| 	defer finished() | 	defer finished() | ||||||
| 
 | 
 | ||||||
| 	var cmd *exec.Cmd | 	cmd := exec.CommandContext(ctx, GitExecutable, GlobalCommandArgs...) | ||||||
|  | 
 | ||||||
| 	switch diffType { | 	switch diffType { | ||||||
| 	case RawDiffNormal: | 	case RawDiffNormal: | ||||||
| 		if len(startCommit) != 0 { | 		if len(startCommit) != 0 { | ||||||
| 			cmd = exec.CommandContext(ctx, GitExecutable, append([]string{"diff", "-M", startCommit, endCommit}, fileArgs...)...) | 			cmd.Args = append(cmd.Args, append([]string{"diff", "-M", startCommit, endCommit}, fileArgs...)...) | ||||||
| 		} else if commit.ParentCount() == 0 { | 		} else if commit.ParentCount() == 0 { | ||||||
| 			cmd = exec.CommandContext(ctx, GitExecutable, append([]string{"show", endCommit}, fileArgs...)...) | 			cmd.Args = append(cmd.Args, append([]string{"show", endCommit}, fileArgs...)...) | ||||||
| 		} else { | 		} else { | ||||||
| 			c, _ := commit.Parent(0) | 			c, _ := commit.Parent(0) | ||||||
| 			cmd = exec.CommandContext(ctx, GitExecutable, append([]string{"diff", "-M", c.ID.String(), endCommit}, fileArgs...)...) | 			cmd.Args = append(cmd.Args, append([]string{"diff", "-M", c.ID.String(), endCommit}, fileArgs...)...) | ||||||
| 		} | 		} | ||||||
| 	case RawDiffPatch: | 	case RawDiffPatch: | ||||||
| 		if len(startCommit) != 0 { | 		if len(startCommit) != 0 { | ||||||
| 			query := fmt.Sprintf("%s...%s", endCommit, startCommit) | 			query := fmt.Sprintf("%s...%s", endCommit, startCommit) | ||||||
| 			cmd = exec.CommandContext(ctx, GitExecutable, append([]string{"format-patch", "--no-signature", "--stdout", "--root", query}, fileArgs...)...) | 			cmd.Args = append(cmd.Args, append([]string{"format-patch", "--no-signature", "--stdout", "--root", query}, fileArgs...)...) | ||||||
| 		} else if commit.ParentCount() == 0 { | 		} else if commit.ParentCount() == 0 { | ||||||
| 			cmd = exec.CommandContext(ctx, GitExecutable, append([]string{"format-patch", "--no-signature", "--stdout", "--root", endCommit}, fileArgs...)...) | 			cmd.Args = append(cmd.Args, append([]string{"format-patch", "--no-signature", "--stdout", "--root", endCommit}, fileArgs...)...) | ||||||
| 		} else { | 		} else { | ||||||
| 			c, _ := commit.Parent(0) | 			c, _ := commit.Parent(0) | ||||||
| 			query := fmt.Sprintf("%s...%s", endCommit, c.ID.String()) | 			query := fmt.Sprintf("%s...%s", endCommit, c.ID.String()) | ||||||
| 			cmd = exec.CommandContext(ctx, GitExecutable, append([]string{"format-patch", "--no-signature", "--stdout", query}, fileArgs...)...) | 			cmd.Args = append(cmd.Args, append([]string{"format-patch", "--no-signature", "--stdout", query}, fileArgs...)...) | ||||||
| 		} | 		} | ||||||
| 	default: | 	default: | ||||||
| 		return fmt.Errorf("invalid diffType: %s", diffType) | 		return fmt.Errorf("invalid diffType: %s", diffType) | ||||||
|  | |||||||
| @ -101,6 +101,7 @@ type CloneRepoOptions struct { | |||||||
| 	Shared     bool | 	Shared     bool | ||||||
| 	NoCheckout bool | 	NoCheckout bool | ||||||
| 	Depth      int | 	Depth      int | ||||||
|  | 	Filter     string | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Clone clones original repository to target path. | // Clone clones original repository to target path. | ||||||
| @ -141,7 +142,9 @@ func CloneWithArgs(ctx context.Context, from, to string, args []string, opts Clo | |||||||
| 	if opts.Depth > 0 { | 	if opts.Depth > 0 { | ||||||
| 		cmd.AddArguments("--depth", strconv.Itoa(opts.Depth)) | 		cmd.AddArguments("--depth", strconv.Itoa(opts.Depth)) | ||||||
| 	} | 	} | ||||||
| 
 | 	if opts.Filter != "" { | ||||||
|  | 		cmd.AddArguments("--filter", opts.Filter) | ||||||
|  | 	} | ||||||
| 	if len(opts.Branch) > 0 { | 	if len(opts.Branch) > 0 { | ||||||
| 		cmd.AddArguments("-b", opts.Branch) | 		cmd.AddArguments("-b", opts.Branch) | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -491,7 +491,10 @@ func serviceRPC(h serviceHandler, service string) { | |||||||
| 	defer finished() | 	defer finished() | ||||||
| 
 | 
 | ||||||
| 	var stderr bytes.Buffer | 	var stderr bytes.Buffer | ||||||
| 	cmd := exec.CommandContext(ctx, git.GitExecutable, service, "--stateless-rpc", h.dir) | 	args := make([]string, len(git.GlobalCommandArgs)) | ||||||
|  | 	copy(args, git.GlobalCommandArgs) | ||||||
|  | 	args = append(args, []string{service, "--stateless-rpc", h.dir}...) | ||||||
|  | 	cmd := exec.CommandContext(ctx, git.GitExecutable, args...) | ||||||
| 	cmd.Dir = h.dir | 	cmd.Dir = h.dir | ||||||
| 	cmd.Env = append(os.Environ(), h.environ...) | 	cmd.Env = append(os.Environ(), h.environ...) | ||||||
| 	cmd.Stdout = h.w | 	cmd.Stdout = h.w | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user