Skip to content

Commit 8d483a8

Browse files
BravoDeltaBDBoris van der Doncktechknowlogick
committed
feat: add archive_on_destroy option to gitea_repository resource (#113)
Implementation for enhancement request #111 Tested by: - terraform apply and destroy of examples folder. Runs correctly, deleting repos on destroy. - terraform apply and destroy of repo without archive_on_delete. Runs correctly, deleting repo on destroy. - terraform apply and destroy of repo with archive_on_delete = false. Runs correctly, deleting repo on destroy. - terraform apply and destroy of repo with archive_on_delete = true. Runs correctly, results in the repository being archived correctly and the resource is removed from terraform state correctly. Co-authored-by: Boris van der Donck <[email protected]> Co-authored-by: techknowlogick <[email protected]> Reviewed-on: https://gitea.com/gitea/terraform-provider-gitea/pulls/113 Co-authored-by: BravoDeltaBD <[email protected]> Co-committed-by: BravoDeltaBD <[email protected]>
1 parent cd763c4 commit 8d483a8

File tree

2 files changed

+87
-6
lines changed

2 files changed

+87
-6
lines changed

docs/resources/repository.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ variable "gitea_clone_token" {
8585
- `allow_rebase` (Boolean)
8686
- `allow_rebase_explicit` (Boolean)
8787
- `allow_squash_merge` (Boolean)
88+
- `archive_on_destroy` (Boolean) Set to 'true' to archive the repository instead of deleting on destroy.
8889
- `archived` (Boolean)
8990
- `auto_init` (Boolean) Flag if the repository should be initiated with the configured values
9091
- `autodetect_manual_merge` (Boolean)

gitea/resource_gitea_repository.go

Lines changed: 86 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"errors"
66
"fmt"
7+
"log"
78
"strconv"
89
"strings"
910

@@ -34,10 +35,11 @@ const (
3435
repoAllowRebase string = "allow_rebase"
3536
repoAllowRebaseMerge string = "allow_rebase_explicit"
3637
repoAllowSquash string = "allow_squash_merge"
37-
repoAchived string = "archived"
38+
repoArchived string = "archived"
3839
repoAllowManualMerge string = "allow_manual_merge"
3940
repoAutodetectManualMerge string = "autodetect_manual_merge"
4041
repoMirror string = "mirror"
42+
repoArchiveOnDestroy string = "archive_on_destroy"
4143
migrationCloneAddresse string = "migration_clone_addresse"
4244
migrationCloneAddress string = "migration_clone_address"
4345
migrationService string = "migration_service"
@@ -253,7 +255,7 @@ func resourceRepoUpdate(d *schema.ResourceData, meta interface{}) (err error) {
253255
var mirrorInterval string = d.Get(migrationMirrorInterval).(string)
254256
opts.MirrorInterval = &mirrorInterval
255257
} else {
256-
var archived bool = d.Get(repoAchived).(bool)
258+
var archived bool = d.Get(repoArchived).(bool)
257259
opts.Archived = &archived
258260
}
259261

@@ -268,12 +270,83 @@ func resourceRepoUpdate(d *schema.ResourceData, meta interface{}) (err error) {
268270

269271
}
270272

271-
func respurceRepoDelete(d *schema.ResourceData, meta interface{}) (err error) {
273+
func resourceRepoDelete(d *schema.ResourceData, meta interface{}) (err error) {
272274
client := meta.(*gitea.Client)
273275

274-
client.DeleteRepo(d.Get(repoOwner).(string), d.Get(repoName).(string))
276+
archiveOnDestroy := d.Get(repoArchiveOnDestroy).(bool)
277+
archived := d.Get(repoArchived).(bool)
278+
owner := d.Get(repoOwner).(string)
279+
name := d.Get(repoName).(string)
275280

276-
return
281+
if archiveOnDestroy {
282+
if archived {
283+
log.Printf("[DEBUG] Repository already archived, nothing to do on delete: %s/%s", owner, name)
284+
err = nil
285+
return err
286+
} else {
287+
log.Printf("[DEBUG] Archiving repository on delete: %s/%s", owner, name)
288+
err = archiveRepo(d, client)
289+
return err
290+
}
291+
} else {
292+
log.Printf("[DEBUG] Deleting repository: %s/%s", owner, repoName)
293+
err = deleteRepo(d, client)
294+
return err
295+
}
296+
}
297+
298+
func archiveRepo(d *schema.ResourceData, client *gitea.Client) (err error) {
299+
if err := d.Set("archived", true); err != nil {
300+
return err
301+
}
302+
303+
var name string = d.Get(repoName).(string)
304+
var description string = d.Get(repoDescription).(string)
305+
var website string = d.Get(repoWebsite).(string)
306+
var private bool = d.Get(repoPrivateFlag).(bool)
307+
var template bool = d.Get(repoTemplate).(bool)
308+
var hasIssues bool = d.Get(repoIssues).(bool)
309+
var hasWiki bool = d.Get(repoWiki).(bool)
310+
var defaultBranch string = d.Get(repoDefaultBranch).(string)
311+
var hasPRs bool = d.Get(repoPrs).(bool)
312+
var hasProjects bool = d.Get(repoProjects).(bool)
313+
var ignoreWhitespaceConflicts bool = d.Get(repoIgnoreWhitespace).(bool)
314+
var allowMerge bool = d.Get(repoAllowMerge).(bool)
315+
var allowRebase bool = d.Get(repoAllowRebase).(bool)
316+
var allowRebaseMerge bool = d.Get(repoAllowRebaseMerge).(bool)
317+
var allowSquash bool = d.Get(repoAllowSquash).(bool)
318+
var allowManualMerge bool = d.Get(repoAllowManualMerge).(bool)
319+
var autodetectManualMerge bool = d.Get(repoAutodetectManualMerge).(bool)
320+
var archived bool = d.Get(repoArchived).(bool)
321+
322+
opts := gitea.EditRepoOption{
323+
Name: &name,
324+
Description: &description,
325+
Website: &website,
326+
Private: &private,
327+
Template: &template,
328+
HasIssues: &hasIssues,
329+
HasWiki: &hasWiki,
330+
DefaultBranch: &defaultBranch,
331+
HasPullRequests: &hasPRs,
332+
HasProjects: &hasProjects,
333+
IgnoreWhitespaceConflicts: &ignoreWhitespaceConflicts,
334+
AllowMerge: &allowMerge,
335+
AllowRebase: &allowRebase,
336+
AllowRebaseMerge: &allowRebaseMerge,
337+
AllowSquash: &allowSquash,
338+
AllowManualMerge: &allowManualMerge,
339+
AutodetectManualMerge: &autodetectManualMerge,
340+
Archived: &archived,
341+
}
342+
343+
_, _, err = client.EditRepo(d.Get(repoOwner).(string), d.Get(repoName).(string), opts)
344+
return err
345+
}
346+
347+
func deleteRepo(d *schema.ResourceData, client *gitea.Client) (err error) {
348+
_, err = client.DeleteRepo(d.Get(repoOwner).(string), d.Get(repoName).(string))
349+
return err
277350
}
278351

279352
func setRepoResourceData(repo *gitea.Repository, d *schema.ResourceData) (err error) {
@@ -309,7 +382,7 @@ func resourceGiteaRepository() *schema.Resource {
309382
Read: resourceRepoRead,
310383
Create: resourceRepoCreate,
311384
Update: resourceRepoUpdate,
312-
Delete: respurceRepoDelete,
385+
Delete: resourceRepoDelete,
313386
Importer: &schema.ResourceImporter{
314387
StateContext: schema.ImportStatePassthroughContext,
315388
},
@@ -482,6 +555,13 @@ func resourceGiteaRepository() *schema.Resource {
482555
Optional: true,
483556
Default: false,
484557
},
558+
"archive_on_destroy": {
559+
Type: schema.TypeBool,
560+
Required: false,
561+
Optional: true,
562+
Default: false,
563+
Description: "Set to 'true' to archive the repository instead of deleting on destroy.",
564+
},
485565
"allow_manual_merge": {
486566
Type: schema.TypeBool,
487567
Required: false,

0 commit comments

Comments
 (0)