| @@ -466,6 +466,8 @@ pulls.compare_base = base | |||||
| pulls.compare_compare = compare | pulls.compare_compare = compare | ||||
| pulls.filter_branch = Filter branch | pulls.filter_branch = Filter branch | ||||
| pulls.no_results = No results found. | pulls.no_results = No results found. | ||||
| pulls.nothing_to_compare = There is nothing to compare because base and head branches are even. | |||||
| pulls.has_pull_request = `There is already a pull request between these two targets: <a href="%[1]s/pulls/%[3]d">%[2]s#%[3]d</a>` | |||||
| pulls.create = Create Pull Request | pulls.create = Create Pull Request | ||||
| pulls.title_desc = wants to merge %[1]d commits from <code>%[2]s</code> into <code>%[3]s</code> | pulls.title_desc = wants to merge %[1]d commits from <code>%[2]s</code> into <code>%[3]s</code> | ||||
| pulls.tab_conversation = Conversation | pulls.tab_conversation = Conversation | ||||
| @@ -308,18 +308,23 @@ func (err ErrIssueNotExist) Error() string { | |||||
| // |____| |____/|____/____/____|_ /\___ >__ |____/ \___ >____ > |__| | // |____| |____/|____/____/____|_ /\___ >__ |____/ \___ >____ > |__| | ||||
| // \/ \/ |__| \/ \/ | // \/ \/ |__| \/ \/ | ||||
| type ErrPullRepoNotExist struct { | |||||
| ID int64 | |||||
| PullID int64 | |||||
| type ErrPullRequestNotExist struct { | |||||
| ID int64 | |||||
| PullID int64 | |||||
| HeadRepoID int64 | |||||
| BaseRepoID int64 | |||||
| HeadBarcnh string | |||||
| BaseBranch string | |||||
| } | } | ||||
| func IsErrPullRepoNotExist(err error) bool { | |||||
| _, ok := err.(ErrPullRepoNotExist) | |||||
| func IsErrPullRequestNotExist(err error) bool { | |||||
| _, ok := err.(ErrPullRequestNotExist) | |||||
| return ok | return ok | ||||
| } | } | ||||
| func (err ErrPullRepoNotExist) Error() string { | |||||
| return fmt.Sprintf("pull repo does not exist [id: %d, pull_id: %d]", err.ID, err.PullID) | |||||
| func (err ErrPullRequestNotExist) Error() string { | |||||
| return fmt.Sprintf("pull request does not exist [id: %d, pull_id: %d, head_repo_id: %d, base_repo_id: %d, head_branch: %s, base_branch: %s]", | |||||
| err.ID, err.PullID, err.HeadRepoID, err.BaseRepoID, err.HeadBarcnh, err.BaseBranch) | |||||
| } | } | ||||
| // _________ __ | // _________ __ | ||||
| @@ -46,10 +46,10 @@ type Issue struct { | |||||
| MilestoneID int64 | MilestoneID int64 | ||||
| Milestone *Milestone `xorm:"-"` | Milestone *Milestone `xorm:"-"` | ||||
| AssigneeID int64 | AssigneeID int64 | ||||
| Assignee *User `xorm:"-"` | |||||
| IsRead bool `xorm:"-"` | |||||
| IsPull bool // Indicates whether is a pull request or not. | |||||
| PullRepo *PullRepo `xorm:"-"` | |||||
| Assignee *User `xorm:"-"` | |||||
| IsRead bool `xorm:"-"` | |||||
| IsPull bool // Indicates whether is a pull request or not. | |||||
| *PullRequest `xorm:"-"` | |||||
| IsClosed bool | IsClosed bool | ||||
| Content string `xorm:"TEXT"` | Content string `xorm:"TEXT"` | ||||
| RenderedContent string `xorm:"-"` | RenderedContent string `xorm:"-"` | ||||
| @@ -96,9 +96,13 @@ func (i *Issue) AfterSet(colName string, _ xorm.Cell) { | |||||
| log.Error(3, "GetUserByID[%d]: %v", i.ID, err) | log.Error(3, "GetUserByID[%d]: %v", i.ID, err) | ||||
| } | } | ||||
| case "is_pull": | case "is_pull": | ||||
| i.PullRepo, err = GetPullRepoByPullID(i.ID) | |||||
| if !i.IsPull { | |||||
| return | |||||
| } | |||||
| i.PullRequest, err = GetPullRequestByPullID(i.ID) | |||||
| if err != nil { | if err != nil { | ||||
| log.Error(3, "GetPullRepoByPullID[%d]: %v", i.ID, err) | |||||
| log.Error(3, "GetPullRequestByPullID[%d]: %v", i.ID, err) | |||||
| } | } | ||||
| case "created": | case "created": | ||||
| i.Created = regulateTimeZone(i.Created) | i.Created = regulateTimeZone(i.Created) | ||||
| @@ -844,23 +848,25 @@ const ( | |||||
| PLLL_ERQUEST_GIT | PLLL_ERQUEST_GIT | ||||
| ) | ) | ||||
| // PullRepo represents relation between pull request and repositories. | |||||
| type PullRepo struct { | |||||
| ID int64 `xorm:"pk autoincr"` | |||||
| PullID int64 `xorm:"INDEX"` | |||||
| HeadRepoID int64 `xorm:"UNIQUE(s)"` | |||||
| HeadRepo *Repository `xorm:"-"` | |||||
| BaseRepoID int64 `xorm:"UNIQUE(s)"` | |||||
| HeadUserName string | |||||
| HeadBarcnh string `xorm:"UNIQUE(s)"` | |||||
| BaseBranch string `xorm:"UNIQUE(s)"` | |||||
| MergeBase string `xorm:"VARCHAR(40)"` | |||||
| Type PullRequestType | |||||
| CanAutoMerge bool | |||||
| HasMerged bool | |||||
| } | |||||
| func (pr *PullRepo) AfterSet(colName string, _ xorm.Cell) { | |||||
| // PullRequest represents relation between pull request and repositories. | |||||
| type PullRequest struct { | |||||
| ID int64 `xorm:"pk autoincr"` | |||||
| PullID int64 `xorm:"INDEX"` | |||||
| PullIndex int64 | |||||
| HeadRepoID int64 `xorm:"UNIQUE(s)"` | |||||
| HeadRepo *Repository `xorm:"-"` | |||||
| BaseRepoID int64 `xorm:"UNIQUE(s)"` | |||||
| HeadUserName string | |||||
| HeadBarcnh string `xorm:"UNIQUE(s)"` | |||||
| BaseBranch string `xorm:"UNIQUE(s)"` | |||||
| MergeBase string `xorm:"VARCHAR(40)"` | |||||
| MergedCommitID string `xorm:"VARCHAR(40)"` | |||||
| Type PullRequestType | |||||
| CanAutoMerge bool | |||||
| HasMerged bool | |||||
| } | |||||
| 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": | ||||
| @@ -872,24 +878,24 @@ func (pr *PullRepo) AfterSet(colName string, _ xorm.Cell) { | |||||
| } | } | ||||
| // NewPullRequest creates new pull request with labels for repository. | // NewPullRequest creates new pull request with labels for repository. | ||||
| func NewPullRequest(repo *Repository, pr *Issue, labelIDs []int64, uuids []string, pullRepo *PullRepo, patch []byte) (err error) { | |||||
| func NewPullRequest(repo *Repository, pull *Issue, labelIDs []int64, uuids []string, pr *PullRequest, patch []byte) (err error) { | |||||
| sess := x.NewSession() | sess := x.NewSession() | ||||
| defer sessionRelease(sess) | defer sessionRelease(sess) | ||||
| if err = sess.Begin(); err != nil { | if err = sess.Begin(); err != nil { | ||||
| return err | return err | ||||
| } | } | ||||
| if err = newIssue(sess, repo, pr, labelIDs, uuids); err != nil { | |||||
| if err = newIssue(sess, repo, pull, labelIDs, uuids); err != nil { | |||||
| return fmt.Errorf("newIssue: %v", err) | return fmt.Errorf("newIssue: %v", err) | ||||
| } | } | ||||
| // Notify watchers. | // Notify watchers. | ||||
| act := &Action{ | act := &Action{ | ||||
| ActUserID: pr.Poster.Id, | |||||
| ActUserName: pr.Poster.Name, | |||||
| ActEmail: pr.Poster.Email, | |||||
| ActUserID: pull.Poster.Id, | |||||
| ActUserName: pull.Poster.Name, | |||||
| ActEmail: pull.Poster.Email, | |||||
| OpType: PULL_REQUEST, | OpType: PULL_REQUEST, | ||||
| Content: fmt.Sprintf("%d|%s", pr.Index, pr.Name), | |||||
| Content: fmt.Sprintf("%d|%s", pull.Index, pull.Name), | |||||
| RepoID: repo.ID, | RepoID: repo.ID, | ||||
| RepoUserName: repo.Owner.Name, | RepoUserName: repo.Owner.Name, | ||||
| RepoName: repo.Name, | RepoName: repo.Name, | ||||
| @@ -920,26 +926,46 @@ func NewPullRequest(repo *Repository, pr *Issue, labelIDs []int64, uuids []strin | |||||
| return fmt.Errorf("git apply --check: %v - %s", err, stderr) | return fmt.Errorf("git apply --check: %v - %s", err, stderr) | ||||
| } | } | ||||
| } | } | ||||
| pullRepo.CanAutoMerge = !strings.Contains(stdout, "error: patch failed:") | |||||
| pr.CanAutoMerge = !strings.Contains(stdout, "error: patch failed:") | |||||
| pullRepo.PullID = pr.ID | |||||
| if _, err = sess.Insert(pullRepo); err != nil { | |||||
| pr.PullID = pull.ID | |||||
| pr.PullIndex = pull.Index | |||||
| if _, err = sess.Insert(pr); err != nil { | |||||
| return fmt.Errorf("insert pull repo: %v", err) | return fmt.Errorf("insert pull repo: %v", err) | ||||
| } | } | ||||
| return sess.Commit() | return sess.Commit() | ||||
| } | } | ||||
| // GetPullRepoByPullID returns pull repo by given pull ID. | |||||
| func GetPullRepoByPullID(pullID int64) (*PullRepo, error) { | |||||
| pullRepo := new(PullRepo) | |||||
| has, err := x.Where("pull_id=?", pullID).Get(pullRepo) | |||||
| // GetPullRequest returnss a pull request by given info. | |||||
| func GetPullRequest(headRepoID, baseRepoID int64, headBranch, baseBranch string) (*PullRequest, error) { | |||||
| pr := &PullRequest{ | |||||
| HeadRepoID: headRepoID, | |||||
| BaseRepoID: baseRepoID, | |||||
| HeadBarcnh: headBranch, | |||||
| BaseBranch: baseBranch, | |||||
| } | |||||
| has, err := x.Get(pr) | |||||
| if err != nil { | |||||
| return nil, err | |||||
| } else if !has { | |||||
| return nil, ErrPullRequestNotExist{0, 0, headRepoID, baseRepoID, headBranch, baseBranch} | |||||
| } | |||||
| return pr, nil | |||||
| } | |||||
| // GetPullRequestByPullID returns pull repo by given pull ID. | |||||
| func GetPullRequestByPullID(pullID int64) (*PullRequest, error) { | |||||
| pr := new(PullRequest) | |||||
| has, err := x.Where("pull_id=?", pullID).Get(pr) | |||||
| if err != nil { | if err != nil { | ||||
| return nil, err | return nil, err | ||||
| } else if !has { | } else if !has { | ||||
| return nil, ErrPullRepoNotExist{0, pullID} | |||||
| return nil, ErrPullRequestNotExist{0, pullID, 0, 0, "", ""} | |||||
| } | } | ||||
| return pullRepo, nil | |||||
| return pr, nil | |||||
| } | } | ||||
| // .____ ___. .__ | // .____ ___. .__ | ||||
| @@ -79,7 +79,7 @@ func init() { | |||||
| new(User), new(PublicKey), new(Oauth2), new(AccessToken), | new(User), new(PublicKey), new(Oauth2), new(AccessToken), | ||||
| new(Repository), new(DeployKey), new(Collaboration), new(Access), | new(Repository), new(DeployKey), new(Collaboration), new(Access), | ||||
| new(Watch), new(Star), new(Follow), new(Action), | new(Watch), new(Star), new(Follow), new(Action), | ||||
| new(Issue), new(PullRepo), new(Comment), new(Attachment), new(IssueUser), | |||||
| new(Issue), new(PullRequest), new(Comment), new(Attachment), new(IssueUser), | |||||
| new(Label), new(IssueLabel), new(Milestone), | new(Label), new(IssueLabel), new(Milestone), | ||||
| new(Mirror), new(Release), new(LoginSource), new(Webhook), | new(Mirror), new(Release), new(LoginSource), new(Webhook), | ||||
| new(UpdateTask), new(HookTask), | new(UpdateTask), new(HookTask), | ||||
| @@ -317,6 +317,7 @@ func RepoAssignment(redirect bool, args ...bool) macaron.Handler { | |||||
| return | return | ||||
| } | } | ||||
| ctx.Data["RepoLink"] = ctx.Repo.RepoLink | ctx.Data["RepoLink"] = ctx.Repo.RepoLink | ||||
| ctx.Data["RepoRelPath"] = ctx.Repo.Owner.Name + "/" + ctx.Repo.Repository.Name | |||||
| tags, err := ctx.Repo.GitRepo.GetTags() | tags, err := ctx.Repo.GitRepo.GetTags() | ||||
| if err != nil { | if err != nil { | ||||
| @@ -170,12 +170,12 @@ func checkPullInfo(ctx *middleware.Context) *models.Issue { | |||||
| func PrepareViewPullInfo(ctx *middleware.Context, pull *models.Issue) *git.PullRequestInfo { | func PrepareViewPullInfo(ctx *middleware.Context, pull *models.Issue) *git.PullRequestInfo { | ||||
| repo := ctx.Repo.Repository | repo := ctx.Repo.Repository | ||||
| ctx.Data["HeadTarget"] = pull.PullRepo.HeadUserName + "/" + pull.PullRepo.HeadBarcnh | |||||
| ctx.Data["BaseTarget"] = ctx.Repo.Owner.Name + "/" + pull.PullRepo.BaseBranch | |||||
| ctx.Data["HeadTarget"] = pull.HeadUserName + "/" + pull.HeadBarcnh | |||||
| ctx.Data["BaseTarget"] = ctx.Repo.Owner.Name + "/" + pull.BaseBranch | |||||
| headRepoPath, err := pull.PullRepo.HeadRepo.RepoPath() | |||||
| headRepoPath, err := pull.HeadRepo.RepoPath() | |||||
| if err != nil { | if err != nil { | ||||
| ctx.Handle(500, "PullRepo.HeadRepo.RepoPath", err) | |||||
| ctx.Handle(500, "HeadRepo.RepoPath", err) | |||||
| return nil | return nil | ||||
| } | } | ||||
| @@ -186,7 +186,7 @@ func PrepareViewPullInfo(ctx *middleware.Context, pull *models.Issue) *git.PullR | |||||
| } | } | ||||
| prInfo, err := headGitRepo.GetPullRequestInfo(models.RepoPath(repo.Owner.Name, repo.Name), | prInfo, err := headGitRepo.GetPullRequestInfo(models.RepoPath(repo.Owner.Name, repo.Name), | ||||
| pull.PullRepo.BaseBranch, pull.PullRepo.HeadBarcnh) | |||||
| pull.BaseBranch, pull.HeadBarcnh) | |||||
| if err != nil { | if err != nil { | ||||
| ctx.Handle(500, "GetPullRequestInfo", err) | ctx.Handle(500, "GetPullRequestInfo", err) | ||||
| return nil | return nil | ||||
| @@ -210,7 +210,10 @@ func ViewPullCommits(ctx *middleware.Context) { | |||||
| } | } | ||||
| prInfo.Commits = models.ValidateCommitsWithEmails(prInfo.Commits) | prInfo.Commits = models.ValidateCommitsWithEmails(prInfo.Commits) | ||||
| ctx.Data["Commits"] = prInfo.Commits | ctx.Data["Commits"] = prInfo.Commits | ||||
| ctx.Data["CommitCount"] = prInfo.Commits.Len() | |||||
| ctx.Data["Username"] = pull.HeadUserName | |||||
| ctx.Data["Reponame"] = pull.HeadRepo.Name | |||||
| ctx.HTML(200, PULL_COMMITS) | ctx.HTML(200, PULL_COMMITS) | ||||
| } | } | ||||
| @@ -226,9 +229,8 @@ func ViewPullFiles(ctx *middleware.Context) { | |||||
| if ctx.Written() { | if ctx.Written() { | ||||
| return | return | ||||
| } | } | ||||
| _ = prInfo | |||||
| headRepoPath := models.RepoPath(pull.PullRepo.HeadUserName, pull.PullRepo.HeadRepo.Name) | |||||
| headRepoPath := models.RepoPath(pull.HeadUserName, pull.HeadRepo.Name) | |||||
| headGitRepo, err := git.OpenRepository(headRepoPath) | headGitRepo, err := git.OpenRepository(headRepoPath) | ||||
| if err != nil { | if err != nil { | ||||
| @@ -236,7 +238,7 @@ func ViewPullFiles(ctx *middleware.Context) { | |||||
| return | return | ||||
| } | } | ||||
| headCommitID, err := headGitRepo.GetCommitIdOfBranch(pull.PullRepo.HeadBarcnh) | |||||
| headCommitID, err := headGitRepo.GetCommitIdOfBranch(pull.HeadBarcnh) | |||||
| if err != nil { | if err != nil { | ||||
| ctx.Handle(500, "GetCommitIdOfBranch", err) | ctx.Handle(500, "GetCommitIdOfBranch", err) | ||||
| return | return | ||||
| @@ -257,9 +259,9 @@ func ViewPullFiles(ctx *middleware.Context) { | |||||
| return | return | ||||
| } | } | ||||
| headTarget := path.Join(pull.PullRepo.HeadUserName, pull.PullRepo.HeadRepo.Name) | |||||
| ctx.Data["Username"] = pull.PullRepo.HeadUserName | |||||
| ctx.Data["Reponame"] = pull.PullRepo.HeadRepo.Name | |||||
| headTarget := path.Join(pull.HeadUserName, pull.HeadRepo.Name) | |||||
| ctx.Data["Username"] = pull.HeadUserName | |||||
| ctx.Data["Reponame"] = pull.HeadRepo.Name | |||||
| ctx.Data["IsImageFile"] = headCommit.IsImageFile | ctx.Data["IsImageFile"] = headCommit.IsImageFile | ||||
| ctx.Data["SourcePath"] = setting.AppSubUrl + "/" + path.Join(headTarget, "src", headCommitID) | ctx.Data["SourcePath"] = setting.AppSubUrl + "/" + path.Join(headTarget, "src", headCommitID) | ||||
| ctx.Data["BeforeSourcePath"] = setting.AppSubUrl + "/" + path.Join(headTarget, "src", prInfo.MergeBase) | ctx.Data["BeforeSourcePath"] = setting.AppSubUrl + "/" + path.Join(headTarget, "src", prInfo.MergeBase) | ||||
| @@ -348,7 +350,7 @@ func PrepareCompareDiff( | |||||
| headRepo *models.Repository, | headRepo *models.Repository, | ||||
| headGitRepo *git.Repository, | headGitRepo *git.Repository, | ||||
| prInfo *git.PullRequestInfo, | prInfo *git.PullRequestInfo, | ||||
| baseBranch, headBranch string) { | |||||
| baseBranch, headBranch string) bool { | |||||
| var ( | var ( | ||||
| repo = ctx.Repo.Repository | repo = ctx.Repo.Repository | ||||
| @@ -359,21 +361,26 @@ func PrepareCompareDiff( | |||||
| ctx.Data["CommitRepoLink"], err = headRepo.RepoLink() | ctx.Data["CommitRepoLink"], err = headRepo.RepoLink() | ||||
| if err != nil { | if err != nil { | ||||
| ctx.Handle(500, "RepoLink", err) | ctx.Handle(500, "RepoLink", err) | ||||
| return | |||||
| return false | |||||
| } | } | ||||
| headCommitID, err := headGitRepo.GetCommitIdOfBranch(headBranch) | headCommitID, err := headGitRepo.GetCommitIdOfBranch(headBranch) | ||||
| if err != nil { | if err != nil { | ||||
| ctx.Handle(500, "GetCommitIdOfBranch", err) | ctx.Handle(500, "GetCommitIdOfBranch", err) | ||||
| return | |||||
| return false | |||||
| } | } | ||||
| ctx.Data["AfterCommitID"] = headCommitID | ctx.Data["AfterCommitID"] = headCommitID | ||||
| if headCommitID == prInfo.MergeBase { | |||||
| ctx.Data["IsNothingToCompare"] = true | |||||
| return true | |||||
| } | |||||
| diff, err := models.GetDiffRange(models.RepoPath(headUser.Name, headRepo.Name), | diff, err := models.GetDiffRange(models.RepoPath(headUser.Name, headRepo.Name), | ||||
| prInfo.MergeBase, headCommitID, setting.Git.MaxGitDiffLines) | prInfo.MergeBase, headCommitID, setting.Git.MaxGitDiffLines) | ||||
| if err != nil { | if err != nil { | ||||
| ctx.Handle(500, "GetDiffRange", err) | ctx.Handle(500, "GetDiffRange", err) | ||||
| return | |||||
| return false | |||||
| } | } | ||||
| ctx.Data["Diff"] = diff | ctx.Data["Diff"] = diff | ||||
| ctx.Data["DiffNotAvailable"] = diff.NumFiles() == 0 | ctx.Data["DiffNotAvailable"] = diff.NumFiles() == 0 | ||||
| @@ -381,7 +388,7 @@ func PrepareCompareDiff( | |||||
| headCommit, err := headGitRepo.GetCommit(headCommitID) | headCommit, err := headGitRepo.GetCommit(headCommitID) | ||||
| if err != nil { | if err != nil { | ||||
| ctx.Handle(500, "GetCommit", err) | ctx.Handle(500, "GetCommit", err) | ||||
| return | |||||
| return false | |||||
| } | } | ||||
| prInfo.Commits = models.ValidateCommitsWithEmails(prInfo.Commits) | prInfo.Commits = models.ValidateCommitsWithEmails(prInfo.Commits) | ||||
| @@ -395,6 +402,7 @@ func PrepareCompareDiff( | |||||
| ctx.Data["SourcePath"] = setting.AppSubUrl + "/" + path.Join(headTarget, "src", headCommitID) | ctx.Data["SourcePath"] = setting.AppSubUrl + "/" + path.Join(headTarget, "src", headCommitID) | ||||
| ctx.Data["BeforeSourcePath"] = setting.AppSubUrl + "/" + path.Join(headTarget, "src", prInfo.MergeBase) | ctx.Data["BeforeSourcePath"] = setting.AppSubUrl + "/" + path.Join(headTarget, "src", prInfo.MergeBase) | ||||
| ctx.Data["RawPath"] = setting.AppSubUrl + "/" + path.Join(headTarget, "raw", headCommitID) | ctx.Data["RawPath"] = setting.AppSubUrl + "/" + path.Join(headTarget, "raw", headCommitID) | ||||
| return false | |||||
| } | } | ||||
| func CompareAndPullRequest(ctx *middleware.Context) { | func CompareAndPullRequest(ctx *middleware.Context) { | ||||
| @@ -408,17 +416,32 @@ func CompareAndPullRequest(ctx *middleware.Context) { | |||||
| return | return | ||||
| } | } | ||||
| PrepareCompareDiff(ctx, headUser, headRepo, headGitRepo, prInfo, baseBranch, headBranch) | |||||
| if ctx.Written() { | |||||
| pr, err := models.GetPullRequest(headRepo.ID, ctx.Repo.Repository.ID, headBranch, baseBranch) | |||||
| if err != nil { | |||||
| if !models.IsErrPullRequestNotExist(err) { | |||||
| ctx.Handle(500, "HasPullRequest", err) | |||||
| return | |||||
| } | |||||
| } else { | |||||
| ctx.Data["HasPullRequest"] = true | |||||
| ctx.Data["PullRequest"] = pr | |||||
| ctx.HTML(200, COMPARE_PULL) | |||||
| return | return | ||||
| } | } | ||||
| // Setup information for new form. | |||||
| RetrieveRepoMetas(ctx, ctx.Repo.Repository) | |||||
| nothingToCompare := PrepareCompareDiff(ctx, headUser, headRepo, headGitRepo, prInfo, baseBranch, headBranch) | |||||
| if ctx.Written() { | if ctx.Written() { | ||||
| return | return | ||||
| } | } | ||||
| if !nothingToCompare { | |||||
| // Setup information for new form. | |||||
| RetrieveRepoMetas(ctx, ctx.Repo.Repository) | |||||
| if ctx.Written() { | |||||
| return | |||||
| } | |||||
| } | |||||
| ctx.HTML(200, COMPARE_PULL) | ctx.HTML(200, COMPARE_PULL) | ||||
| } | } | ||||
| @@ -458,7 +481,7 @@ func CompareAndPullRequestPost(ctx *middleware.Context, form auth.CreateIssueFor | |||||
| return | return | ||||
| } | } | ||||
| pr := &models.Issue{ | |||||
| pull := &models.Issue{ | |||||
| RepoID: repo.ID, | RepoID: repo.ID, | ||||
| Index: int64(repo.NumIssues) + 1, | Index: int64(repo.NumIssues) + 1, | ||||
| Name: form.Title, | Name: form.Title, | ||||
| @@ -469,7 +492,7 @@ func CompareAndPullRequestPost(ctx *middleware.Context, form auth.CreateIssueFor | |||||
| IsPull: true, | IsPull: true, | ||||
| Content: form.Content, | Content: form.Content, | ||||
| } | } | ||||
| if err := models.NewPullRequest(repo, pr, labelIDs, attachments, &models.PullRepo{ | |||||
| if err := models.NewPullRequest(repo, pull, labelIDs, attachments, &models.PullRequest{ | |||||
| HeadRepoID: headRepo.ID, | HeadRepoID: headRepo.ID, | ||||
| BaseRepoID: repo.ID, | BaseRepoID: repo.ID, | ||||
| HeadUserName: headUser.Name, | HeadUserName: headUser.Name, | ||||
| @@ -482,6 +505,6 @@ func CompareAndPullRequestPost(ctx *middleware.Context, form auth.CreateIssueFor | |||||
| return | return | ||||
| } | } | ||||
| log.Trace("Pull request created: %d/%d", repo.ID, pr.ID) | |||||
| ctx.Redirect(ctx.Repo.RepoLink + "/pulls/" + com.ToStr(pr.Index)) | |||||
| log.Trace("Pull request created: %d/%d", repo.ID, pull.ID) | |||||
| ctx.Redirect(ctx.Repo.RepoLink + "/pulls/" + com.ToStr(pull.Index)) | |||||
| } | } | ||||
| @@ -133,7 +133,7 @@ | |||||
| {{if .Issue.IsPull}} | {{if .Issue.IsPull}} | ||||
| <div class="comment merge box"> | <div class="comment merge box"> | ||||
| <a class="avatar text {{if .Issue.IsClosed}}grey{{else if .Issue.PullRepo.CanAutoMerge}}green{{else}}red{{end}}"> | |||||
| <a class="avatar text {{if .Issue.IsClosed}}grey{{else if .Issue.CanAutoMerge}}green{{else}}red{{end}}"> | |||||
| <span class="mega-octicon octicon-git-merge"></span> | <span class="mega-octicon octicon-git-merge"></span> | ||||
| </a> | </a> | ||||
| <div class="content"> | <div class="content"> | ||||
| @@ -142,17 +142,19 @@ | |||||
| <div class="item text grey"> | <div class="item text grey"> | ||||
| {{$.i18n.Tr "repo.pulls.reopen_to_merge"}} | {{$.i18n.Tr "repo.pulls.reopen_to_merge"}} | ||||
| </div> | </div> | ||||
| {{else if .Issue.PullRepo.CanAutoMerge}} | |||||
| {{else if .Issue.CanAutoMerge}} | |||||
| <div class="item text green"> | <div class="item text green"> | ||||
| <span class="octicon octicon-check"></span> | <span class="octicon octicon-check"></span> | ||||
| {{$.i18n.Tr "repo.pulls.can_auto_merge_desc"}} | {{$.i18n.Tr "repo.pulls.can_auto_merge_desc"}} | ||||
| </div> | </div> | ||||
| {{if .IsRepositoryAdmin}} | |||||
| <div class="ui divider"></div> | <div class="ui divider"></div> | ||||
| <div> | <div> | ||||
| <button class="ui green button"> | <button class="ui green button"> | ||||
| <span class="octicon octicon-git-merge"></span> {{$.i18n.Tr "repo.pulls.merge_pull_request"}} | <span class="octicon octicon-git-merge"></span> {{$.i18n.Tr "repo.pulls.merge_pull_request"}} | ||||
| </button> | </button> | ||||
| </div> | </div> | ||||
| {{end}} | |||||
| {{else}} | {{else}} | ||||
| <div class="item text red"> | <div class="item text red"> | ||||
| <span class="octicon octicon-x"></span> | <span class="octicon octicon-x"></span> | ||||
| @@ -45,10 +45,20 @@ | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| {{template "repo/issue/new_form" .}} | |||||
| {{if .IsNothingToCompare}} | |||||
| <div class="ui segment"> | |||||
| {{.i18n.Tr "repo.pulls.nothing_to_compare"}} | |||||
| </div> | |||||
| {{else if .HasPullRequest}} | |||||
| <div class="ui segment"> | |||||
| {{.i18n.Tr "repo.pulls.has_pull_request" $.RepoLink $.RepoRelPath .PullRequest.PullIndex | Safe}} | |||||
| </div> | |||||
| {{else}} | |||||
| {{template "repo/issue/new_form" .}} | |||||
| {{template "repo/commits_table" .}} | {{template "repo/commits_table" .}} | ||||
| {{template "repo/diff_box" .}} | {{template "repo/diff_box" .}} | ||||
| {{end}} | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||