80 lines · 1.9 KB · Go
RawDownload
// Copyright 2015 The Gogs Authors. All rights reserved.// Copyright 2019 The Gitea Authors. All rights reserved.// Copyright 2024 The Forgejo Authors c/o Codeberg e.V.. All rights reserved.// SPDX-License-Identifier: MIT package git import (	"path"	"strings") // GetTreeEntryByPath get the tree entries according the sub dirfunc (t *Tree) GetTreeEntryByPath(relpath string) (*TreeEntry, error) {	if len(relpath) == 0 {		return &TreeEntry{			ptree:     t,			ID:        t.ID,			name:      "",			entryMode: EntryModeTree,		}, nil	} 	// FIXME: This should probably use git cat-file --batch to be a bit more efficient	relpath = path.Clean(relpath)	parts := strings.Split(relpath, "/")	var err error	tree := t	for i, name := range parts {		if i == len(parts)-1 {			entries, err := tree.ListEntries()			if err != nil {				return nil, err			}			for _, v := range entries {				if v.Name() == name {					return v, nil				}			}		} else {			tree, err = tree.SubTree(name)			if err != nil {				return nil, err			}		}	}	return nil, ErrNotExist{"", relpath}} // GetBlobByPath get the blob object according the pathfunc (t *Tree) GetBlobByPath(relpath string) (*Blob, error) {	entry, err := t.GetTreeEntryByPath(relpath)	if err != nil {		return nil, err	} 	if !entry.IsDir() && !entry.IsSubmodule() {		return entry.Blob(), nil	} 	return nil, ErrNotExist{"", relpath}} // GetBlobByFoldedPath returns the blob object at relpath, regardless of the// case of relpath. If there are multiple files with the same case-insensitive// name, the first one found will be returned.func (t *Tree) GetBlobByFoldedPath(relpath string) (*Blob, error) {	entries, err := t.ListEntries()	if err != nil {		return nil, err	} 	for _, entry := range entries {		if strings.EqualFold(entry.Name(), relpath) {			return t.GetBlobByPath(entry.Name())		}	} 	return nil, ErrNotExist{"", relpath}}