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