Skip to content

Commit 5105934

Browse files
authored
Merge branch 'main' into api_repoGetReviewers+repo.GetAssignees
2 parents e36804c + 0db1048 commit 5105934

40 files changed

+965
-413
lines changed

Diff for: custom/conf/app.example.ini

+5-5
Original file line numberDiff line numberDiff line change
@@ -1155,20 +1155,20 @@ PATH =
11551155
;STARTUP_TIMEOUT = 30s
11561156
;;
11571157
;; Issue indexer queue, currently support: channel, levelqueue or redis, default is levelqueue (deprecated - use [queue.issue_indexer])
1158-
;ISSUE_INDEXER_QUEUE_TYPE = levelqueue
1158+
;ISSUE_INDEXER_QUEUE_TYPE = levelqueue; **DEPRECATED** use settings in `[queue.issue_indexer]`.
11591159
;;
11601160
;; When ISSUE_INDEXER_QUEUE_TYPE is levelqueue, this will be the path where the queue will be saved.
11611161
;; This can be overridden by `ISSUE_INDEXER_QUEUE_CONN_STR`.
11621162
;; default is queues/common
1163-
;ISSUE_INDEXER_QUEUE_DIR = queues/common
1163+
;ISSUE_INDEXER_QUEUE_DIR = queues/common; **DEPRECATED** use settings in `[queue.issue_indexer]`.
11641164
;;
11651165
;; When `ISSUE_INDEXER_QUEUE_TYPE` is `redis`, this will store the redis connection string.
11661166
;; When `ISSUE_INDEXER_QUEUE_TYPE` is `levelqueue`, this is a directory or additional options of
11671167
;; the form `leveldb://path/to/db?option=value&....`, and overrides `ISSUE_INDEXER_QUEUE_DIR`.
1168-
;ISSUE_INDEXER_QUEUE_CONN_STR = "addrs=127.0.0.1:6379 db=0"
1168+
;ISSUE_INDEXER_QUEUE_CONN_STR = "addrs=127.0.0.1:6379 db=0"; **DEPRECATED** use settings in `[queue.issue_indexer]`.
11691169
;;
11701170
;; Batch queue number, default is 20
1171-
;ISSUE_INDEXER_QUEUE_BATCH_NUMBER = 20
1171+
;ISSUE_INDEXER_QUEUE_BATCH_NUMBER = 20; **DEPRECATED** use settings in `[queue.issue_indexer]`.
11721172

11731173
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
11741174
;; Repository Indexer settings
@@ -1197,7 +1197,7 @@ PATH =
11971197
;REPO_INDEXER_EXCLUDE =
11981198
;;
11991199
;;
1200-
;UPDATE_BUFFER_LEN = 20
1200+
;UPDATE_BUFFER_LEN = 20; **DEPRECATED** use settings in `[queue.issue_indexer]`.
12011201
;MAX_FILE_SIZE = 1048576
12021202

12031203
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Diff for: docs/content/doc/advanced/config-cheat-sheet.en-us.md

