diff --git a/docs/index.md b/docs/index.md index e5e038b..f1cf291 100644 --- a/docs/index.md +++ b/docs/index.md @@ -17,7 +17,7 @@ terraform { required_providers { gitea = { source = "Lerentis/gitea" - version = "0.7.2" + version = "0.7.4" } } } diff --git a/docs/resources/git_hook.md b/docs/resources/git_hook.md new file mode 100644 index 0000000..a987155 --- /dev/null +++ b/docs/resources/git_hook.md @@ -0,0 +1,47 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "gitea_git_hook Resource - terraform-provider-gitea" +subcategory: "" +description: |- + gitea_git_hook manages git hooks on a repository. +--- + +# gitea_git_hook (Resource) + +`gitea_git_hook` manages git hooks on a repository. + +## Example Usage + +```terraform +resource "gitea_org" "test_org" { + name = "test-org" +} + +resource "gitea_repository" "org_repo" { + username = gitea_org.test_org.name + name = "org-test-repo" +} + +resource "gitea_git_hook" "org_repo_post-receive" { + name = "post-receive" + user = gitea_org.test_org.name + repo = gitea_repository.org_repo.name + content = file("${path.module}/post-receive.sh") +} +``` + + +## Schema + +### Required + +- `content` (String) Content of the git hook +- `name` (String) Name of the git hook to configure +- `repo` (String) The repository that this hook belongs too. +- `user` (String) The user (or organisation) owning the repo this hook belongs too + +### Read-Only + +- `id` (String) The ID of this resource. + + diff --git a/gitea/provider.go b/gitea/provider.go index aed1dae..6c5c806 100644 --- a/gitea/provider.go +++ b/gitea/provider.go @@ -80,6 +80,7 @@ func Provider() *schema.Provider { "gitea_repository": resourceGiteaRepository(), "gitea_public_key": resourceGiteaPublicKey(), "gitea_team": resourceGiteaTeam(), + "gitea_git_hook": resourceGiteaGitHook(), }, ConfigureFunc: providerConfigure, diff --git a/gitea/resource_gitea_git_hook.go b/gitea/resource_gitea_git_hook.go new file mode 100644 index 0000000..186482d --- /dev/null +++ b/gitea/resource_gitea_git_hook.go @@ -0,0 +1,115 @@ +package gitea + +import ( + "fmt" + + "code.gitea.io/sdk/gitea" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +const ( + GitHookUser string = "user" + GitHookRepo string = "repo" + GitHookName string = "name" + GitHookContent string = "content" +) + +func resourceGitHookRead(d *schema.ResourceData, meta interface{}) (err error) { + client := meta.(*gitea.Client) + + user := d.Get(GitHookUser).(string) + repo := d.Get(GitHookRepo).(string) + name := d.Get(GitHookName).(string) + + gitHook, _, err := client.GetRepoGitHook(user, repo, name) + + if err != nil { + return err + } + + err = setGitHookResourceData(user, repo, gitHook, d) + + return +} + +func resourceGitHookUpdate(d *schema.ResourceData, meta interface{}) (err error) { + client := meta.(*gitea.Client) + + user := d.Get(GitHookUser).(string) + repo := d.Get(GitHookRepo).(string) + name := d.Get(GitHookName).(string) + + opts := gitea.EditGitHookOption{ + Content: d.Get(GitHookContent).(string), + } + + _, err = client.EditRepoGitHook(user, repo, name, opts) + + if err != nil { + return err + } + + // Get gitHook ourselves, EditRepoGitHook does not return it + gitHook, _, err := client.GetRepoGitHook(user, repo, name) + + if err != nil { + return err + } + + err = setGitHookResourceData(user, repo, gitHook, d) + + return +} + +func resourceGitHookDelete(d *schema.ResourceData, meta interface{}) (err error) { + client := meta.(*gitea.Client) + + user := d.Get(GitHookUser).(string) + repo := d.Get(GitHookRepo).(string) + name := d.Get(GitHookName).(string) + + _, err = client.DeleteRepoGitHook(user, repo, name) + + return +} + +func setGitHookResourceData(user string, repo string, gitHook *gitea.GitHook, d *schema.ResourceData) (err error) { + d.SetId(fmt.Sprintf("%s/%s/%s", user, repo, gitHook.Name)) + d.Set(GitHookUser, user) + d.Set(GitHookRepo, repo) + d.Set(GitHookName, gitHook.Name) + d.Set(GitHookContent, gitHook.Content) + return +} + +func resourceGiteaGitHook() *schema.Resource { + return &schema.Resource{ + Read: resourceGitHookRead, + Create: resourceGitHookUpdate, // All hooks already exist, just empty and disabled + Update: resourceGitHookUpdate, + Delete: resourceGitHookDelete, + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Required: true, + Description: "Name of the git hook to configure", + }, + "repo": { + Type: schema.TypeString, + Required: true, + Description: "The repository that this hook belongs too.", + }, + "user": { + Type: schema.TypeString, + Required: true, + Description: "The user (or organisation) owning the repo this hook belongs too", + }, + "content": { + Type: schema.TypeString, + Required: true, + Description: "Content of the git hook", + }, + }, + Description: "`gitea_git_hook` manages git hooks on a repository.", + } +}