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.

repo_tree_nogogit.go 1.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. //go:build !gogit
  4. package git
  5. import (
  6. "io"
  7. )
  8. func (repo *Repository) getTree(id ObjectID) (*Tree, error) {
  9. wr, rd, cancel := repo.CatFileBatch(repo.Ctx)
  10. defer cancel()
  11. _, _ = wr.Write([]byte(id.String() + "\n"))
  12. // ignore the SHA
  13. _, typ, size, err := ReadBatchLine(rd)
  14. if err != nil {
  15. return nil, err
  16. }
  17. switch typ {
  18. case "tag":
  19. resolvedID := id
  20. data, err := io.ReadAll(io.LimitReader(rd, size))
  21. if err != nil {
  22. return nil, err
  23. }
  24. tag, err := parseTagData(id.Type(), data)
  25. if err != nil {
  26. return nil, err
  27. }
  28. commit, err := tag.Commit(repo)
  29. if err != nil {
  30. return nil, err
  31. }
  32. commit.Tree.ResolvedID = resolvedID
  33. return &commit.Tree, nil
  34. case "commit":
  35. commit, err := CommitFromReader(repo, id, io.LimitReader(rd, size))
  36. if err != nil {
  37. return nil, err
  38. }
  39. if _, err := rd.Discard(1); err != nil {
  40. return nil, err
  41. }
  42. commit.Tree.ResolvedID = commit.ID
  43. return &commit.Tree, nil
  44. case "tree":
  45. tree := NewTree(repo, id)
  46. tree.ResolvedID = id
  47. tree.entries, err = catBatchParseTreeEntries(repo.objectFormat, tree, rd, size)
  48. if err != nil {
  49. return nil, err
  50. }
  51. tree.entriesParsed = true
  52. return tree, nil
  53. default:
  54. return nil, ErrNotExist{
  55. ID: id.String(),
  56. }
  57. }
  58. }
  59. // GetTree find the tree object in the repository.
  60. func (repo *Repository) GetTree(idStr string) (*Tree, error) {
  61. if len(idStr) != repo.objectFormat.FullLength() {
  62. res, err := repo.GetRefCommitID(idStr)
  63. if err != nil {
  64. return nil, err
  65. }
  66. if len(res) > 0 {
  67. idStr = res
  68. }
  69. }
  70. id, err := NewIDFromString(idStr)
  71. if err != nil {
  72. return nil, err
  73. }
  74. return repo.getTree(id)
  75. }