+5-5
Original file line numberDiff line numberDiff line change
@@ -356,10 +356,10 @@ relation to port exhaustion.
356356
- `ISSUE_INDEXER_NAME`: **gitea_issues**: Issue indexer name, available when ISSUE_INDEXER_TYPE is elasticsearch
357357
- `ISSUE_INDEXER_PATH`: **indexers/issues.bleve**: Index file used for issue search; available when ISSUE_INDEXER_TYPE is bleve and elasticsearch.
358358
- The next 4 configuration values are deprecated and should be set in `queue.issue_indexer` however are kept for backwards compatibility:
359-
- `ISSUE_INDEXER_QUEUE_TYPE`: **levelqueue**: Issue indexer queue, currently supports:`channel`, `levelqueue`, `redis`.
360-
- `ISSUE_INDEXER_QUEUE_DIR`: **queues/common**: When `ISSUE_INDEXER_QUEUE_TYPE` is `levelqueue`, this will be the path where the queue will be saved. (Previously this was `indexers/issues.queue`.)
361-
- `ISSUE_INDEXER_QUEUE_CONN_STR`: **addrs=127.0.0.1:6379 db=0**: When `ISSUE_INDEXER_QUEUE_TYPE` is `redis`, this will store the redis connection string. When `ISSUE_INDEXER_QUEUE_TYPE` is `levelqueue`, this is a directory or additional options of the form `leveldb://path/to/db?option=value&....`, and overrides `ISSUE_INDEXER_QUEUE_DIR`.
362-
- `ISSUE_INDEXER_QUEUE_BATCH_NUMBER`: **20**: Batch queue number.
359+
- `ISSUE_INDEXER_QUEUE_TYPE`: **levelqueue**: Issue indexer queue, currently supports:`channel`, `levelqueue`, `redis`. **DEPRECATED** use settings in `[queue.issue_indexer]`.
360+
- `ISSUE_INDEXER_QUEUE_DIR`: **queues/common**: When `ISSUE_INDEXER_QUEUE_TYPE` is `levelqueue`, this will be the path where the queue will be saved. **DEPRECATED** use settings in `[queue.issue_indexer]`.
361+
- `ISSUE_INDEXER_QUEUE_CONN_STR`: **addrs=127.0.0.1:6379 db=0**: When `ISSUE_INDEXER_QUEUE_TYPE` is `redis`, this will store the redis connection string. When `ISSUE_INDEXER_QUEUE_TYPE` is `levelqueue`, this is a directory or additional options of the form `leveldb://path/to/db?option=value&....`, and overrides `ISSUE_INDEXER_QUEUE_DIR`. **DEPRECATED** use settings in `[queue.issue_indexer]`.
362+
- `ISSUE_INDEXER_QUEUE_BATCH_NUMBER`: **20**: Batch queue number. **DEPRECATED** use settings in `[queue.issue_indexer]`.
363363

