mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09:00 
			
		
		
		
	save PR info as patch and minor fix on PR
This commit is contained in:
		| @@ -104,6 +104,7 @@ There are 5 ways to install Gogs: | |||||||
| - [OpenShift](https://github.com/tkisme/gogs-openshift) | - [OpenShift](https://github.com/tkisme/gogs-openshift) | ||||||
| - [Cloudron](https://cloudron.io/appstore.html#io.gogs.cloudronapp) | - [Cloudron](https://cloudron.io/appstore.html#io.gogs.cloudronapp) | ||||||
| - [Scaleway](https://www.scaleway.com/imagehub/gogs/) | - [Scaleway](https://www.scaleway.com/imagehub/gogs/) | ||||||
|  | - [Portal](https://portaldemo.xyz/cloud/) | ||||||
|  |  | ||||||
| ## Acknowledgments | ## Acknowledgments | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								gogs.go
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								gogs.go
									
									
									
									
									
								
							| @@ -17,7 +17,7 @@ import ( | |||||||
| 	"github.com/gogits/gogs/modules/setting" | 	"github.com/gogits/gogs/modules/setting" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| const APP_VER = "0.6.16.1002 Beta" | const APP_VER = "0.6.16.1004 Beta" | ||||||
|  |  | ||||||
| func init() { | func init() { | ||||||
| 	runtime.GOMAXPROCS(runtime.NumCPU()) | 	runtime.GOMAXPROCS(runtime.NumCPU()) | ||||||
|   | |||||||
| @@ -930,10 +930,12 @@ type PullRequest struct { | |||||||
| 	Merger         *User `xorm:"-"` | 	Merger         *User `xorm:"-"` | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // Note: don't try to get Pull because will end up recursive querying. | ||||||
| func (pr *PullRequest) AfterSet(colName string, _ xorm.Cell) { | func (pr *PullRequest) AfterSet(colName string, _ xorm.Cell) { | ||||||
| 	var err error | 	var err error | ||||||
| 	switch colName { | 	switch colName { | ||||||
| 	case "head_repo_id": | 	case "head_repo_id": | ||||||
|  | 		// FIXME: shouldn't show error if it's known that head repository has been removed. | ||||||
| 		pr.HeadRepo, err = GetRepositoryByID(pr.HeadRepoID) | 		pr.HeadRepo, err = GetRepositoryByID(pr.HeadRepoID) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			log.Error(3, "GetRepositoryByID[%d]: %v", pr.ID, err) | 			log.Error(3, "GetRepositoryByID[%d]: %v", pr.ID, err) | ||||||
| @@ -1017,7 +1019,7 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository) (err error | |||||||
| 	if _, stderr, err = process.ExecDir(-1, tmpBasePath, | 	if _, stderr, err = process.ExecDir(-1, tmpBasePath, | ||||||
| 		fmt.Sprintf("PullRequest.Merge(git pull): %s", tmpBasePath), | 		fmt.Sprintf("PullRequest.Merge(git pull): %s", tmpBasePath), | ||||||
| 		"git", "pull", headRepoPath, pr.HeadBarcnh); err != nil { | 		"git", "pull", headRepoPath, pr.HeadBarcnh); err != nil { | ||||||
| 		return fmt.Errorf("git pull: %s", stderr) | 		return fmt.Errorf("git pull[%s / %s -> %s]: %s", headRepoPath, pr.HeadBarcnh, tmpBasePath, stderr) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// Push back to upstream. | 	// Push back to upstream. | ||||||
| @@ -1059,27 +1061,32 @@ func NewPullRequest(repo *Repository, pull *Issue, labelIDs []int64, uuids []str | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// Test apply patch. | 	// Test apply patch. | ||||||
|  | 	if err = repo.UpdateLocalCopy(); err != nil { | ||||||
|  | 		return fmt.Errorf("UpdateLocalCopy: %v", err) | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	repoPath, err := repo.RepoPath() | 	repoPath, err := repo.RepoPath() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("RepoPath: %v", err) | 		return fmt.Errorf("RepoPath: %v", err) | ||||||
| 	} | 	} | ||||||
| 	patchPath := path.Join(repoPath, "pulls", com.ToStr(pr.ID)+".patch") | 	patchPath := path.Join(repoPath, "pulls", com.ToStr(pull.ID)+".patch") | ||||||
|  |  | ||||||
| 	os.MkdirAll(path.Dir(patchPath), os.ModePerm) | 	os.MkdirAll(path.Dir(patchPath), os.ModePerm) | ||||||
| 	if err = ioutil.WriteFile(patchPath, patch, 0644); err != nil { | 	if err = ioutil.WriteFile(patchPath, patch, 0644); err != nil { | ||||||
| 		return fmt.Errorf("save patch: %v", err) | 		return fmt.Errorf("save patch: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer os.Remove(patchPath) |  | ||||||
|  |  | ||||||
| 	stdout, stderr, err := process.ExecDir(-1, repoPath, | 	pr.CanAutoMerge = true | ||||||
|  | 	_, stderr, err := process.ExecDir(-1, repo.LocalCopyPath(), | ||||||
| 		fmt.Sprintf("NewPullRequest(git apply --check): %d", repo.ID), | 		fmt.Sprintf("NewPullRequest(git apply --check): %d", repo.ID), | ||||||
| 		"git", "apply", "--check", "-v", patchPath) | 		"git", "apply", "--check", patchPath) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		if strings.Contains(stderr, "fatal:") { | 		if strings.Contains(stderr, "patch does not apply") { | ||||||
|  | 			pr.CanAutoMerge = false | ||||||
|  | 		} else { | ||||||
| 			return fmt.Errorf("git apply --check: %v - %s", err, stderr) | 			return fmt.Errorf("git apply --check: %v - %s", err, stderr) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	pr.CanAutoMerge = !strings.Contains(stdout, "error: patch failed:") |  | ||||||
|  |  | ||||||
| 	pr.PullID = pull.ID | 	pr.PullID = pull.ID | ||||||
| 	pr.PullIndex = pull.Index | 	pr.PullIndex = pull.Index | ||||||
|   | |||||||
| @@ -296,6 +296,35 @@ func (repo *Repository) DescriptionHtml() template.HTML { | |||||||
| 	return template.HTML(DescPattern.ReplaceAllStringFunc(base.Sanitizer.Sanitize(repo.Description), sanitize)) | 	return template.HTML(DescPattern.ReplaceAllStringFunc(base.Sanitizer.Sanitize(repo.Description), sanitize)) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (repo *Repository) LocalCopyPath() string { | ||||||
|  | 	return path.Join(setting.RepoRootPath, "local", com.ToStr(repo.ID)) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // UpdateLocalCopy makes sure the local copy of repository is up-to-date. | ||||||
|  | func (repo *Repository) UpdateLocalCopy() error { | ||||||
|  | 	repoPath, err := repo.RepoPath() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	localPath := repo.LocalCopyPath() | ||||||
|  | 	if !com.IsExist(localPath) { | ||||||
|  | 		_, stderr, err := process.Exec( | ||||||
|  | 			fmt.Sprintf("UpdateLocalCopy(git clone): %s", repoPath), "git", "clone", repoPath, localPath) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return fmt.Errorf("git clone: %v - %s", err, stderr) | ||||||
|  | 		} | ||||||
|  | 	} else { | ||||||
|  | 		_, stderr, err := process.ExecDir(-1, localPath, | ||||||
|  | 			fmt.Sprintf("UpdateLocalCopy(git pull): %s", repoPath), "git", "pull") | ||||||
|  | 		if err != nil { | ||||||
|  | 			return fmt.Errorf("git pull: %v - %s", err, stderr) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
| func isRepositoryExist(e Engine, u *User, repoName string) (bool, error) { | func isRepositoryExist(e Engine, u *User, repoName string) (bool, error) { | ||||||
| 	has, err := e.Get(&Repository{ | 	has, err := e.Get(&Repository{ | ||||||
| 		OwnerID:   u.Id, | 		OwnerID:   u.Id, | ||||||
|   | |||||||
| @@ -44,7 +44,7 @@ func (repo *Repository) GetPullRequestInfo(basePath, baseBranch, headBranch stri | |||||||
| 	} | 	} | ||||||
| 	prInfo.MergeBase = strings.TrimSpace(stdout) | 	prInfo.MergeBase = strings.TrimSpace(stdout) | ||||||
|  |  | ||||||
| 	stdout, stderr, err = com.ExecCmdDir(repo.Path, "git", "log", remoteBranch+"..."+headBranch, prettyLogFormat) | 	stdout, stderr, err = com.ExecCmdDir(repo.Path, "git", "log", prInfo.MergeBase+"..."+headBranch, prettyLogFormat) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("list diff logs: %v", concatenateError(err, stderr)) | 		return nil, fmt.Errorf("list diff logs: %v", concatenateError(err, stderr)) | ||||||
| 	} | 	} | ||||||
| @@ -64,20 +64,8 @@ func (repo *Repository) GetPullRequestInfo(basePath, baseBranch, headBranch stri | |||||||
| } | } | ||||||
|  |  | ||||||
| // GetPatch generates and returns patch data between given branches. | // GetPatch generates and returns patch data between given branches. | ||||||
| func (repo *Repository) GetPatch(basePath, baseBranch, headBranch string) ([]byte, error) { | func (repo *Repository) GetPatch(mergeBase, headBranch string) ([]byte, error) { | ||||||
| 	// Add a temporary remote. | 	stdout, stderr, err := com.ExecCmdDirBytes(repo.Path, "git", "diff", "-p", mergeBase, headBranch) | ||||||
| 	tmpRemote := com.ToStr(time.Now().UnixNano()) |  | ||||||
| 	_, stderr, err := com.ExecCmdDirBytes(repo.Path, "git", "remote", "add", "-f", tmpRemote, basePath) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, fmt.Errorf("add base as remote: %v", concatenateError(err, string(stderr))) |  | ||||||
| 	} |  | ||||||
| 	defer func() { |  | ||||||
| 		com.ExecCmdDir(repo.Path, "git", "remote", "remove", tmpRemote) |  | ||||||
| 	}() |  | ||||||
|  |  | ||||||
| 	var stdout []byte |  | ||||||
| 	remoteBranch := "remotes/" + tmpRemote + "/" + baseBranch |  | ||||||
| 	stdout, stderr, err = com.ExecCmdDirBytes(repo.Path, "git", "diff", "-p", remoteBranch, headBranch) |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, concatenateError(err, string(stderr)) | 		return nil, concatenateError(err, string(stderr)) | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -187,16 +187,22 @@ func PrepareViewPullInfo(ctx *middleware.Context, pull *models.Issue) *git.PullR | |||||||
| 	ctx.Data["HeadTarget"] = pull.HeadUserName + "/" + pull.HeadBarcnh | 	ctx.Data["HeadTarget"] = pull.HeadUserName + "/" + pull.HeadBarcnh | ||||||
| 	ctx.Data["BaseTarget"] = ctx.Repo.Owner.Name + "/" + pull.BaseBranch | 	ctx.Data["BaseTarget"] = ctx.Repo.Owner.Name + "/" + pull.BaseBranch | ||||||
|  |  | ||||||
| 	headRepoPath, err := pull.HeadRepo.RepoPath() | 	var ( | ||||||
| 	if err != nil { | 		headGitRepo *git.Repository | ||||||
| 		ctx.Handle(500, "HeadRepo.RepoPath", err) | 		err         error | ||||||
| 		return nil | 	) | ||||||
| 	} | 	if pull.HeadRepo != nil { | ||||||
|  | 		headRepoPath, err := pull.HeadRepo.RepoPath() | ||||||
|  | 		if err != nil { | ||||||
|  | 			ctx.Handle(500, "HeadRepo.RepoPath", err) | ||||||
|  | 			return nil | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 	headGitRepo, err := git.OpenRepository(headRepoPath) | 		headGitRepo, err = git.OpenRepository(headRepoPath) | ||||||
| 	if err != nil { | 		if err != nil { | ||||||
| 		ctx.Handle(500, "OpenRepository", err) | 			ctx.Handle(500, "OpenRepository", err) | ||||||
| 		return nil | 			return nil | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if pull.HeadRepo == nil || !headGitRepo.IsBranchExist(pull.HeadBarcnh) { | 	if pull.HeadRepo == nil || !headGitRepo.IsBranchExist(pull.HeadBarcnh) { | ||||||
| @@ -530,18 +536,18 @@ func CompareAndPullRequest(ctx *middleware.Context) { | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	pr, err := models.GetUnmergedPullRequest(headRepo.ID, ctx.Repo.Repository.ID, headBranch, baseBranch) | 	// pr, err := models.GetUnmergedPullRequest(headRepo.ID, ctx.Repo.Repository.ID, headBranch, baseBranch) | ||||||
| 	if err != nil { | 	// if err != nil { | ||||||
| 		if !models.IsErrPullRequestNotExist(err) { | 	// 	if !models.IsErrPullRequestNotExist(err) { | ||||||
| 			ctx.Handle(500, "GetUnmergedPullRequest", err) | 	// 		ctx.Handle(500, "GetUnmergedPullRequest", err) | ||||||
| 			return | 	// 		return | ||||||
| 		} | 	// 	} | ||||||
| 	} else { | 	// } else { | ||||||
| 		ctx.Data["HasPullRequest"] = true | 	// 	ctx.Data["HasPullRequest"] = true | ||||||
| 		ctx.Data["PullRequest"] = pr | 	// 	ctx.Data["PullRequest"] = pr | ||||||
| 		ctx.HTML(200, COMPARE_PULL) | 	// 	ctx.HTML(200, COMPARE_PULL) | ||||||
| 		return | 	// 	return | ||||||
| 	} | 	// } | ||||||
|  |  | ||||||
| 	nothingToCompare := PrepareCompareDiff(ctx, headUser, headRepo, headGitRepo, prInfo, baseBranch, headBranch) | 	nothingToCompare := PrepareCompareDiff(ctx, headUser, headRepo, headGitRepo, prInfo, baseBranch, headBranch) | ||||||
| 	if ctx.Written() { | 	if ctx.Written() { | ||||||
| @@ -575,7 +581,7 @@ func CompareAndPullRequestPost(ctx *middleware.Context, form auth.CreateIssueFor | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	patch, err := headGitRepo.GetPatch(models.RepoPath(repo.Owner.Name, repo.Name), baseBranch, headBranch) | 	patch, err := headGitRepo.GetPatch(prInfo.MergeBase, headBranch) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		ctx.Handle(500, "GetPatch", err) | 		ctx.Handle(500, "GetPatch", err) | ||||||
| 		return | 		return | ||||||
|   | |||||||
| @@ -1 +1 @@ | |||||||
| 0.6.16.1002 Beta | 0.6.16.1004 Beta | ||||||
		Reference in New Issue
	
	Block a user