From 4470192c70a2b3f9b10065754731a266fd5ce721 Mon Sep 17 00:00:00 2001
From: Lunny Xiao <xiaolunwen@gmail.com>
Date: Sat, 15 Mar 2014 00:18:09 +0800
Subject: [PATCH] add pure go git lib to instead cgo git lib

---
 models/repo.go  | 27 ++++++----------------
 models/repo2.go | 61 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 68 insertions(+), 20 deletions(-)
 create mode 100644 models/repo2.go

diff --git a/models/repo.go b/models/repo.go
index 26aba4a851..c52d0a1f24 100644
--- a/models/repo.go
+++ b/models/repo.go
@@ -9,7 +9,6 @@ import (
 	"fmt"
 	"io/ioutil"
 	"os"
-	"path"
 	"path/filepath"
 	"strings"
 	"time"
@@ -262,11 +261,7 @@ func GetRepositoryCount(user *User) (int64, error) {
 	return orm.Count(&Repository{OwnerId: user.Id})
 }
 
-const (
-	RFile = iota + 1
-	RDir
-)
-
+/*
 type RepoFile struct {
 	Id      *git.Oid
 	Type    int
@@ -282,15 +277,19 @@ func (f *RepoFile) IsFile() bool {
 
 func (f *RepoFile) IsDir() bool {
 	return f.Type == git.FilemodeTree
-}
+}*/
 
+/*
 func GetReposFiles(userName, reposName, branchName, rpath string) ([]*RepoFile, error) {
 	f := RepoPath(userName, reposName)
+
 	repo, err := git.OpenRepository(f)
 	if err != nil {
 		return nil, err
 	}
 
+	repo.LookupReference("refs/heads/" + branchName)
+
 	obj, err := repo.RevparseSingle("HEAD")
 	if err != nil {
 		return nil, err
@@ -322,20 +321,8 @@ func GetReposFiles(userName, reposName, branchName, rpath string) ([]*RepoFile,
 		return 0
 	})
 
-	/*for ; i < tree.EntryCount(); i++ {
-		entry := tree.EntryByIndex(i)
-
-		repofiles = append(repofiles, &RepoFile{
-			entry.Id,
-			entry.Filemode,
-			entry.Name,
-			lastCommit.Message(),
-			lastCommit.Committer().When,
-		})
-	}*/
-
 	return repofiles, nil
-}
+}*/
 
 func StarReposiory(user *User, repoName string) error {
 	return nil
diff --git a/models/repo2.go b/models/repo2.go
new file mode 100644
index 0000000000..ef0131d83e
--- /dev/null
+++ b/models/repo2.go
@@ -0,0 +1,61 @@
+package models
+
+import (
+	"path"
+	"time"
+
+	git "github.com/speedata/gogit"
+)
+
+type RepoFile struct {
+	Id      *git.Oid
+	Type    int
+	Name    string
+	Path    string
+	Message string
+	Created time.Time
+}
+
+func (f *RepoFile) IsFile() bool {
+	return f.Type == git.FileModeBlob || f.Type == git.FileModeBlobExec
+}
+
+func (f *RepoFile) IsDir() bool {
+	return f.Type == git.FileModeTree
+}
+
+func GetReposFiles(userName, reposName, branchName, rpath string) ([]*RepoFile, error) {
+	f := RepoPath(userName, reposName)
+
+	repo, err := git.OpenRepository(f)
+	if err != nil {
+		return nil, err
+	}
+
+	ref, err := repo.LookupReference("refs/heads/" + branchName)
+	if err != nil {
+		return nil, err
+	}
+
+	lastCommit, err := repo.LookupCommit(ref.Oid)
+	if err != nil {
+		return nil, err
+	}
+
+	var repofiles []*RepoFile
+	lastCommit.Tree.Walk(func(dirname string, entry *git.TreeEntry) int {
+		if dirname == rpath {
+			repofiles = append(repofiles, &RepoFile{
+				entry.Id,
+				entry.Filemode,
+				entry.Name,
+				path.Join(dirname, entry.Name),
+				lastCommit.Message(),
+				lastCommit.Committer.When,
+			})
+		}
+		return 0
+	})
+
+	return repofiles, nil
+}