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_blob_gogit.go 1.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. // Copyright 2015 The Gogs Authors. All rights reserved.
  2. // Copyright 2019 The Gitea Authors. All rights reserved.
  3. // SPDX-License-Identifier: MIT
  4. //go:build gogit
  5. package git
  6. import (
  7. "path"
  8. "strings"
  9. "github.com/go-git/go-git/v5/plumbing"
  10. "github.com/go-git/go-git/v5/plumbing/filemode"
  11. "github.com/go-git/go-git/v5/plumbing/object"
  12. )
  13. // GetTreeEntryByPath get the tree entries according the sub dir
  14. func (t *Tree) GetTreeEntryByPath(relpath string) (*TreeEntry, error) {
  15. if len(relpath) == 0 {
  16. return &TreeEntry{
  17. ID: t.ID,
  18. // Type: ObjectTree,
  19. gogitTreeEntry: &object.TreeEntry{
  20. Name: "",
  21. Mode: filemode.Dir,
  22. Hash: t.ID,
  23. },
  24. }, nil
  25. }
  26. relpath = path.Clean(relpath)
  27. parts := strings.Split(relpath, "/")
  28. var err error
  29. tree := t
  30. for i, name := range parts {
  31. if i == len(parts)-1 {
  32. entries, err := tree.ListEntries()
  33. if err != nil {
  34. if err == plumbing.ErrObjectNotFound {
  35. return nil, ErrNotExist{
  36. RelPath: relpath,
  37. }
  38. }
  39. return nil, err
  40. }
  41. for _, v := range entries {
  42. if v.Name() == name {
  43. return v, nil
  44. }
  45. }
  46. } else {
  47. tree, err = tree.SubTree(name)
  48. if err != nil {
  49. if err == plumbing.ErrObjectNotFound {
  50. return nil, ErrNotExist{
  51. RelPath: relpath,
  52. }
  53. }
  54. return nil, err
  55. }
  56. }
  57. }
  58. return nil, ErrNotExist{"", relpath}
  59. }