Skip to content

Commit 610c6de

Browse files
Rewrite API to use struct for setting tracker and wiki settings.
1 parent 5780b7b commit 610c6de

File tree

4 files changed

+124
-199
lines changed

4 files changed

+124
-199
lines changed

integrations/api_repo_edit_test.go

+60-80
Original file line numberDiff line numberDiff line change
@@ -23,37 +23,35 @@ func getRepoEditOptionFromRepo(repo *models.Repository) *api.EditRepoOption {
2323
website := repo.Website
2424
private := repo.IsPrivate
2525
hasIssues := false
26-
externalTracker := false
27-
externalTrackerURL := ""
28-
externalTrackerFormat := ""
29-
externalTrackerStyle := ""
30-
enableTimeTracker := false
31-
letOnlyContributorsTrackTime := false
32-
enableIssueDependencies := false
26+
var internalTracker *api.InternalTracker
27+
var externalTracker *api.ExternalTracker
3328
if unit, err := repo.GetUnit(models.UnitTypeIssues); err == nil {
3429
config := unit.IssuesConfig()
3530
hasIssues = true
36-
enableTimeTracker = config.EnableTimetracker
37-
letOnlyContributorsTrackTime = config.AllowOnlyContributorsToTrackTime
38-
enableIssueDependencies = config.EnableDependencies
31+
internalTracker = &api.InternalTracker{
32+
EnableTimeTracker: config.EnableTimetracker,
33+
LetOnlyContributorsTrackTime: config.AllowOnlyContributorsToTrackTime,
34+
EnableIssueDependencies: config.EnableDependencies,
35+
}
3936
} else if unit, err := repo.GetUnit(models.UnitTypeExternalTracker); err == nil {
4037
config := unit.ExternalTrackerConfig()
4138
hasIssues = true
42-
externalTracker = true
43-
externalTrackerURL = config.ExternalTrackerURL
44-
externalTrackerFormat = config.ExternalTrackerFormat
45-
externalTrackerStyle = config.ExternalTrackerStyle
39+
externalTracker = &api.ExternalTracker{
40+
ExternalTrackerURL: config.ExternalTrackerURL,
41+
ExternalTrackerFormat: config.ExternalTrackerFormat,
42+
ExternalTrackerStyle: config.ExternalTrackerStyle,
43+
}
4644
}
4745
hasWiki := false
48-
externalWiki := false
49-
externalWikiURL := ""
46+
var externalWiki *api.ExternalWiki
5047
if _, err := repo.GetUnit(models.UnitTypeWiki); err == nil {
5148
hasWiki = true
5249
} else if unit, err := repo.GetUnit(models.UnitTypeExternalWiki); err == nil {
5350
hasWiki = true
5451
config := unit.ExternalWikiConfig()
55-
externalWiki = true
56-
externalWikiURL = config.ExternalWikiURL
52+
externalWiki = &api.ExternalWiki{
53+
ExternalWikiURL: config.ExternalWikiURL,
54+
}
5755
}
5856
defaultBranch := repo.DefaultBranch
5957
hasPullRequests := false
@@ -73,29 +71,23 @@ func getRepoEditOptionFromRepo(repo *models.Repository) *api.EditRepoOption {
7371
}
7472
archived := repo.IsArchived
7573
return &api.EditRepoOption{
76-
Name: &name,
77-
Description: &description,
78-
Website: &website,
79-
Private: &private,
80-
HasIssues: &hasIssues,
81-
ExternalTracker: &externalTracker,
82-
ExternalTrackerURL: &externalTrackerURL,
83-
ExternalTrackerFormat: &externalTrackerFormat,
84-
ExternalTrackerStyle: &externalTrackerStyle,
85-
EnableTimeTracker: &enableTimeTracker,
86-
LetOnlyContributorsTrackTime: &letOnlyContributorsTrackTime,
87-
EnableIssueDependencies: &enableIssueDependencies,
88-
HasWiki: &hasWiki,
89-
ExternalWiki: &externalWiki,
90-
ExternalWikiURL: &externalWikiURL,
91-
DefaultBranch: &defaultBranch,
92-
HasPullRequests: &hasPullRequests,
93-
IgnoreWhitespaceConflicts: &ignoreWhitespaceConflicts,
94-
AllowMerge: &allowMerge,
95-
AllowRebase: &allowRebase,
96-
AllowRebaseMerge: &allowRebaseMerge,
97-
AllowSquash: &allowSquash,
98-
Archived: &archived,
74+
Name: &name,
75+
Description: &description,
76+
Website: &website,
77+
Private: &private,
78+
HasIssues: &hasIssues,
79+
ExternalTracker: externalTracker,
80+
InternalTracker: internalTracker,
81+
HasWiki: &hasWiki,
82+
ExternalWiki: externalWiki,
83+
DefaultBranch: &defaultBranch,
84+
HasPullRequests: &hasPullRequests,
85+
IgnoreWhitespaceConflicts: &ignoreWhitespaceConflicts,
86+
AllowMerge: &allowMerge,
87+
AllowRebase: &allowRebase,
88+
AllowRebaseMerge: &allowRebaseMerge,
89+
AllowSquash: &allowSquash,
90+
Archived: &archived,
9991
}
10092
}
10193

