Как сделать git2go tree.Walk () нерекурсивными и показать папки и начать с целевой папки? - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть следующий код:

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

Как этого добиться?(Цель состоит в том, чтобы лениво загрузить структуру каталогов в веб-клиент, т.е. позволить веб-клиенту загружать содержимое папок, когда пользователь открывает их - также обратите внимание, что это пустое хранилище)

1 Ответ

0 голосов
/ 25 января 2019

Чтобы не входить в данный каталог, достаточно вернуть 1 из функции, переданной в Walk.

Вы можете сохранить видимые каталоги в массиве или канале.

Пример:

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 и root *git.Tree (функция getRepoAndTree()).

...