From f82ea42679eaa220ab39d1e4d70e2ed4cbaf0fa7 Mon Sep 17 00:00:00 2001
From: Ethan Koenig <ethantkoenig@gmail.com>
Date: Sat, 4 Feb 2017 11:00:07 -0500
Subject: [PATCH] Fix bug in removeOrgRepo

---
 models/models.go |  2 ++
 models/org.go    | 22 ++++++++++++++++++++--
 2 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/models/models.go b/models/models.go
index 624badda1..ec93d4c12 100644
--- a/models/models.go
+++ b/models/models.go
@@ -30,12 +30,14 @@ import (
 
 // Engine represents a xorm engine or session.
 type Engine interface {
+	Decr(column string, arg ...interface{}) *xorm.Session
 	Delete(interface{}) (int64, error)
 	Exec(string, ...interface{}) (sql.Result, error)
 	Find(interface{}, ...interface{}) error
 	Get(interface{}) (bool, error)
 	Id(interface{}) *xorm.Session
 	In(string, ...interface{}) *xorm.Session
+	Incr(column string, arg ...interface{}) *xorm.Session
 	Insert(...interface{}) (int64, error)
 	InsertOne(interface{}) (int64, error)
 	Iterate(interface{}, xorm.IterFunc) error
diff --git a/models/org.go b/models/org.go
index 40f34a4f0..f68c2b9fc 100644
--- a/models/org.go
+++ b/models/org.go
@@ -526,10 +526,28 @@ func RemoveOrgUser(orgID, userID int64) error {
 }
 
 func removeOrgRepo(e Engine, orgID, repoID int64) error {
-	_, err := e.Delete(&TeamRepo{
+	teamRepos := make([]*TeamRepo, 0, 10)
+	if err := e.Find(&teamRepos, &TeamRepo{OrgID: orgID, RepoID: repoID}); err != nil {
+		return err
+	}
+
+	if len(teamRepos) == 0 {
+		return nil
+	}
+
+	if _, err := e.Delete(&TeamRepo{
 		OrgID:  orgID,
 		RepoID: repoID,
-	})
+	}); err != nil {
+		return err
+	}
+
+	teamIDs := make([]int64, len(teamRepos))
+	for i, teamRepo := range teamRepos {
+		teamIDs[i] = teamRepo.ID
+	}
+
+	_, err := x.Decr("num_repos").In("id", teamIDs).Update(new(Team))
 	return err
 }