|
@@ -6,6 +6,7 @@ package models
|
|
|
|
|
|
import (
|
|
|
"path"
|
|
|
+ "strings"
|
|
|
"time"
|
|
|
|
|
|
git "github.com/gogits/git"
|
|
@@ -13,10 +14,33 @@ import (
|
|
|
|
|
|
type RepoFile struct {
|
|
|
*git.TreeEntry
|
|
|
- Path string
|
|
|
- Message string
|
|
|
- Created time.Time
|
|
|
- Size int64
|
|
|
+ Path string
|
|
|
+ Message string
|
|
|
+ Created time.Time
|
|
|
+ Size int64
|
|
|
+ LastCommit string
|
|
|
+}
|
|
|
+
|
|
|
+func findTree(repo *git.Repository, tree *git.Tree, rpath string) *git.Tree {
|
|
|
+ if rpath == "" {
|
|
|
+ return tree
|
|
|
+ }
|
|
|
+ paths := strings.Split(rpath, "/")
|
|
|
+ var g = tree
|
|
|
+ for _, p := range paths {
|
|
|
+ s := g.EntryByName(p)
|
|
|
+ if s == nil {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ g, err := repo.LookupTree(s.Id)
|
|
|
+ if err != nil {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ if g == nil {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return g
|
|
|
}
|
|
|
|
|
|
func GetReposFiles(userName, reposName, branchName, rpath string) ([]*RepoFile, error) {
|
|
@@ -45,23 +69,72 @@ func GetReposFiles(userName, reposName, branchName, rpath string) ([]*RepoFile,
|
|
|
if err != nil {
|
|
|
return 0
|
|
|
}
|
|
|
- switch entry.Filemode {
|
|
|
- case git.FileModeBlob, git.FileModeBlobExec:
|
|
|
- repofiles = append(repofiles, &RepoFile{
|
|
|
- entry,
|
|
|
- path.Join(dirname, entry.Name),
|
|
|
- lastCommit.Message(),
|
|
|
- lastCommit.Committer.When,
|
|
|
- size,
|
|
|
- })
|
|
|
- case git.FileModeTree:
|
|
|
- repodirs = append(repodirs, &RepoFile{
|
|
|
- entry,
|
|
|
- path.Join(dirname, entry.Name),
|
|
|
- lastCommit.Message(),
|
|
|
- lastCommit.Committer.When,
|
|
|
- size,
|
|
|
- })
|
|
|
+
|
|
|
+ var cm = lastCommit
|
|
|
+
|
|
|
+ for {
|
|
|
+ if cm.ParentCount() == 0 {
|
|
|
+ break
|
|
|
+ } else if cm.ParentCount() == 1 {
|
|
|
+ pt := findTree(repo, cm.Parent(0).Tree, dirname)
|
|
|
+ if pt == nil {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ pEntry := pt.EntryByName(entry.Name)
|
|
|
+ if pEntry == nil || !pEntry.Id.Equal(entry.Id) {
|
|
|
+ break
|
|
|
+ } else {
|
|
|
+ cm = cm.Parent(0)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ var emptyCnt = 0
|
|
|
+ var sameIdcnt = 0
|
|
|
+ for i := 0; i < cm.ParentCount(); i++ {
|
|
|
+ p := cm.Parent(i)
|
|
|
+ pt := findTree(repo, p.Tree, dirname)
|
|
|
+ var pEntry *git.TreeEntry
|
|
|
+ if pt != nil {
|
|
|
+ pEntry = pt.EntryByName(entry.Name)
|
|
|
+ }
|
|
|
+
|
|
|
+ if pEntry == nil {
|
|
|
+ if emptyCnt == cm.ParentCount()-1 {
|
|
|
+ goto loop
|
|
|
+ } else {
|
|
|
+ emptyCnt = emptyCnt + 1
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if !pEntry.Id.Equal(entry.Id) {
|
|
|
+ goto loop
|
|
|
+ } else {
|
|
|
+ if sameIdcnt == cm.ParentCount()-1 {
|
|
|
+ // TODO: now follow the first parent commit?
|
|
|
+ cm = cm.Parent(0)
|
|
|
+ break
|
|
|
+ }
|
|
|
+ sameIdcnt = sameIdcnt + 1
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ loop:
|
|
|
+
|
|
|
+ rp := &RepoFile{
|
|
|
+ entry,
|
|
|
+ path.Join(dirname, entry.Name),
|
|
|
+ cm.Message(),
|
|
|
+ cm.Committer.When,
|
|
|
+ size,
|
|
|
+ cm.Id().String(),
|
|
|
+ }
|
|
|
+
|
|
|
+ if entry.IsFile() {
|
|
|
+ repofiles = append(repofiles, rp)
|
|
|
+ } else if entry.IsDir() {
|
|
|
+ repodirs = append(repodirs, rp)
|
|
|
}
|
|
|
}
|
|
|
return 0
|