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  }