@@ -922,6 +922,7 @@ func VerifyActiveEmailCode(code, email string) *EmailAddress {
922922
923923// ChangeUserName changes all corresponding setting from old user name to new one.
924924func ChangeUserName (u * User , newUserName string ) (err error ) {
925+ oldUserName := u .Name
925926 if err = IsUsableUsername (newUserName ); err != nil {
926927 return err
927928 }
@@ -939,16 +940,24 @@ func ChangeUserName(u *User, newUserName string) (err error) {
939940 return err
940941 }
941942
942- if _ , err = sess .Exec ("UPDATE `repository` SET owner_name=? WHERE owner_name=?" , newUserName , u . Name ); err != nil {
943+ if _ , err = sess .Exec ("UPDATE `repository` SET owner_name=? WHERE owner_name=?" , newUserName , oldUserName ); err != nil {
943944 return fmt .Errorf ("Change repo owner name: %v" , err )
944945 }
945946
946947 // Do not fail if directory does not exist
947- if err = os .Rename (UserPath (u . Name ), UserPath (newUserName )); err != nil && ! os .IsNotExist (err ) {
948+ if err = os .Rename (UserPath (oldUserName ), UserPath (newUserName )); err != nil && ! os .IsNotExist (err ) {
948949 return fmt .Errorf ("Rename user directory: %v" , err )
949950 }
950951
951- return sess .Commit ()
952+ if err = sess .Commit (); err != nil {
953+ if err2 := os .Rename (UserPath (newUserName ), UserPath (oldUserName )); err2 != nil && ! os .IsNotExist (err2 ) {
954+ log .Critical ("Unable to rollback directory change during failed username change from: %s to: %s. DB Error: %v. Filesystem Error: %v" , oldUserName , newUserName , err , err2 )
955+ return fmt .Errorf ("failed to rollback directory change during failed username change from: %s to: %s. DB Error: %w. Filesystem Error: %v" , oldUserName , newUserName , err , err2 )
956+ }
957+ return err
958+ }
959+
960+ return nil
952961}
953962
954963// checkDupEmail checks whether there are the same email with the user
0 commit comments