364364
- `REPO_INDEXER_ENABLED`: **false**: Enables code search (uses a lot of disk space, about 6 times more than the repository size).
365365
- `REPO_INDEXER_TYPE`: **bleve**: Code search engine type, could be `bleve` or `elasticsearch`.
@@ -370,7 +370,7 @@ relation to port exhaustion.
370370
- `REPO_INDEXER_INCLUDE`: **empty**: A comma separated list of glob patterns (see https://github.com/gobwas/glob) to **include** in the index. Use `**.txt` to match any files with .txt extension. An empty list means include all files.
371371
- `REPO_INDEXER_EXCLUDE`: **empty**: A comma separated list of glob patterns (see https://github.com/gobwas/glob) to **exclude** from the index. Files that match this list will not be indexed, even if they match in `REPO_INDEXER_INCLUDE`.
372372
- `REPO_INDEXER_EXCLUDE_VENDORED`: **true**: Exclude vendored files from index.
373-
- `UPDATE_BUFFER_LEN`: **20**: Buffer length of index request.
373+
- `UPDATE_BUFFER_LEN`: **20**: Buffer length of index request. **DEPRECATED** use settings in `[queue.issue_indexer]`.
374374
- `MAX_FILE_SIZE`: **1048576**: Maximum size in bytes of files to be indexed.
375375
- `STARTUP_TIMEOUT`: **30s**: If the indexer takes longer than this timeout to start - fail. (This timeout will be added to the hammer time above for child processes - as bleve will not start until the previous parent is shutdown.) Set to zero to never timeout.
376376

Diff for: integrations/api_issue_test.go

+40-6
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,10 @@ func TestAPIListIssues(t *testing.T) {
2525

2626
session := loginUser(t, owner.Name)
2727
token := getTokenForLoggedInUser(t, session)
28-
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues?state=all&token=%s",
29-
owner.Name, repo.Name, token)
30-
resp := session.MakeRequest(t, req, http.StatusOK)
28+
link, _ := url.Parse(fmt.Sprintf("/api/v1/repos/%s/%s/issues", owner.Name, repo.Name))
29+
30+
link.RawQuery = url.Values{"token": {token}, "state": {"all"}}.Encode()
31+
resp := session.MakeRequest(t, NewRequest(t, "GET", link.String()), http.StatusOK)
3132
var apiIssues []*api.Issue
3233
DecodeJSON(t, resp, &apiIssues)
3334
assert.Len(t, apiIssues, models.GetCount(t, &models.Issue{RepoID: repo.ID}))
@@ -36,15 +37,34 @@ func TestAPIListIssues(t *testing.T) {
3637
}
3738

3839
// test milestone filter
39-
req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues?state=all&type=all&milestones=ignore,milestone1,3,4&token=%s",
40-
owner.Name, repo.Name, token)
41-
resp = session.MakeRequest(t, req, http.StatusOK)
40+
link.RawQuery = url.Values{"token": {token}, "state": {"all"}, "type": {"all"}, "milestones": {"ignore,milestone1,3,4"}}.Encode()
41+
resp = session.MakeRequest(t, NewRequest(t, "GET", link.String()), http.StatusOK)
4242
DecodeJSON(t, resp, &apiIssues)
4343
if assert.Len(t, apiIssues, 2) {
4444
assert.EqualValues(t, 3, apiIssues[0].Milestone.ID)
4545
assert.EqualValues(t, 1, apiIssues[1].Milestone.ID)
4646
}
4747

48+
link.RawQuery = url.Values{"token": {token}, "state": {"all"}, "created_by": {"user2"}}.Encode()
49+
resp = session.MakeRequest(t, NewRequest(t, "GET", link.String()), http.StatusOK)
50+
DecodeJSON(t, resp, &apiIssues)
51+
if assert.Len(t, apiIssues, 1) {
52+
assert.EqualValues(t, 5, apiIssues[0].ID)
53+
}
54+
55+
link.RawQuery = url.Values{"token": {token}, "state": {"all"}, "assigned_by": {"user1"}}.Encode()
56+
resp = session.MakeRequest(t, NewRequest(t, "GET", link.String()), http.StatusOK)
57+
DecodeJSON(t, resp, &apiIssues)
58+
if assert.Len(t, apiIssues, 1) {
59+
assert.EqualValues(t, 1, apiIssues[0].ID)
60+
}
61+
62+
link.RawQuery = url.Values{"token": {token}, "state": {"all"}, "mentioned_by": {"user4"}}.Encode()
63+
resp = session.MakeRequest(t, NewRequest(t, "GET", link.String()), http.StatusOK)
64+
DecodeJSON(t, resp, &apiIssues)
65+
if assert.Len(t, apiIssues, 1) {
66+
assert.EqualValues(t, 1, apiIssues[0].ID)
67+
}
4868
}
4969

