From c64924682e8871baed68fce64107fd16dbb835a7 Mon Sep 17 00:00:00 2001
From: Ethan Koenig <ethantkoenig@gmail.com>
Date: Sat, 30 Dec 2017 22:08:08 -0500
Subject: [PATCH] Fix race condition in team functions (#3268)

---
 models/org_team.go | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/models/org_team.go b/models/org_team.go
index 1e3bc27071..c667cfb8e2 100644
--- a/models/org_team.go
+++ b/models/org_team.go
@@ -102,11 +102,12 @@ func (t *Team) addRepository(e Engine, repo *Repository) (err error) {
 		return err
 	}
 
-	t.NumRepos++
-	if _, err = e.ID(t.ID).Cols("num_repos").Update(t); err != nil {
+	if _, err = e.Incr("num_repos").ID(t.ID).Update(new(Team)); err != nil {
 		return fmt.Errorf("update team: %v", err)
 	}
 
+	t.NumRepos++
+
 	if err = repo.recalculateTeamAccesses(e, 0); err != nil {
 		return fmt.Errorf("recalculateAccesses: %v", err)
 	}
@@ -488,8 +489,6 @@ func AddTeamMember(team *Team, userID int64) error {
 	}
 
 	// Get team and its repositories.
-	team.NumMembers++
-
 	if err := team.GetRepositories(); err != nil {
 		return err
 	}
@@ -506,10 +505,12 @@ func AddTeamMember(team *Team, userID int64) error {
 		TeamID: team.ID,
 	}); err != nil {
 		return err
-	} else if _, err := sess.ID(team.ID).Update(team); err != nil {
+	} else if _, err := sess.Incr("num_members").ID(team.ID).Update(new(Team)); err != nil {
 		return err
 	}
 
+	team.NumMembers++
+
 	// Give access to team repositories.
 	for _, repo := range team.Repos {
 		if err := repo.recalculateTeamAccesses(sess, 0); err != nil {