Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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
5 changes: 5 additions & 0 deletions services/repository/branch.go
Original file line number Diff line number Diff line change
Expand Up @@ -663,6 +663,11 @@ func SetRepoDefaultBranch(ctx context.Context, repo *repo_model.Repository, newB
}
}

// clear divergence cache
if err := DelRepoDivergenceFromCache(ctx, repo.ID); err != nil {
log.Error("DelRepoDivergenceFromCache: %v", err)
}

notify_service.ChangeDefaultBranch(ctx, repo)

return nil
Expand Down
97 changes: 97 additions & 0 deletions tests/integration/change_default_branch_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,16 @@ package integration
import (
"fmt"
"net/http"
"strconv"
"testing"

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"
"code.gitea.io/gitea/tests"

"github.com/stretchr/testify/assert"
)

func TestChangeDefaultBranch(t *testing.T) {
Expand All @@ -38,3 +42,96 @@ func TestChangeDefaultBranch(t *testing.T) {
})
session.MakeRequest(t, req, http.StatusNotFound)
}

func checkDivergence(t *testing.T, session *TestSession, branchesURL, expectedDefaultBranch string, expectedBranchToDivergence map[string]git.DivergeObject) {
req := NewRequest(t, "GET", branchesURL)
resp := session.MakeRequest(t, req, http.StatusOK)

htmlDoc := NewHTMLParser(t, resp.Body)

branchNodes := htmlDoc.doc.Find(".gt-ellipsis").Nodes
Copy link
Member

@silverwind silverwind May 7, 2025

Choose a reason for hiding this comment

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

This class selector is too unspecific. Can you maybe add a new unique class to the elements in question and select on that?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I added a new .branch-name class to branch name elements in the branch list template, and updated integration test accordingly.

Copy link
Contributor

Choose a reason for hiding this comment

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

I added a new .branch-name class to branch name elements in the branch list template, and updated integration test accordingly.

I suggest left a comment like something that branch-name is used for tests, do not remove.

Copy link
Member

Choose a reason for hiding this comment

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

I suggest left a comment like something that branch-name is used for tests, do not remove.

Not strictly needed imho, but nice to have because one will notice anyways when the test starts to fail.

branchNames := []string{}
for _, node := range branchNodes {
branchNames = append(branchNames, node.FirstChild.Data)
}

expectBranchCount := len(expectedBranchToDivergence)

assert.Len(t, branchNames, expectBranchCount+1)
assert.Equal(t, expectedDefaultBranch, branchNames[0])

allCountBehindNodes := htmlDoc.doc.Find(".count-behind").Nodes
allCountAheadNodes := htmlDoc.doc.Find(".count-ahead").Nodes

assert.Len(t, allCountAheadNodes, expectBranchCount)
assert.Len(t, allCountBehindNodes, expectBranchCount)

for i := range expectBranchCount {
branchName := branchNames[i+1]
assert.Contains(t, expectedBranchToDivergence, branchName)

expectedCountAhead := expectedBranchToDivergence[branchName].Ahead
expectedCountBehind := expectedBranchToDivergence[branchName].Behind
countAhead, err := strconv.Atoi(allCountAheadNodes[i].FirstChild.Data)
assert.NoError(t, err)
countBehind, err := strconv.Atoi(allCountBehindNodes[i].FirstChild.Data)
assert.NoError(t, err)

assert.Equal(t, expectedCountAhead, countAhead)
assert.Equal(t, expectedCountBehind, countBehind)
}
}

func TestChangeDefaultBranchDivergence(t *testing.T) {
defer tests.PrepareTestEnv(t)()
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 16})
owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})

session := loginUser(t, owner.Name)
branchesURL := fmt.Sprintf("/%s/%s/branches", owner.Name, repo.Name)
settingsBranchesURL := fmt.Sprintf("/%s/%s/settings/branches", owner.Name, repo.Name)

// check branch divergence before switching default branch
expectedBranchToDivergenceBefore := map[string]git.DivergeObject{
"not-signed": {
Ahead: 0,
Behind: 0,
},
"good-sign-not-yet-validated": {
Ahead: 0,
Behind: 1,
},
"good-sign": {
Ahead: 1,
Behind: 3,
},
}
checkDivergence(t, session, branchesURL, "master", expectedBranchToDivergenceBefore)

// switch default branch
newDefaultBranch := "good-sign-not-yet-validated"
csrf := GetUserCSRFToken(t, session)
req := NewRequestWithValues(t, "POST", settingsBranchesURL, map[string]string{
"_csrf": csrf,
"action": "default_branch",
"branch": newDefaultBranch,
})
session.MakeRequest(t, req, http.StatusSeeOther)

// check branch divergence after switching default branch
expectedBranchToDivergenceAfter := map[string]git.DivergeObject{
"master": {
Ahead: 1,
Behind: 0,
},
"not-signed": {
Ahead: 1,
Behind: 0,
},
"good-sign": {
Ahead: 1,
Behind: 2,
},
}
checkDivergence(t, session, branchesURL, newDefaultBranch, expectedBranchToDivergenceAfter)
}