diff --git a/Makefile b/Makefile index a876a51..486f45c 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ KERNEL?=$$(uname -s | tr '[:upper:]' '[:lower:]') GOFMT ?= gofmt -s -VERSION = 0.12.3 +VERSION = 0.13.0 test: fmt-check go test -i $(TEST) || exit 1 diff --git a/README.md b/README.md index 2a5bffe..17d15ca 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ terraform { required_providers { gitea = { source = "Lerentis/gitea" - version = "0.12.3" + version = "0.13.0" } } } diff --git a/docs/index.md b/docs/index.md index 419f534..4a70051 100644 --- a/docs/index.md +++ b/docs/index.md @@ -17,7 +17,7 @@ terraform { required_providers { gitea = { source = "Lerentis/gitea" - version = "0.12.3" + version = "0.13.0" } } } diff --git a/docs/resources/team.md b/docs/resources/team.md index 6434ca7..9d891d2 100644 --- a/docs/resources/team.md +++ b/docs/resources/team.md @@ -34,6 +34,26 @@ resource "gitea_team" "test_team" { permission = "write" members = [gitea_user.test.username] } + + +resource "gitea_repository" "test" { + username = gitea_org.test_org.name + name = "test" + private = true + issue_labels = "Default" + license = "MIT" + gitignores = "Go" +} + +resource "gitea_team" "test_team_restricted" { + name = "Restricted Devs" + organisation = gitea_org.test_org.name + description = "Restricted Devs of Test Org" + permission = "write" + members = [gitea_user.test.username] + include_all_repositories = false + repositories = [gitea_repository.test.name] +} ``` @@ -52,6 +72,7 @@ resource "gitea_team" "test_team" { - `members` (List of String) List of Users that should be part of this team - `permission` (String) Permissions associated with this Team Can be `none`, `read`, `write`, `admin` or `owner` +- `repositories` (List of String) List of Repositories that should be part of this team - `units` (String) List of types of Repositories that should be allowed to be created from Team members. Can be `repo.code`, `repo.issues`, `repo.ext_issues`, `repo.wiki`, `repo.pulls`, `repo.releases`, `repo.projects` and/or `repo.ext_wiki` diff --git a/examples/provider.tf b/examples/provider.tf index 1c7dae3..7a3b3e0 100644 --- a/examples/provider.tf +++ b/examples/provider.tf @@ -2,7 +2,7 @@ terraform { required_providers { gitea = { source = "terraform.local/lerentis/gitea" - version = "0.12.3" + version = "0.13.0" } } } diff --git a/examples/provider/provider.tf b/examples/provider/provider.tf index 8362174..fd96593 100644 --- a/examples/provider/provider.tf +++ b/examples/provider/provider.tf @@ -2,7 +2,7 @@ terraform { required_providers { gitea = { source = "Lerentis/gitea" - version = "0.12.3" + version = "0.13.0" } } } diff --git a/examples/resources/gitea_team/resource.tf b/examples/resources/gitea_team/resource.tf index 7accce0..256f8ce 100644 --- a/examples/resources/gitea_team/resource.tf +++ b/examples/resources/gitea_team/resource.tf @@ -19,3 +19,23 @@ resource "gitea_team" "test_team" { permission = "write" members = [gitea_user.test.username] } + + +resource "gitea_repository" "test" { + username = gitea_org.test_org.name + name = "test" + private = true + issue_labels = "Default" + license = "MIT" + gitignores = "Go" +} + +resource "gitea_team" "test_team_restricted" { + name = "Restricted Devs" + organisation = gitea_org.test_org.name + description = "Restricted Devs of Test Org" + permission = "write" + members = [gitea_user.test.username] + include_all_repositories = false + repositories = [gitea_repository.test.name] +} diff --git a/gitea/resource_gitea_team.go b/gitea/resource_gitea_team.go index 15d4203..dbcb434 100644 --- a/gitea/resource_gitea_team.go +++ b/gitea/resource_gitea_team.go @@ -1,6 +1,7 @@ package gitea import ( + "errors" "fmt" "strconv" "strings" @@ -18,6 +19,7 @@ const ( TeamIncludeAllReposFlag string = "include_all_repositories" TeamUnits string = "units" TeamMembers string = "members" + TeamRepositories string = "repositories" ) func resourceTeamRead(d *schema.ResourceData, meta interface{}) (err error) { @@ -75,12 +77,14 @@ func resourceTeamCreate(d *schema.ResourceData, meta interface{}) (err error) { units = append(units, gitea.RepoUnitProjects) } + includeAllRepos := d.Get(TeamIncludeAllReposFlag).(bool) + opts := gitea.CreateTeamOption{ Name: d.Get(TeamName).(string), Description: d.Get(TeamDescription).(string), Permission: gitea.AccessMode(d.Get(TeamPermissions).(string)), CanCreateOrgRepo: d.Get(TeamCreateRepoFlag).(bool), - IncludesAllRepositories: d.Get(TeamIncludeAllReposFlag).(bool), + IncludesAllRepositories: includeAllRepos, Units: units, } @@ -101,6 +105,13 @@ func resourceTeamCreate(d *schema.ResourceData, meta interface{}) (err error) { } } + if !includeAllRepos { + err = setTeamRepositories(team, d, meta, false) + if err != nil { + return err + } + } + err = setTeamResourceData(team, d) return @@ -181,6 +192,13 @@ func resourceTeamUpdate(d *schema.ResourceData, meta interface{}) (err error) { } } + if !includeAllRepos { + err = setTeamRepositories(team, d, meta, true) + if err != nil { + return err + } + } + team, _, _ = client.GetTeam(id) err = setTeamResourceData(team, d) @@ -218,6 +236,7 @@ func setTeamResourceData(team *gitea.Team, d *schema.ResourceData) (err error) { d.Set(TeamUnits, d.Get(TeamUnits).(string)) d.Set(TeamOrg, d.Get(TeamOrg).(string)) d.Set(TeamMembers, d.Get(TeamMembers)) + d.Set(TeamRepositories, d.Get(TeamRepositories)) return } @@ -290,7 +309,75 @@ func resourceGiteaTeam() *schema.Resource { Computed: true, Description: "List of Users that should be part of this team", }, + "repositories": { + Type: schema.TypeList, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + Optional: true, + Required: false, + Computed: true, + Description: "List of Repositories that should be part of this team", + }, }, Description: "`gitea_team` manages Team that are part of an organisation.", } } + +func setTeamRepositories(team *gitea.Team, d *schema.ResourceData, meta interface{}, update bool) (err error) { + client := meta.(*gitea.Client) + + org := d.Get(TeamOrg).(string) + + repositories := make(map[string]bool) + for _, repo := range d.Get(TeamRepositories).([]interface{}) { + if repo != "" { + repositories[repo.(string)] = true + } + } + + if update { + page := 1 + + for { + var existingRepositories []*gitea.Repository + existingRepositories, _, err = client.ListTeamRepositories(team.ID, gitea.ListTeamRepositoriesOptions{ + ListOptions: gitea.ListOptions{ + Page: page, + PageSize: 50, + }, + }) + if err != nil { + return errors.New(fmt.Sprintf("[ERROR] Error listeng team repositories: %s", err)) + } + if len(existingRepositories) == 0 { + break + } + + for _, exr := range existingRepositories { + _, exists := repositories[exr.Name] + if exists { + repositories[exr.Name] = false + } else { + _, err = client.RemoveTeamRepository(team.ID, org, exr.Name) + if err != nil { + return errors.New(fmt.Sprintf("[ERROR] Error removing team repository %q: %s", exr.Name, err)) + } + } + } + + page += 1 + } + } + + for repo, flag := range repositories { + if flag { + _, err = client.AddTeamRepository(team.ID, org, repo) + if err != nil { + return errors.New(fmt.Sprintf("[ERROR] Error adding team repository %q: %s", repo, err)) + } + } + } + + return +}