@@ -126,7 +126,7 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) error {
126126 return fmt .Errorf ("%s is an organization not a user" , u .Name )
127127 }
128128
129- if user_model .IsLastAdminUser (ctx , u ) {
129+ if u . IsActive && user_model .IsLastAdminUser (ctx , u ) {
130130 return models.ErrDeleteLastAdminUser {UID : u .ID }
131131 }
132132
@@ -250,7 +250,7 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) error {
250250 if err := committer .Commit (); err != nil {
251251 return err
252252 }
253- committer .Close ()
253+ _ = committer .Close ()
254254
255255 if err = asymkey_service .RewriteAllPublicKeys (ctx ); err != nil {
256256 return err
@@ -259,50 +259,45 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) error {
259259 return err
260260 }
261261
262- // Note: There are something just cannot be roll back,
263- // so just keep error logs of those operations.
262+ // Note: There are something just cannot be roll back, so just keep error logs of those operations.
264263 path := user_model .UserPath (u .Name )
265- if err : = util .RemoveAll (path ); err != nil {
266- err = fmt .Errorf ("Failed to RemoveAll %s: %w" , path , err )
264+ if err = util .RemoveAll (path ); err != nil {
265+ err = fmt .Errorf ("failed to RemoveAll %s: %w" , path , err )
267266 _ = system_model .CreateNotice (ctx , system_model .NoticeTask , fmt .Sprintf ("delete user '%s': %v" , u .Name , err ))
268- return err
269267 }
270268
271269 if u .Avatar != "" {
272270 avatarPath := u .CustomAvatarRelativePath ()
273- if err : = storage .Avatars .Delete (avatarPath ); err != nil {
274- err = fmt .Errorf ("Failed to remove %s: %w" , avatarPath , err )
271+ if err = storage .Avatars .Delete (avatarPath ); err != nil {
272+ err = fmt .Errorf ("failed to remove %s: %w" , avatarPath , err )
275273 _ = system_model .CreateNotice (ctx , system_model .NoticeTask , fmt .Sprintf ("delete user '%s': %v" , u .Name , err ))
276- return err
277274 }
278275 }
279276
280277 return nil
281278}
282279
283- // DeleteInactiveUsers deletes all inactive users and email addresses.
280+ // DeleteInactiveUsers deletes all inactive users and their email addresses.
284281func DeleteInactiveUsers (ctx context.Context , olderThan time.Duration ) error {
285- users , err := user_model .GetInactiveUsers (ctx , olderThan )
282+ inactiveUsers , err := user_model .GetInactiveUsers (ctx , olderThan )
286283 if err != nil {
287284 return err
288285 }
289286
290287 // FIXME: should only update authorized_keys file once after all deletions.
291- for _ , u := range users {
292- select {
293- case <- ctx .Done ():
294- return db .ErrCancelledf ("Before delete inactive user %s" , u .Name )
295- default :
296- }
297- if err := DeleteUser (ctx , u , false ); err != nil {
298- // Ignore users that were set inactive by admin.
299- if models .IsErrUserOwnRepos (err ) || models .IsErrUserHasOrgs (err ) ||
300- models .IsErrUserOwnPackages (err ) || models .IsErrDeleteLastAdminUser (err ) {
288+ for _ , u := range inactiveUsers {
289+ if err = DeleteUser (ctx , u , false ); err != nil {
290+ // Ignore inactive users that were ever active but then were set inactive by admin
291+ if models .IsErrUserOwnRepos (err ) || models .IsErrUserHasOrgs (err ) || models .IsErrUserOwnPackages (err ) {
301292 continue
302293 }
303- return err
294+ select {
295+ case <- ctx .Done ():
296+ return db .ErrCancelledf ("when deleting inactive user %q" , u .Name )
297+ default :
298+ return err
299+ }
304300 }
305301 }
306-
307- return user_model .DeleteInactiveEmailAddresses (ctx )
302+ return nil // TODO: there could be still inactive users left, and the number would increase gradually
308303}
0 commit comments