Skip to content

Commit 23f3d48

Browse files
committed
Merge branch 'main' into link-to-symlink
2 parents 3dbee79 + eba9c0c commit 23f3d48

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+704
-212
lines changed

custom/conf/app.example.ini

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1067,6 +1067,9 @@ LEVEL = Info
10671067
;;
10681068
;; In addition to testing patches using the three-way merge method, re-test conflicting patches with git apply
10691069
;TEST_CONFLICTING_PATCHES_WITH_GIT_APPLY = false
1070+
;;
1071+
;; Retarget child pull requests to the parent pull request branch target on merge of parent pull request. It only works on merged PRs where the head and base branch target the same repo.
1072+
;RETARGET_CHILDREN_ON_MERGE = true
10701073

10711074
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10721075
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

docs/content/administration/config-cheat-sheet.en-us.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ In addition, there is _`StaticRootPath`_ which can be set as a built-in at build
135135
- `POPULATE_SQUASH_COMMENT_WITH_COMMIT_MESSAGES`: **false**: In default squash-merge messages include the commit message of all commits comprising the pull request.
136136
- `ADD_CO_COMMITTER_TRAILERS`: **true**: Add co-authored-by and co-committed-by trailers to merge commit messages if committer does not match author.
137137
- `TEST_CONFLICTING_PATCHES_WITH_GIT_APPLY`: **false**: PR patches are tested using a three-way merge method to discover if there are conflicts. If this setting is set to **true**, conflicting patches will be retested using `git apply` - This was the previous behaviour in 1.18 (and earlier) but is somewhat inefficient. Please report if you find that this setting is required.
138+
- `RETARGET_CHILDREN_ON_MERGE`: **true**: Retarget child pull requests to the parent pull request branch target on merge of parent pull request. It only works on merged PRs where the head and base branch target the same repo.
138139

139140
### Repository - Issue (`repository.issue`)
140141

docs/content/installation/comparison.en-us.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ _Symbols used in table:_
5252
| Markdown support |||||||||
5353
| CSV support |||||||||
5454
| 'GitHub / GitLab pages' | [⚙️][gitea-pages-server], [⚙️][gitea-caddy-plugin] ||||||||
55+
| Gists / Snippets | [⚙️][opengist] ||||||||
5556
| Repo-specific wiki (as a repo itself) |||||| / |||
5657
| Deploy Tokens |||||||||
5758
| Repository Tokens with write rights |||||||||
@@ -147,3 +148,4 @@ _Symbols used in table:_
147148

148149
[gitea-caddy-plugin]: https://github.com/42wim/caddy-gitea
149150
[gitea-pages-server]: https://codeberg.org/Codeberg/pages-server
151+
[opengist]: https://github.com/thomiceli/opengist

models/fixtures/repo_unit.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,3 +669,10 @@
669669
type: 10
670670
config: "{}"
671671
created_unix: 946684810
672+
673+
-
674+
id: 101
675+
repo_id: 59
676+
type: 1
677+
config: "{}"
678+
created_unix: 946684810

models/fixtures/repository.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1693,3 +1693,16 @@
16931693
size: 0
16941694
is_fsck_enabled: true
16951695
close_issues_via_commit_in_any_branch: false
1696+
1697+
-
1698+
id: 59
1699+
owner_id: 2
1700+
owner_name: user2
1701+
lower_name: test_commit_revert
1702+
name: test_commit_revert
1703+
default_branch: main
1704+
is_empty: false
1705+
is_archived: false
1706+
is_private: true
1707+
status: 0
1708+
num_issues: 0

models/fixtures/user.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
num_followers: 2
6767
num_following: 1
6868
num_stars: 2
69-
num_repos: 14
69+
num_repos: 15
7070
num_teams: 0
7171
num_members: 0
7272
visibility: 0

models/git/commit_status.go

Lines changed: 19 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import (
2525
"code.gitea.io/gitea/modules/translation"
2626

2727
"xorm.io/builder"
28-
"xorm.io/xorm"
2928
)
3029

