99import gitlab
1010import gitlab .base
1111import gitlab .exceptions
12+ import gitlab .v4 .objects
1213
1314SLEEP_INTERVAL = 0.5
1415TIMEOUT = 60 # seconds before timeout will occur
@@ -37,6 +38,11 @@ def safe_delete(object: gitlab.base.RESTObject) -> None:
3738 object = manager .get (object .get_id ()) # type: ignore[attr-defined]
3839 except gitlab .exceptions .GitlabGetError :
3940 return
41+ # If object is already marked for deletion we have succeeded
42+ if getattr (object , "marked_for_deletion_on" , None ) is not None :
43+ # 'Group' and 'Project' objects have a 'marked_for_deletion_on' attribute
44+ logging .info (f"{ object !r} is marked for deletion." )
45+ return
4046
4147 if index :
4248 logging .info (f"Attempt { index + 1 } to delete { object !r} ." )
@@ -52,22 +58,16 @@ def safe_delete(object: gitlab.base.RESTObject) -> None:
5258 # we shouldn't cause test to fail if it still exists
5359 return
5460 elif isinstance (object , gitlab .v4 .objects .Project ):
55- # Immediately delete rather than waiting for at least 1day
56- # https://docs.gitlab.com/ee/api/projects.html#delete-project
57- object .delete (permanently_remove = True )
58- pass
61+ # Starting in GitLab 18, projects can't be immediately deleted.
62+ # So this will mark it for deletion.
63+ object .delete ()
5964 else :
6065 # We only attempt to delete parent groups to prevent dangling sub-groups
61- # However parent groups can only be deleted on a delay in Gl 16
66+ # However parent groups can only be deleted on a delay in GitLab 16
6267 # https://docs.gitlab.com/ee/api/groups.html#remove-group
6368 object .delete ()
6469 except gitlab .exceptions .GitlabDeleteError :
65- logging .info (f"{ object !r} already deleted or scheduled for deletion." )
66- if isinstance (object , gitlab .v4 .objects .Group ):
67- # Parent groups can never be immediately deleted in GL 16,
68- # so don't cause test to fail if it still exists
69- return
70- pass
70+ logging .exception (f"Error attempting to delete: { object .pformat ()} " )
7171
7272 time .sleep (SLEEP_INTERVAL )
7373 pytest .fail (f"{ object !r} was not deleted" )
0 commit comments