code.gitea.io/gitea@v1.19.3/modules/git/tree_blob_gogit.go (about)

     1  // Copyright 2015 The Gogs Authors. All rights reserved.
     2  // Copyright 2019 The Gitea Authors. All rights reserved.
     3  // SPDX-License-Identifier: MIT
     4  
     5  //go:build gogit
     6  
     7  package git
     8  
     9  import (
    10  	"path"
    11  	"strings"
    12  
    13  	"github.com/go-git/go-git/v5/plumbing"
    14  	"github.com/go-git/go-git/v5/plumbing/filemode"
    15  	"github.com/go-git/go-git/v5/plumbing/object"
    16  )
    17  
    18  // GetTreeEntryByPath get the tree entries according the sub dir
    19  func (t *Tree) GetTreeEntryByPath(relpath string) (*TreeEntry, error) {
    20  	if len(relpath) == 0 {
    21  		return &TreeEntry{
    22  			ID: t.ID,
    23  			// Type: ObjectTree,
    24  			gogitTreeEntry: &object.TreeEntry{
    25  				Name: "",
    26  				Mode: filemode.Dir,
    27  				Hash: t.ID,
    28  			},
    29  		}, nil
    30  	}
    31  
    32  	relpath = path.Clean(relpath)
    33  	parts := strings.Split(relpath, "/")
    34  	var err error
    35  	tree := t
    36  	for i, name := range parts {
    37  		if i == len(parts)-1 {
    38  			entries, err := tree.ListEntries()
    39  			if err != nil {
    40  				if err == plumbing.ErrObjectNotFound {
    41  					return nil, ErrNotExist{
    42  						RelPath: relpath,
    43  					}
    44  				}
    45  				return nil, err
    46  			}
    47  			for _, v := range entries {
    48  				if v.Name() == name {
    49  					return v, nil
    50  				}
    51  			}
    52  		} else {
    53  			tree, err = tree.SubTree(name)
    54  			if err != nil {
    55  				if err == plumbing.ErrObjectNotFound {
    56  					return nil, ErrNotExist{
    57  						RelPath: relpath,
    58  					}
    59  				}
    60  				return nil, err
    61  			}
    62  		}
    63  	}
    64  	return nil, ErrNotExist{"", relpath}
    65  }