From 3cc9bb12851e058d995171b01c4a4f74c3be4b26 Mon Sep 17 00:00:00 2001 From: Gavin Bunney Date: Thu, 17 Oct 2019 13:32:17 -0700 Subject: [PATCH] Added `enable_git_lfs` flag for repositories --- bitbucket/resource_repository.go | 67 ++++++++++++++++++++++---- bitbucket/resource_repository_test.go | 32 ++++++++++++ docusaurus/docs/resource_repository.md | 1 + 3 files changed, 91 insertions(+), 9 deletions(-) diff --git a/bitbucket/resource_repository.go b/bitbucket/resource_repository.go index b2f9a9e..6ccf522 100644 --- a/bitbucket/resource_repository.go +++ b/bitbucket/resource_repository.go @@ -67,6 +67,11 @@ func resourceRepository() *schema.Resource { Optional: true, Default: false, }, + "enable_git_lfs": { + Type: schema.TypeBool, + Optional: true, + Default: false, + }, "clone_ssh": { Type: schema.TypeString, Computed: true, @@ -112,12 +117,18 @@ func resourceRepositoryUpdate(d *schema.ResourceData, m interface{}) error { return err } + err = handleRepositoryGitLFSChanges(client, project, repoSlug, d) + if err != nil { + return err + } + return resourceRepositoryRead(d, m) } func resourceRepositoryCreate(d *schema.ResourceData, m interface{}) error { client := m.(*BitbucketServerProvider).BitbucketClient repo, project := newRepositoryFromResource(d) + repoSlug := determineSlug(d) bytedata, err := json.Marshal(repo) @@ -135,16 +146,48 @@ func resourceRepositoryCreate(d *schema.ResourceData, m interface{}) error { d.SetId(string(fmt.Sprintf("%s/%s", project, repo.Name))) + err = handleRepositoryGitLFSChanges(client, project, repoSlug, d) + if err != nil { + return err + } + return resourceRepositoryRead(d, m) } +func handleRepositoryGitLFSChanges(client *BitbucketClient, project string, repoSlug string, d *schema.ResourceData) error { + enableGitLFS := d.Get("enable_git_lfs").(bool) + if (d.IsNewResource() && enableGitLFS) || d.HasChange("enable_git_lfs") { + if enableGitLFS { + _, err := client.Put(fmt.Sprintf("/rest/git-lfs/admin/projects/%s/repos/%s/enabled", + project, + repoSlug, + ), nil) + + if err != nil { + return err + } + } else { + _, err := client.Delete(fmt.Sprintf("/rest/git-lfs/admin/projects/%s/repos/%s/enabled", + project, + repoSlug, + )) + + if err != nil { + return err + } + } + } + + return nil +} + func resourceRepositoryRead(d *schema.ResourceData, m interface{}) error { id := d.Id() if id != "" { idparts := strings.Split(id, "/") if len(idparts) == 2 { - d.Set("project", idparts[0]) - d.Set("slug", idparts[1]) + _ = d.Set("project", idparts[0]) + _ = d.Set("slug", idparts[1]) } else { return fmt.Errorf("incorrect ID format, should match `project/slug`") } @@ -177,21 +220,27 @@ func resourceRepositoryRead(d *schema.ResourceData, m interface{}) error { return decodeerr } - d.Set("name", repo.Name) + _ = d.Set("name", repo.Name) if repo.Slug != "" && repo.Name != repo.Slug { - d.Set("slug", repo.Slug) + _ = d.Set("slug", repo.Slug) } - d.Set("description", repo.Description) - d.Set("forkable", repo.Forkable) - d.Set("public", repo.Public) + _ = d.Set("description", repo.Description) + _ = d.Set("forkable", repo.Forkable) + _ = d.Set("public", repo.Public) for _, clone_url := range repo.Links.Clone { if clone_url.Name == "http" { - d.Set("clone_https", clone_url.Href) + _ = d.Set("clone_https", clone_url.Href) } else { - d.Set("clone_ssh", clone_url.Href) + _ = d.Set("clone_ssh", clone_url.Href) } } + + gifLFS, err := client.Get(fmt.Sprintf("/rest/git-lfs/admin/projects/%s/repos/%s/enabled", + project, + repoSlug, + )) + _ = d.Set("enable_git_lfs", err == nil && gifLFS.StatusCode == 200) } return nil diff --git a/bitbucket/resource_repository_test.go b/bitbucket/resource_repository_test.go index 0a421ed..93dcfd6 100644 --- a/bitbucket/resource_repository_test.go +++ b/bitbucket/resource_repository_test.go @@ -71,6 +71,38 @@ func TestAccBitbucketRepository_namewithspaces(t *testing.T) { }) } +func TestAccBitbucketRepository_gitlfs(t *testing.T) { + var repo Repository + + key := fmt.Sprintf("%v", rand.New(rand.NewSource(time.Now().UnixNano())).Int()) + testAccBitbucketRepositoryConfig := fmt.Sprintf(` + resource "bitbucketserver_project" "test" { + key = "TEST%v" + name = "Test%v" + } + + resource "bitbucketserver_repository" "test_repo" { + project = bitbucketserver_project.test.key + name = "test-repo-for-repository-test" + enable_git_lfs = true + } + `, key, key) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckBitbucketRepositoryDestroy, + Steps: []resource.TestStep{ + { + Config: testAccBitbucketRepositoryConfig, + Check: resource.ComposeTestCheckFunc( + testAccCheckBitbucketRepositoryExists("bitbucketserver_repository.test_repo", &repo), + ), + }, + }, + }) +} + func testAccCheckBitbucketRepositoryDestroy(s *terraform.State) error { client := testAccProvider.Meta().(*BitbucketServerProvider).BitbucketClient rs, ok := s.RootModule().Resources["bitbucketserver_repository.test_repo"] diff --git a/docusaurus/docs/resource_repository.md b/docusaurus/docs/resource_repository.md index 546fd55..cd43a04 100644 --- a/docusaurus/docs/resource_repository.md +++ b/docusaurus/docs/resource_repository.md @@ -23,6 +23,7 @@ resource "bitbucketserver_repository" "test" { * `description` - Optional. Description of the repository. * `forkable` - Optional. Enable/disable forks of this repository. Default `true` * `public` - Optional. Determine if this repository is public. Default `false` +* `enable_git_lfs` - Optional. Enable git-lfs for this repository. Default `false` ## Attribute Reference