Skip to content
Draft
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion routers/web/repo/compare.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand Down
2 changes: 1 addition & 1 deletion routers/web/repo/pull.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not right.

}

if pull.IsWorkInProgress(ctx) {
Expand Down
2 changes: 1 addition & 1 deletion templates/repo/commits_table.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<div class="commits-table-left tw-flex tw-items-center">
{{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}}
Expand Down
17 changes: 10 additions & 7 deletions templates/repo/diff/compare.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -173,10 +173,9 @@
</div>
</div>

{{$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}}
<div class="ui segment">
{{if $allowCreatePR}}
{{ctx.Locale.Tr "repo.pulls.nothing_to_compare_and_allow_empty_pr"}}
Expand Down Expand Up @@ -216,16 +215,20 @@
</div>
{{end}}
{{else}}{{/* not singed-in or not for pull-request */}}
{{if not .CommitCount}}
{{if .DiffNotAvailable}}
<div class="ui segment">{{ctx.Locale.Tr "repo.commits.nothing_to_compare"}}</div>
{{end}}
{{end}}
</div>

{{if $showDiffBox}}
{{if or .CommitCount (not .DiffNotAvailable)}}
<div class="ui container fluid padded tw-my-4">
{{template "repo/commits_table" .}}
{{template "repo/diff/box" .}}
{{if .CommitCount}}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it right?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

{{template "repo/commits_table" .}}
{{end}}
{{if not .DiffNotAvailable}}
{{template "repo/diff/box" .}}
{{end}}
</div>
{{end}}
</div>
Expand Down
71 changes: 71 additions & 0 deletions tests/integration/pull_compare_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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())
})
}
Loading