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.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. objectFormat, err := repo.GetObjectFormat()
  48. if err != nil {
  49. return nil, err
  50. }
  51. tree.entries, err = catBatchParseTreeEntries(objectFormat, tree, rd, size)
  52. if err != nil {
  53. return nil, err
  54. }
  55. tree.entriesParsed = true
  56. return tree, nil
  57. default:
  58. if err := DiscardFull(rd, size+1); err != nil {
  59. return nil, err
  60. }
  61. return nil, ErrNotExist{
  62. ID: id.String(),
  63. }
  64. }
  65. }
  66. // GetTree find the tree object in the repository.
  67. func (repo *Repository) GetTree(idStr string) (*Tree, error) {
  68. objectFormat, err := repo.GetObjectFormat()
  69. if err != nil {
  70. return nil, err
  71. }
  72. if len(idStr) != objectFormat.FullLength() {
  73. res, err := repo.GetRefCommitID(idStr)
  74. if err != nil {
  75. return nil, err
  76. }
  77. if len(res) > 0 {
  78. idStr = res
  79. }
  80. }
  81. id, err := NewIDFromString(idStr)
  82. if err != nil {
  83. return nil, err
  84. }
  85. return repo.getTree(id)
  86. }