3130
// CommitStatus holds a single Status of a single Commit
@@ -221,57 +220,42 @@ func CalcCommitStatus(statuses []*CommitStatus) *CommitStatus {
221220
// CommitStatusOptions holds the options for query commit statuses
222221
type CommitStatusOptions struct {
223222
db.ListOptions
223+
RepoID int64
224+
SHA string
224225
State string
225226
SortType string
226227
}
227228

228-
// GetCommitStatuses returns all statuses for a given commit.
229-
func GetCommitStatuses(ctx context.Context, repo *repo_model.Repository, sha string, opts *CommitStatusOptions) ([]*CommitStatus, int64, error) {
230-
if opts.Page <= 0 {
231-
opts.Page = 1
232-
}
233-
if opts.PageSize <= 0 {
234-
opts.Page = setting.ItemsPerPage
235-
}
236-
237-
countSession := listCommitStatusesStatement(ctx, repo, sha, opts)
238-
countSession = db.SetSessionPagination(countSession, opts)
239-
maxResults, err := countSession.Count(new(CommitStatus))
240-
if err != nil {
241-
log.Error("Count PRs: %v", err)
242-
return nil, maxResults, err
229+
func (opts *CommitStatusOptions) ToConds() builder.Cond {
230+
var cond builder.Cond = builder.Eq{
231+
"repo_id": opts.RepoID,
232+
"sha": opts.SHA,
243233
}
244234

245-
statuses := make([]*CommitStatus, 0, opts.PageSize)
246-
findSession := listCommitStatusesStatement(ctx, repo, sha, opts)
247-
findSession = db.SetSessionPagination(findSession, opts)
248-
sortCommitStatusesSession(findSession, opts.SortType)
249-
return statuses, maxResults, findSession.Find(&statuses)
250-
}
251-
252-
func listCommitStatusesStatement(ctx context.Context, repo *repo_model.Repository, sha string, opts *CommitStatusOptions) *xorm.Session {
253-
sess := db.GetEngine(ctx).Where("repo_id = ?", repo.ID).And("sha = ?", sha)
254235
switch opts.State {
255236
case "pending", "success", "error", "failure", "warning":
256-
sess.And("state = ?", opts.State)
237+
cond = cond.And(builder.Eq{
238+
"state": opts.State,
239+
})
257240
}
258-
return sess
241+
242+
return cond
259243
}
260244

261-
func sortCommitStatusesSession(sess *xorm.Session, sortType string) {
262-
switch sortType {
245+
func (opts *CommitStatusOptions) ToOrders() string {
246+
switch opts.SortType {
263247
case "oldest":
264-
sess.Asc("created_unix")
248+
return "created_unix ASC"
265249
case "recentupdate":
266-
sess.Desc("updated_unix")
250+
return "updated_unix DESC"
267251
case "leastupdate":
268-
sess.Asc("updated_unix")
252+
return "updated_unix ASC"
269253
case "leastindex":
270-
sess.Desc("index")
254+
return "`index` DESC"
271255
case "highestindex":
272-
sess.Asc("index")
256+
return "`index` ASC"
273257
default:
274-
sess.Desc("created_unix")
258+
return "created_unix DESC"
275259
}
276260
}
277261

models/git/commit_status_test.go

Lines changed: 129 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,11 @@ func TestGetCommitStatuses(t *testing.T) {
2222

2323
sha1 := "1234123412341234123412341234123412341234"
2424

25-
statuses, maxResults, err := git_model.GetCommitStatuses(db.DefaultContext, repo1, sha1, &git_model.CommitStatusOptions{ListOptions: db.ListOptions{Page: 1, PageSize: 50}})
25+
statuses, maxResults, err := db.FindAndCount[git_model.CommitStatus](db.DefaultContext, &git_model.CommitStatusOptions{
26+
ListOptions: db.ListOptions{Page: 1, PageSize: 50},
27+
RepoID: repo1.ID,
28+
SHA: sha1,
29+
})
2630
assert.NoError(t, err)
2731
assert.Equal(t, int(maxResults), 5)
2832
assert.Len(t, statuses, 5)
@@ -46,4 +50,128 @@ func TestGetCommitStatuses(t *testing.T) {
4650
assert.Equal(t, "deploy/awesomeness", statuses[4].Context)
4751
assert.Equal(t, structs.CommitStatusError, statuses[4].State)
4852
assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[4].APIURL(db.DefaultContext))
53+
54+
statuses, maxResults, err = db.FindAndCount[git_model.CommitStatus](db.DefaultContext, &git_model.CommitStatusOptions{
55+
ListOptions: db.ListOptions{Page: 2, PageSize: 50},
56+
RepoID: repo1.ID,
57+
SHA: sha1,
58+
})
59+
assert.NoError(t, err)
60+
assert.Equal(t, int(maxResults), 5)
61+
assert.Empty(t, statuses)
62+
}
63+
64+
func Test_CalcCommitStatus(t *testing.T) {
65+
kases := []struct {
66+
statuses []*git_model.CommitStatus
67+
expected *git_model.CommitStatus
68+
}{
69+
{
70+
statuses: []*git_model.CommitStatus{
71+
{
72+
State: structs.CommitStatusPending,
73+
},
74+
},
75+
expected: &git_model.CommitStatus{
76+
State: structs.CommitStatusPending,
77+
},
78+
},
79+
{
80+
statuses: []*git_model.CommitStatus{
81+
{
82+
State: structs.CommitStatusSuccess,
83+
},
84+
{
85+
State: structs.CommitStatusPending,
86+
},
87+
},
88+
expected: &git_model.CommitStatus{
89+
State: structs.CommitStatusPending,
90+
},
91+
},
92+
{
93+
statuses: []*git_model.CommitStatus{
94+
{
95+
State: structs.CommitStatusSuccess,
96+
},
97+
{
98+
State: structs.CommitStatusPending,
99+
},
100+
{
101+
State: structs.CommitStatusSuccess,
102+
},
103+
},
104+
expected: &git_model.CommitStatus{
105+
State: structs.CommitStatusPending,
106+
},
107+
},
108+
{
109+
statuses: []*git_model.CommitStatus{
110+
{
111+
State: structs.CommitStatusError,
112+
},
113+
{
114+
State: structs.CommitStatusPending,
115+
},
116+
{
117+
State: structs.CommitStatusSuccess,
118+
},
119+
},
120+
expected: &git_model.CommitStatus{
121+
State: structs.CommitStatusError,
122+
},
123+
},
124+
{
125+
statuses: []*git_model.CommitStatus{
126+
{
127+
State: structs.CommitStatusWarning,
128+
},
129+
{
130+
State: structs.CommitStatusPending,
131+
},
132+
{
133+
State: structs.CommitStatusSuccess,
134+
},
135+
},
136+
expected: &git_model.CommitStatus{
137+
State: structs.CommitStatusWarning,
138+
},
139+
},
140+
{
141+
statuses: []*git_model.CommitStatus{
142+
{
143+
State: structs.CommitStatusSuccess,
144+
},
145+
{
146+
State: structs.CommitStatusSuccess,
147+
},
148+
{
149+
State: structs.CommitStatusSuccess,
150+
},
151+
},
152+
expected: &git_model.CommitStatus{
153+
State: structs.CommitStatusSuccess,
154+
},
155+
},
156+
{
157+
statuses: []*git_model.CommitStatus{
158+
{
159+
State: structs.CommitStatusFailure,
160+
},
161+
{
162+
State: structs.CommitStatusError,
163+
},
164+
{
165+
State: structs.CommitStatusWarning,
166+
},
167+
},
168+
expected: &git_model.CommitStatus{
169+
State: structs.CommitStatusError,
170+
},
171+
},
172+
}
173+
174+
for _, kase := range kases {
175+
assert.Equal(t, kase.expected, git_model.CalcCommitStatus(kase.statuses))
176+
}
49177
}

models/issues/tracked_time.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ func GetTrackedTimeByID(ctx context.Context, id int64) (*TrackedTime, error) {
340340
}
341341

342342
// GetIssueTotalTrackedTime returns the total tracked time for issues by given conditions.
343-
func GetIssueTotalTrackedTime(ctx context.Context, opts *IssuesOptions, isClosed bool) (int64, error) {
343+
func GetIssueTotalTrackedTime(ctx context.Context, opts *IssuesOptions, isClosed util.OptionalBool) (int64, error) {
344344
if len(opts.IssueIDs) <= MaxQueryParameters {
345345
return getIssueTotalTrackedTimeChunk(ctx, opts, isClosed, opts.IssueIDs)
346346
}
@@ -363,7 +363,7 @@ func GetIssueTotalTrackedTime(ctx context.Context, opts *IssuesOptions, isClosed
363363
return accum, nil
364364
}
365365

366-
func getIssueTotalTrackedTimeChunk(ctx context.Context, opts *IssuesOptions, isClosed bool, issueIDs []int64) (int64, error) {
366+
func getIssueTotalTrackedTimeChunk(ctx context.Context, opts *IssuesOptions, isClosed util.OptionalBool, issueIDs []int64) (int64, error) {
367367
sumSession := func(opts *IssuesOptions, issueIDs []int64) *xorm.Session {
368368
sess := db.GetEngine(ctx).
369369
Table("tracked_time").
@@ -377,7 +377,9 @@ func getIssueTotalTrackedTimeChunk(ctx context.Context, opts *IssuesOptions, isC
377377
Time int64
378378
}
379379

380-
return sumSession(opts, issueIDs).
381-
And("issue.is_closed = ?", isClosed).
382-
SumInt(new(trackedTime), "tracked_time.time")
380+
session := sumSession(opts, issueIDs)
381+
if !isClosed.IsNone() {
382+
session = session.And("issue.is_closed = ?", isClosed.IsTrue())
383+
}
384+
return session.SumInt(new(trackedTime), "tracked_time.time")
383385
}

models/issues/tracked_time_test.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
issues_model "code.gitea.io/gitea/models/issues"
1212
"code.gitea.io/gitea/models/unittest"
1313
user_model "code.gitea.io/gitea/models/user"
14+
"code.gitea.io/gitea/modules/util"
1415

1516
"github.com/stretchr/testify/assert"
1617
)
@@ -119,11 +120,15 @@ func TestTotalTimesForEachUser(t *testing.T) {
119120
func TestGetIssueTotalTrackedTime(t *testing.T) {
120121
assert.NoError(t, unittest.PrepareTestDatabase())
121122

122-
ttt, err := issues_model.GetIssueTotalTrackedTime(db.DefaultContext, &issues_model.IssuesOptions{MilestoneIDs: []int64{1}}, false)
123+
ttt, err := issues_model.GetIssueTotalTrackedTime(db.DefaultContext, &issues_model.IssuesOptions{MilestoneIDs: []int64{1}}, util.OptionalBoolFalse)
123124
assert.NoError(t, err)
124125
assert.EqualValues(t, 3682, ttt)
125126

126-
ttt, err = issues_model.GetIssueTotalTrackedTime(db.DefaultContext, &issues_model.IssuesOptions{MilestoneIDs: []int64{1}}, true)
127+
ttt, err = issues_model.GetIssueTotalTrackedTime(db.DefaultContext, &issues_model.IssuesOptions{MilestoneIDs: []int64{1}}, util.OptionalBoolTrue)
127128
assert.NoError(t, err)
128129
assert.EqualValues(t, 0, ttt)
130+
131+
ttt, err = issues_model.GetIssueTotalTrackedTime(db.DefaultContext, &issues_model.IssuesOptions{MilestoneIDs: []int64{1}}, util.OptionalBoolNone)
132+
assert.NoError(t, err)
133+
assert.EqualValues(t, 3682, ttt)
129134
}

0 commit comments

Comments
 (0)