@@ -179,14 +171,13 @@ func TestAPIRepoEdit(t *testing.T) {
179171
assert.Equal(t, *repoEditOption.HasWiki, *repo1editedOption.HasWiki)
180172

181173
//Test editing repo1 to use internal issue and wiki (default)
182-
enableTimeTracker := false
183-
letOnlyContributorsTrackTime := false
184-
enableIssueDependencies := false
185174
*repoEditOption.HasIssues = true
186175
repoEditOption.ExternalTracker = nil
187-
repoEditOption.EnableTimeTracker = &enableTimeTracker
188-
repoEditOption.LetOnlyContributorsTrackTime = &letOnlyContributorsTrackTime
189-
repoEditOption.EnableIssueDependencies = &enableIssueDependencies
176+
repoEditOption.InternalTracker = &api.InternalTracker{
177+
EnableTimeTracker: false,
178+
LetOnlyContributorsTrackTime: false,
179+
EnableIssueDependencies: false,
180+
}
190181
*repoEditOption.HasWiki = true
191182
repoEditOption.ExternalWiki = nil
192183
url = fmt.Sprintf("/api/v1/repos/%s/%s?token=%s", user2.Name, *repoEditOption.Name, token2)
@@ -198,25 +189,20 @@ func TestAPIRepoEdit(t *testing.T) {
198189
repo1edited = models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository)
199190
repo1editedOption = getRepoEditOptionFromRepo(repo1edited)
200191
assert.Equal(t, *repo1editedOption.HasIssues, true)
201-
assert.Equal(t, *repo1editedOption.ExternalTracker, false)
202-
assert.Equal(t, *repo1editedOption.EnableTimeTracker, false)
203-
assert.Equal(t, *repo1editedOption.LetOnlyContributorsTrackTime, false)
204-
assert.Equal(t, *repo1editedOption.EnableIssueDependencies, false)
192+
assert.Nil(t, repo1editedOption.ExternalTracker)
193+
assert.Equal(t, *repo1editedOption.InternalTracker, *repoEditOption.InternalTracker)
205194
assert.Equal(t, *repo1editedOption.HasWiki, true)
206-
assert.Equal(t, *repo1editedOption.ExternalWiki, false)
195+
assert.Nil(t, repo1editedOption.ExternalWiki)
207196

208197
//Test editing repo1 to use external issue and wiki
209-
externalTracker := true
210-
externalURL := "http://www.somewebsite.com"
211-
externalTrackerFormat := "http://www.somewebsite.com/{user}/{repo}?issue={index}"
212-
externalTrackerStyle := "alphanumeric"
213-
externalWiki := true
214-
repoEditOption.ExternalTracker = &externalTracker
215-
repoEditOption.ExternalTrackerURL = &externalURL
216-
repoEditOption.ExternalTrackerFormat = &externalTrackerFormat
217-
repoEditOption.ExternalTrackerStyle = &externalTrackerStyle
218-
repoEditOption.ExternalWiki = &externalWiki
219-
repoEditOption.ExternalWikiURL = &externalURL
198+
repoEditOption.ExternalTracker = &api.ExternalTracker{
199+
ExternalTrackerURL: "http://www.somewebsite.com",
200+
ExternalTrackerFormat: "http://www.somewebsite.com/{user}/{repo}?issue={index}",
201+
ExternalTrackerStyle: "alphanumeric",
202+
}
203+
repoEditOption.ExternalWiki = &api.ExternalWiki{
204+
ExternalWikiURL: "http://www.somewebsite.com",
205+
}
220206
req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption)
221207
resp = session.MakeRequest(t, req, http.StatusOK)
222208
DecodeJSON(t, resp, &repo)
@@ -225,35 +211,29 @@ func TestAPIRepoEdit(t *testing.T) {
225211
repo1edited = models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository)
226212
repo1editedOption = getRepoEditOptionFromRepo(repo1edited)
227213
assert.Equal(t, *repo1editedOption.HasIssues, true)
228-
assert.Equal(t, *repo1editedOption.ExternalTracker, true)
229-
assert.Equal(t, *repo1editedOption.ExternalTrackerURL, *repoEditOption.ExternalTrackerURL)
230-
assert.Equal(t, *repo1editedOption.ExternalTrackerFormat, *repoEditOption.ExternalTrackerFormat)
231-
assert.Equal(t, *repo1editedOption.ExternalTrackerStyle, *repoEditOption.ExternalTrackerStyle)
214+
assert.Equal(t, *repo1editedOption.ExternalTracker, *repoEditOption.ExternalTracker)
232215
assert.Equal(t, *repo1editedOption.HasWiki, true)
233-
assert.Equal(t, *repo1editedOption.ExternalWiki, true)
234-
assert.Equal(t, *repo1editedOption.ExternalWikiURL, *repoEditOption.ExternalWikiURL)
216+
assert.Equal(t, *repo1editedOption.ExternalWiki, *repoEditOption.ExternalWiki)
235217

