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  }