mirror of
https://github.com/go-gitea/gitea.git
synced 2025-12-08 22:11:40 +01:00
Refactor compare router param parse
This commit is contained in:
parent
98ef79d73a
commit
7fe0840008
@ -5,7 +5,6 @@ package repo
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
|
||||||
|
|
||||||
user_model "code.gitea.io/gitea/models/user"
|
user_model "code.gitea.io/gitea/models/user"
|
||||||
"code.gitea.io/gitea/modules/gitrepo"
|
"code.gitea.io/gitea/modules/gitrepo"
|
||||||
@ -52,18 +51,7 @@ func CompareDiff(ctx *context.APIContext) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
infoPath := ctx.PathParam("*")
|
compareResult, closer := parseCompareInfo(ctx, ctx.PathParam("*"))
|
||||||
infos := []string{ctx.Repo.Repository.DefaultBranch, ctx.Repo.Repository.DefaultBranch}
|
|
||||||
if infoPath != "" {
|
|
||||||
infos = strings.SplitN(infoPath, "...", 2)
|
|
||||||
if len(infos) != 2 {
|
|
||||||
if infos = strings.SplitN(infoPath, "..", 2); len(infos) != 2 {
|
|
||||||
infos = []string{ctx.Repo.Repository.DefaultBranch, infoPath}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
compareResult, closer := parseCompareInfo(ctx, api.CreatePullRequestOption{Base: infos[0], Head: infos[1]})
|
|
||||||
if ctx.Written() {
|
if ctx.Written() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,6 +30,7 @@ import (
|
|||||||
"code.gitea.io/gitea/modules/timeutil"
|
"code.gitea.io/gitea/modules/timeutil"
|
||||||
"code.gitea.io/gitea/modules/web"
|
"code.gitea.io/gitea/modules/web"
|
||||||
"code.gitea.io/gitea/routers/api/v1/utils"
|
"code.gitea.io/gitea/routers/api/v1/utils"
|
||||||
|
"code.gitea.io/gitea/routers/common"
|
||||||
asymkey_service "code.gitea.io/gitea/services/asymkey"
|
asymkey_service "code.gitea.io/gitea/services/asymkey"
|
||||||
"code.gitea.io/gitea/services/automerge"
|
"code.gitea.io/gitea/services/automerge"
|
||||||
"code.gitea.io/gitea/services/context"
|
"code.gitea.io/gitea/services/context"
|
||||||
@ -413,7 +414,7 @@ func CreatePullRequest(ctx *context.APIContext) {
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Get repo/branch information
|
// Get repo/branch information
|
||||||
compareResult, closer := parseCompareInfo(ctx, form)
|
compareResult, closer := parseCompareInfo(ctx, form.Base+".."+form.Head)
|
||||||
if ctx.Written() {
|
if ctx.Written() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -1065,24 +1066,28 @@ type parseCompareInfoResult struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// parseCompareInfo returns non-nil if it succeeds, it always writes to the context and returns nil if it fails
|
// parseCompareInfo returns non-nil if it succeeds, it always writes to the context and returns nil if it fails
|
||||||
func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption) (result *parseCompareInfoResult, closer func()) {
|
func parseCompareInfo(ctx *context.APIContext, compareParam string) (result *parseCompareInfoResult, closer func()) {
|
||||||
var err error
|
|
||||||
// Get compared branches information
|
|
||||||
// format: <base branch>...[<head repo>:]<head branch>
|
|
||||||
// base<-head: master...head:feature
|
|
||||||
// same repo: master...feature
|
|
||||||
baseRepo := ctx.Repo.Repository
|
baseRepo := ctx.Repo.Repository
|
||||||
baseRefToGuess := form.Base
|
compareReq, err := common.ParseCompareRouterParam(baseRepo, compareParam)
|
||||||
|
if err != nil {
|
||||||
|
ctx.APIErrorNotFound()
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
headUser := ctx.Repo.Owner
|
var headRepo *repo_model.Repository
|
||||||
headRefToGuess := form.Head
|
if compareReq.HeadOwner == "" {
|
||||||
if headInfos := strings.Split(form.Head, ":"); len(headInfos) == 1 {
|
if compareReq.HeadRepoName == "" {
|
||||||
// If there is no head repository, it means pull request between same repository.
|
headRepo = ctx.Repo.Repository
|
||||||
// Do nothing here because the head variables have been assigned above.
|
} else {
|
||||||
} else if len(headInfos) == 2 {
|
ctx.APIErrorNotFound()
|
||||||
// There is a head repository (the head repository could also be the same base repo)
|
return nil, nil
|
||||||
headRefToGuess = headInfos[1]
|
}
|
||||||
headUser, err = user_model.GetUserByName(ctx, headInfos[0])
|
} else {
|
||||||
|
var headUser *user_model.User
|
||||||
|
if compareReq.HeadOwner == ctx.Repo.Owner.Name {
|
||||||
|
headUser = ctx.Repo.Owner
|
||||||
|
} else {
|
||||||
|
headUser, err = user_model.GetUserByName(ctx, compareReq.HeadOwner)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if user_model.IsErrUserNotExist(err) {
|
if user_model.IsErrUserNotExist(err) {
|
||||||
ctx.APIErrorNotFound("GetUserByName")
|
ctx.APIErrorNotFound("GetUserByName")
|
||||||
@ -1091,16 +1096,10 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption)
|
|||||||
}
|
}
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
ctx.APIErrorNotFound()
|
|
||||||
return nil, nil
|
|
||||||
}
|
}
|
||||||
|
if compareReq.HeadRepoName == "" {
|
||||||
isSameRepo := ctx.Repo.Owner.ID == headUser.ID
|
headRepo = repo_model.GetForkedRepo(ctx, headUser.ID, baseRepo.ID)
|
||||||
|
if headRepo == nil && headUser.ID != baseRepo.OwnerID {
|
||||||
// Check if current user has fork of repository or in the same repository.
|
|
||||||
headRepo := repo_model.GetForkedRepo(ctx, headUser.ID, baseRepo.ID)
|
|
||||||
if headRepo == nil && !isSameRepo {
|
|
||||||
err = baseRepo.GetBaseRepo(ctx)
|
err = baseRepo.GetBaseRepo(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.APIErrorInternal(err)
|
ctx.APIErrorInternal(err)
|
||||||
@ -1116,10 +1115,27 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption)
|
|||||||
// Assign headRepo so it can be used below.
|
// Assign headRepo so it can be used below.
|
||||||
headRepo = baseRepo.BaseRepo
|
headRepo = baseRepo.BaseRepo
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if compareReq.HeadOwner == ctx.Repo.Owner.Name && compareReq.HeadRepoName == ctx.Repo.Repository.Name {
|
||||||
|
headRepo = ctx.Repo.Repository
|
||||||
|
} else {
|
||||||
|
headRepo, err = repo_model.GetRepositoryByName(ctx, headUser.ID, compareReq.HeadRepoName)
|
||||||
|
if err != nil {
|
||||||
|
if repo_model.IsErrRepoNotExist(err) {
|
||||||
|
ctx.APIErrorNotFound("GetRepositoryByName")
|
||||||
|
} else {
|
||||||
|
ctx.APIErrorInternal(err)
|
||||||
|
}
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
isSameRepo := baseRepo.ID == headRepo.ID
|
||||||
|
|
||||||
var headGitRepo *git.Repository
|
var headGitRepo *git.Repository
|
||||||
if isSameRepo {
|
if isSameRepo {
|
||||||
headRepo = ctx.Repo.Repository
|
|
||||||
headGitRepo = ctx.Repo.GitRepo
|
headGitRepo = ctx.Repo.GitRepo
|
||||||
closer = func() {} // no need to close the head repo because it shares the base repo
|
closer = func() {} // no need to close the head repo because it shares the base repo
|
||||||
} else {
|
} else {
|
||||||
@ -1162,10 +1178,10 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption)
|
|||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
baseRef := ctx.Repo.GitRepo.UnstableGuessRefByShortName(baseRefToGuess)
|
baseRef := ctx.Repo.GitRepo.UnstableGuessRefByShortName(compareReq.BaseOriRef)
|
||||||
headRef := headGitRepo.UnstableGuessRefByShortName(headRefToGuess)
|
headRef := headGitRepo.UnstableGuessRefByShortName(compareReq.HeadOriRef)
|
||||||
|
|
||||||
log.Trace("Repo path: %q, base ref: %q->%q, head ref: %q->%q", ctx.Repo.Repository.RelativePath(), baseRefToGuess, baseRef, headRefToGuess, headRef)
|
log.Trace("Repo path: %q, base ref: %q->%q, head ref: %q->%q", ctx.Repo.Repository.RelativePath(), compareReq.BaseOriRef, baseRef, compareReq.HeadOriRef, headRef)
|
||||||
|
|
||||||
baseRefValid := baseRef.IsBranch() || baseRef.IsTag() || git.IsStringLikelyCommitID(git.ObjectFormatFromName(ctx.Repo.Repository.ObjectFormatName), baseRef.ShortName())
|
baseRefValid := baseRef.IsBranch() || baseRef.IsTag() || git.IsStringLikelyCommitID(git.ObjectFormatFromName(ctx.Repo.Repository.ObjectFormatName), baseRef.ShortName())
|
||||||
headRefValid := headRef.IsBranch() || headRef.IsTag() || git.IsStringLikelyCommitID(git.ObjectFormatFromName(headRepo.ObjectFormatName), headRef.ShortName())
|
headRefValid := headRef.IsBranch() || headRef.IsTag() || git.IsStringLikelyCommitID(git.ObjectFormatFromName(headRepo.ObjectFormatName), headRef.ShortName())
|
||||||
|
|||||||
@ -4,9 +4,12 @@
|
|||||||
package common
|
package common
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
repo_model "code.gitea.io/gitea/models/repo"
|
repo_model "code.gitea.io/gitea/models/repo"
|
||||||
user_model "code.gitea.io/gitea/models/user"
|
user_model "code.gitea.io/gitea/models/user"
|
||||||
"code.gitea.io/gitea/modules/git"
|
"code.gitea.io/gitea/modules/git"
|
||||||
|
"code.gitea.io/gitea/modules/util"
|
||||||
pull_service "code.gitea.io/gitea/services/pull"
|
pull_service "code.gitea.io/gitea/services/pull"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -20,3 +23,113 @@ type CompareInfo struct {
|
|||||||
HeadBranch string
|
HeadBranch string
|
||||||
DirectComparison bool
|
DirectComparison bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type CompareRouterReq struct {
|
||||||
|
BaseOriRef string
|
||||||
|
HeadOwner string
|
||||||
|
HeadRepoName string
|
||||||
|
HeadOriRef string
|
||||||
|
CaretTimes int // ^ times after base ref
|
||||||
|
DotTimes int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cr *CompareRouterReq) DirectComparison() bool {
|
||||||
|
return cr.DotTimes == 2
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cr *CompareRouterReq) CompareDots() string {
|
||||||
|
return strings.Repeat(".", cr.DotTimes)
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseBase(base string) (string, int) {
|
||||||
|
parts := strings.SplitN(base, "^", 2)
|
||||||
|
if len(parts) == 1 {
|
||||||
|
return base, 0
|
||||||
|
}
|
||||||
|
return parts[0], len(parts[1]) + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseHead(head string) (string, string, string) {
|
||||||
|
paths := strings.SplitN(head, ":", 2)
|
||||||
|
if len(paths) == 1 {
|
||||||
|
return "", "", paths[0]
|
||||||
|
}
|
||||||
|
ownerRepo := strings.SplitN(paths[0], "/", 2)
|
||||||
|
if len(ownerRepo) == 1 {
|
||||||
|
return paths[0], "", paths[1]
|
||||||
|
}
|
||||||
|
return ownerRepo[0], ownerRepo[1], paths[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
// ParseCompareRouterParam Get compare information from the router parameter.
|
||||||
|
// A full compare url is of the form:
|
||||||
|
//
|
||||||
|
// 1. /{:baseOwner}/{:baseRepoName}/compare/{:baseBranch}...{:headBranch}
|
||||||
|
// 2. /{:baseOwner}/{:baseRepoName}/compare/{:baseBranch}...{:headOwner}:{:headBranch}
|
||||||
|
// 3. /{:baseOwner}/{:baseRepoName}/compare/{:baseBranch}...{:headOwner}/{:headRepoName}:{:headBranch}
|
||||||
|
// 4. /{:baseOwner}/{:baseRepoName}/compare/{:headBranch}
|
||||||
|
// 5. /{:baseOwner}/{:baseRepoName}/compare/{:headOwner}:{:headBranch}
|
||||||
|
// 6. /{:baseOwner}/{:baseRepoName}/compare/{:headOwner}/{:headRepoName}:{:headBranch}
|
||||||
|
//
|
||||||
|
// Here we obtain the infoPath "{:baseBranch}...[{:headOwner}/{:headRepoName}:]{:headBranch}" as ctx.PathParam("*")
|
||||||
|
// with the :baseRepo in ctx.Repo.
|
||||||
|
//
|
||||||
|
// Note: Generally :headRepoName is not provided here - we are only passed :headOwner.
|
||||||
|
//
|
||||||
|
// How do we determine the :headRepo?
|
||||||
|
//
|
||||||
|
// 1. If :headOwner is not set then the :headRepo = :baseRepo
|
||||||
|
// 2. If :headOwner is set - then look for the fork of :baseRepo owned by :headOwner
|
||||||
|
// 3. But... :baseRepo could be a fork of :headOwner's repo - so check that
|
||||||
|
// 4. Now, :baseRepo and :headRepos could be forks of the same repo - so check that
|
||||||
|
//
|
||||||
|
// format: <base branch>...[<head repo>:]<head branch>
|
||||||
|
// base<-head: master...head:feature
|
||||||
|
// same repo: master...feature
|
||||||
|
func ParseCompareRouterParam(baseRepo *repo_model.Repository, routerParam string) (*CompareRouterReq, error) {
|
||||||
|
if routerParam == "" {
|
||||||
|
return &CompareRouterReq{
|
||||||
|
BaseOriRef: baseRepo.DefaultBranch,
|
||||||
|
HeadOwner: baseRepo.Owner.Name,
|
||||||
|
HeadRepoName: baseRepo.Name,
|
||||||
|
HeadOriRef: baseRepo.DefaultBranch,
|
||||||
|
DotTimes: 2,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var basePart, headPart string
|
||||||
|
dotTimes := 3
|
||||||
|
parts := strings.Split(routerParam, "...")
|
||||||
|
if len(parts) > 2 {
|
||||||
|
return nil, util.NewInvalidArgumentErrorf("invalid compare router: %s", routerParam)
|
||||||
|
}
|
||||||
|
if len(parts) != 2 {
|
||||||
|
parts = strings.Split(routerParam, "..")
|
||||||
|
if len(parts) == 1 {
|
||||||
|
headOwnerName, headRepoName, headRef := parseHead(routerParam)
|
||||||
|
return &CompareRouterReq{
|
||||||
|
BaseOriRef: baseRepo.DefaultBranch,
|
||||||
|
HeadOriRef: headRef,
|
||||||
|
HeadOwner: headOwnerName,
|
||||||
|
HeadRepoName: headRepoName,
|
||||||
|
DotTimes: dotTimes,
|
||||||
|
}, nil
|
||||||
|
} else if len(parts) > 2 {
|
||||||
|
return nil, util.NewInvalidArgumentErrorf("invalid compare router: %s", routerParam)
|
||||||
|
}
|
||||||
|
dotTimes = 2
|
||||||
|
}
|
||||||
|
basePart, headPart = parts[0], parts[1]
|
||||||
|
|
||||||
|
baseRef, caretTimes := parseBase(basePart)
|
||||||
|
headOwnerName, headRepoName, headRef := parseHead(headPart)
|
||||||
|
|
||||||
|
return &CompareRouterReq{
|
||||||
|
BaseOriRef: baseRef,
|
||||||
|
HeadOriRef: headRef,
|
||||||
|
HeadOwner: headOwnerName,
|
||||||
|
HeadRepoName: headRepoName,
|
||||||
|
CaretTimes: caretTimes,
|
||||||
|
DotTimes: dotTimes,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|||||||
@ -195,71 +195,27 @@ func setCsvCompareContext(ctx *context.Context) {
|
|||||||
func ParseCompareInfo(ctx *context.Context) *common.CompareInfo {
|
func ParseCompareInfo(ctx *context.Context) *common.CompareInfo {
|
||||||
baseRepo := ctx.Repo.Repository
|
baseRepo := ctx.Repo.Repository
|
||||||
ci := &common.CompareInfo{}
|
ci := &common.CompareInfo{}
|
||||||
|
|
||||||
fileOnly := ctx.FormBool("file-only")
|
fileOnly := ctx.FormBool("file-only")
|
||||||
|
|
||||||
// Get compared branches information
|
compareReq, err := common.ParseCompareRouterParam(baseRepo, ctx.PathParam("*"))
|
||||||
// A full compare url is of the form:
|
if err != nil {
|
||||||
//
|
ctx.ServerError("GetUserByName", err)
|
||||||
// 1. /{:baseOwner}/{:baseRepoName}/compare/{:baseBranch}...{:headBranch}
|
return nil
|
||||||
// 2. /{:baseOwner}/{:baseRepoName}/compare/{:baseBranch}...{:headOwner}:{:headBranch}
|
}
|
||||||
// 3. /{:baseOwner}/{:baseRepoName}/compare/{:baseBranch}...{:headOwner}/{:headRepoName}:{:headBranch}
|
|
||||||
// 4. /{:baseOwner}/{:baseRepoName}/compare/{:headBranch}
|
|
||||||
// 5. /{:baseOwner}/{:baseRepoName}/compare/{:headOwner}:{:headBranch}
|
|
||||||
// 6. /{:baseOwner}/{:baseRepoName}/compare/{:headOwner}/{:headRepoName}:{:headBranch}
|
|
||||||
//
|
|
||||||
// Here we obtain the infoPath "{:baseBranch}...[{:headOwner}/{:headRepoName}:]{:headBranch}" as ctx.PathParam("*")
|
|
||||||
// with the :baseRepo in ctx.Repo.
|
|
||||||
//
|
|
||||||
// Note: Generally :headRepoName is not provided here - we are only passed :headOwner.
|
|
||||||
//
|
|
||||||
// How do we determine the :headRepo?
|
|
||||||
//
|
|
||||||
// 1. If :headOwner is not set then the :headRepo = :baseRepo
|
|
||||||
// 2. If :headOwner is set - then look for the fork of :baseRepo owned by :headOwner
|
|
||||||
// 3. But... :baseRepo could be a fork of :headOwner's repo - so check that
|
|
||||||
// 4. Now, :baseRepo and :headRepos could be forks of the same repo - so check that
|
|
||||||
//
|
|
||||||
// format: <base branch>...[<head repo>:]<head branch>
|
|
||||||
// base<-head: master...head:feature
|
|
||||||
// same repo: master...feature
|
|
||||||
|
|
||||||
var (
|
if compareReq.HeadOwner == "" {
|
||||||
isSameRepo bool
|
if compareReq.HeadRepoName == "" {
|
||||||
infoPath string
|
ci.HeadRepo = baseRepo
|
||||||
err error
|
|
||||||
)
|
|
||||||
|
|
||||||
infoPath = ctx.PathParam("*")
|
|
||||||
var infos []string
|
|
||||||
if infoPath == "" {
|
|
||||||
infos = []string{baseRepo.DefaultBranch, baseRepo.DefaultBranch}
|
|
||||||
} else {
|
} else {
|
||||||
infos = strings.SplitN(infoPath, "...", 2)
|
ctx.NotFound(nil)
|
||||||
if len(infos) != 2 {
|
return nil
|
||||||
if infos = strings.SplitN(infoPath, "..", 2); len(infos) == 2 {
|
}
|
||||||
ci.DirectComparison = true
|
|
||||||
ctx.Data["PageIsComparePull"] = false
|
|
||||||
} else {
|
} else {
|
||||||
infos = []string{baseRepo.DefaultBranch, infoPath}
|
var headUser *user_model.User
|
||||||
}
|
if compareReq.HeadOwner == ctx.Repo.Owner.Name {
|
||||||
}
|
headUser = ctx.Repo.Owner
|
||||||
}
|
} else {
|
||||||
|
headUser, err = user_model.GetUserByName(ctx, compareReq.HeadOwner)
|
||||||
ctx.Data["BaseName"] = baseRepo.OwnerName
|
|
||||||
ci.BaseBranch = infos[0]
|
|
||||||
ctx.Data["BaseBranch"] = ci.BaseBranch
|
|
||||||
|
|
||||||
// If there is no head repository, it means compare between same repository.
|
|
||||||
headInfos := strings.Split(infos[1], ":")
|
|
||||||
if len(headInfos) == 1 {
|
|
||||||
isSameRepo = true
|
|
||||||
ci.HeadUser = ctx.Repo.Owner
|
|
||||||
ci.HeadBranch = headInfos[0]
|
|
||||||
} else if len(headInfos) == 2 {
|
|
||||||
headInfosSplit := strings.Split(headInfos[0], "/")
|
|
||||||
if len(headInfosSplit) == 1 {
|
|
||||||
ci.HeadUser, err = user_model.GetUserByName(ctx, headInfos[0])
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if user_model.IsErrUserNotExist(err) {
|
if user_model.IsErrUserNotExist(err) {
|
||||||
ctx.NotFound(nil)
|
ctx.NotFound(nil)
|
||||||
@ -268,37 +224,47 @@ func ParseCompareInfo(ctx *context.Context) *common.CompareInfo {
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
ci.HeadBranch = headInfos[1]
|
}
|
||||||
isSameRepo = ci.HeadUser.ID == ctx.Repo.Owner.ID
|
if compareReq.HeadRepoName == "" {
|
||||||
if isSameRepo {
|
ci.HeadRepo = repo_model.GetForkedRepo(ctx, headUser.ID, baseRepo.ID)
|
||||||
ci.HeadRepo = baseRepo
|
if ci.HeadRepo == nil && headUser.ID != baseRepo.OwnerID {
|
||||||
|
err = baseRepo.GetBaseRepo(ctx)
|
||||||
|
if err != nil {
|
||||||
|
ctx.ServerError("GetBaseRepo", err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if baseRepo's base repository is the same as headUser's repository.
|
||||||
|
if baseRepo.BaseRepo == nil || baseRepo.BaseRepo.OwnerID != headUser.ID {
|
||||||
|
log.Trace("parseCompareInfo[%d]: does not have fork or in same repository", baseRepo.ID)
|
||||||
|
ctx.NotFound(nil)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
// Assign headRepo so it can be used below.
|
||||||
|
ci.HeadRepo = baseRepo.BaseRepo
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ci.HeadRepo, err = repo_model.GetRepositoryByOwnerAndName(ctx, headInfosSplit[0], headInfosSplit[1])
|
if compareReq.HeadOwner == ctx.Repo.Owner.Name && compareReq.HeadRepoName == ctx.Repo.Repository.Name {
|
||||||
|
ci.HeadRepo = ctx.Repo.Repository
|
||||||
|
} else {
|
||||||
|
ci.HeadRepo, err = repo_model.GetRepositoryByName(ctx, headUser.ID, compareReq.HeadRepoName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if repo_model.IsErrRepoNotExist(err) {
|
if repo_model.IsErrRepoNotExist(err) {
|
||||||
ctx.NotFound(nil)
|
ctx.NotFound(nil)
|
||||||
} else {
|
} else {
|
||||||
ctx.ServerError("GetRepositoryByOwnerAndName", err)
|
ctx.ServerError("GetRepositoryByName", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if err := ci.HeadRepo.LoadOwner(ctx); err != nil {
|
|
||||||
if user_model.IsErrUserNotExist(err) {
|
|
||||||
ctx.NotFound(nil)
|
|
||||||
} else {
|
|
||||||
ctx.ServerError("GetUserByName", err)
|
|
||||||
}
|
}
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
ci.HeadBranch = headInfos[1]
|
|
||||||
ci.HeadUser = ci.HeadRepo.Owner
|
|
||||||
isSameRepo = ci.HeadRepo.ID == ctx.Repo.Repository.ID
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ctx.NotFound(nil)
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
ci.BaseBranch = compareReq.BaseOriRef
|
||||||
|
ci.HeadBranch = compareReq.HeadOriRef
|
||||||
|
isSameRepo := baseRepo.ID == ci.HeadRepo.ID
|
||||||
|
|
||||||
|
ctx.Data["BaseName"] = baseRepo.OwnerName
|
||||||
|
ctx.Data["BaseBranch"] = ci.BaseBranch
|
||||||
ctx.Data["HeadUser"] = ci.HeadUser
|
ctx.Data["HeadUser"] = ci.HeadUser
|
||||||
ctx.Data["HeadBranch"] = ci.HeadBranch
|
ctx.Data["HeadBranch"] = ci.HeadBranch
|
||||||
ctx.Repo.PullRequest.SameRepo = isSameRepo
|
ctx.Repo.PullRequest.SameRepo = isSameRepo
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user