Browse Source

speedup models.getReposFiles, using os.Exec
but the results may different with before

Gogs 11 years ago
parent
commit
7811e58726
1 changed files with 12 additions and 65 deletions
  1. 12 65
      models/git.go

+ 12 - 65
models/git.go

@@ -142,7 +142,8 @@ func GetReposFiles(userName, repoName, commitId, rpath string) ([]*RepoFile, err
 }
 
 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 {
 		return nil, err
 	}
@@ -162,77 +163,23 @@ func getReposFiles(userName, repoName, commitId string, rpath string) ([]*RepoFi
 				return 0
 			}
 
-			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 {
-					pt, _ := repo.SubTree(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
-					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
-								}
-							}
-						}
-					}
-				}
+			cmd := exec.Command("git", "log", "-1", "--pretty=format:%H", commitId, "--", entry.Name)
+			cmd.Dir = repopath
+			out, err := cmd.Output()
+			if err != nil {
+				return 0
+			}
+			filecm, err := repo.GetCommit(string(out))
+			if err != nil {
+				return 0
 			}
-
-		loop:
 
 			rp := &RepoFile{
 				entry,
 				path.Join(dirname, entry.Name),
 				size,
 				repo,
-				cm,
+				filecm,
 			}
 
 			if entry.IsFile() {