@@ -23,12 +23,37 @@ func getRepoEditOptionFromRepo(repo *models.Repository) *api.EditRepoOption {
2323 website := repo .Website
2424 private := repo .IsPrivate
2525 hasIssues := false
26- if _ , err := repo .GetUnit (models .UnitTypeIssues ); err == nil {
26+ externalTracker := false
27+ externalTrackerURL := ""
28+ externalTrackerFormat := ""
29+ externalTrackerStyle := ""
30+ enableTimeTracker := false
31+ letOnlyContributorsTrackTime := false
32+ enableIssueDependencies := false
33+ if unit , err := repo .GetUnit (models .UnitTypeIssues ); err == nil {
34+ config := unit .IssuesConfig ()
2735 hasIssues = true
36+ enableTimeTracker = config .EnableTimetracker
37+ letOnlyContributorsTrackTime = config .AllowOnlyContributorsToTrackTime
38+ enableIssueDependencies = config .EnableDependencies
39+ } else if unit , err := repo .GetUnit (models .UnitTypeExternalTracker ); err == nil {
40+ config := unit .ExternalTrackerConfig ()
41+ hasIssues = true
42+ externalTracker = true
43+ externalTrackerURL = config .ExternalTrackerURL
44+ externalTrackerFormat = config .ExternalTrackerFormat
45+ externalTrackerStyle = config .ExternalTrackerStyle
2846 }
2947 hasWiki := false
48+ externalWiki := false
49+ externalWikiURL := ""
3050 if _ , err := repo .GetUnit (models .UnitTypeWiki ); err == nil {
3151 hasWiki = true
52+ } else if unit , err := repo .GetUnit (models .UnitTypeExternalWiki ); err == nil {
53+ hasWiki = true
54+ config := unit .ExternalWikiConfig ()
55+ externalWiki = true
56+ externalWikiURL = config .ExternalWikiURL
3257 }
3358 defaultBranch := repo .DefaultBranch
3459 hasPullRequests := false
@@ -48,20 +73,29 @@ func getRepoEditOptionFromRepo(repo *models.Repository) *api.EditRepoOption {
4873 }
4974 archived := repo .IsArchived
5075 return & api.EditRepoOption {
51- Name : & name ,
52- Description : & description ,
53- Website : & website ,
54- Private : & private ,
55- HasIssues : & hasIssues ,
56- HasWiki : & hasWiki ,
57- DefaultBranch : & defaultBranch ,
58- HasPullRequests : & hasPullRequests ,
59- IgnoreWhitespaceConflicts : & ignoreWhitespaceConflicts ,
60- AllowMerge : & allowMerge ,
61- AllowRebase : & allowRebase ,
62- AllowRebaseMerge : & allowRebaseMerge ,
63- AllowSquash : & allowSquash ,
64- Archived : & archived ,
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 ,
6599 }
66100}
67101
@@ -143,6 +177,81 @@ func TestAPIRepoEdit(t *testing.T) {
143177 assert .Equal (t , * repoEditOption .Archived , * repo1editedOption .Archived )
144178 assert .Equal (t , * repoEditOption .Private , * repo1editedOption .Private )
145179 assert .Equal (t , * repoEditOption .HasWiki , * repo1editedOption .HasWiki )
180+
181+ //Test editing repo1 to use internal issue and wiki (default)
182+ enableTimeTracker := false
183+ letOnlyContributorsTrackTime := false
184+ enableIssueDependencies := false
185+ * repoEditOption .HasIssues = true
186+ repoEditOption .ExternalTracker = nil
187+ repoEditOption .EnableTimeTracker = & enableTimeTracker
188+ repoEditOption .LetOnlyContributorsTrackTime = & letOnlyContributorsTrackTime
189+ repoEditOption .EnableIssueDependencies = & enableIssueDependencies
190+ * repoEditOption .HasWiki = true
191+ repoEditOption .ExternalWiki = nil
192+ url = fmt .Sprintf ("/api/v1/repos/%s/%s?token=%s" , user2 .Name , * repoEditOption .Name , token2 )
193+ req = NewRequestWithJSON (t , "PATCH" , url , & repoEditOption )
194+ resp = session .MakeRequest (t , req , http .StatusOK )
195+ DecodeJSON (t , resp , & repo )
196+ assert .NotNil (t , repo )
197+ // check repo1 was written to database
198+ repo1edited = models .AssertExistsAndLoadBean (t , & models.Repository {ID : 1 }).(* models.Repository )
199+ repo1editedOption = getRepoEditOptionFromRepo (repo1edited )
200+ 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 )
205+ assert .Equal (t , * repo1editedOption .HasWiki , true )
206+ assert .Equal (t , * repo1editedOption .ExternalWiki , false )
207+
208+ //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
220+ req = NewRequestWithJSON (t , "PATCH" , url , & repoEditOption )
221+ resp = session .MakeRequest (t , req , http .StatusOK )
222+ DecodeJSON (t , resp , & repo )
223+ assert .NotNil (t , repo )
224+ // check repo1 was written to database
225+ repo1edited = models .AssertExistsAndLoadBean (t , & models.Repository {ID : 1 }).(* models.Repository )
226+ repo1editedOption = getRepoEditOptionFromRepo (repo1edited )
227+ 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 )
232+ assert .Equal (t , * repo1editedOption .HasWiki , true )
233+ assert .Equal (t , * repo1editedOption .ExternalWiki , true )
234+ assert .Equal (t , * repo1editedOption .ExternalWikiURL , * repoEditOption .ExternalWikiURL )
235+
236+ //Test small repo change through API with issue and wiki option not set; They shall not be touched.
237+ * repoEditOption .Description = "small change"
238+ repoEditOption .HasIssues = nil
239+ * repoEditOption .ExternalTracker = false
240+ repoEditOption .HasWiki = nil
241+ * repoEditOption .ExternalWiki = false
242+ req = NewRequestWithJSON (t , "PATCH" , url , & repoEditOption )
243+ resp = session .MakeRequest (t , req , http .StatusOK )
244+ DecodeJSON (t , resp , & repo )
245+ assert .NotNil (t , repo )
246+ // check repo1 was written to database
247+ repo1edited = models .AssertExistsAndLoadBean (t , & models.Repository {ID : 1 }).(* models.Repository )
248+ repo1editedOption = getRepoEditOptionFromRepo (repo1edited )
249+ assert .Equal (t , * repo1editedOption .Description , * repoEditOption .Description )
250+ assert .Equal (t , * repo1editedOption .HasIssues , true )
251+ assert .Equal (t , * repo1editedOption .ExternalTracker , true )
252+ assert .Equal (t , * repo1editedOption .HasWiki , true )
253+ assert .Equal (t , * repo1editedOption .ExternalWiki , true )
254+
146255 // reset repo in db
147256 url = fmt .Sprintf ("/api/v1/repos/%s/%s?token=%s" , user2 .Name , * repoEditOption .Name , token2 )
148257 req = NewRequestWithJSON (t , "PATCH" , url , & origRepoEditOption )
0 commit comments