mirror of
https://github.com/go-gitea/gitea.git
synced 2026-04-20 20:58:52 +02:00
In manual merge detected changes, the pushing user should be the
de-facto author of the merge, not the committer. For ff-only merges, the
author (PR owner) often have nothing to do with the merger. Similarly,
even if a merge commit exists, it does not indicate that the merge
commit author is the merger. This is especially true if the merge commit
is a ff-only merge on a given branch.
If pusher is for some reason unavailable, we fall back to the old method
of using committer or owning organization as the author.
---------
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
76 lines
2.8 KiB
Go
76 lines
2.8 KiB
Go
// Copyright 2026 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package integration
|
|
|
|
import (
|
|
"fmt"
|
|
"net/url"
|
|
"testing"
|
|
"time"
|
|
|
|
auth_model "code.gitea.io/gitea/models/auth"
|
|
issues_model "code.gitea.io/gitea/models/issues"
|
|
"code.gitea.io/gitea/models/unittest"
|
|
user_model "code.gitea.io/gitea/models/user"
|
|
"code.gitea.io/gitea/modules/setting"
|
|
api "code.gitea.io/gitea/modules/structs"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestManualMergeAutodetect(t *testing.T) {
|
|
onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) {
|
|
// user2 is the repo owner
|
|
// user1 is the pusher/merger
|
|
user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
|
|
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
|
session2 := loginUser(t, user2.Name)
|
|
|
|
// Create a repo owned by user2
|
|
repoName := "manual-merge-autodetect"
|
|
defaultBranch := setting.Repository.DefaultBranch
|
|
user2Ctx := NewAPITestContext(t, user2.Name, repoName, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser)
|
|
doAPICreateRepository(user2Ctx, false)(t)
|
|
|
|
// Enable autodetect manual merge
|
|
doAPIEditRepository(user2Ctx, &api.EditRepoOption{
|
|
HasPullRequests: new(true),
|
|
AllowManualMerge: new(true),
|
|
AutodetectManualMerge: new(true),
|
|
})(t)
|
|
|
|
// Create a PR from a branch
|
|
branchName := "feature"
|
|
testEditFileToNewBranch(t, session2, user2.Name, repoName, defaultBranch, branchName, "README.md", "Manual Merge Test")
|
|
|
|
apiPull, err := doAPICreatePullRequest(NewAPITestContext(t, user1.Name, repoName, auth_model.AccessTokenScopeWriteRepository), user2.Name, repoName, defaultBranch, branchName)(t)
|
|
assert.NoError(t, err)
|
|
|
|
// user1 clones and pushes the branch to master (fast-forward)
|
|
dstPath := t.TempDir()
|
|
u, _ := url.Parse(giteaURL.String())
|
|
u.Path = fmt.Sprintf("%s/%s.git", user2.Name, repoName)
|
|
u.User = url.UserPassword(user1.Name, userPassword)
|
|
|
|
doGitClone(dstPath, u)(t)
|
|
doGitMerge(dstPath, "origin/"+branchName)(t)
|
|
doGitPushTestRepository(dstPath, "origin", defaultBranch)(t)
|
|
|
|
// Wait for the PR to be marked as merged by the background task
|
|
var pr *issues_model.PullRequest
|
|
require.Eventually(t, func() bool {
|
|
pr = unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: apiPull.ID})
|
|
return pr.HasMerged
|
|
}, 10*time.Second, 100*time.Millisecond)
|
|
|
|
// Check if the PR is merged and who is the merger
|
|
pr = unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: apiPull.ID})
|
|
assert.True(t, pr.HasMerged)
|
|
assert.Equal(t, issues_model.PullRequestStatusManuallyMerged, pr.Status)
|
|
// Merger should be user1 (the pusher), not the commit author (user2) or repo owner (user2)
|
|
assert.Equal(t, user1.ID, pr.MergerID)
|
|
})
|
|
}
|