@@ -23,12 +23,35 @@ func getRepoEditOptionFromRepo(repo *models.Repository) *api.EditRepoOption {
23
23
website := repo .Website
24
24
private := repo .IsPrivate
25
25
hasIssues := false
26
- if _ , err := repo .GetUnit (models .UnitTypeIssues ); err == nil {
26
+ var internalTracker * api.InternalTracker
27
+ var externalTracker * api.ExternalTracker
28
+ if unit , err := repo .GetUnit (models .UnitTypeIssues ); err == nil {
29
+ config := unit .IssuesConfig ()
27
30
hasIssues = true
31
+ internalTracker = & api.InternalTracker {
32
+ EnableTimeTracker : config .EnableTimetracker ,
33
+ AllowOnlyContributorsToTrackTime : config .AllowOnlyContributorsToTrackTime ,
34
+ EnableIssueDependencies : config .EnableDependencies ,
35
+ }
36
+ } else if unit , err := repo .GetUnit (models .UnitTypeExternalTracker ); err == nil {
37
+ config := unit .ExternalTrackerConfig ()
38
+ hasIssues = true
39
+ externalTracker = & api.ExternalTracker {
40
+ ExternalTrackerURL : config .ExternalTrackerURL ,
41
+ ExternalTrackerFormat : config .ExternalTrackerFormat ,
42
+ ExternalTrackerStyle : config .ExternalTrackerStyle ,
43
+ }
28
44
}
29
45
hasWiki := false
46
+ var externalWiki * api.ExternalWiki
30
47
if _ , err := repo .GetUnit (models .UnitTypeWiki ); err == nil {
31
48
hasWiki = true
49
+ } else if unit , err := repo .GetUnit (models .UnitTypeExternalWiki ); err == nil {
50
+ hasWiki = true
51
+ config := unit .ExternalWikiConfig ()
52
+ externalWiki = & api.ExternalWiki {
53
+ ExternalWikiURL : config .ExternalWikiURL ,
54
+ }
32
55
}
33
56
defaultBranch := repo .DefaultBranch
34
57
hasPullRequests := false
@@ -53,7 +76,10 @@ func getRepoEditOptionFromRepo(repo *models.Repository) *api.EditRepoOption {
53
76
Website : & website ,
54
77
Private : & private ,
55
78
HasIssues : & hasIssues ,
79
+ ExternalTracker : externalTracker ,
80
+ InternalTracker : internalTracker ,
56
81
HasWiki : & hasWiki ,
82
+ ExternalWiki : externalWiki ,
57
83
DefaultBranch : & defaultBranch ,
58
84
HasPullRequests : & hasPullRequests ,
59
85
IgnoreWhitespaceConflicts : & ignoreWhitespaceConflicts ,
@@ -143,6 +169,84 @@ func TestAPIRepoEdit(t *testing.T) {
143
169
assert .Equal (t , * repoEditOption .Archived , * repo1editedOption .Archived )
144
170
assert .Equal (t , * repoEditOption .Private , * repo1editedOption .Private )
145
171
assert .Equal (t , * repoEditOption .HasWiki , * repo1editedOption .HasWiki )
172
+
173
+ //Test editing repo1 to use internal issue and wiki (default)
174
+ * repoEditOption .HasIssues = true
175
+ repoEditOption .ExternalTracker = nil
176
+ repoEditOption .InternalTracker = & api.InternalTracker {
177
+ EnableTimeTracker : false ,
178
+ AllowOnlyContributorsToTrackTime : false ,
179
+ EnableIssueDependencies : false ,
180
+ }
181
+ * repoEditOption .HasWiki = true
182
+ repoEditOption .ExternalWiki = nil
183
+ url = fmt .Sprintf ("/api/v1/repos/%s/%s?token=%s" , user2 .Name , * repoEditOption .Name , token2 )
184
+ req = NewRequestWithJSON (t , "PATCH" , url , & repoEditOption )
185
+ resp = session .MakeRequest (t , req , http .StatusOK )
186
+ DecodeJSON (t , resp , & repo )
187
+ assert .NotNil (t , repo )
188
+ // check repo1 was written to database
189
+ repo1edited = models .AssertExistsAndLoadBean (t , & models.Repository {ID : 1 }).(* models.Repository )
190
+ repo1editedOption = getRepoEditOptionFromRepo (repo1edited )
191
+ assert .Equal (t , * repo1editedOption .HasIssues , true )
192
+ assert .Nil (t , repo1editedOption .ExternalTracker )
193
+ assert .Equal (t , * repo1editedOption .InternalTracker , * repoEditOption .InternalTracker )
194
+ assert .Equal (t , * repo1editedOption .HasWiki , true )
195
+ assert .Nil (t , repo1editedOption .ExternalWiki )
196
+
197
+ //Test editing repo1 to use external issue and wiki
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
+ }
206
+ req = NewRequestWithJSON (t , "PATCH" , url , & repoEditOption )
207
+ resp = session .MakeRequest (t , req , http .StatusOK )
208
+ DecodeJSON (t , resp , & repo )
209
+ assert .NotNil (t , repo )
210
+ // check repo1 was written to database
211
+ repo1edited = models .AssertExistsAndLoadBean (t , & models.Repository {ID : 1 }).(* models.Repository )
212
+ repo1editedOption = getRepoEditOptionFromRepo (repo1edited )
213
+ assert .Equal (t , * repo1editedOption .HasIssues , true )
214
+ assert .Equal (t , * repo1editedOption .ExternalTracker , * repoEditOption .ExternalTracker )
215
+ assert .Equal (t , * repo1editedOption .HasWiki , true )
216
+ assert .Equal (t , * repo1editedOption .ExternalWiki , * repoEditOption .ExternalWiki )
217
+
218
+ // Do some tests with invalid URL for external tracker and wiki
219
+ repoEditOption .ExternalTracker .ExternalTrackerURL = "htp://www.somewebsite.com"
220
+ req = NewRequestWithJSON (t , "PATCH" , url , & repoEditOption )
221
+ resp = session .MakeRequest (t , req , http .StatusUnprocessableEntity )
222
+ repoEditOption .ExternalTracker .ExternalTrackerURL = "http://www.somewebsite.com"
223
+ repoEditOption .ExternalTracker .ExternalTrackerFormat = "http://www.somewebsite.com/{user/{repo}?issue={index}"
224
+ req = NewRequestWithJSON (t , "PATCH" , url , & repoEditOption )
225
+ resp = session .MakeRequest (t , req , http .StatusUnprocessableEntity )
226
+ repoEditOption .ExternalTracker .ExternalTrackerFormat = "http://www.somewebsite.com/{user}/{repo}?issue={index}"
227
+ repoEditOption .ExternalWiki .ExternalWikiURL = "htp://www.somewebsite.com"
228
+ req = NewRequestWithJSON (t , "PATCH" , url , & repoEditOption )
229
+ resp = session .MakeRequest (t , req , http .StatusUnprocessableEntity )
230
+
231
+ //Test small repo change through API with issue and wiki option not set; They shall not be touched.
232
+ * repoEditOption .Description = "small change"
233
+ repoEditOption .HasIssues = nil
234
+ repoEditOption .ExternalTracker = nil
235
+ repoEditOption .HasWiki = nil
236
+ repoEditOption .ExternalWiki = nil
237
+ req = NewRequestWithJSON (t , "PATCH" , url , & repoEditOption )
238
+ resp = session .MakeRequest (t , req , http .StatusOK )
239
+ DecodeJSON (t , resp , & repo )
240
+ assert .NotNil (t , repo )
241
+ // check repo1 was written to database
242
+ repo1edited = models .AssertExistsAndLoadBean (t , & models.Repository {ID : 1 }).(* models.Repository )
243
+ repo1editedOption = getRepoEditOptionFromRepo (repo1edited )
244
+ assert .Equal (t , * repo1editedOption .Description , * repoEditOption .Description )
245
+ assert .Equal (t , * repo1editedOption .HasIssues , true )
246
+ assert .NotNil (t , * repo1editedOption .ExternalTracker )
247
+ assert .Equal (t , * repo1editedOption .HasWiki , true )
248
+ assert .NotNil (t , * repo1editedOption .ExternalWiki )
249
+
146
250
// reset repo in db
147
251
url = fmt .Sprintf ("/api/v1/repos/%s/%s?token=%s" , user2 .Name , * repoEditOption .Name , token2 )
148
252
req = NewRequestWithJSON (t , "PATCH" , url , & origRepoEditOption )
0 commit comments