diff --git a/routers/web/repo/compare.go b/routers/web/repo/compare.go index 150a8583c8434..366637e5441b4 100644 --- a/routers/web/repo/compare.go +++ b/routers/web/repo/compare.go @@ -448,7 +448,8 @@ func PrepareCompareDiff( if (headCommitID == ci.MergeBase && !ci.DirectComparison()) || headCommitID == ci.BaseCommitID { - ctx.Data["IsNothingToCompare"] = true + ctx.Data["CommitCount"] = 0 + ctx.Data["DiffNotAvailable"] = true if unit, err := repo.GetUnit(ctx, unit.TypePullRequests); err == nil { config := unit.PullRequestsConfig() diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go index cff501ad71d92..2d865843f2298 100644 --- a/routers/web/repo/pull.go +++ b/routers/web/repo/pull.go @@ -592,7 +592,7 @@ func prepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *git_s } if compareInfo.HeadCommitID == compareInfo.MergeBase { - ctx.Data["IsNothingToCompare"] = true + ctx.Data["DiffNotAvailable"] = true } if pull.IsWorkInProgress(ctx) { diff --git a/templates/repo/commits_table.tmpl b/templates/repo/commits_table.tmpl index c8ae535a182f1..6f369ee403b3b 100644 --- a/templates/repo/commits_table.tmpl +++ b/templates/repo/commits_table.tmpl @@ -2,7 +2,7 @@
{{if or .PageIsCommits (gt .CommitCount 0)}} {{.CommitCount}} {{ctx.Locale.Tr "repo.commits.commits"}} - {{else if .IsNothingToCompare}} + {{else if .DiffNotAvailable}} {{ctx.Locale.Tr "repo.commits.nothing_to_compare"}} {{else}} {{ctx.Locale.Tr "repo.commits.no_commits" $.BaseBranch $.HeadBranch}} diff --git a/templates/repo/diff/compare.tmpl b/templates/repo/diff/compare.tmpl index 41d0a198f4093..ed62e69e9356c 100644 --- a/templates/repo/diff/compare.tmpl +++ b/templates/repo/diff/compare.tmpl @@ -173,10 +173,9 @@
- {{$showDiffBox := and .CommitCount (not .IsNothingToCompare)}} {{if and .IsSigned .PageIsComparePull}} - {{$allowCreatePR := and ($.CompareInfo.BaseRef.IsBranch) ($.CompareInfo.HeadRef.IsBranch) (not $.CompareInfo.DirectComparison) (or $.AllowEmptyPr (not .IsNothingToCompare))}} - {{if .IsNothingToCompare}} + {{$allowCreatePR := and ($.CompareInfo.BaseRef.IsBranch) ($.CompareInfo.HeadRef.IsBranch) (not $.CompareInfo.DirectComparison) (or $.AllowEmptyPr (not .DiffNotAvailable))}} + {{if .DiffNotAvailable}}
{{if $allowCreatePR}} {{ctx.Locale.Tr "repo.pulls.nothing_to_compare_and_allow_empty_pr"}} @@ -216,16 +215,21 @@
{{end}} {{else}}{{/* not singed-in or not for pull-request */}} - {{if not .CommitCount}} + {{if .DiffNotAvailable}}
{{ctx.Locale.Tr "repo.commits.nothing_to_compare"}}
{{end}} {{end}} - {{if $showDiffBox}} + {{$hasCommits := and .Commits (gt .CommitCount 0)}} + {{if or $hasCommits (not .DiffNotAvailable)}}
- {{template "repo/commits_table" .}} - {{template "repo/diff/box" .}} + {{if $hasCommits}} + {{template "repo/commits_table" .}} + {{end}} + {{if not .DiffNotAvailable}} + {{template "repo/diff/box" .}} + {{end}}
{{end}} diff --git a/tests/integration/pull_compare_test.go b/tests/integration/pull_compare_test.go index da00b3fd56640..78922538df13b 100644 --- a/tests/integration/pull_compare_test.go +++ b/tests/integration/pull_compare_test.go @@ -7,16 +7,22 @@ import ( "fmt" "net/http" "net/url" + "path" + "strconv" "testing" + "time" issues_model "code.gitea.io/gitea/models/issues" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/git/gitcmd" "code.gitea.io/gitea/modules/test" repo_service "code.gitea.io/gitea/services/repository" "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestPullCompare(t *testing.T) { @@ -170,3 +176,68 @@ func TestPullCompare_EnableAllowEditsFromMaintainer(t *testing.T) { } }) } + +func TestPullCompareForcePushDroppedCommit(t *testing.T) { + onGiteaRun(t, func(t *testing.T, u *url.URL) { + user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + repo, err := repo_service.CreateRepositoryDirectly(t.Context(), user, user, repo_service.CreateRepoOptions{ + Name: "compare-force-push", + AutoInit: true, + DefaultBranch: "master", + Readme: "Default", + }, true) + require.NoError(t, err) + + session := loginUser(t, user.Name) + u.Path = fmt.Sprintf("/%s/%s.git", user.Name, repo.Name) + u.User = url.UserPassword(user.Name, userPassword) + + dstPath := t.TempDir() + doGitClone(dstPath, u)(t) + doGitCreateBranch(dstPath, "feature/drop-commit")(t) + + doGitCheckoutWriteFileCommit(localGitAddCommitOptions{ + LocalRepoPath: dstPath, + CheckoutBranch: "feature/drop-commit", + TreeFilePath: "README.md", + TreeFileContent: "first\n", + })(t) + doGitCheckoutWriteFileCommit(localGitAddCommitOptions{ + LocalRepoPath: dstPath, + CheckoutBranch: "feature/drop-commit", + TreeFilePath: "README.md", + TreeFileContent: "first\nsecond\n", + })(t) + doGitPushTestRepository(dstPath, "origin", "feature/drop-commit")(t) + + resp := testPullCreate(t, session, user.Name, repo.Name, true, "master", "feature/drop-commit", "Force push compare") + prURL := test.RedirectURL(resp) + issueIndex, err := strconv.ParseInt(path.Base(prURL), 10, 64) + require.NoError(t, err) + issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{RepoID: repo.ID, Index: issueIndex}) + require.NoError(t, issue.LoadPullRequest(t.Context())) + + err = gitcmd.NewCommand("reset", "--hard", "HEAD~1").WithDir(dstPath).Run(t.Context()) + require.NoError(t, err) + err = gitcmd.NewCommand("push", "--force", "origin", "feature/drop-commit").WithDir(dstPath).Run(t.Context()) + require.NoError(t, err) + + var compareURL string + require.Eventually(t, func() bool { + req := NewRequest(t, "GET", prURL) + resp := session.MakeRequest(t, req, http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + selection := htmlDoc.doc.Find("a.comment-text-label[href*='/compare/']") + if selection.Length() == 0 { + return false + } + compareURL = selection.Last().AttrOr("href", "") + return compareURL != "" + }, 5*time.Second, 20*time.Millisecond) + + req := NewRequest(t, "GET", compareURL) + resp = session.MakeRequest(t, req, http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + assert.Positive(t, htmlDoc.doc.Find("#diff-file-boxes [data-new-filename=\"README.md\"]").Length()) + }) +}