gitea源码

repo_tree_gogit.go 1.5KB

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. "errors"
  8. "code.gitea.io/gitea/modules/git/gitcmd"
  9. "github.com/go-git/go-git/v5/plumbing"
  10. )
  11. func (repo *Repository) getTree(id ObjectID) (*Tree, error) {
  12. gogitTree, err := repo.gogitRepo.TreeObject(plumbing.Hash(id.RawValue()))
  13. if err != nil {
  14. if errors.Is(err, plumbing.ErrObjectNotFound) {
  15. return nil, ErrNotExist{
  16. ID: id.String(),
  17. }
  18. }
  19. return nil, err
  20. }
  21. tree := NewTree(repo, id)
  22. tree.gogitTree = gogitTree
  23. return tree, nil
  24. }
  25. // GetTree find the tree object in the repository.
  26. func (repo *Repository) GetTree(idStr string) (*Tree, error) {
  27. objectFormat, err := repo.GetObjectFormat()
  28. if err != nil {
  29. return nil, err
  30. }
  31. if len(idStr) != objectFormat.FullLength() {
  32. res, _, err := gitcmd.NewCommand("rev-parse", "--verify").AddDynamicArguments(idStr).RunStdString(repo.Ctx, &gitcmd.RunOpts{Dir: repo.Path})
  33. if err != nil {
  34. return nil, err
  35. }
  36. if len(res) > 0 {
  37. idStr = res[:len(res)-1]
  38. }
  39. }
  40. id, err := NewIDFromString(idStr)
  41. if err != nil {
  42. return nil, err
  43. }
  44. resolvedID := id
  45. commitObject, err := repo.gogitRepo.CommitObject(plumbing.Hash(id.RawValue()))
  46. if err == nil {
  47. id = ParseGogitHash(commitObject.TreeHash)
  48. }
  49. treeObject, err := repo.getTree(id)
  50. if err != nil {
  51. return nil, err
  52. }
  53. treeObject.ResolvedID = resolvedID
  54. return treeObject, nil
  55. }