5070
func TestAPICreateIssue(t *testing.T) {
@@ -202,6 +222,20 @@ func TestAPISearchIssues(t *testing.T) {
202222
resp = session.MakeRequest(t, req, http.StatusOK)
203223
DecodeJSON(t, resp, &apiIssues)
204224
assert.Len(t, apiIssues, 1)
225+
226+
query = url.Values{"milestones": {"milestone1"}, "state": {"all"}}
227+
link.RawQuery = query.Encode()
228+
req = NewRequest(t, "GET", link.String())
229+
resp = session.MakeRequest(t, req, http.StatusOK)
230+
DecodeJSON(t, resp, &apiIssues)
231+
assert.Len(t, apiIssues, 1)
232+
233+
query = url.Values{"milestones": {"milestone1,milestone3"}, "state": {"all"}}
234+
link.RawQuery = query.Encode()
235+
req = NewRequest(t, "GET", link.String())
236+
resp = session.MakeRequest(t, req, http.StatusOK)
237+
DecodeJSON(t, resp, &apiIssues)
238+
assert.Len(t, apiIssues, 2)
205239
}
206240

207241
func TestAPISearchIssuesWithLabels(t *testing.T) {

Diff for: integrations/api_releases_test.go

+53
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package integrations
77
import (
88
"fmt"
99
"net/http"
10+
"net/url"
1011
"testing"
1112

1213
"code.gitea.io/gitea/models"
@@ -16,6 +17,58 @@ import (
1617
"github.com/stretchr/testify/assert"
1718
)
1819

20+
func TestAPIListReleases(t *testing.T) {
21+
defer prepareTestEnv(t)()
22+
23+
repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository)
24+
user2 := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User)
25+
session := loginUser(t, user2.LowerName)
26+
token := getTokenForLoggedInUser(t, session)
27+
28+
link, _ := url.Parse(fmt.Sprintf("/api/v1/repos/%s/%s/releases", user2.Name, repo.Name))
29+
link.RawQuery = url.Values{"token": {token}}.Encode()
30+
resp := session.MakeRequest(t, NewRequest(t, "GET", link.String()), http.StatusOK)
31+
var apiReleases []*api.Release
32+
DecodeJSON(t, resp, &apiReleases)
33+
if assert.Len(t, apiReleases, 3) {
34+
for _, release := range apiReleases {
35+
switch release.ID {
36+
case 1:
37+
assert.False(t, release.IsDraft)
38+
assert.False(t, release.IsPrerelease)
39+
case 4:
40+
assert.True(t, release.IsDraft)
41+
assert.False(t, release.IsPrerelease)
42+
case 5:
43+
assert.False(t, release.IsDraft)
44+
assert.True(t, release.IsPrerelease)
45+
default:
46+
assert.NoError(t, fmt.Errorf("unexpected release: %v", release))
47+
}
48+
}
49+
}
50+
51+
// test filter
52+
testFilterByLen := func(auth bool, query url.Values, expectedLength int, msgAndArgs ...string) {
53+
link.RawQuery = query.Encode()
54+
if auth {
55+
query.Set("token", token)
56+
resp = session.MakeRequest(t, NewRequest(t, "GET", link.String()), http.StatusOK)
57+
} else {
58+
resp = MakeRequest(t, NewRequest(t, "GET", link.String()), http.StatusOK)
59+
}
60+
DecodeJSON(t, resp, &apiReleases)
61+
assert.Len(t, apiReleases, expectedLength, msgAndArgs)
62+
}
63+
64+
testFilterByLen(false, url.Values{"draft": {"true"}}, 0, "anon should not see drafts")
65+
testFilterByLen(true, url.Values{"draft": {"true"}}, 1, "repo owner should see drafts")
66+
testFilterByLen(true, url.Values{"draft": {"false"}}, 2, "exclude drafts")
67+
testFilterByLen(true, url.Values{"draft": {"false"}, "pre-release": {"false"}}, 1, "exclude drafts and pre-releases")
68+
testFilterByLen(true, url.Values{"pre-release": {"true"}}, 1, "only get pre-release")
69+
testFilterByLen(true, url.Values{"draft": {"true"}, "pre-release": {"true"}}, 0, "there is no pre-release draft")
70+
}
71+
1972
func createNewReleaseUsingAPI(t *testing.T, session *TestSession, token string, owner *models.User, repo *models.Repository, name, target, title, desc string) *api.Release {
2073
urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/releases?token=%s",
2174
owner.Name, repo.Name, token)

Diff for: integrations/api_repo_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ func TestAPIViewRepo(t *testing.T) {
223223
DecodeJSON(t, resp, &repo)
224224
assert.EqualValues(t, 1, repo.ID)
225225
assert.EqualValues(t, "repo1", repo.Name)
226-
assert.EqualValues(t, 2, repo.Releases)
226+
assert.EqualValues(t, 3, repo.Releases)
227227
assert.EqualValues(t, 1, repo.OpenIssues)
228228
assert.EqualValues(t, 3, repo.OpenPulls)
229229

Diff for: integrations/release_test.go

+13-10
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ func TestCreateRelease(t *testing.T) {
8585
session := loginUser(t, "user2")
8686
createNewRelease(t, session, "/user2/repo1", "v0.0.1", "v0.0.1", false, false)
8787

88-
checkLatestReleaseAndCount(t, session, "/user2/repo1", "v0.0.1", i18n.Tr("en", "repo.release.stable"), 3)
88+
checkLatestReleaseAndCount(t, session, "/user2/repo1", "v0.0.1", i18n.Tr("en", "repo.release.stable"), 4)
8989
}
9090

9191
func TestCreateReleasePreRelease(t *testing.T) {
@@ -94,7 +94,7 @@ func TestCreateReleasePreRelease(t *testing.T) {
9494
session := loginUser(t, "user2")
9595
createNewRelease(t, session, "/user2/repo1", "v0.0.1", "v0.0.1", true, false)
9696

97-
checkLatestReleaseAndCount(t, session, "/user2/repo1", "v0.0.1", i18n.Tr("en", "repo.release.prerelease"), 3)
97+
checkLatestReleaseAndCount(t, session, "/user2/repo1", "v0.0.1", i18n.Tr("en", "repo.release.prerelease"), 4)
9898
}
9999

100100
func TestCreateReleaseDraft(t *testing.T) {
@@ -103,7 +103,7 @@ func TestCreateReleaseDraft(t *testing.T) {
103103
session := loginUser(t, "user2")
104104
createNewRelease(t, session, "/user2/repo1", "v0.0.1", "v0.0.1", false, true)
105105

106-
checkLatestReleaseAndCount(t, session, "/user2/repo1", "v0.0.1", i18n.Tr("en", "repo.release.draft"), 3)
106+
checkLatestReleaseAndCount(t, session, "/user2/repo1", "v0.0.1", i18n.Tr("en", "repo.release.draft"), 4)
107107
}
108108

109109
func TestCreateReleasePaging(t *testing.T) {
@@ -142,7 +142,7 @@ func TestViewReleaseListNoLogin(t *testing.T) {
142142

143143
htmlDoc := NewHTMLParser(t, rsp.Body)
144144
releases := htmlDoc.Find("#release-list li.ui.grid")
145-
assert.Equal(t, 1, releases.Length())
145+
assert.Equal(t, 2, releases.Length())
146146

147147
links := make([]string, 0, 5)
148148
releases.Each(func(i int, s *goquery.Selection) {
@@ -153,7 +153,7 @@ func TestViewReleaseListNoLogin(t *testing.T) {
153153
links = append(links, link)
154154
})
155155

156-
assert.EqualValues(t, []string{"/user2/repo1/releases/tag/v1.1"}, links)
156+
assert.EqualValues(t, []string{"/user2/repo1/releases/tag/v1.0", "/user2/repo1/releases/tag/v1.1"}, links)
157157
}
158158

159159
func TestViewReleaseListLogin(t *testing.T) {
@@ -169,7 +169,7 @@ func TestViewReleaseListLogin(t *testing.T) {
169169

170170
htmlDoc := NewHTMLParser(t, rsp.Body)
171171
releases := htmlDoc.Find("#release-list li.ui.grid")
172-
assert.Equal(t, 2, releases.Length())
172+
assert.Equal(t, 3, releases.Length())
173173

174174
links := make([]string, 0, 5)
175175
releases.Each(func(i int, s *goquery.Selection) {
@@ -180,8 +180,11 @@ func TestViewReleaseListLogin(t *testing.T) {
180180
links = append(links, link)
181181
})
182182

183-
assert.EqualValues(t, []string{"/user2/repo1/releases/tag/draft-release",
184-
"/user2/repo1/releases/tag/v1.1"}, links)
183+
assert.EqualValues(t, []string{
184+
"/user2/repo1/releases/tag/draft-release",
185+
"/user2/repo1/releases/tag/v1.0",
186+
"/user2/repo1/releases/tag/v1.1",
187+
}, links)
185188
}
186189

187190
func TestViewTagsList(t *testing.T) {
@@ -197,12 +200,12 @@ func TestViewTagsList(t *testing.T) {
197200

198201
htmlDoc := NewHTMLParser(t, rsp.Body)
199202
tags := htmlDoc.Find(".tag-list tr")
200-
assert.Equal(t, 2, tags.Length())
203+
assert.Equal(t, 3, tags.Length())
201204

202205
tagNames := make([]string, 0, 5)
203206
tags.Each(func(i int, s *goquery.Selection) {
204207
tagNames = append(tagNames, s.Find(".tag a.df.ac").Text())
205208
})
206209

207-
assert.EqualValues(t, []string{"delete-tag", "v1.1"}, tagNames)
210+
assert.EqualValues(t, []string{"v1.0", "delete-tag", "v1.1"}, tagNames)
208211
}

Diff for: models/fixtures/issue_user.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,4 @@
1717
uid: 4
1818
issue_id: 1
1919
is_read: false
20-
is_mentioned: false
20+
is_mentioned: true

Diff for: models/fixtures/release.yml

+19-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
-
2-
id: 1
1+
- id: 1
32
repo_id: 1
43
publisher_id: 2
54
tag_name: "v1.1"
@@ -13,8 +12,7 @@
1312
is_tag: false
1413
created_unix: 946684800
1514

16-
-
17-
id: 2
15+
- id: 2
1816
repo_id: 40
1917
publisher_id: 2
2018
tag_name: "v1.1"
@@ -28,8 +26,7 @@
2826
is_tag: false
2927
created_unix: 946684800
3028

31-
-
32-
id: 3
29+
- id: 3
3330
repo_id: 1
3431
publisher_id: 2
3532
tag_name: "delete-tag"
@@ -43,8 +40,7 @@
4340
is_tag: true
4441
created_unix: 946684800
4542

46-
-
47-
id: 4
43+
- id: 4
4844
repo_id: 1
4945
publisher_id: 2
5046
tag_name: "draft-release"
@@ -55,3 +51,18 @@
5551
is_prerelease: false
5652
is_tag: false
5753
created_unix: 1619524806
54+
55+
- id: 5
56+
repo_id: 1
57+
publisher_id: 2
58+
tag_name: "v1.0"
59+
lower_tag_name: "v1.0"
60+
target: "master"
61+
title: "pre-release"
62+
note: "some text for a pre release"
63+
sha1: "65f1bf27bc3bf70f64657658635e66094edbcb4d"
64+
num_commits: 1
65+
is_draft: false
66+
is_prerelease: true
67+
is_tag: false
68+
created_unix: 946684800

Diff for: models/issue.go

+8
Original file line numberDiff line numberDiff line change
@@ -1100,6 +1100,7 @@ type IssuesOptions struct {
11001100
LabelIDs []int64
11011101
IncludedLabelNames []string
11021102
ExcludedLabelNames []string
1103+
IncludeMilestones []string
11031104
SortType string
11041105
IssueIDs []int64
11051106
UpdatedAfterUnix int64
@@ -1241,6 +1242,13 @@ func (opts *IssuesOptions) setupSession(sess *xorm.Session) {
12411242
if len(opts.ExcludedLabelNames) > 0 {
12421243
sess.And(builder.NotIn("issue.id", BuildLabelNamesIssueIDsCondition(opts.ExcludedLabelNames)))
12431244
}
1245+
1246+
if len(opts.IncludeMilestones) > 0 {
1247+
sess.In("issue.milestone_id",
1248+
builder.Select("id").
1249+
From("milestone").
1250+
Where(builder.In("name", opts.IncludeMilestones)))
1251+
}
12441252
}
12451253

12461254
func applyReposCondition(sess *xorm.Session, repoIDs []int64) *xorm.Session {

Diff for: models/migrations/migrations.go

+2
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,8 @@ var migrations = []Migration{
317317
NewMigration("Add issue resource index table", addIssueResourceIndexTable),
318318
// v183 -> v184
319319
NewMigration("Create PushMirror table", createPushMirrorTable),
320+
// v184 -> v185
321+
NewMigration("Rename Task errors to message", renameTaskErrorsToMessage),
320322
}
321323

322324
// GetCurrentDBVersion returns the current db version

0 commit comments

Comments
 (0)