如何使 git2go tree.Walk() 非递归并显示文件夹并从目标文件夹开始?
How to make git2go tree.Walk() non-recursive and show folders and begin at target folder?
我有以下代码:
branch, err := gR.LookupBranch(branchName, git.BranchLocal)
if err != nil {
return err
}
defer branch.Free()
commit, err := gR.LookupCommit(branch.Target())
if err != nil {
return err
}
defer commit.Free()
tree, err := gR.LookupTree(commit.TreeId())
if err != nil {
return err
}
defer tree.Free()
err = tree.Walk(func(td string, te *git.TreeEntry) int {
if te.Type == git.ObjectBlob {
fmt.Println(te.Name)
}
return 0
})
这会递归地打印出存储库中的所有文件。例如,如果我们的存储库中有以下文件:
test_file.txt
test_file_2.txt
test_folder/test_subfile_1.txt
test_folder/test_subfolder/test_subfile_2.txt
然后它会打印:
test_file.txt
test_file2.txt
test_subfile_1.txt
test_subfile_2.txt
相反,我的目标是打印:
test_file.txt
test_file_2.txt
test_folder
但是也可以选择从文件夹里面开始走,所以可以打印:
test_subfile_1.txt
test_subfolder
我怎样才能做到这一点? (目的是将目录结构延迟加载到 Web 客户端中,即允许 Web 客户端在用户打开文件夹时加载文件夹的内容——另请注意,这是一个裸仓库)
为了避免进入给定的目录,从传递给 Walk
.
的函数中 return 1
就足够了
您可以将看到的目录保存在数组或通道中。
示例:
func echoFilesCollectDirs(repo *git.Repository, tree *git.Tree, ch chan *git.Tree) {
tree.Walk(func(td string, te *git.TreeEntry) int {
fmt.Println(te.Name)
if te.Type == git.ObjectTree {
t, _ := repo.LookupTree(te.Id)
go func() { ch <- t }() // send tree into channel to process it later
return 1
}
return 0
})
}
func main() {
gR, tree := getRepoAndTree() // returns (*git.Repository, *git.Tree)
ch := make(chan *git.Tree)
echoFilesCollectDirs(gR, tree, ch)
// process next directory in a channel
// t := <-ch
// echoFilesCollectDirs(gR, t, ch)
}
注意:为了缩短代码,我删除了错误处理和获取 *git.Repository
和根 *git.Tree
的样板部分(函数 getRepoAndTree()
).
我有以下代码:
branch, err := gR.LookupBranch(branchName, git.BranchLocal)
if err != nil {
return err
}
defer branch.Free()
commit, err := gR.LookupCommit(branch.Target())
if err != nil {
return err
}
defer commit.Free()
tree, err := gR.LookupTree(commit.TreeId())
if err != nil {
return err
}
defer tree.Free()
err = tree.Walk(func(td string, te *git.TreeEntry) int {
if te.Type == git.ObjectBlob {
fmt.Println(te.Name)
}
return 0
})
这会递归地打印出存储库中的所有文件。例如,如果我们的存储库中有以下文件:
test_file.txt
test_file_2.txt
test_folder/test_subfile_1.txt
test_folder/test_subfolder/test_subfile_2.txt
然后它会打印:
test_file.txt
test_file2.txt
test_subfile_1.txt
test_subfile_2.txt
相反,我的目标是打印:
test_file.txt
test_file_2.txt
test_folder
但是也可以选择从文件夹里面开始走,所以可以打印:
test_subfile_1.txt
test_subfolder
我怎样才能做到这一点? (目的是将目录结构延迟加载到 Web 客户端中,即允许 Web 客户端在用户打开文件夹时加载文件夹的内容——另请注意,这是一个裸仓库)
为了避免进入给定的目录,从传递给 Walk
.
1
就足够了
您可以将看到的目录保存在数组或通道中。
示例:
func echoFilesCollectDirs(repo *git.Repository, tree *git.Tree, ch chan *git.Tree) {
tree.Walk(func(td string, te *git.TreeEntry) int {
fmt.Println(te.Name)
if te.Type == git.ObjectTree {
t, _ := repo.LookupTree(te.Id)
go func() { ch <- t }() // send tree into channel to process it later
return 1
}
return 0
})
}
func main() {
gR, tree := getRepoAndTree() // returns (*git.Repository, *git.Tree)
ch := make(chan *git.Tree)
echoFilesCollectDirs(gR, tree, ch)
// process next directory in a channel
// t := <-ch
// echoFilesCollectDirs(gR, t, ch)
}
注意:为了缩短代码,我删除了错误处理和获取 *git.Repository
和根 *git.Tree
的样板部分(函数 getRepoAndTree()
).