From 6fc73a84332643ffbd431f6e7fcb16942c505c04 Mon Sep 17 00:00:00 2001 From: zeripath Date: Wed, 23 Mar 2022 19:04:50 +0000 Subject: [PATCH] Fix compare link in active feeds for new branch (#19149) (#19185) Backport #19149 When a new branch is pushed the old SHA is always listed as the empty sha and thus the compare link that is created does not work correctly. Therefore when creating the compare link for new branches: 1. Attempt to get the parent of the first commit and use that as the basis for the compare link. 2. If this is not possible make a comparison to the default branch 3. Finally if that is not possible simply do not show a compare link. However, there are multiple broken compare links remaining therefore, in order for these to not break we will simply make the compare link redirect to the default branch. Fix #19144 Signed-off-by: a1012112796 <1012112796@qq.com> Signed-off-by: Andrew Thornton Co-authored-by: Andrew Thornton Co-authored-by: a1012112796 <1012112796@qq.com> --- routers/web/repo/compare.go | 7 +++++++ services/repository/push.go | 29 ++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/routers/web/repo/compare.go b/routers/web/repo/compare.go index e0855b1834..f1b89a7be0 100644 --- a/routers/web/repo/compare.go +++ b/routers/web/repo/compare.go @@ -298,6 +298,13 @@ func ParseCompareInfo(ctx *context.Context) *CompareInfo { ci.BaseBranch = baseCommit.ID.String() ctx.Data["BaseBranch"] = ci.BaseBranch baseIsCommit = true + } else if ci.BaseBranch == git.EmptySHA { + if isSameRepo { + ctx.Redirect(ctx.Repo.RepoLink + "/compare/" + util.PathEscapeSegments(ci.HeadBranch)) + } else { + ctx.Redirect(ctx.Repo.RepoLink + "/compare/" + util.PathEscapeSegments(ci.HeadRepo.FullName()) + ":" + util.PathEscapeSegments(ci.HeadBranch)) + } + return nil } else { ctx.NotFound("IsRefExist", nil) return nil diff --git a/services/repository/push.go b/services/repository/push.go index 11854ccb39..b1dbe7d7f0 100644 --- a/services/repository/push.go +++ b/services/repository/push.go @@ -216,7 +216,34 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error { if len(commits.Commits) > setting.UI.FeedMaxCommitNum { commits.Commits = commits.Commits[:setting.UI.FeedMaxCommitNum] } - commits.CompareURL = repo.ComposeCompareURL(opts.OldCommitID, opts.NewCommitID) + + oldCommitID := opts.OldCommitID + if oldCommitID == git.EmptySHA && len(commits.Commits) > 0 { + oldCommit, err := gitRepo.GetCommit(commits.Commits[len(commits.Commits)-1].Sha1) + if err != nil && !git.IsErrNotExist(err) { + log.Error("unable to GetCommit %s from %-v: %v", oldCommitID, repo, err) + } + if oldCommit != nil { + for i := 0; i < oldCommit.ParentCount(); i++ { + commitID, _ := oldCommit.ParentID(i) + if !commitID.IsZero() { + oldCommitID = commitID.String() + break + } + } + } + } + + if oldCommitID == git.EmptySHA && repo.DefaultBranch != branch { + oldCommitID = repo.DefaultBranch + } + + if oldCommitID != git.EmptySHA { + commits.CompareURL = repo.ComposeCompareURL(oldCommitID, opts.NewCommitID) + } else { + commits.CompareURL = "" + } + notification.NotifyPushCommits(pusher, repo, opts, commits) if err = models.RemoveDeletedBranchByName(repo.ID, branch); err != nil {