236218
// Do some tests with invalid URL for external tracker and wiki
237-
externalURLInvalid := "htp://www.somewebsite.com"
238-
externalTrackerFormatInvalid := "http://www.somewebsite.com/{user/{repo}?issue={index}"
239-
repoEditOption.ExternalTrackerURL = &externalURLInvalid
219+
repoEditOption.ExternalTracker.ExternalTrackerURL = "htp://www.somewebsite.com"
240220
req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption)
241221
resp = session.MakeRequest(t, req, http.StatusUnprocessableEntity)
242-
repoEditOption.ExternalTrackerURL = &externalURL
243-
repoEditOption.ExternalTrackerFormat = &externalTrackerFormatInvalid
222+
repoEditOption.ExternalTracker.ExternalTrackerURL = "http://www.somewebsite.com"
223+
repoEditOption.ExternalTracker.ExternalTrackerFormat = "http://www.somewebsite.com/{user/{repo}?issue={index}"
244224
req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption)
245225
resp = session.MakeRequest(t, req, http.StatusUnprocessableEntity)
246-
repoEditOption.ExternalTrackerFormat = &externalTrackerFormat
247-
repoEditOption.ExternalWikiURL = &externalURLInvalid
226+
repoEditOption.ExternalTracker.ExternalTrackerFormat = "http://www.somewebsite.com/{user}/{repo}?issue={index}"
227+
repoEditOption.ExternalWiki.ExternalWikiURL = "htp://www.somewebsite.com"
248228
req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption)
249229
resp = session.MakeRequest(t, req, http.StatusUnprocessableEntity)
250230

