@@ -249,37 +249,46 @@ func (repo *Repository) recalculateTeamAccesses(e Engine, ignTeamID int64) (err
249249// recalculateUserAccess recalculates new access for a single user
250250// Usable if we know access only affected one user
251251func (repo * Repository ) recalculateUserAccess (e Engine , uid int64 ) (err error ) {
252- access := AccessModeNone
252+ minMode := AccessModeRead
253+ if ! repo .IsPrivate {
254+ minMode = AccessModeWrite
255+ }
256+
257+ accessMode := AccessModeNone
253258 collaborator , err := repo .getCollaboration (e , uid )
254259 if err != nil {
255260 return err
256261 } else if collaborator != nil {
257- access = collaborator .Mode
258- }
259-
260- var teams []Team
261- if err := e .Join ("INNER" , "team_repo" , "team_repo.team_id = team.id" ).
262- Join ("INNER" , "team_user" , "team_user.team_id = team.id" ).
263- Where ("team.org_id = ?" , repo .OwnerID ).
264- And ("team_repo.repo_id=?" , repo .ID ).
265- And ("team_user.uid=?" , uid ).
266- Find (& teams ); err != nil {
267- return err
262+ accessMode = collaborator .Mode
268263 }
269264
270- for _ , t := range teams {
271- if t .IsOwnerTeam () {
272- t .Authorize = AccessModeOwner
265+ if repo .Owner .IsOrganization () {
266+ var teams []Team
267+ if err := e .Join ("INNER" , "team_repo" , "team_repo.team_id = team.id" ).
268+ Join ("INNER" , "team_user" , "team_user.team_id = team.id" ).
269+ Where ("team.org_id = ?" , repo .OwnerID ).
270+ And ("team_repo.repo_id=?" , repo .ID ).
271+ And ("team_user.uid=?" , uid ).
272+ Find (& teams ); err != nil {
273+ return err
273274 }
274275
275- access = maxAccessMode (access , t .Authorize )
276+ for _ , t := range teams {
277+ if t .IsOwnerTeam () {
278+ t .Authorize = AccessModeOwner
279+ }
280+
281+ accessMode = maxAccessMode (accessMode , t .Authorize )
282+ }
276283 }
277284
278285 // Delete old user accesses and insert new one for repository.
279286 if _ , err = e .Delete (& Access {RepoID : repo .ID , UserID : uid }); err != nil {
280287 return fmt .Errorf ("delete old user accesses: %v" , err )
281- } else if _ , err = e .Insert (& Access {RepoID : repo .ID , UserID : uid , Mode : access }); err != nil {
282- return fmt .Errorf ("insert new user accesses: %v" , err )
288+ } else if accessMode >= minMode {
289+ if _ , err = e .Insert (& Access {RepoID : repo .ID , UserID : uid , Mode : accessMode }); err != nil {
290+ return fmt .Errorf ("insert new user accesses: %v" , err )
291+ }
283292 }
284293 return nil
285294}
0 commit comments