Make external issue tracker regexp configurable via API (#21338)

Fixes #21336 

Signed-off-by: Andrew Imeson <andrew@andrewimeson.com>
tokarchuk/v1.18
Andrew Imeson 2 years ago committed by GitHub
parent 81d7270cde
commit d94f15c2fd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      modules/convert/repository.go
  2. 4
      modules/structs/repo.go
  3. 7
      routers/api/v1/repo/repo.go
  4. 7
      templates/swagger/v1_json.tmpl
  5. 18
      tests/integration/api_repo_edit_test.go

@ -56,9 +56,10 @@ func innerToRepo(repo *repo_model.Repository, mode perm.AccessMode, isParent boo
config := unit.ExternalTrackerConfig() config := unit.ExternalTrackerConfig()
hasIssues = true hasIssues = true
externalTracker = &api.ExternalTracker{ externalTracker = &api.ExternalTracker{
ExternalTrackerURL: config.ExternalTrackerURL, ExternalTrackerURL: config.ExternalTrackerURL,
ExternalTrackerFormat: config.ExternalTrackerFormat, ExternalTrackerFormat: config.ExternalTrackerFormat,
ExternalTrackerStyle: config.ExternalTrackerStyle, ExternalTrackerStyle: config.ExternalTrackerStyle,
ExternalTrackerRegexpPattern: config.ExternalTrackerRegexpPattern,
} }
} }
hasWiki := false hasWiki := false

@ -34,8 +34,10 @@ type ExternalTracker struct {
ExternalTrackerURL string `json:"external_tracker_url"` ExternalTrackerURL string `json:"external_tracker_url"`
// External Issue Tracker URL Format. Use the placeholders {user}, {repo} and {index} for the username, repository name and issue index. // External Issue Tracker URL Format. Use the placeholders {user}, {repo} and {index} for the username, repository name and issue index.
ExternalTrackerFormat string `json:"external_tracker_format"` ExternalTrackerFormat string `json:"external_tracker_format"`
// External Issue Tracker Number Format, either `numeric` or `alphanumeric` // External Issue Tracker Number Format, either `numeric`, `alphanumeric`, or `regexp`
ExternalTrackerStyle string `json:"external_tracker_style"` ExternalTrackerStyle string `json:"external_tracker_style"`
// External Issue Tracker issue regular expression
ExternalTrackerRegexpPattern string `json:"external_tracker_regexp_pattern"`
} }
// ExternalWiki represents setting for external wiki // ExternalWiki represents setting for external wiki

@ -755,9 +755,10 @@ func updateRepoUnits(ctx *context.APIContext, opts api.EditRepoOption) error {
RepoID: repo.ID, RepoID: repo.ID,
Type: unit_model.TypeExternalTracker, Type: unit_model.TypeExternalTracker,
Config: &repo_model.ExternalTrackerConfig{ Config: &repo_model.ExternalTrackerConfig{
ExternalTrackerURL: opts.ExternalTracker.ExternalTrackerURL, ExternalTrackerURL: opts.ExternalTracker.ExternalTrackerURL,
ExternalTrackerFormat: opts.ExternalTracker.ExternalTrackerFormat, ExternalTrackerFormat: opts.ExternalTracker.ExternalTrackerFormat,
ExternalTrackerStyle: opts.ExternalTracker.ExternalTrackerStyle, ExternalTrackerStyle: opts.ExternalTracker.ExternalTrackerStyle,
ExternalTrackerRegexpPattern: opts.ExternalTracker.ExternalTrackerRegexpPattern,
}, },
}) })
deleteUnitTypes = append(deleteUnitTypes, unit_model.TypeIssues) deleteUnitTypes = append(deleteUnitTypes, unit_model.TypeIssues)

@ -16015,8 +16015,13 @@
"type": "string", "type": "string",
"x-go-name": "ExternalTrackerFormat" "x-go-name": "ExternalTrackerFormat"
}, },
"external_tracker_regexp_pattern": {
"description": "External Issue Tracker issue regular expression",
"type": "string",
"x-go-name": "ExternalTrackerRegexpPattern"
},
"external_tracker_style": { "external_tracker_style": {
"description": "External Issue Tracker Number Format, either `numeric` or `alphanumeric`", "description": "External Issue Tracker Number Format, either `numeric`, `alphanumeric`, or `regexp`",
"type": "string", "type": "string",
"x-go-name": "ExternalTrackerStyle" "x-go-name": "ExternalTrackerStyle"
}, },

@ -40,9 +40,10 @@ func getRepoEditOptionFromRepo(repo *repo_model.Repository) *api.EditRepoOption
config := unit.ExternalTrackerConfig() config := unit.ExternalTrackerConfig()
hasIssues = true hasIssues = true
externalTracker = &api.ExternalTracker{ externalTracker = &api.ExternalTracker{
ExternalTrackerURL: config.ExternalTrackerURL, ExternalTrackerURL: config.ExternalTrackerURL,
ExternalTrackerFormat: config.ExternalTrackerFormat, ExternalTrackerFormat: config.ExternalTrackerFormat,
ExternalTrackerStyle: config.ExternalTrackerStyle, ExternalTrackerStyle: config.ExternalTrackerStyle,
ExternalTrackerRegexpPattern: config.ExternalTrackerRegexpPattern,
} }
} }
hasWiki := false hasWiki := false
@ -220,6 +221,17 @@ func TestAPIRepoEdit(t *testing.T) {
assert.Equal(t, *repo1editedOption.HasWiki, true) assert.Equal(t, *repo1editedOption.HasWiki, true)
assert.Equal(t, *repo1editedOption.ExternalWiki, *repoEditOption.ExternalWiki) assert.Equal(t, *repo1editedOption.ExternalWiki, *repoEditOption.ExternalWiki)
repoEditOption.ExternalTracker.ExternalTrackerStyle = "regexp"
repoEditOption.ExternalTracker.ExternalTrackerRegexpPattern = `(\d+)`
req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption)
resp = session.MakeRequest(t, req, http.StatusOK)
DecodeJSON(t, resp, &repo)
assert.NotNil(t, repo)
repo1edited = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
repo1editedOption = getRepoEditOptionFromRepo(repo1edited)
assert.Equal(t, *repo1editedOption.HasIssues, true)
assert.Equal(t, *repo1editedOption.ExternalTracker, *repoEditOption.ExternalTracker)
// Do some tests with invalid URL for external tracker and wiki // Do some tests with invalid URL for external tracker and wiki
repoEditOption.ExternalTracker.ExternalTrackerURL = "htp://www.somewebsite.com" repoEditOption.ExternalTracker.ExternalTrackerURL = "htp://www.somewebsite.com"
req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption) req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption)

Loading…
Cancel
Save