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