Skip to content

Commit f3fbb7c

Browse files
authored
Count only visible repos on profile (#25928)
Fixes #25914
1 parent 7e382a5 commit f3fbb7c

File tree

9 files changed

+211
-106
lines changed

9 files changed

+211
-106
lines changed

models/repo/repo_list.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,11 @@ func SearchRepository(ctx context.Context, opts *SearchRepoOptions) (RepositoryL
522522
return SearchRepositoryByCondition(ctx, opts, cond, true)
523523
}
524524

525+
// CountRepository counts repositories based on search options,
526+
func CountRepository(ctx context.Context, opts *SearchRepoOptions) (int64, error) {
527+
return db.GetEngine(ctx).Where(SearchRepositoryCondition(opts)).Count(new(Repository))
528+
}
529+
525530
// SearchRepositoryByCondition search repositories by condition
526531
func SearchRepositoryByCondition(ctx context.Context, opts *SearchRepoOptions, cond builder.Cond, loadAttributes bool) (RepositoryList, int64, error) {
527532
sess, count, err := searchRepositoryByCondition(ctx, opts, cond)

models/repo/repo_list_test.go

Lines changed: 127 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -15,108 +15,11 @@ import (
1515
"github.com/stretchr/testify/assert"
1616
)
1717

18-
func TestSearchRepository(t *testing.T) {
19-
assert.NoError(t, unittest.PrepareTestDatabase())
20-
21-
// test search public repository on explore page
22-
repos, count, err := repo_model.SearchRepositoryByName(db.DefaultContext, &repo_model.SearchRepoOptions{
23-
ListOptions: db.ListOptions{
24-
Page: 1,
25-
PageSize: 10,
26-
},
27-
Keyword: "repo_12",
28-
Collaborate: util.OptionalBoolFalse,
29-
})
30-
31-
assert.NoError(t, err)
32-
if assert.Len(t, repos, 1) {
33-
assert.Equal(t, "test_repo_12", repos[0].Name)
34-
}
35-
assert.Equal(t, int64(1), count)
36-
37-
repos, count, err = repo_model.SearchRepositoryByName(db.DefaultContext, &repo_model.SearchRepoOptions{
38-
ListOptions: db.ListOptions{
39-
Page: 1,
40-
PageSize: 10,
41-
},
42-
Keyword: "test_repo",
43-
Collaborate: util.OptionalBoolFalse,
44-
})
45-
46-
assert.NoError(t, err)
47-
assert.Equal(t, int64(2), count)
48-
assert.Len(t, repos, 2)
49-
50-
// test search private repository on explore page
51-
repos, count, err = repo_model.SearchRepositoryByName(db.DefaultContext, &repo_model.SearchRepoOptions{
52-
ListOptions: db.ListOptions{
53-
Page: 1,
54-
PageSize: 10,
55-
},
56-
Keyword: "repo_13",
57-
Private: true,
58-
Collaborate: util.OptionalBoolFalse,
59-
})
60-
61-
assert.NoError(t, err)
62-
if assert.Len(t, repos, 1) {
63-
assert.Equal(t, "test_repo_13", repos[0].Name)
64-
}
65-
assert.Equal(t, int64(1), count)
66-
67-
repos, count, err = repo_model.SearchRepositoryByName(db.DefaultContext, &repo_model.SearchRepoOptions{
68-
ListOptions: db.ListOptions{
69-
Page: 1,
70-
PageSize: 10,
71-
},
72-
Keyword: "test_repo",
73-
Private: true,
74-
Collaborate: util.OptionalBoolFalse,
75-
})
76-
77-
assert.NoError(t, err)
78-
assert.Equal(t, int64(3), count)
79-
assert.Len(t, repos, 3)
80-
81-
// Test non existing owner
82-
repos, count, err = repo_model.SearchRepositoryByName(db.DefaultContext, &repo_model.SearchRepoOptions{OwnerID: unittest.NonexistentID})
83-
84-
assert.NoError(t, err)
85-
assert.Empty(t, repos)
86-
assert.Equal(t, int64(0), count)
87-
88-
// Test search within description
89-
repos, count, err = repo_model.SearchRepository(db.DefaultContext, &repo_model.SearchRepoOptions{
90-
ListOptions: db.ListOptions{
91-
Page: 1,
92-
PageSize: 10,
93-
},
94-
Keyword: "description_14",
95-
Collaborate: util.OptionalBoolFalse,
96-
IncludeDescription: true,
97-
})
98-
99-
assert.NoError(t, err)
100-
if assert.Len(t, repos, 1) {
101-
assert.Equal(t, "test_repo_14", repos[0].Name)
102-
}
103-
assert.Equal(t, int64(1), count)
104-
105-
// Test NOT search within description
106-
repos, count, err = repo_model.SearchRepository(db.DefaultContext, &repo_model.SearchRepoOptions{
107-
ListOptions: db.ListOptions{
108-
Page: 1,
109-
PageSize: 10,
110-
},
111-
Keyword: "description_14",
112-
Collaborate: util.OptionalBoolFalse,
113-
IncludeDescription: false,
114-
})
115-
116-
assert.NoError(t, err)
117-
assert.Empty(t, repos)
118-
assert.Equal(t, int64(0), count)
119-
18+
func getTestCases() []struct {
19+
name string
20+
opts *repo_model.SearchRepoOptions
21+
count int
22+
} {
12023
testCases := []struct {
12124
name string
12225
opts *repo_model.SearchRepoOptions
@@ -274,6 +177,113 @@ func TestSearchRepository(t *testing.T) {
274177
},
275178
}
276179

180+
return testCases
181+
}
182+
183+
func TestSearchRepository(t *testing.T) {
184+
assert.NoError(t, unittest.PrepareTestDatabase())
185+
186+
// test search public repository on explore page
187+
repos, count, err := repo_model.SearchRepositoryByName(db.DefaultContext, &repo_model.SearchRepoOptions{
188+
ListOptions: db.ListOptions{
189+
Page: 1,
190+
PageSize: 10,
191+
},
192+
Keyword: "repo_12",
193+
Collaborate: util.OptionalBoolFalse,
194+
})
195+
196+
assert.NoError(t, err)
197+
if assert.Len(t, repos, 1) {
198+
assert.Equal(t, "test_repo_12", repos[0].Name)
199+
}
200+
assert.Equal(t, int64(1), count)
201+
202+
repos, count, err = repo_model.SearchRepositoryByName(db.DefaultContext, &repo_model.SearchRepoOptions{
203+
ListOptions: db.ListOptions{
204+
Page: 1,
205+
PageSize: 10,
206+
},
207+
Keyword: "test_repo",
208+
Collaborate: util.OptionalBoolFalse,
209+
})
210+
211+
assert.NoError(t, err)
212+
assert.Equal(t, int64(2), count)
213+
assert.Len(t, repos, 2)
214+
215+
// test search private repository on explore page
216+
repos, count, err = repo_model.SearchRepositoryByName(db.DefaultContext, &repo_model.SearchRepoOptions{
217+
ListOptions: db.ListOptions{
218+
Page: 1,
219+
PageSize: 10,
220+
},
221+
Keyword: "repo_13",
222+
Private: true,
223+
Collaborate: util.OptionalBoolFalse,
224+
})
225+
226+
assert.NoError(t, err)
227+
if assert.Len(t, repos, 1) {
228+
assert.Equal(t, "test_repo_13", repos[0].Name)
229+
}
230+
assert.Equal(t, int64(1), count)
231+
232+
repos, count, err = repo_model.SearchRepositoryByName(db.DefaultContext, &repo_model.SearchRepoOptions{
233+
ListOptions: db.ListOptions{
234+
Page: 1,
235+
PageSize: 10,
236+
},
237+
Keyword: "test_repo",
238+
Private: true,
239+
Collaborate: util.OptionalBoolFalse,
240+
})
241+
242+
assert.NoError(t, err)
243+
assert.Equal(t, int64(3), count)
244+
assert.Len(t, repos, 3)
245+
246+
// Test non existing owner
247+
repos, count, err = repo_model.SearchRepositoryByName(db.DefaultContext, &repo_model.SearchRepoOptions{OwnerID: unittest.NonexistentID})
248+
249+
assert.NoError(t, err)
250+
assert.Empty(t, repos)
251+
assert.Equal(t, int64(0), count)
252+
253+
// Test search within description
254+
repos, count, err = repo_model.SearchRepository(db.DefaultContext, &repo_model.SearchRepoOptions{
255+
ListOptions: db.ListOptions{
256+
Page: 1,
257+
PageSize: 10,
258+
},
259+
Keyword: "description_14",
260+
Collaborate: util.OptionalBoolFalse,
261+
IncludeDescription: true,
262+
})
263+
264+
assert.NoError(t, err)
265+
if assert.Len(t, repos, 1) {
266+
assert.Equal(t, "test_repo_14", repos[0].Name)
267+
}
268+
assert.Equal(t, int64(1), count)
269+
270+
// Test NOT search within description
271+
repos, count, err = repo_model.SearchRepository(db.DefaultContext, &repo_model.SearchRepoOptions{
272+
ListOptions: db.ListOptions{
273+
Page: 1,
274+
PageSize: 10,
275+
},
276+
Keyword: "description_14",
277+
Collaborate: util.OptionalBoolFalse,
278+
IncludeDescription: false,
279+
})
280+
281+
assert.NoError(t, err)
282+
assert.Empty(t, repos)
283+
assert.Equal(t, int64(0), count)
284+
285+
testCases := getTestCases()
286+
277287
for _, testCase := range testCases {
278288
t.Run(testCase.name, func(t *testing.T) {
279289
repos, count, err := repo_model.SearchRepositoryByName(db.DefaultContext, testCase.opts)
@@ -349,6 +359,21 @@ func TestSearchRepository(t *testing.T) {
349359
}
350360
}
351361

362+
func TestCountRepository(t *testing.T) {
363+
assert.NoError(t, unittest.PrepareTestDatabase())
364+
365+
testCases := getTestCases()
366+
367+
for _, testCase := range testCases {
368+
t.Run(testCase.name, func(t *testing.T) {
369+
count, err := repo_model.CountRepository(db.DefaultContext, testCase.opts)
370+
371+
assert.NoError(t, err)
372+
assert.Equal(t, int64(testCase.count), count)
373+
})
374+
}
375+
}
376+
352377
func TestSearchRepositoryByTopicName(t *testing.T) {
353378
assert.NoError(t, unittest.PrepareTestDatabase())
354379

routers/web/org/home.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"code.gitea.io/gitea/modules/markup"
1717
"code.gitea.io/gitea/modules/markup/markdown"
1818
"code.gitea.io/gitea/modules/setting"
19+
shared_user "code.gitea.io/gitea/routers/web/shared/user"
1920
)
2021

2122
const (
@@ -158,6 +159,12 @@ func Home(ctx *context.Context) {
158159
ctx.Data["PageIsViewRepositories"] = true
159160
ctx.Data["IsFollowing"] = isFollowing
160161

162+
err = shared_user.LoadHeaderCount(ctx)
163+
if err != nil {
164+
ctx.ServerError("LoadHeaderCount", err)
165+
return
166+
}
167+
161168
pager := context.NewPagination(int(count), setting.UI.User.RepoPagingNum, page, 5)
162169
pager.SetDefaultParams(ctx)
163170
pager.AddParam(ctx, "language", "Language")

routers/web/org/projects.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,12 @@ func Projects(ctx *context.Context) {
101101
project.RenderedContent = project.Description
102102
}
103103

104+
err = shared_user.LoadHeaderCount(ctx)
105+
if err != nil {
106+
ctx.ServerError("LoadHeaderCount", err)
107+
return
108+
}
109+
104110
numPages := 0
105111
if total > 0 {
106112
numPages = (int(total) - 1/setting.UI.IssuePagingNum)
@@ -135,6 +141,13 @@ func RenderNewProject(ctx *context.Context) {
135141
ctx.Data["HomeLink"] = ctx.ContextUser.HomeLink()
136142
ctx.Data["CancelLink"] = ctx.ContextUser.HomeLink() + "/-/projects"
137143
shared_user.RenderUserHeader(ctx)
144+
145+
err := shared_user.LoadHeaderCount(ctx)
146+
if err != nil {
147+
ctx.ServerError("LoadHeaderCount", err)
148+
return
149+
}
150+
138151
ctx.HTML(http.StatusOK, tplProjectsNew)
139152
}
140153

@@ -270,6 +283,12 @@ func EditProjectPost(ctx *context.Context) {
270283

271284
shared_user.RenderUserHeader(ctx)
272285

286+
err := shared_user.LoadHeaderCount(ctx)
287+
if err != nil {
288+
ctx.ServerError("LoadHeaderCount", err)
289+
return
290+
}
291+
273292
if ctx.HasError() {
274293
ctx.HTML(http.StatusOK, tplProjectsNew)
275294
return
@@ -379,6 +398,12 @@ func ViewProject(ctx *context.Context) {
379398
ctx.Data["Boards"] = boards
380399
shared_user.RenderUserHeader(ctx)
381400

401+
err = shared_user.LoadHeaderCount(ctx)
402+
if err != nil {
403+
ctx.ServerError("LoadHeaderCount", err)
404+
return
405+
}
406+
382407
ctx.HTML(http.StatusOK, tplProjectsView)
383408
}
384409

routers/web/shared/user/header.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"code.gitea.io/gitea/modules/markup"
1515
"code.gitea.io/gitea/modules/markup/markdown"
1616
"code.gitea.io/gitea/modules/setting"
17+
"code.gitea.io/gitea/modules/util"
1718
)
1819

1920
// prepareContextForCommonProfile store some common data into context data for user's profile related pages (including the nav menu)
@@ -110,3 +111,21 @@ func RenderUserHeader(ctx *context.Context) {
110111
defer profileClose()
111112
ctx.Data["HasProfileReadme"] = profileReadmeBlob != nil
112113
}
114+
115+
func LoadHeaderCount(ctx *context.Context) error {
116+
prepareContextForCommonProfile(ctx)
117+
118+
repoCount, err := repo_model.CountRepository(ctx, &repo_model.SearchRepoOptions{
119+
Actor: ctx.Doer,
120+
OwnerID: ctx.ContextUser.ID,
121+
Private: ctx.IsSigned,
122+
Collaborate: util.OptionalBoolFalse,
123+
IncludeDescription: setting.UI.SearchRepoDescription,
124+
})
125+
if err != nil {
126+
return err
127+
}
128+
ctx.Data["RepoCount"] = repoCount
129+
130+
return nil
131+
}

0 commit comments

Comments
 (0)