251231
//Test small repo change through API with issue and wiki option not set; They shall not be touched.
252232
*repoEditOption.Description = "small change"
253233
repoEditOption.HasIssues = nil
254-
*repoEditOption.ExternalTracker = false
234+
repoEditOption.ExternalTracker = nil
255235
repoEditOption.HasWiki = nil
256-
*repoEditOption.ExternalWiki = false
236+
repoEditOption.ExternalWiki = nil
257237
req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption)
258238
resp = session.MakeRequest(t, req, http.StatusOK)
259239
DecodeJSON(t, resp, &repo)
@@ -263,9 +243,9 @@ func TestAPIRepoEdit(t *testing.T) {
263243
repo1editedOption = getRepoEditOptionFromRepo(repo1edited)
264244
assert.Equal(t, *repo1editedOption.Description, *repoEditOption.Description)
265245
assert.Equal(t, *repo1editedOption.HasIssues, true)
266-
assert.Equal(t, *repo1editedOption.ExternalTracker, true)
246+
assert.NotNil(t, *repo1editedOption.ExternalTracker)
267247
assert.Equal(t, *repo1editedOption.HasWiki, true)
268-
assert.Equal(t, *repo1editedOption.ExternalWiki, true)
248+
assert.NotNil(t, *repo1editedOption.ExternalWiki)
269249

270250
// reset repo in db
271251
url = fmt.Sprintf("/api/v1/repos/%s/%s?token=%s", user2.Name, *repoEditOption.Name, token2)

modules/structs/repo.go

+20-22
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,31 @@ type Permission struct {
1616
}
1717

1818
// InternalTracker represents settings for internal tracker
19+
// swagger:model
1920
type InternalTracker struct {
20-
EnableTimeTracker bool `json:"enable_time_tracker"`
21+
// Enable time tracking (Built-in issue tracker)
22+
EnableTimeTracker bool `json:"enable_time_tracker"`
23+
// Let only contributors track time (Built-in issue tracker)
2124
LetOnlyContributorsTrackTime bool `json:"let_only_contributors_track_time"`
22-
EnableIssueDependencies bool `json:"enable_issue_dependencies"`
25+
// Enable dependencies for issues and pull requests (Built-in issue tracker)
26+
EnableIssueDependencies bool `json:"enable_issue_dependencies"`
2327
}
2428

2529
// ExternalTracker represents settings for external tracker
30+
// swagger:model
2631
type ExternalTracker struct {
27-
ExternalTrackerURL string `json:"external_tracker_url"`
32+
// URL of external issue tracker.
33+
ExternalTrackerURL string `json:"external_tracker_url"`
34+
// External Issue Tracker URL Format. Use the placeholders {user}, {repo} and {index} for the username, repository name and issue index.
2835
ExternalTrackerFormat string `json:"external_tracker_format"`
29-
ExternalTrackerStyle string `json:"external_tracker_style"`
36+
// External Issue Tracker Number Format, either `numeric` or `alphanumeric`
37+
ExternalTrackerStyle string `json:"external_tracker_style"`
3038
}
3139

3240
// ExternalWiki represents setting for external wiki
41+
// swagger:model
3342
type ExternalWiki struct {
43+
// URL of external wiki.
3444
ExternalWikiURL string `json:"external_wiki_url"`
3545
}
3646

@@ -117,26 +127,14 @@ type EditRepoOption struct {
117127
Private *bool `json:"private,omitempty"`
118128
// either `true` to enable issues for this repository or `false` to disable them.
119129
HasIssues *bool `json:"has_issues,omitempty"`
120-
// either `true` to enable external issue tracker or `false` to disable it.
121-
ExternalTracker *bool `json:"external_tracker,omitempty"`
122-
// URL of external issue tracker.
123-
ExternalTrackerURL *string `json:"external_tracker_url,omitempty"`
124-
// External Issue Tracker URL Format. Use the placeholders {user}, {repo} and {index} for the username, repository name and issue index.
125-
ExternalTrackerFormat *string `json:"external_tracker_format,omitempty"`
126-
// External Issue Tracker Number Format, either `numeric` or `alphanumeric`
127-
ExternalTrackerStyle *string `json:"external_tracker_style,omitempty"`
128-
// Enable time tracking (Built-in issue tracker)
129-
EnableTimeTracker *bool `json:"enable_time_tracker,omitempty"`
130-
// Let only contributors track time (Built-in issue tracker)
131-
LetOnlyContributorsTrackTime *bool `json:"let_only_contributors_track_time,omitempty"`
132-
// Enable dependencies for issues and pull requests (Built-in issue tracker)
133-
EnableIssueDependencies *bool `json:"enable_issue_dependencies,omitempty"`
130+
// set this structure to configure internal issue tracker (requires has_issues)
131+
InternalTracker *InternalTracker `json:"internal_tracker,omitempty"`
132+
// set this structure to use external issue tracker (requires has_issues)
133+
ExternalTracker *ExternalTracker `json:"external_tracker,omitempty"`
134134
// either `true` to enable the wiki for this repository or `false` to disable it.
135135
HasWiki *bool `json:"has_wiki,omitempty"`
136-
// either `true` to enable external wiki or `false` to disable it.
137-
ExternalWiki *bool `json:"external_wiki,omitempty"`
138-
// URL of external wiki.
139-
ExternalWikiURL *string `json:"external_wiki_url,omitempty"`
136+
// set this structure to use external wiki instead of internal (requires has_wiki)
137+
ExternalWiki *ExternalWiki `json:"external_wiki,omitempty"`
140138
// sets the default branch for this repository.
141139
DefaultBranch *string `json:"default_branch,omitempty"`
142140
// either `true` to allow pull requests, or `false` to prevent pull request.

0 commit comments

Comments
 (0)