@@ -68,6 +68,7 @@ type RepoTransfer struct { //nolint
68
68
RecipientID int64
69
69
Recipient * user_model.User `xorm:"-"`
70
70
RepoID int64
71
+ Repo * Repository `xorm:"-"`
71
72
TeamIDs []int64
72
73
Teams []* organization.Team `xorm:"-"`
73
74
@@ -79,48 +80,65 @@ func init() {
79
80
db .RegisterModel (new (RepoTransfer ))
80
81
}
81
82
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 {
84
84
if r .Recipient == nil {
85
85
u , err := user_model .GetUserByID (ctx , r .RecipientID )
86
86
if err != nil {
87
87
return err
88
88
}
89
-
90
89
r .Recipient = u
91
90
}
92
91
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
+ }
99
94
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
+ }
103
112
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 {
104
119
r .Teams = append (r .Teams , team )
105
120
}
106
121
}
107
122
123
+ if err := r .LoadRepo (ctx ); err != nil {
124
+ return err
125
+ }
126
+
108
127
if r .Doer == nil {
109
128
u , err := user_model .GetUserByID (ctx , r .DoerID )
110
129
if err != nil {
111
130
return err
112
131
}
113
-
114
132
r .Doer = u
115
133
}
116
134
117
135
return nil
118
136
}
119
137
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.
121
139
// For user, it checks if it's himself
122
140
// 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 {
124
142
if err := r .LoadAttributes (ctx ); err != nil {
125
143
log .Error ("LoadAttributes: %v" , err )
126
144
return false
@@ -166,6 +184,10 @@ func GetPendingRepositoryTransfers(ctx context.Context, opts *PendingRepositoryT
166
184
Find (& transfers )
167
185
}
168
186
187
+ func IsRepositoryTransferExist (ctx context.Context , repoID int64 ) (bool , error ) {
188
+ return db .GetEngine (ctx ).Where ("repo_id = ?" , repoID ).Exist (new (RepoTransfer ))
189
+ }
190
+
169
191
// GetPendingRepositoryTransfer fetches the most recent and ongoing transfer
170
192
// process for the repository
171
193
func GetPendingRepositoryTransfer (ctx context.Context , repo * Repository ) (* RepoTransfer , error ) {
@@ -206,11 +228,26 @@ func CreatePendingRepositoryTransfer(ctx context.Context, doer, newOwner *user_m
206
228
return err
207
229
}
208
230
231
+ if _ , err := user_model .GetUserByID (ctx , newOwner .ID ); err != nil {
232
+ return err
233
+ }
234
+
209
235
// Make sure repo is ready to transfer
210
236
if err := TestRepositoryReadyForTransfer (repo .Status ); err != nil {
211
237
return err
212
238
}
213
239
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
+
214
251
repo .Status = RepositoryPendingTransfer
215
252
if err := UpdateRepositoryCols (ctx , repo , "status" ); err != nil {
216
253
return err
0 commit comments