diff --git a/models/git/branch.go b/models/git/branch.go index 6021e1101f..edbecf95a7 100644 --- a/models/git/branch.go +++ b/models/git/branch.go @@ -156,6 +156,19 @@ func init() { db.RegisterModel(new(RenamedBranch)) } +func GetBranchByID(ctx context.Context, branchID int64) (*Branch, error) { + var branch Branch + has, err := db.GetEngine(ctx).ID(branchID).Get(&branch) + if err != nil { + return nil, err + } else if !has { + return nil, ErrBranchNotExist{ + RepoID: branch.RepoID, + } + } + return &branch, nil +} + func GetBranch(ctx context.Context, repoID int64, branchName string) (*Branch, error) { var branch Branch has, err := db.GetEngine(ctx).Where("repo_id=?", repoID).And("name=?", branchName).Get(&branch) diff --git a/models/issues/issue_dev_link.go b/models/issues/issue_dev_link.go index f567d35673..17d2b68b0b 100644 --- a/models/issues/issue_dev_link.go +++ b/models/issues/issue_dev_link.go @@ -25,7 +25,7 @@ type IssueDevLink struct { IssueID int64 `xorm:"INDEX"` LinkType IssueDevLinkType LinkedRepoID int64 `xorm:"INDEX"` // it can link to self repo or other repo - LinkIndex string // branch name, pull request number or commit sha + LinkID int64 // branch id in branch table or pull request id CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` Repo *repo_model.Repository `xorm:"-"` // current repo of issue LinkedRepo *repo_model.Repository `xorm:"-"` diff --git a/models/migrations/v1_25/v322.go b/models/migrations/v1_25/v322.go index ef3441a28f..bf905d69ec 100644 --- a/models/migrations/v1_25/v322.go +++ b/models/migrations/v1_25/v322.go @@ -15,7 +15,7 @@ func CreateTableIssueDevLink(x *xorm.Engine) error { IssueID int64 `xorm:"INDEX"` LinkType int LinkedRepoID int64 `xorm:"INDEX"` // it can link to self repo or other repo - LinkIndex string // branch name, pull request number or commit sha + LinkID int64 // branch id in branch table or pull request id CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` } return x.Sync(new(IssueDevLink)) diff --git a/routers/web/repo/issue_dev.go b/routers/web/repo/issue_dev.go index 33ec9c03ed..61918a760c 100644 --- a/routers/web/repo/issue_dev.go +++ b/routers/web/repo/issue_dev.go @@ -99,11 +99,17 @@ func CreateBranchFromIssue(ctx *context.Context) { return } + branch, err := git_model.GetBranch(ctx, repo.ID, form.NewBranchName) + if err != nil { + ctx.ServerError("GetBranch", err) + return + } + if err := issues_model.CreateIssueDevLink(ctx, &issues_model.IssueDevLink{ IssueID: issue.ID, LinkType: issues_model.IssueDevLinkTypeBranch, LinkedRepoID: repo.ID, - LinkIndex: form.NewBranchName, + LinkID: branch.ID, }); err != nil { ctx.ServerError("CreateIssueDevLink", err) return diff --git a/services/issue/dev_link.go b/services/issue/dev_link.go index e8004a95b0..492a2c5240 100644 --- a/services/issue/dev_link.go +++ b/services/issue/dev_link.go @@ -7,7 +7,6 @@ import ( "context" "fmt" "sort" - "strconv" git_model "code.gitea.io/gitea/models/git" issues_model "code.gitea.io/gitea/models/issues" @@ -49,11 +48,7 @@ func FindIssueDevLinksByIssue(ctx context.Context, issue *issues_model.Issue) (i switch link.LinkType { case issues_model.IssueDevLinkTypePullRequest: - pullID, err := strconv.ParseInt(link.LinkIndex, 10, 64) - if err != nil { - return nil, err - } - pull, err := issues_model.GetPullRequestByID(ctx, pullID) + pull, err := issues_model.GetPullRequestByID(ctx, link.LinkID) if err != nil { return nil, err } @@ -64,15 +59,15 @@ func FindIssueDevLinksByIssue(ctx context.Context, issue *issues_model.Issue) (i } pull.Issue.Repo = issue.Repo link.PullRequest = pull - branchPRExists.Add(fmt.Sprintf("%d-%s", link.LinkedRepoID, pull.HeadBranch)) + branchPRExists.Add(fmt.Sprintf("%d-%d-%s", link.LinkedRepoID, link.LinkType, pull.HeadBranch)) case issues_model.IssueDevLinkTypeBranch: - branch, err := git_model.GetBranch(ctx, link.LinkedRepoID, link.LinkIndex) + branch, err := git_model.GetBranchByID(ctx, link.LinkID) if err != nil { return nil, err } link.Branch = branch link.Branch.Repo = link.LinkedRepo - link.DisplayBranch = !branchPRExists.Contains(fmt.Sprintf("%d-%s", link.LinkedRepoID, link.LinkIndex)) + link.DisplayBranch = !branchPRExists.Contains(fmt.Sprintf("%d-%d-%d", link.LinkedRepoID, link.LinkType, link.LinkID)) } } diff --git a/services/pull/pull.go b/services/pull/pull.go index 3b8a63ef3e..4a96088b94 100644 --- a/services/pull/pull.go +++ b/services/pull/pull.go @@ -11,7 +11,6 @@ import ( "io" "os" "regexp" - "strconv" "strings" "time" @@ -152,7 +151,7 @@ func NewPullRequest(ctx context.Context, opts *NewPullRequestOptions) error { IssueID: link.IssueID, LinkType: issues_model.IssueDevLinkTypePullRequest, LinkedRepoID: pr.HeadRepoID, - LinkIndex: strconv.FormatInt(pr.ID, 10), + LinkID: pr.ID, }); err != nil { return err }