Skip to content

Commit 9836fb6

Browse files
committed
Merge branch 'main' into fix_cargo_rename_deps
2 parents d46a559 + f35e2b0 commit 9836fb6

File tree

182 files changed

+6078
-5484
lines changed

Some content is hidden

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

182 files changed

+6078
-5484
lines changed

custom/conf/app.example.ini

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1007,6 +1007,14 @@ LEVEL = Info
10071007
;; The set of allowed values and rules are the same as DEFAULT_REPO_UNITS.
10081008
;DEFAULT_FORK_REPO_UNITS = repo.code,repo.pulls
10091009
;;
1010+
;; Comma separated list of default mirror repo units.
1011+
;; The set of allowed values and rules are the same as DEFAULT_REPO_UNITS.
1012+
;DEFAULT_MIRROR_REPO_UNITS = repo.code,repo.releases,repo.issues,repo.wiki,repo.projects,repo.packages
1013+
;;
1014+
;; Comma separated list of default template repo units.
1015+
;; The set of allowed values and rules are the same as DEFAULT_REPO_UNITS.
1016+
;DEFAULT_TEMPLATE_REPO_UNITS = repo.code,repo.releases,repo.issues,repo.pulls,repo.wiki,repo.projects,repo.packages
1017+
;;
10101018
;; Prefix archive files by placing them in a directory named after the repository
10111019
;PREFIX_ARCHIVE_FILES = true
10121020
;;

