Skip to content

Add has_code to repository REST API #35214

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions modules/structs/repo.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ type Repository struct {
Updated time.Time `json:"updated_at"`
ArchivedAt time.Time `json:"archived_at"`
Permissions *Permission `json:"permissions,omitempty"`
HasCode bool `json:"has_code"`
HasIssues bool `json:"has_issues"`
InternalTracker *InternalTracker `json:"internal_tracker,omitempty"`
ExternalTracker *ExternalTracker `json:"external_tracker,omitempty"`
Expand Down Expand Up @@ -170,6 +171,8 @@ type EditRepoOption struct {
Private *bool `json:"private,omitempty"`
// either `true` to make this repository a template or `false` to make it a normal repository
Template *bool `json:"template,omitempty"`
// either `true` to enable code for this repository or `false` to disable it.
HasCode *bool `json:"has_code,omitempty"`
// either `true` to enable issues for this repository or `false` to disable them.
HasIssues *bool `json:"has_issues,omitempty"`
// set this structure to configure internal issue tracker
Expand Down
12 changes: 12 additions & 0 deletions routers/api/v1/repo/repo.go
Original file line number Diff line number Diff line change
Expand Up @@ -869,6 +869,18 @@ func updateRepoUnits(ctx *context.APIContext, opts api.EditRepoOption) error {
}
}

if opts.HasCode != nil && !unit_model.TypeCode.UnitGlobalDisabled() {
if *opts.HasCode {
units = append(units, repo_model.RepoUnit{
RepoID: repo.ID,
Type: unit_model.TypeCode,
Config: &repo_model.UnitConfig{},
})
} else {
deleteUnitTypes = append(deleteUnitTypes, unit_model.TypeCode)
}
}

if opts.HasPullRequests != nil && !unit_model.TypePullRequests.UnitGlobalDisabled() {
if *opts.HasPullRequests {
// We do allow setting individual PR settings through the API, so
Expand Down
9 changes: 9 additions & 0 deletions templates/swagger/v1_json.tmpl

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

54 changes: 54 additions & 0 deletions tests/integration/api_repo_edit_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,12 +76,36 @@ func getRepoEditOptionFromRepo(repo *repo_model.Repository) *api.EditRepoOption
allowFastForwardOnly = config.AllowFastForwardOnly
}
archived := repo.IsArchived
hasProjects := false
var projectsMode *string
if unit, err := repo.GetUnit(db.DefaultContext, unit_model.TypeProjects); err == nil && unit != nil {
hasProjects = true
pm := string(unit.ProjectsConfig().ProjectsMode)
projectsMode = &pm
}
hasCode := repo.UnitEnabled(db.DefaultContext, unit_model.TypeCode)
hasPackages := repo.UnitEnabled(db.DefaultContext, unit_model.TypePackages)
hasReleases := repo.UnitEnabled(db.DefaultContext, unit_model.TypeReleases)
hasActions := false
if unit, err := repo.GetUnit(db.DefaultContext, unit_model.TypeActions); err == nil && unit != nil {
hasActions = true
// TODO: expose action config of repo to api
// actionsConfig = &api.RepoActionsConfig{
// DisabledWorkflows: unit.ActionsConfig().DisabledWorkflows,
// }
}
return &api.EditRepoOption{
Name: &name,
Description: &description,
Website: &website,
Private: &private,
HasIssues: &hasIssues,
HasProjects: &hasProjects,
ProjectsMode: projectsMode,
HasCode: &hasCode,
HasPackages: &hasPackages,
HasReleases: &hasReleases,
HasActions: &hasActions,
ExternalTracker: externalTracker,
InternalTracker: internalTracker,
HasWiki: &hasWiki,
Expand All @@ -108,6 +132,11 @@ func getNewRepoEditOption(opts *api.EditRepoOption) *api.EditRepoOption {
private := !*opts.Private
hasIssues := !*opts.HasIssues
hasWiki := !*opts.HasWiki
hasProjects := !*opts.HasProjects
hasCode := !*opts.HasCode
hasPackages := !*opts.HasPackages
hasReleases := !*opts.HasReleases
hasActions := !*opts.HasActions
defaultBranch := "master"
hasPullRequests := !*opts.HasPullRequests
ignoreWhitespaceConflicts := !*opts.IgnoreWhitespaceConflicts
Expand All @@ -125,6 +154,11 @@ func getNewRepoEditOption(opts *api.EditRepoOption) *api.EditRepoOption {
DefaultBranch: &defaultBranch,
HasIssues: &hasIssues,
HasWiki: &hasWiki,
HasProjects: &hasProjects,
HasCode: &hasCode,
HasPackages: &hasPackages,
HasReleases: &hasReleases,
HasActions: &hasActions,
HasPullRequests: &hasPullRequests,
IgnoreWhitespaceConflicts: &ignoreWhitespaceConflicts,
AllowMerge: &allowMerge,
Expand Down Expand Up @@ -156,6 +190,11 @@ func TestAPIRepoEdit(t *testing.T) {

// Test editing a repo1 which user2 owns, changing name and many properties
origRepoEditOption := getRepoEditOptionFromRepo(repo1)
assert.True(t, *origRepoEditOption.HasCode)
assert.True(t, *origRepoEditOption.HasPackages)
assert.True(t, *origRepoEditOption.HasProjects)
assert.True(t, *origRepoEditOption.HasReleases)
assert.True(t, *origRepoEditOption.HasActions)
repoEditOption := getNewRepoEditOption(origRepoEditOption)
req := NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo1.Name), &repoEditOption).
AddTokenAuth(token2)
Expand All @@ -177,6 +216,11 @@ func TestAPIRepoEdit(t *testing.T) {
assert.Equal(t, *repoEditOption.Archived, *repo1editedOption.Archived)
assert.Equal(t, *repoEditOption.Private, *repo1editedOption.Private)
assert.Equal(t, *repoEditOption.HasWiki, *repo1editedOption.HasWiki)
assert.Equal(t, *repoEditOption.HasCode, *repo1editedOption.HasCode)
assert.Equal(t, *repoEditOption.HasPackages, *repo1editedOption.HasPackages)
assert.Equal(t, *repoEditOption.HasProjects, *repo1editedOption.HasProjects)
assert.Equal(t, *repoEditOption.HasReleases, *repo1editedOption.HasReleases)
assert.Equal(t, *repoEditOption.HasActions, *repo1editedOption.HasActions)

// Test editing repo1 to use internal issue and wiki (default)
*repoEditOption.HasIssues = true
Expand Down Expand Up @@ -224,6 +268,11 @@ func TestAPIRepoEdit(t *testing.T) {
assert.Equal(t, *repo1editedOption.ExternalTracker, *repoEditOption.ExternalTracker)
assert.True(t, *repo1editedOption.HasWiki)
assert.Equal(t, *repo1editedOption.ExternalWiki, *repoEditOption.ExternalWiki)
assert.False(t, *repo1editedOption.HasCode)
assert.False(t, *repo1editedOption.HasPackages)
assert.False(t, *repo1editedOption.HasProjects)
assert.False(t, *repo1editedOption.HasReleases)
assert.False(t, *repo1editedOption.HasActions)

repoEditOption.ExternalTracker.ExternalTrackerStyle = "regexp"
repoEditOption.ExternalTracker.ExternalTrackerRegexpPattern = `(\d+)`
Expand Down Expand Up @@ -272,6 +321,11 @@ func TestAPIRepoEdit(t *testing.T) {
assert.NotNil(t, *repo1editedOption.ExternalTracker)
assert.True(t, *repo1editedOption.HasWiki)
assert.NotNil(t, *repo1editedOption.ExternalWiki)
assert.False(t, *repo1editedOption.HasCode)
assert.False(t, *repo1editedOption.HasPackages)
assert.False(t, *repo1editedOption.HasProjects)
assert.False(t, *repo1editedOption.HasReleases)
assert.False(t, *repo1editedOption.HasActions)

// reset repo in db
req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, *repoEditOption.Name), &origRepoEditOption).
Expand Down