@@ -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