speedup models.getReposFiles, using os.Exec

but the results may different with before
This commit is contained in:
Gogs 2014-04-10 12:38:56 -04:00
parent a24c0b92e4
commit 7811e58726
1 changed files with 12 additions and 65 deletions

View File

@ -142,7 +142,8 @@ func GetReposFiles(userName, repoName, commitId, rpath string) ([]*RepoFile, err
} }
func getReposFiles(userName, repoName, commitId string, rpath string) ([]*RepoFile, error) { func getReposFiles(userName, repoName, commitId string, rpath string) ([]*RepoFile, error) {
repo, err := git.OpenRepository(RepoPath(userName, repoName)) repopath := RepoPath(userName, repoName)
repo, err := git.OpenRepository(repopath)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -162,77 +163,23 @@ func getReposFiles(userName, repoName, commitId string, rpath string) ([]*RepoFi
return 0 return 0
} }
var cm = commit cmd := exec.Command("git", "log", "-1", "--pretty=format:%H", commitId, "--", entry.Name)
var i int cmd.Dir = repopath
for { out, err := cmd.Output()
i = i + 1 if err != nil {
//fmt.Println(".....", i, cm.Id(), cm.ParentCount()) return 0
if cm.ParentCount() == 0 { }
break filecm, err := repo.GetCommit(string(out))
} else if cm.ParentCount() == 1 { if err != nil {
pt, _ := repo.SubTree(cm.Parent(0).Tree, dirname) return 0
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
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
if pt != nil {
pEntry = pt.EntryByName(entry.Name)
}
//fmt.Println("pEntry", pEntry)
if pEntry == nil {
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 {
lastSameCm = cm.Parent(i)
sameIdcnt = sameIdcnt + 1
if emptyCnt+sameIdcnt == cm.ParentCount() {
// TODO: now follow the first parent commit?
cm = lastSameCm
//fmt.Println("sameId...")
break
}
}
}
}
}
} }
loop:
rp := &RepoFile{ rp := &RepoFile{
entry, entry,
path.Join(dirname, entry.Name), path.Join(dirname, entry.Name),
size, size,
repo, repo,
cm, filecm,
} }
if entry.IsFile() { if entry.IsFile() {