@@ -68,6 +68,7 @@ type RepoTransfer struct { //nolint
6868 RecipientID int64
6969 Recipient * user_model.User `xorm:"-"`
7070 RepoID int64
71+ Repo * Repository `xorm:"-"`
7172 TeamIDs []int64
7273 Teams []* organization.Team `xorm:"-"`
7374
@@ -79,48 +80,65 @@ func init() {
7980 db .RegisterModel (new (RepoTransfer ))
8081}
8182
82- // LoadAttributes fetches the transfer recipient from the database
83- func (r * RepoTransfer ) LoadAttributes (ctx context.Context ) error {
83+ func (r * RepoTransfer ) LoadRecipient (ctx context.Context ) error {
8484 if r .Recipient == nil {
8585 u , err := user_model .GetUserByID (ctx , r .RecipientID )
8686 if err != nil {
8787 return err
8888 }
89-
9089 r .Recipient = u
9190 }
9291
93- if r .Recipient .IsOrganization () && len (r .TeamIDs ) != len (r .Teams ) {
94- for _ , v := range r .TeamIDs {
95- team , err := organization .GetTeamByID (ctx , v )
96- if err != nil {
97- return err
98- }
92+ return nil
93+ }
9994
100- if team .OrgID != r .Recipient .ID {
101- return fmt .Errorf ("team %d belongs not to org %d" , v , r .Recipient .ID )
102- }
95+ func (r * RepoTransfer ) LoadRepo (ctx context.Context ) error {
96+ if r .Repo == nil {
97+ repo , err := GetRepositoryByID (ctx , r .RepoID )
98+ if err != nil {
99+ return err
100+ }
101+ r .Repo = repo
102+ }
103+
104+ return nil
105+ }
106+
107+ // LoadAttributes fetches the transfer recipient from the database
108+ func (r * RepoTransfer ) LoadAttributes (ctx context.Context ) error {
109+ if err := r .LoadRecipient (ctx ); err != nil {
110+ return err
111+ }
103112
113+ if r .Recipient .IsOrganization () && r .Teams == nil {
114+ teamsMap , err := organization .GetTeamsByIDs (ctx , r .TeamIDs )
115+ if err != nil {
116+ return err
117+ }
118+ for _ , team := range teamsMap {
104119 r .Teams = append (r .Teams , team )
105120 }
106121 }
107122
123+ if err := r .LoadRepo (ctx ); err != nil {
124+ return err
125+ }
126+
108127 if r .Doer == nil {
109128 u , err := user_model .GetUserByID (ctx , r .DoerID )
110129 if err != nil {
111130 return err
112131 }
113-
114132 r .Doer = u
115133 }
116134
117135 return nil
118136}
119137
120- // CanUserAcceptTransfer checks if the user has the rights to accept/decline a repo transfer.
138+ // CanUserAcceptOrRejectTransfer checks if the user has the rights to accept/decline a repo transfer.
121139// For user, it checks if it's himself
122140// For organizations, it checks if the user is able to create repos
123- func (r * RepoTransfer ) CanUserAcceptTransfer (ctx context.Context , u * user_model.User ) bool {
141+ func (r * RepoTransfer ) CanUserAcceptOrRejectTransfer (ctx context.Context , u * user_model.User ) bool {
124142 if err := r .LoadAttributes (ctx ); err != nil {
125143 log .Error ("LoadAttributes: %v" , err )
126144 return false
@@ -166,6 +184,10 @@ func GetPendingRepositoryTransfers(ctx context.Context, opts *PendingRepositoryT
166184 Find (& transfers )
167185}
168186
187+ func IsRepositoryTransferExist (ctx context.Context , repoID int64 ) (bool , error ) {
188+ return db .GetEngine (ctx ).Where ("repo_id = ?" , repoID ).Exist (new (RepoTransfer ))
189+ }
190+
169191// GetPendingRepositoryTransfer fetches the most recent and ongoing transfer
170192// process for the repository
171193func GetPendingRepositoryTransfer (ctx context.Context , repo * Repository ) (* RepoTransfer , error ) {
@@ -206,11 +228,26 @@ func CreatePendingRepositoryTransfer(ctx context.Context, doer, newOwner *user_m
206228 return err
207229 }
208230
231+ if _ , err := user_model .GetUserByID (ctx , newOwner .ID ); err != nil {
232+ return err
233+ }
234+
209235 // Make sure repo is ready to transfer
210236 if err := TestRepositoryReadyForTransfer (repo .Status ); err != nil {
211237 return err
212238 }
213239
240+ exist , err := IsRepositoryTransferExist (ctx , repo .ID )
241+ if err != nil {
242+ return err
243+ }
244+ if exist {
245+ return ErrRepoTransferInProgress {
246+ Uname : repo .Owner .LowerName ,
247+ Name : repo .Name ,
248+ }
249+ }
250+
214251 repo .Status = RepositoryPendingTransfer
215252 if err := UpdateRepositoryCols (ctx , repo , "status" ); err != nil {
216253 return err
0 commit comments