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())
+ })
+}