You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

tree_gogit.go 1.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. // Copyright 2015 The Gogs Authors. All rights reserved.
  2. // Copyright 2019 The Gitea Authors. All rights reserved.
  3. // Use of this source code is governed by a MIT-style
  4. // license that can be found in the LICENSE file.
  5. //go:build gogit
  6. // +build gogit
  7. package git
  8. import (
  9. "io"
  10. "github.com/go-git/go-git/v5/plumbing"
  11. "github.com/go-git/go-git/v5/plumbing/object"
  12. )
  13. // Tree represents a flat directory listing.
  14. type Tree struct {
  15. ID SHA1
  16. ResolvedID SHA1
  17. repo *Repository
  18. gogitTree *object.Tree
  19. // parent tree
  20. ptree *Tree
  21. }
  22. func (t *Tree) loadTreeObject() error {
  23. gogitTree, err := t.repo.gogitRepo.TreeObject(t.ID)
  24. if err != nil {
  25. return err
  26. }
  27. t.gogitTree = gogitTree
  28. return nil
  29. }
  30. // ListEntries returns all entries of current tree.
  31. func (t *Tree) ListEntries() (Entries, error) {
  32. if t.gogitTree == nil {
  33. err := t.loadTreeObject()
  34. if err != nil {
  35. return nil, err
  36. }
  37. }
  38. entries := make([]*TreeEntry, len(t.gogitTree.Entries))
  39. for i, entry := range t.gogitTree.Entries {
  40. entries[i] = &TreeEntry{
  41. ID: entry.Hash,
  42. gogitTreeEntry: &t.gogitTree.Entries[i],
  43. ptree: t,
  44. }
  45. }
  46. return entries, nil
  47. }
  48. // ListEntriesRecursive returns all entries of current tree recursively including all subtrees
  49. func (t *Tree) ListEntriesRecursive() (Entries, error) {
  50. if t.gogitTree == nil {
  51. err := t.loadTreeObject()
  52. if err != nil {
  53. return nil, err
  54. }
  55. }
  56. var entries []*TreeEntry
  57. seen := map[plumbing.Hash]bool{}
  58. walker := object.NewTreeWalker(t.gogitTree, true, seen)
  59. for {
  60. fullName, entry, err := walker.Next()
  61. if err == io.EOF {
  62. break
  63. }
  64. if err != nil {
  65. return nil, err
  66. }
  67. if seen[entry.Hash] {
  68. continue
  69. }
  70. convertedEntry := &TreeEntry{
  71. ID: entry.Hash,
  72. gogitTreeEntry: &entry,
  73. ptree: t,
  74. fullName: fullName,
  75. }
  76. entries = append(entries, convertedEntry)
  77. }
  78. return entries, nil
  79. }