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
279352func 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