@@ -31,6 +31,8 @@ const (
3131// RepoTransfer is used to manage repository transfers
3232type RepoTransfer struct {
3333 ID int64 `xorm:"pk autoincr"`
34+ UserID int64
35+ User * User `xorm:"-"`
3436 RecipientID int64
3537 Recipient * User `xorm:"-"`
3638 RepoID int64
@@ -39,18 +41,30 @@ type RepoTransfer struct {
3941 Status TransferStatus
4042}
4143
42- // LoadRecipient fetches the transfer recipient from the database
43- func (r * RepoTransfer ) LoadRecipient () error {
44- if r .Recipient != nil {
44+ // LoadAttributes fetches the transfer recipient from the database
45+ func (r * RepoTransfer ) LoadAttributes () error {
46+ if r .Recipient != nil && r . User != nil {
4547 return nil
4648 }
4749
48- u , err := GetUserByID (r .RecipientID )
49- if err != nil {
50- return err
50+ if r .Recipient == nil {
51+ u , err := GetUserByID (r .RecipientID )
52+ if err != nil {
53+ return err
54+ }
55+
56+ r .Recipient = u
57+ }
58+
59+ if r .User == nil {
60+ u , err := GetUserByID (r .UserID )
61+ if err != nil {
62+ return err
63+ }
64+
65+ r .User = u
5166 }
5267
53- r .Recipient = u
5468 return nil
5569}
5670
@@ -59,20 +73,26 @@ func (r *RepoTransfer) LoadRecipient() error {
5973func GetPendingRepositoryTransfer (repo * Repository ) (* RepoTransfer , error ) {
6074 var transfer = new (RepoTransfer )
6175
62- _ , err := x .Where ("status = ? AND repo_id = ? " , Pending , repo .ID ).
76+ has , err := x .Where ("status = ? AND repo_id = ? " , Pending , repo .ID ).
6377 Get (transfer )
64-
6578 if err != nil {
6679 return nil , err
6780 }
6881
69- if transfer .ID == 0 {
82+ if transfer .ID == 0 || ! has {
7083 return nil , ErrNoPendingRepoTransfer {RepoID : repo .ID }
7184 }
7285
7386 return transfer , nil
7487}
7588
89+ func acceptRepositoryTransfer (repo * Repository ) error {
90+ _ , err := x .Where ("repo_id = ?" , repo .ID ).Cols ("status" ).Update (& RepoTransfer {
91+ Status : Accepted ,
92+ })
93+ return err
94+ }
95+
7696// CancelRepositoryTransfer makes sure to set the transfer process as
7797// "rejected". Thus ending the transfer process
7898func CancelRepositoryTransfer (repoTransfer * RepoTransfer ) error {
@@ -85,15 +105,12 @@ func CancelRepositoryTransfer(repoTransfer *RepoTransfer) error {
85105
86106// StartRepositoryTransfer marks the repository transfer as "pending". It
87107// doesn't actually transfer the repository until the user acks the transfer.
88- func StartRepositoryTransfer (newOwnerName string , repo * Repository ) error {
108+ func StartRepositoryTransfer (doer * User , newOwnerName string , repo * Repository ) error {
89109 // Make sure the repo isn't being transferred to someone currently
90110 // Only one transfer process can be initiated at a time.
91- // It has to be cancelled for a new transfer to occur
92-
93- n , err := x .Count (& RepoTransfer {
94- RepoID : repo .ID ,
95- Status : Pending ,
96- })
111+ // It has to be cancelled for a new one to occur
112+ n , err := x .Where ("status = ? AND repo_id = ?" , Pending , repo .ID ).
113+ Count (new (RepoTransfer ))
97114 if err != nil {
98115 return err
99116 }
@@ -121,25 +138,23 @@ func StartRepositoryTransfer(newOwnerName string, repo *Repository) error {
121138 Status : Pending ,
122139 CreatedUnix : util .TimeStampNow (),
123140 UpdatedUnix : util .TimeStampNow (),
141+ UserID : doer .ID ,
124142 }
125143
126144 _ , err = x .Insert (transfer )
127145 return err
128146}
129147
130- // TransferOwnership transfers all corresponding setting from old user to new one.
131- func TransferOwnership (doer * User , newOwnerName string , repo * Repository ) error {
132- newOwner , err := GetUserByName (newOwnerName )
133- if err != nil {
134- return fmt .Errorf ("get new owner '%s': %v" , newOwnerName , err )
135- }
148+ // TransferOwnership transfers all corresponding setting from one user to
149+ // another.
150+ func TransferOwnership (doer , newOwner * User , repo * Repository ) error {
136151
137152 // Check if new owner has repository with same name.
138153 has , err := IsRepositoryExist (newOwner , repo .Name )
139154 if err != nil {
140155 return fmt .Errorf ("IsRepositoryExist: %v" , err )
141156 } else if has {
142- return ErrRepoAlreadyExist {newOwnerName , repo .Name }
157+ return ErrRepoAlreadyExist {newOwner . Name , repo .Name }
143158 }
144159
145160 sess := x .NewSession ()
@@ -160,6 +175,10 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
160175 return fmt .Errorf ("update owner: %v" , err )
161176 }
162177
178+ if err := acceptRepositoryTransfer (repo ); err != nil {
179+ return err
180+ }
181+
163182 // Remove redundant collaborators.
164183 collaborators , err := repo .getCollaborators (sess )
165184 if err != nil {
0 commit comments