From 7076f466c9491b07be272d4680cfea5ed839b855 Mon Sep 17 00:00:00 2001
From: Lunny Xiao <xiaolunwen@gmail.com>
Date: Wed, 19 Mar 2014 16:42:50 +0800
Subject: [PATCH] bug fixed

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

diff --git a/models/repo.go b/models/repo.go
index cdbb4b5f4a..38ab3d4a9b 100644
--- a/models/repo.go
+++ b/models/repo.go
@@ -446,7 +446,7 @@ func GetReposFiles(userName, reposName, branchName, commitId, rpath string) ([]*
 		return nil, err
 	}
 
-	commit, err := GetCommit(userName, reposName, branchName, commitId)
+	commit, err := repo.GetCommit(branchName, commitId)
 	if err != nil {
 		return nil, err
 	}
@@ -462,8 +462,10 @@ func GetReposFiles(userName, reposName, branchName, commitId, rpath string) ([]*
 			}
 
 			var cm = commit
-
+			var i int
 			for {
+				i = i + 1
+				//fmt.Println(".....", i, cm.Id(), cm.ParentCount())
 				if cm.ParentCount() == 0 {
 					break
 				} else if cm.ParentCount() == 1 {
@@ -480,7 +482,10 @@ func GetReposFiles(userName, reposName, branchName, commitId, rpath string) ([]*
 				} else {
 					var emptyCnt = 0
 					var sameIdcnt = 0
+					var lastSameCm *git.Commit
+					//fmt.Println(".....", cm.ParentCount())
 					for i := 0; i < cm.ParentCount(); i++ {
+						//fmt.Println("parent", i, cm.Parent(i).Id())
 						p := cm.Parent(i)
 						pt, _ := repo.SubTree(p.Tree, dirname)
 						var pEntry *git.TreeEntry
@@ -488,23 +493,31 @@ func GetReposFiles(userName, reposName, branchName, commitId, rpath string) ([]*
 							pEntry = pt.EntryByName(entry.Name)
 						}
 
+						//fmt.Println("pEntry", pEntry)
+
 						if pEntry == nil {
-							if emptyCnt == cm.ParentCount()-1 {
-								goto loop
-							} else {
-								emptyCnt = emptyCnt + 1
-								continue
+							emptyCnt = emptyCnt + 1
+							if emptyCnt+sameIdcnt == cm.ParentCount() {
+								if lastSameCm == nil {
+									goto loop
+								} else {
+									cm = lastSameCm
+									break
+								}
 							}
 						} else {
+							//fmt.Println(i, "pEntry", pEntry.Id, "entry", entry.Id)
 							if !pEntry.Id.Equal(entry.Id) {
 								goto loop
 							} else {
-								if sameIdcnt == cm.ParentCount()-1 {
+								lastSameCm = cm.Parent(i)
+								sameIdcnt = sameIdcnt + 1
+								if emptyCnt+sameIdcnt == cm.ParentCount() {
 									// TODO: now follow the first parent commit?
-									cm = cm.Parent(0)
+									cm = lastSameCm
+									//fmt.Println("sameId...")
 									break
 								}
-								sameIdcnt = sameIdcnt + 1
 							}
 						}
 					}
@@ -539,22 +552,7 @@ func GetCommit(userName, repoName, branchname, commitid string) (*git.Commit, er
 		return nil, err
 	}
 
-	if commitid != "" {
-		oid, err := git.NewOidFromString(commitid)
-		if err != nil {
-			return nil, err
-		}
-		return repo.LookupCommit(oid)
-	}
-	if branchname == "" {
-		return nil, errors.New("no branch name and no commit id")
-	}
-
-	r, err := repo.LookupReference(fmt.Sprintf("refs/heads/%s", branchname))
-	if err != nil {
-		return nil, err
-	}
-	return r.LastCommit()
+	return repo.GetCommit(branchname, commitid)
 }
 
 // GetCommits returns all commits of given branch of repository.