mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09:00 
			
		
		
		
	work on PR conversation
This commit is contained in:
		| @@ -5,9 +5,11 @@ | ||||
| package repo | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"path" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/Unknwon/com" | ||||
|  | ||||
| 	"github.com/gogits/gogs/models" | ||||
| 	"github.com/gogits/gogs/modules/auth" | ||||
| 	"github.com/gogits/gogs/modules/base" | ||||
| @@ -124,17 +126,19 @@ func ForkPost(ctx *middleware.Context, form auth.CreateRepoForm) { | ||||
| 	ctx.Redirect(setting.AppSubUrl + "/" + ctxUser.Name + "/" + repo.Name) | ||||
| } | ||||
|  | ||||
| func CompareAndPullRequest(ctx *middleware.Context) { | ||||
| 	ctx.Data["Title"] = ctx.Tr("repo.pulls.compare_changes") | ||||
| 	ctx.Data["PageIsComparePull"] = true | ||||
| func Pulls(ctx *middleware.Context) { | ||||
| 	ctx.Data["IsRepoToolbarPulls"] = true | ||||
| 	ctx.HTML(200, PULLS) | ||||
| } | ||||
|  | ||||
| 	repo := ctx.Repo.Repository | ||||
| // func ViewPull | ||||
|  | ||||
| func ParseCompareInfo(ctx *middleware.Context) (*models.User, *models.Repository, *git.Repository, *git.PullRequestInfo, string, string) { | ||||
| 	// Get compare branch information. | ||||
| 	infos := strings.Split(ctx.Params("*"), "...") | ||||
| 	if len(infos) != 2 { | ||||
| 		ctx.Handle(404, "CompareAndPullRequest", nil) | ||||
| 		return | ||||
| 		return nil, nil, nil, nil, "", "" | ||||
| 	} | ||||
|  | ||||
| 	baseBranch := infos[0] | ||||
| @@ -143,47 +147,221 @@ func CompareAndPullRequest(ctx *middleware.Context) { | ||||
| 	headInfos := strings.Split(infos[1], ":") | ||||
| 	if len(headInfos) != 2 { | ||||
| 		ctx.Handle(404, "CompareAndPullRequest", nil) | ||||
| 		return | ||||
| 		return nil, nil, nil, nil, "", "" | ||||
| 	} | ||||
| 	headUser := headInfos[0] | ||||
| 	headUsername := headInfos[0] | ||||
| 	headBranch := headInfos[1] | ||||
| 	ctx.Data["HeadBranch"] = headBranch | ||||
|  | ||||
| 	// TODO: check if branches are valid. | ||||
| 	fmt.Println(baseBranch, headUser, headBranch) | ||||
|  | ||||
| 	// TODO: add organization support | ||||
| 	// Check if current user has fork of repository. | ||||
| 	headRepo, has := models.HasForkedRepo(ctx.User.Id, repo.ID) | ||||
| 	if !has { | ||||
| 		ctx.Handle(404, "HasForkedRepo", nil) | ||||
| 		return | ||||
| 	headUser, err := models.GetUserByName(headUsername) | ||||
| 	if err != nil { | ||||
| 		if models.IsErrUserNotExist(err) { | ||||
| 			ctx.Handle(404, "GetUserByName", nil) | ||||
| 		} else { | ||||
| 			ctx.Handle(500, "GetUserByName", err) | ||||
| 		} | ||||
| 		return nil, nil, nil, nil, "", "" | ||||
| 	} | ||||
|  | ||||
| 	headGitRepo, err := git.OpenRepository(models.RepoPath(ctx.User.Name, headRepo.Name)) | ||||
| 	repo := ctx.Repo.Repository | ||||
|  | ||||
| 	// Check if base branch is valid. | ||||
| 	if !ctx.Repo.GitRepo.IsBranchExist(baseBranch) { | ||||
| 		ctx.Handle(404, "IsBranchExist", nil) | ||||
| 		return nil, nil, nil, nil, "", "" | ||||
| 	} | ||||
|  | ||||
| 	// Check if current user has fork of repository. | ||||
| 	headRepo, has := models.HasForkedRepo(headUser.Id, repo.ID) | ||||
| 	if !has || !ctx.User.IsAdminOfRepo(headRepo) { | ||||
| 		ctx.Handle(404, "HasForkedRepo", nil) | ||||
| 		return nil, nil, nil, nil, "", "" | ||||
| 	} | ||||
|  | ||||
| 	headGitRepo, err := git.OpenRepository(models.RepoPath(headUser.Name, headRepo.Name)) | ||||
| 	if err != nil { | ||||
| 		ctx.Handle(500, "OpenRepository", err) | ||||
| 		return | ||||
| 		return nil, nil, nil, nil, "", "" | ||||
| 	} | ||||
|  | ||||
| 	// Check if head branch is valid. | ||||
| 	if !headGitRepo.IsBranchExist(headBranch) { | ||||
| 		ctx.Handle(404, "IsBranchExist", nil) | ||||
| 		return nil, nil, nil, nil, "", "" | ||||
| 	} | ||||
|  | ||||
| 	headBranches, err := headGitRepo.GetBranches() | ||||
| 	if err != nil { | ||||
| 		ctx.Handle(500, "GetBranches", err) | ||||
| 		return | ||||
| 		return nil, nil, nil, nil, "", "" | ||||
| 	} | ||||
| 	ctx.Data["HeadBranches"] = headBranches | ||||
|  | ||||
| 	prInfo, err := headGitRepo.GetPullRequestInfo(models.RepoPath(repo.Owner.Name, repo.Name), baseBranch, headBranch) | ||||
| 	if err != nil { | ||||
| 		ctx.Handle(500, "GetPullRequestInfo", err) | ||||
| 		return nil, nil, nil, nil, "", "" | ||||
| 	} | ||||
| 	ctx.Data["BeforeCommitID"] = prInfo.MergeBase | ||||
|  | ||||
| 	return headUser, headRepo, headGitRepo, prInfo, baseBranch, headBranch | ||||
| } | ||||
|  | ||||
| func PrepareCompareDiff( | ||||
| 	ctx *middleware.Context, | ||||
| 	headUser *models.User, | ||||
| 	headRepo *models.Repository, | ||||
| 	headGitRepo *git.Repository, | ||||
| 	prInfo *git.PullRequestInfo, | ||||
| 	baseBranch, headBranch string) { | ||||
|  | ||||
| 	var ( | ||||
| 		repo = ctx.Repo.Repository | ||||
| 		err  error | ||||
| 	) | ||||
|  | ||||
| 	// Get diff information. | ||||
| 	ctx.Data["CommitRepoLink"], err = headRepo.RepoLink() | ||||
| 	if err != nil { | ||||
| 		ctx.Handle(500, "RepoLink", err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	headCommitID, err := headGitRepo.GetCommitIdOfBranch(headBranch) | ||||
| 	if err != nil { | ||||
| 		ctx.Handle(500, "GetCommitIdOfBranch", err) | ||||
| 		return | ||||
| 	} | ||||
| 	ctx.Data["AfterCommitID"] = headCommitID | ||||
|  | ||||
| 	diff, err := models.GetDiffRange(models.RepoPath(headUser.Name, headRepo.Name), | ||||
| 		prInfo.MergeBase, headCommitID, setting.Git.MaxGitDiffLines) | ||||
| 	if err != nil { | ||||
| 		ctx.Handle(500, "GetDiffRange", err) | ||||
| 		return | ||||
| 	} | ||||
| 	ctx.Data["Diff"] = diff | ||||
| 	ctx.Data["DiffNotAvailable"] = diff.NumFiles() == 0 | ||||
|  | ||||
| 	headCommit, err := headGitRepo.GetCommit(headCommitID) | ||||
| 	if err != nil { | ||||
| 		ctx.Handle(500, "GetCommit", err) | ||||
| 		return | ||||
| 	} | ||||
| 	isImageFile := func(name string) bool { | ||||
| 		blob, err := headCommit.GetBlobByPath(name) | ||||
| 		if err != nil { | ||||
| 			return false | ||||
| 		} | ||||
|  | ||||
| 		dataRc, err := blob.Data() | ||||
| 		if err != nil { | ||||
| 			return false | ||||
| 		} | ||||
| 		buf := make([]byte, 1024) | ||||
| 		n, _ := dataRc.Read(buf) | ||||
| 		if n > 0 { | ||||
| 			buf = buf[:n] | ||||
| 		} | ||||
| 		_, isImage := base.IsImageFile(buf) | ||||
| 		return isImage | ||||
| 	} | ||||
|  | ||||
| 	prInfo.Commits = models.ValidateCommitsWithEmails(prInfo.Commits) | ||||
| 	ctx.Data["Commits"] = prInfo.Commits | ||||
| 	ctx.Data["CommitCount"] = prInfo.Commits.Len() | ||||
| 	ctx.Data["Username"] = headUser.Name | ||||
| 	ctx.Data["Reponame"] = headRepo.Name | ||||
| 	ctx.Data["IsImageFile"] = isImageFile | ||||
| 	ctx.Data["SourcePath"] = setting.AppSubUrl + "/" + path.Join(headUser.Name, repo.Name, "src", headCommitID) | ||||
| 	ctx.Data["BeforeSourcePath"] = setting.AppSubUrl + "/" + path.Join(headUser.Name, repo.Name, "src", prInfo.MergeBase) | ||||
| 	ctx.Data["RawPath"] = setting.AppSubUrl + "/" + path.Join(headUser.Name, repo.Name, "raw", headCommitID) | ||||
| } | ||||
|  | ||||
| func CompareAndPullRequest(ctx *middleware.Context) { | ||||
| 	ctx.Data["Title"] = ctx.Tr("repo.pulls.compare_changes") | ||||
| 	ctx.Data["PageIsComparePull"] = true | ||||
| 	ctx.Data["IsDiffCompare"] = true | ||||
| 	renderAttachmentSettings(ctx) | ||||
|  | ||||
| 	headUser, headRepo, headGitRepo, prInfo, baseBranch, headBranch := ParseCompareInfo(ctx) | ||||
| 	if ctx.Written() { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	PrepareCompareDiff(ctx, headUser, headRepo, headGitRepo, prInfo, baseBranch, headBranch) | ||||
| 	if ctx.Written() { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	// Setup information for new form. | ||||
| 	RetrieveRepoMetas(ctx, ctx.Repo.Repository) | ||||
| 	if ctx.Written() { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	// Get diff information. | ||||
|  | ||||
| 	ctx.HTML(200, COMPARE_PULL) | ||||
| } | ||||
|  | ||||
| func Pulls(ctx *middleware.Context) { | ||||
| 	ctx.Data["IsRepoToolbarPulls"] = true | ||||
| 	ctx.HTML(200, PULLS) | ||||
| func CompareAndPullRequestPost(ctx *middleware.Context, form auth.CreateIssueForm) { | ||||
| 	ctx.Data["Title"] = ctx.Tr("repo.pulls.compare_changes") | ||||
| 	ctx.Data["PageIsComparePull"] = true | ||||
| 	ctx.Data["IsDiffCompare"] = true | ||||
| 	renderAttachmentSettings(ctx) | ||||
|  | ||||
| 	var ( | ||||
| 		repo        = ctx.Repo.Repository | ||||
| 		attachments []string | ||||
| 	) | ||||
|  | ||||
| 	_, headRepo, headGitRepo, prInfo, baseBranch, headBranch := ParseCompareInfo(ctx) | ||||
| 	if ctx.Written() { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	patch, err := headGitRepo.GetPatch(models.RepoPath(repo.Owner.Name, repo.Name), baseBranch, headBranch) | ||||
| 	if err != nil { | ||||
| 		ctx.Handle(500, "GetPatch", err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	labelIDs, milestoneID, assigneeID := ValidateRepoMetas(ctx, form) | ||||
| 	if ctx.Written() { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	if setting.AttachmentEnabled { | ||||
| 		attachments = form.Attachments | ||||
| 	} | ||||
|  | ||||
| 	if ctx.HasError() { | ||||
| 		ctx.HTML(200, COMPARE_PULL) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	pr := &models.Issue{ | ||||
| 		RepoID:      repo.ID, | ||||
| 		Index:       int64(repo.NumIssues) + 1, | ||||
| 		Name:        form.Title, | ||||
| 		PosterID:    ctx.User.Id, | ||||
| 		Poster:      ctx.User, | ||||
| 		MilestoneID: milestoneID, | ||||
| 		AssigneeID:  assigneeID, | ||||
| 		IsPull:      true, | ||||
| 		Content:     form.Content, | ||||
| 	} | ||||
| 	if err := models.NewPullRequest(repo, pr, labelIDs, attachments, &models.PullRepo{ | ||||
| 		HeadRepoID: headRepo.ID, | ||||
| 		BaseRepoID: repo.ID, | ||||
| 		HeadBarcnh: headBranch, | ||||
| 		BaseBranch: baseBranch, | ||||
| 		MergeBase:  prInfo.MergeBase, | ||||
| 		Type:       models.PULL_REQUEST_GOGS, | ||||
| 	}, patch); err != nil { | ||||
| 		ctx.Handle(500, "NewPullRequest", err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	log.Trace("Pull request created: %d/%d", repo.ID, pr.ID) | ||||
| 	ctx.Redirect(ctx.Repo.RepoLink + "/pulls/" + com.ToStr(pr.Index)) | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user