@@ -126,7 +126,7 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) error {
126
126
return fmt .Errorf ("%s is an organization not a user" , u .Name )
127
127
}
128
128
129
- if user_model .IsLastAdminUser (ctx , u ) {
129
+ if u . IsActive && user_model .IsLastAdminUser (ctx , u ) {
130
130
return models.ErrDeleteLastAdminUser {UID : u .ID }
131
131
}
132
132
@@ -250,7 +250,7 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) error {
250
250
if err := committer .Commit (); err != nil {
251
251
return err
252
252
}
253
- committer .Close ()
253
+ _ = committer .Close ()
254
254
255
255
if err = asymkey_service .RewriteAllPublicKeys (ctx ); err != nil {
256
256
return err
@@ -259,50 +259,45 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) error {
259
259
return err
260
260
}
261
261
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.
264
263
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 )
267
266
_ = system_model .CreateNotice (ctx , system_model .NoticeTask , fmt .Sprintf ("delete user '%s': %v" , u .Name , err ))
268
- return err
269
267
}
270
268
271
269
if u .Avatar != "" {
272
270
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 )
275
273
_ = system_model .CreateNotice (ctx , system_model .NoticeTask , fmt .Sprintf ("delete user '%s': %v" , u .Name , err ))
276
- return err
277
274
}
278
275
}
279
276
280
277
return nil
281
278
}
282
279
283
- // DeleteInactiveUsers deletes all inactive users and email addresses.
280
+ // DeleteInactiveUsers deletes all inactive users and their email addresses.
284
281
func DeleteInactiveUsers (ctx context.Context , olderThan time.Duration ) error {
285
- users , err := user_model .GetInactiveUsers (ctx , olderThan )
282
+ inactiveUsers , err := user_model .GetInactiveUsers (ctx , olderThan )
286
283
if err != nil {
287
284
return err
288
285
}
289
286
290
287
// 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 ) {
301
292
continue
302
293
}
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
+ }
304
300
}
305
301
}
306
-
307
- return user_model .DeleteInactiveEmailAddresses (ctx )
302
+ return nil // TODO: there could be still inactive users left, and the number would increase gradually
308
303
}
0 commit comments