mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09:00 
			
		
		
		
	Remove SavePatch and generate patches on the fly (#9302)
* Save patches to temporary files * Remove SavePatch and generate patches on the fly * Use ioutil.TempDir * fixup! Use ioutil.TempDir * fixup! fixup! Use ioutil.TempDir * RemoveAll LocalCopyPath() in initIntergrationTest * Default to status checking on PR creation * Remove unnecessary set to StatusChecking * Protect against unable to load repo * Handle conflicts * Restore original conflict setting * In TestPullRequests update status to StatusChecking before running TestPatch
This commit is contained in:
		| @@ -68,94 +68,22 @@ func Merge(pr *models.PullRequest, doer *models.User, baseGitRepo *git.Repositor | ||||
| 	}() | ||||
|  | ||||
| 	// Clone base repo. | ||||
| 	tmpBasePath, err := models.CreateTemporaryPath("merge") | ||||
| 	tmpBasePath, err := createTemporaryRepo(pr) | ||||
| 	if err != nil { | ||||
| 		log.Error("CreateTemporaryPath: %v", err) | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	defer func() { | ||||
| 		if err := models.RemoveTemporaryPath(tmpBasePath); err != nil { | ||||
| 			log.Error("Merge: RemoveTemporaryPath: %s", err) | ||||
| 		} | ||||
| 	}() | ||||
|  | ||||
| 	headRepoPath := pr.HeadRepo.RepoPath() | ||||
|  | ||||
| 	if err := git.InitRepository(tmpBasePath, false); err != nil { | ||||
| 		log.Error("git init tmpBasePath: %v", err) | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	remoteRepoName := "head_repo" | ||||
| 	baseBranch := "base" | ||||
|  | ||||
| 	// Add head repo remote. | ||||
| 	addCacheRepo := func(staging, cache string) error { | ||||
| 		p := filepath.Join(staging, ".git", "objects", "info", "alternates") | ||||
| 		f, err := os.OpenFile(p, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0600) | ||||
| 		if err != nil { | ||||
| 			log.Error("Could not create .git/objects/info/alternates file in %s: %v", staging, err) | ||||
| 			return err | ||||
| 		} | ||||
| 		defer f.Close() | ||||
| 		data := filepath.Join(cache, "objects") | ||||
| 		if _, err := fmt.Fprintln(f, data); err != nil { | ||||
| 			log.Error("Could not write to .git/objects/info/alternates file in %s: %v", staging, err) | ||||
| 			return err | ||||
| 		} | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	if err := addCacheRepo(tmpBasePath, baseGitRepo.Path); err != nil { | ||||
| 		log.Error("Unable to add base repository to temporary repo [%s -> %s]: %v", pr.BaseRepo.FullName(), tmpBasePath, err) | ||||
| 		return fmt.Errorf("Unable to add base repository to temporary repo [%s -> tmpBasePath]: %v", pr.BaseRepo.FullName(), err) | ||||
| 	} | ||||
| 	trackingBranch := "tracking" | ||||
| 	stagingBranch := "staging" | ||||
|  | ||||
| 	var outbuf, errbuf strings.Builder | ||||
| 	if err := git.NewCommand("remote", "add", "-t", pr.BaseBranch, "-m", pr.BaseBranch, "origin", baseGitRepo.Path).RunInDirPipeline(tmpBasePath, &outbuf, &errbuf); err != nil { | ||||
| 		log.Error("Unable to add base repository as origin [%s -> %s]: %v\n%s\n%s", pr.BaseRepo.FullName(), tmpBasePath, err, outbuf.String(), errbuf.String()) | ||||
| 		return fmt.Errorf("Unable to add base repository as origin [%s -> tmpBasePath]: %v\n%s\n%s", pr.BaseRepo.FullName(), err, outbuf.String(), errbuf.String()) | ||||
| 	} | ||||
| 	outbuf.Reset() | ||||
| 	errbuf.Reset() | ||||
|  | ||||
| 	if err := git.NewCommand("fetch", "origin", "--no-tags", pr.BaseBranch+":"+baseBranch, pr.BaseBranch+":original_"+baseBranch).RunInDirPipeline(tmpBasePath, &outbuf, &errbuf); err != nil { | ||||
| 		log.Error("Unable to fetch origin base branch [%s:%s -> base, original_base in %s]: %v:\n%s\n%s", pr.BaseRepo.FullName(), pr.BaseBranch, tmpBasePath, err, outbuf.String(), errbuf.String()) | ||||
| 		return fmt.Errorf("Unable to fetch origin base branch [%s:%s -> base, original_base in tmpBasePath]: %v\n%s\n%s", pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String()) | ||||
| 	} | ||||
| 	outbuf.Reset() | ||||
| 	errbuf.Reset() | ||||
|  | ||||
| 	if err := git.NewCommand("symbolic-ref", "HEAD", git.BranchPrefix+baseBranch).RunInDirPipeline(tmpBasePath, &outbuf, &errbuf); err != nil { | ||||
| 		log.Error("Unable to set HEAD as base branch [%s]: %v\n%s\n%s", tmpBasePath, err, outbuf.String(), errbuf.String()) | ||||
| 		return fmt.Errorf("Unable to set HEAD as base branch [tmpBasePath]: %v\n%s\n%s", err, outbuf.String(), errbuf.String()) | ||||
| 	} | ||||
| 	outbuf.Reset() | ||||
| 	errbuf.Reset() | ||||
|  | ||||
| 	if err := addCacheRepo(tmpBasePath, headRepoPath); err != nil { | ||||
| 		log.Error("Unable to add head repository to temporary repo [%s -> %s]: %v", pr.HeadRepo.FullName(), tmpBasePath, err) | ||||
| 		return fmt.Errorf("Unable to head base repository to temporary repo [%s -> tmpBasePath]: %v", pr.HeadRepo.FullName(), err) | ||||
| 	} | ||||
|  | ||||
| 	if err := git.NewCommand("remote", "add", remoteRepoName, headRepoPath).RunInDirPipeline(tmpBasePath, &outbuf, &errbuf); err != nil { | ||||
| 		log.Error("Unable to add head repository as head_repo [%s -> %s]: %v\n%s\n%s", pr.HeadRepo.FullName(), tmpBasePath, err, outbuf.String(), errbuf.String()) | ||||
| 		return fmt.Errorf("Unable to add head repository as head_repo [%s -> tmpBasePath]: %v\n%s\n%s", pr.HeadRepo.FullName(), err, outbuf.String(), errbuf.String()) | ||||
| 	} | ||||
| 	outbuf.Reset() | ||||
| 	errbuf.Reset() | ||||
|  | ||||
| 	trackingBranch := "tracking" | ||||
| 	// Fetch head branch | ||||
| 	if err := git.NewCommand("fetch", "--no-tags", remoteRepoName, pr.HeadBranch+":"+trackingBranch).RunInDirPipeline(tmpBasePath, &outbuf, &errbuf); err != nil { | ||||
| 		log.Error("Unable to fetch head_repo head branch [%s:%s -> tracking in %s]: %v:\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, tmpBasePath, err, outbuf.String(), errbuf.String()) | ||||
| 		return fmt.Errorf("Unable to fetch head_repo head branch [%s:%s -> tracking in tmpBasePath]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, err, outbuf.String(), errbuf.String()) | ||||
| 	} | ||||
| 	outbuf.Reset() | ||||
| 	errbuf.Reset() | ||||
|  | ||||
| 	stagingBranch := "staging" | ||||
|  | ||||
| 	// Enable sparse-checkout | ||||
| 	sparseCheckoutList, err := getDiffTree(tmpBasePath, baseBranch, trackingBranch) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user