gitea源码

repo_tree_nogogit.go 2.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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, err := repo.CatFileBatch(repo.Ctx)
  10. if err != nil {
  11. return nil, err
  12. }
  13. defer cancel()
  14. _, _ = wr.Write([]byte(id.String() + "\n"))
  15. // ignore the SHA
  16. _, typ, size, err := ReadBatchLine(rd)
  17. if err != nil {
  18. return nil, err
  19. }
  20. switch typ {
  21. case "tag":
  22. resolvedID := id
  23. data, err := io.ReadAll(io.LimitReader(rd, size))
  24. if err != nil {
  25. return nil, err
  26. }
  27. tag, err := parseTagData(id.Type(), data)
  28. if err != nil {
  29. return nil, err
  30. }
  31. if _, err := wr.Write([]byte(tag.Object.String() + "\n")); err != nil {
  32. return nil, err
  33. }
  34. commit, err := repo.getCommitFromBatchReader(wr, rd, tag.Object)
  35. if err != nil {
  36. return nil, err
  37. }
  38. commit.Tree.ResolvedID = resolvedID
  39. return &commit.Tree, nil
  40. case "commit":
  41. commit, err := CommitFromReader(repo, id, io.LimitReader(rd, size))
  42. if err != nil {
  43. return nil, err
  44. }
  45. if _, err := rd.Discard(1); err != nil {
  46. return nil, err
  47. }
  48. commit.Tree.ResolvedID = commit.ID
  49. return &commit.Tree, nil
  50. case "tree":
  51. tree := NewTree(repo, id)
  52. tree.ResolvedID = id
  53. objectFormat, err := repo.GetObjectFormat()
  54. if err != nil {
  55. return nil, err
  56. }
  57. tree.entries, err = catBatchParseTreeEntries(objectFormat, tree, rd, size)
  58. if err != nil {
  59. return nil, err
  60. }
  61. tree.entriesParsed = true
  62. return tree, nil
  63. default:
  64. if err := DiscardFull(rd, size+1); err != nil {
  65. return nil, err
  66. }
  67. return nil, ErrNotExist{
  68. ID: id.String(),
  69. }
  70. }
  71. }
  72. // GetTree find the tree object in the repository.
  73. func (repo *Repository) GetTree(idStr string) (*Tree, error) {
  74. objectFormat, err := repo.GetObjectFormat()
  75. if err != nil {
  76. return nil, err
  77. }
  78. if len(idStr) != objectFormat.FullLength() {
  79. res, err := repo.GetRefCommitID(idStr)
  80. if err != nil {
  81. return nil, err
  82. }
  83. if len(res) > 0 {
  84. idStr = res
  85. }
  86. }
  87. id, err := NewIDFromString(idStr)
  88. if err != nil {
  89. return nil, err
  90. }
  91. return repo.getTree(id)
  92. }