@@ -15,6 +15,7 @@ import (
15
15
"code.gitea.io/gitea/models/organization"
16
16
repo_model "code.gitea.io/gitea/models/repo"
17
17
user_model "code.gitea.io/gitea/models/user"
18
+ "code.gitea.io/gitea/modules/log"
18
19
"code.gitea.io/gitea/modules/setting"
19
20
"code.gitea.io/gitea/modules/util"
20
21
@@ -498,11 +499,6 @@ func AddTeamMember(team *organization.Team, userID int64) error {
498
499
}
499
500
defer committer .Close ()
500
501
501
- // Get team and its repositories.
502
- if err := team .GetRepositoriesCtx (ctx ); err != nil {
503
- return err
504
- }
505
-
506
502
sess := db .GetEngine (ctx )
507
503
508
504
if err := db .Insert (ctx , & organization.TeamUser {
@@ -518,17 +514,51 @@ func AddTeamMember(team *organization.Team, userID int64) error {
518
514
team .NumMembers ++
519
515
520
516
// Give access to team repositories.
521
- for _ , repo := range team .Repos {
522
- if err := recalculateUserAccess (ctx , repo , userID ); err != nil {
523
- return err
524
- }
525
- if setting .Service .AutoWatchNewRepos {
526
- if err = repo_model .WatchRepoCtx (ctx , userID , repo .ID , true ); err != nil {
527
- return err
517
+ // update exist access if mode become bigger
518
+ subQuery := builder .Select ("repo_id" ).From ("team_repo" ).
519
+ Where (builder.Eq {"team_id" : team .ID })
520
+
521
+ if _ , err := sess .Where ("user_id=?" , userID ).
522
+ In ("repo_id" , subQuery ).
523
+ And ("mode < ?" , team .AccessMode ).
524
+ SetExpr ("mode" , team .AccessMode ).
525
+ Update (new (Access )); err != nil {
526
+ return fmt .Errorf ("update user accesses: %v" , err )
527
+ }
528
+
529
+ // for not exist access
530
+ var repoIDs []int64
531
+ accessSubQuery := builder .Select ("repo_id" ).From ("access" ).Where (builder.Eq {"user_id" : userID })
532
+ if err := sess .SQL (subQuery .And (builder .NotIn ("repo_id" , accessSubQuery ))).Find (& repoIDs ); err != nil {
533
+ return fmt .Errorf ("select id accesses: %v" , err )
534
+ }
535
+
536
+ accesses := make ([]* Access , 0 , 100 )
537
+ for i , repoID := range repoIDs {
538
+ accesses = append (accesses , & Access {RepoID : repoID , UserID : userID , Mode : team .AccessMode })
539
+ if (i % 100 == 0 || i == len (repoIDs )- 1 ) && len (accesses ) > 0 {
540
+ if err = db .Insert (ctx , accesses ); err != nil {
541
+ return fmt .Errorf ("insert new user accesses: %v" , err )
528
542
}
543
+ accesses = accesses [:0 ]
529
544
}
530
545
}
531
546
547
+ // watch could be failed, so run it in a goroutine
548
+ if setting .Service .AutoWatchNewRepos {
549
+ // Get team and its repositories.
550
+ if err := team .GetRepositoriesCtx (db .DefaultContext ); err != nil {
551
+ log .Error ("getRepositories failed: %v" , err )
552
+ }
553
+ go func (repos []* repo_model.Repository ) {
554
+ for _ , repo := range repos {
555
+ if err = repo_model .WatchRepoCtx (db .DefaultContext , userID , repo .ID , true ); err != nil {
556
+ log .Error ("watch repo failed: %v" , err )
557
+ }
558
+ }
559
+ }(team .Repos )
560
+ }
561
+
532
562
return committer .Commit ()
533
563
}
534
564
0 commit comments