From 3a91ac51a93aa6e352896048ce37c01227b42055 Mon Sep 17 00:00:00 2001
From: Lunny Xiao <xiaolunwen@gmail.com>
Date: Tue, 14 Feb 2017 22:14:29 +0800
Subject: [PATCH] fix bug of multiple forks (#928)

---
 models/repo.go | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/models/repo.go b/models/repo.go
index d83c5fd6ab..97bad686b9 100644
--- a/models/repo.go
+++ b/models/repo.go
@@ -2372,6 +2372,17 @@ func HasForkedRepo(ownerID, repoID int64) (*Repository, bool) {
 
 // ForkRepository forks a repository
 func ForkRepository(u *User, oldRepo *Repository, name, desc string) (_ *Repository, err error) {
+	forkedRepo, err := oldRepo.GetUserFork(u.ID)
+	if err != nil {
+		return nil, err
+	}
+	if forkedRepo != nil {
+		return nil, ErrRepoAlreadyExist{
+			Uname: u.Name,
+			Name:  forkedRepo.Name,
+		}
+	}
+
 	repo := &Repository{
 		OwnerID:       u.ID,
 		Owner:         u,
@@ -2453,6 +2464,19 @@ func (repo *Repository) GetForks() ([]*Repository, error) {
 	return forks, x.Find(&forks, &Repository{ForkID: repo.ID})
 }
 
+// GetUserFork return user forked repository from this repository, if not forked return nil
+func (repo *Repository) GetUserFork(userID int64) (*Repository, error) {
+	var forkedRepo Repository
+	has, err := x.Where("fork_id = ?", repo.ID).And("owner_id = ?", userID).Get(&forkedRepo)
+	if err != nil {
+		return nil, err
+	}
+	if !has {
+		return nil, nil
+	}
+	return &forkedRepo, nil
+}
+
 // __________                             .__
 // \______   \____________    ____   ____ |  |__
 //  |    |  _/\_  __ \__  \  /    \_/ ___\|  |  \