models/actions/task.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ func UpdateTask(ctx context.Context, task *ActionTask, cols ...string) error {
341341
// UpdateTaskByState updates the task by the state.
342342
// It will always update the task if the state is not final, even there is no change.
343343
// So it will update ActionTask.Updated to avoid the task being judged as a zombie task.
344-
func UpdateTaskByState(ctx context.Context, state *runnerv1.TaskState) (*ActionTask, error) {
344+
func UpdateTaskByState(ctx context.Context, runnerID int64, state *runnerv1.TaskState) (*ActionTask, error) {
345345
stepStates := map[int64]*runnerv1.StepState{}
346346
for _, v := range state.Steps {
347347
stepStates[v.Id] = v
@@ -360,6 +360,8 @@ func UpdateTaskByState(ctx context.Context, state *runnerv1.TaskState) (*ActionT
360360
return nil, err
361361
} else if !has {
362362
return nil, util.ErrNotExist
363+
} else if runnerID != task.RunnerID {
364+
return nil, fmt.Errorf("invalid runner for task")
363365
}
364366

365367
if task.Status.IsDone() {

models/activities/action.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,10 @@ func (a *Action) TableIndices() []*schemas.Index {
171171
cudIndex := schemas.NewIndex("c_u_d", schemas.IndexType)
172172
cudIndex.AddColumn("created_unix", "user_id", "is_deleted")
173173

174-
indices := []*schemas.Index{actUserIndex, repoIndex, cudIndex}
174+
cuIndex := schemas.NewIndex("c_u", schemas.IndexType)
175+
cuIndex.AddColumn("user_id", "is_deleted")
176+
177+
indices := []*schemas.Index{actUserIndex, repoIndex, cudIndex, cuIndex}
175178

176179
return indices
177180
}

models/migrations/migrations.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,7 @@ func prepareMigrationTasks() []*migration {
365365
newMigration(305, "Add Repository Licenses", v1_23.AddRepositoryLicenses),
366366
newMigration(306, "Add BlockAdminMergeOverride to ProtectedBranch", v1_23.AddBlockAdminMergeOverrideBranchProtection),
367367
newMigration(307, "Fix milestone deadline_unix when there is no due date", v1_23.FixMilestoneNoDueDate),
368+
newMigration(308, "Add index(user_id, is_deleted) for action table", v1_23.AddNewIndexForUserDashboard),
368369
}
369370
return preparedMigrations
370371
}

models/migrations/v1_23/v308.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
// Copyright 2024 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package v1_23 //nolint
5+
6+
import (
7+
"code.gitea.io/gitea/modules/timeutil"
8+
9+
"xorm.io/xorm"
10+
"xorm.io/xorm/schemas"
11+
)
12+
13+
type improveActionTableIndicesAction struct {
14+
ID int64 `xorm:"pk autoincr"`
15+
UserID int64 `xorm:"INDEX"` // Receiver user id.
16+
OpType int
17+
ActUserID int64 // Action user id.
18+
RepoID int64
19+
CommentID int64 `xorm:"INDEX"`
20+
IsDeleted bool `xorm:"NOT NULL DEFAULT false"`
21+
RefName string
22+
IsPrivate bool `xorm:"NOT NULL DEFAULT false"`
23+
Content string `xorm:"TEXT"`
24+
CreatedUnix timeutil.TimeStamp `xorm:"created"`
25+
}
26+
27+
// TableName sets the name of this table
28+
func (*improveActionTableIndicesAction) TableName() string {
29+
return "action"
30+
}
31+
32+
func (a *improveActionTableIndicesAction) TableIndices() []*schemas.Index {
33+
repoIndex := schemas.NewIndex("r_u_d", schemas.IndexType)
34+
repoIndex.AddColumn("repo_id", "user_id", "is_deleted")
35+
36+
actUserIndex := schemas.NewIndex("au_r_c_u_d", schemas.IndexType)
37+
actUserIndex.AddColumn("act_user_id", "repo_id", "created_unix", "user_id", "is_deleted")
38+
39+
cudIndex := schemas.NewIndex("c_u_d", schemas.IndexType)
40+
cudIndex.AddColumn("created_unix", "user_id", "is_deleted")
41+
42+
cuIndex := schemas.NewIndex("c_u", schemas.IndexType)
43+
cuIndex.AddColumn("user_id", "is_deleted")
44+
45+
indices := []*schemas.Index{actUserIndex, repoIndex, cudIndex, cuIndex}
46+
47+
return indices
48+
}
49+
50+
func AddNewIndexForUserDashboard(x *xorm.Engine) error {
51+
return x.Sync(new(improveActionTableIndicesAction))
52+
}

models/organization/org.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,9 @@ func (org *Organization) LoadTeams(ctx context.Context) ([]*Team, error) {
141141
}
142142

143143
// GetMembers returns all members of organization.
144-
func (org *Organization) GetMembers(ctx context.Context) (user_model.UserList, map[int64]bool, error) {
144+
func (org *Organization) GetMembers(ctx context.Context, doer *user_model.User) (user_model.UserList, map[int64]bool, error) {
145145
return FindOrgMembers(ctx, &FindOrgMembersOpts{
146+
Doer: doer,
146147
OrgID: org.ID,
147148
})
148149
}
@@ -195,16 +196,22 @@ func (org *Organization) CanCreateRepo() bool {
195196
// FindOrgMembersOpts represensts find org members conditions
196197
type FindOrgMembersOpts struct {
197198
db.ListOptions
198-
OrgID int64
199-
PublicOnly bool
199+
Doer *user_model.User
200+
IsDoerMember bool
201+
OrgID int64
202+
}
203+
204+
func (opts FindOrgMembersOpts) PublicOnly() bool {
205+
return opts.Doer == nil || !(opts.IsDoerMember || opts.Doer.IsAdmin)
200206
}
201207

202208
// CountOrgMembers counts the organization's members
203209
func CountOrgMembers(ctx context.Context, opts *FindOrgMembersOpts) (int64, error) {
204210
sess := db.GetEngine(ctx).Where("org_id=?", opts.OrgID)
205-
if opts.PublicOnly {
211+
if opts.PublicOnly() {
206212
sess.And("is_public = ?", true)
207213
}
214+
208215
return sess.Count(new(OrgUser))
209216
}
210217

@@ -525,9 +532,10 @@ func GetOrgsCanCreateRepoByUserID(ctx context.Context, userID int64) ([]*Organiz
525532
// GetOrgUsersByOrgID returns all organization-user relations by organization ID.
526533
func GetOrgUsersByOrgID(ctx context.Context, opts *FindOrgMembersOpts) ([]*OrgUser, error) {
527534
sess := db.GetEngine(ctx).Where("org_id=?", opts.OrgID)
528-
if opts.PublicOnly {
535+
if opts.PublicOnly() {
529536
sess.And("is_public = ?", true)
530537
}
538+
531539
if opts.ListOptions.PageSize > 0 {
532540
sess = db.SetSessionPagination(sess, opts)
533541

models/organization/org_test.go

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package organization_test
55

66
import (
7+
"sort"
78
"testing"
89

910
"code.gitea.io/gitea/models/db"
@@ -103,7 +104,7 @@ func TestUser_GetTeams(t *testing.T) {
103104
func TestUser_GetMembers(t *testing.T) {
104105
assert.NoError(t, unittest.PrepareTestDatabase())
105106
org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3})
106-
members, _, err := org.GetMembers(db.DefaultContext)
107+
members, _, err := org.GetMembers(db.DefaultContext, &user_model.User{IsAdmin: true})
107108
assert.NoError(t, err)
108109
if assert.Len(t, members, 3) {
109110
assert.Equal(t, int64(2), members[0].ID)
@@ -210,37 +211,42 @@ func TestFindOrgs(t *testing.T) {
210211
func TestGetOrgUsersByOrgID(t *testing.T) {
211212
assert.NoError(t, unittest.PrepareTestDatabase())
212213

213-
orgUsers, err := organization.GetOrgUsersByOrgID(db.DefaultContext, &organization.FindOrgMembersOpts{
214-
ListOptions: db.ListOptions{},
215-
OrgID: 3,
216-
PublicOnly: false,
214+
opts := &organization.FindOrgMembersOpts{
215+
Doer: &user_model.User{IsAdmin: true},
216+
OrgID: 3,
217+
}
218+
assert.False(t, opts.PublicOnly())
219+
orgUsers, err := organization.GetOrgUsersByOrgID(db.DefaultContext, opts)
220+
assert.NoError(t, err)
221+
sort.Slice(orgUsers, func(i, j int) bool {
222+
return orgUsers[i].ID < orgUsers[j].ID
217223
})
224+
assert.EqualValues(t, []*organization.OrgUser{{
225+
ID: 1,
226+
OrgID: 3,
227+
UID: 2,
228+
IsPublic: true,
229+
}, {
230+
ID: 2,
231+
OrgID: 3,
232+
UID: 4,
233+
IsPublic: false,
234+
}, {
235+
ID: 9,
236+
OrgID: 3,
237+
UID: 28,
238+
IsPublic: true,
239+
}}, orgUsers)
240+
241+
opts = &organization.FindOrgMembersOpts{OrgID: 3}
242+
assert.True(t, opts.PublicOnly())
243+
orgUsers, err = organization.GetOrgUsersByOrgID(db.DefaultContext, opts)
218244
assert.NoError(t, err)
219-
if assert.Len(t, orgUsers, 3) {
220-
assert.Equal(t, organization.OrgUser{
221-
ID: orgUsers[0].ID,
222-
OrgID: 3,
223-
UID: 2,
224-
IsPublic: true,
225-
}, *orgUsers[0])
226-
assert.Equal(t, organization.OrgUser{
227-
ID: orgUsers[1].ID,
228-
OrgID: 3,
229-
UID: 4,
230-
IsPublic: false,
231-
}, *orgUsers[1])
232-
assert.Equal(t, organization.OrgUser{
233-
ID: orgUsers[2].ID,
234-
OrgID: 3,
235-
UID: 28,
236-
IsPublic: true,
237-
}, *orgUsers[2])
238-
}
245+
assert.Len(t, orgUsers, 2)
239246

240247
orgUsers, err = organization.GetOrgUsersByOrgID(db.DefaultContext, &organization.FindOrgMembersOpts{
241248
ListOptions: db.ListOptions{},
242249
OrgID: unittest.NonexistentID,
243-
PublicOnly: false,
244250
})
245251
assert.NoError(t, err)
246252
assert.Len(t, orgUsers, 0)

models/organization/org_user_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ func TestUserListIsPublicMember(t *testing.T) {
9494
func testUserListIsPublicMember(t *testing.T, orgID int64, expected map[int64]bool) {
9595
org, err := organization.GetOrgByID(db.DefaultContext, orgID)
9696
assert.NoError(t, err)
97-
_, membersIsPublic, err := org.GetMembers(db.DefaultContext)
97+
_, membersIsPublic, err := org.GetMembers(db.DefaultContext, &user_model.User{IsAdmin: true})
9898
assert.NoError(t, err)
9999
assert.Equal(t, expected, membersIsPublic)
100100
}
@@ -121,7 +121,7 @@ func TestUserListIsUserOrgOwner(t *testing.T) {
121121
func testUserListIsUserOrgOwner(t *testing.T, orgID int64, expected map[int64]bool) {
122122
org, err := organization.GetOrgByID(db.DefaultContext, orgID)
123123
assert.NoError(t, err)
124-
members, _, err := org.GetMembers(db.DefaultContext)
124+
members, _, err := org.GetMembers(db.DefaultContext, &user_model.User{IsAdmin: true})
125125
assert.NoError(t, err)
126126
assert.Equal(t, expected, organization.IsUserOrgOwner(db.DefaultContext, members, orgID))
127127
}

models/perm/access_mode.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,6 @@ func ParseAccessMode(permission string, allowed ...AccessMode) AccessMode {
6060
}
6161
return util.Iif(slices.Contains(allowed, m), m, AccessModeNone)
6262
}
63+
64+
// ErrInvalidAccessMode is returned when an invalid access mode is used
65+
var ErrInvalidAccessMode = util.NewInvalidArgumentErrorf("Invalid access mode")

models/unit/unit.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,27 @@ var (
8080
TypePullRequests,
8181
}
8282

83+
// DefaultMirrorRepoUnits contains the default unit types for mirrors
84+
DefaultMirrorRepoUnits = []Type{
85+
TypeCode,
86+
TypeIssues,
87+
TypeReleases,
88+
TypeUncyclo,
89+
TypeProjects,
90+
TypePackages,
91+
}
92+
93+
// DefaultTemplateRepoUnits contains the default unit types for templates
94+
DefaultTemplateRepoUnits = []Type{
95+
TypeCode,
96+
TypeIssues,
97+
TypePullRequests,
98+
TypeReleases,
99+
TypeUncyclo,
100+
TypeProjects,
101+
TypePackages,
102+
}
103+
83104
// NotAllowedDefaultRepoUnits contains units that can't be default
84105
NotAllowedDefaultRepoUnits = []Type{
85106
TypeExternalUncyclo,
@@ -147,6 +168,7 @@ func LoadUnitConfig() error {
147168
if len(DefaultRepoUnits) == 0 {
148169
return errors.New("no default repository units found")
149170
}
171+
// default fork repo units
150172
setDefaultForkRepoUnits, invalidKeys := FindUnitTypes(setting.Repository.DefaultForkRepoUnits...)
151173
if len(invalidKeys) > 0 {
152174
log.Warn("Invalid keys in default fork repo units: %s", strings.Join(invalidKeys, ", "))
@@ -155,6 +177,24 @@ func LoadUnitConfig() error {
155177
if len(DefaultForkRepoUnits) == 0 {
156178
return errors.New("no default fork repository units found")
157179
}
180+
// default mirror repo units
181+
setDefaultMirrorRepoUnits, invalidKeys := FindUnitTypes(setting.Repository.DefaultMirrorRepoUnits...)
182+
if len(invalidKeys) > 0 {
183+
log.Warn("Invalid keys in default mirror repo units: %s", strings.Join(invalidKeys, ", "))
184+
}
185+
DefaultMirrorRepoUnits = validateDefaultRepoUnits(DefaultMirrorRepoUnits, setDefaultMirrorRepoUnits)
186+
if len(DefaultMirrorRepoUnits) == 0 {
187+
return errors.New("no default mirror repository units found")
188+
}
189+
// default template repo units
190+
setDefaultTemplateRepoUnits, invalidKeys := FindUnitTypes(setting.Repository.DefaultTemplateRepoUnits...)
191+
if len(invalidKeys) > 0 {
192+
log.Warn("Invalid keys in default template repo units: %s", strings.Join(invalidKeys, ", "))
193+
}
194+
DefaultTemplateRepoUnits = validateDefaultRepoUnits(DefaultTemplateRepoUnits, setDefaultTemplateRepoUnits)
195+
if len(DefaultTemplateRepoUnits) == 0 {
196+
return errors.New("no default template repository units found")
197+
}
158198
return nil
159199
}
160200

modules/base/tool.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ func StringsToInt64s(strs []string) ([]int64, error) {
147147
}
148148
ints := make([]int64, 0, len(strs))
149149
for _, s := range strs {
150+
if s == "" {
151+
continue
152+
}
150153
n, err := strconv.ParseInt(s, 10, 64)
151154
if err != nil {
152155
return nil, err

modules/base/tool_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ func TestStringsToInt64s(t *testing.T) {
152152
}
153153
testSuccess(nil, nil)
154154
testSuccess([]string{}, []int64{})
155+
testSuccess([]string{""}, []int64{})
155156
testSuccess([]string{"-1234"}, []int64{-1234})
156157
testSuccess([]string{"1", "4", "16", "64", "256"}, []int64{1, 4, 16, 64, 256})
157158

modules/container/set.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ func (s Set[T]) AddMultiple(values ...T) {
3131
}
3232
}
3333

34-
// Contains determines whether a set contains the specified elements.
35-
// Returns true if the set contains the specified element; otherwise, false.
34+
// Contains determines whether a set contains all these elements.
35+
// Returns true if the set contains all these elements; otherwise, false.
3636
func (s Set[T]) Contains(values ...T) bool {
3737
ret := true
3838
for _, value := range values {

modules/container/set_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ func TestSet(t *testing.T) {
1818

1919
assert.True(t, s.Contains("key1"))
2020
assert.True(t, s.Contains("key2"))
21+
assert.True(t, s.Contains("key1", "key2"))
2122
assert.False(t, s.Contains("key3"))
23+
assert.False(t, s.Contains("key1", "key3"))
2224

2325
assert.True(t, s.Remove("key2"))
2426
assert.False(t, s.Contains("key2"))

modules/indexer/code/bleve/bleve.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
"github.com/blevesearch/bleve/v2/analysis/token/camelcase"
3232
"github.com/blevesearch/bleve/v2/analysis/token/lowercase"
3333
"github.com/blevesearch/bleve/v2/analysis/token/unicodenorm"
34+
"github.com/blevesearch/bleve/v2/analysis/tokenizer/letter"
3435
"github.com/blevesearch/bleve/v2/analysis/tokenizer/unicode"
3536
"github.com/blevesearch/bleve/v2/mapping"
3637
"github.com/blevesearch/bleve/v2/search/query"
@@ -69,7 +70,7 @@ const (
6970
filenameIndexerAnalyzer = "filenameIndexerAnalyzer"
7071
filenameIndexerTokenizer = "filenameIndexerTokenizer"
7172
repoIndexerDocType = "repoIndexerDocType"
72-
repoIndexerLatestVersion = 7
73+
repoIndexerLatestVersion = 8
7374
)
7475

7576
// generateBleveIndexMapping generates a bleve index mapping for the repo indexer
@@ -105,7 +106,7 @@ func generateBleveIndexMapping() (mapping.IndexMapping, error) {
105106
} else if err := mapping.AddCustomAnalyzer(repoIndexerAnalyzer, map[string]any{
106107
"type": analyzer_custom.Name,
107108
"char_filters": []string{},
108-
"tokenizer": unicode.Name,
109+
"tokenizer": letter.Name,
109110
"token_filters": []string{unicodeNormalizeName, camelcase.Name, lowercase.Name},
110111
}); err != nil {
111112
return nil, err

0 commit comments

Comments
 (0)