mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	Symlinks are followed when you click on a link next to an entry, either until a file has been found or until we know that the link is dead. When the link cannot be accessed, we fall back to the current behavior of showing the document containing the target. --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
		
			
				
	
	
		
			95 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | |
| // SPDX-License-Identifier: MIT
 | |
| 
 | |
| //go:build !gogit
 | |
| 
 | |
| package git
 | |
| 
 | |
| import "code.gitea.io/gitea/modules/log"
 | |
| 
 | |
| // TreeEntry the leaf in the git tree
 | |
| type TreeEntry struct {
 | |
| 	ID    ObjectID
 | |
| 	ptree *Tree
 | |
| 
 | |
| 	entryMode EntryMode
 | |
| 	name      string
 | |
| 	size      int64
 | |
| 	sized     bool
 | |
| }
 | |
| 
 | |
| // Name returns the name of the entry (base name)
 | |
| func (te *TreeEntry) Name() string {
 | |
| 	return te.name
 | |
| }
 | |
| 
 | |
| // Mode returns the mode of the entry
 | |
| func (te *TreeEntry) Mode() EntryMode {
 | |
| 	return te.entryMode
 | |
| }
 | |
| 
 | |
| // Size returns the size of the entry
 | |
| func (te *TreeEntry) Size() int64 {
 | |
| 	if te.IsDir() {
 | |
| 		return 0
 | |
| 	} else if te.sized {
 | |
| 		return te.size
 | |
| 	}
 | |
| 
 | |
| 	wr, rd, cancel, err := te.ptree.repo.CatFileBatchCheck(te.ptree.repo.Ctx)
 | |
| 	if err != nil {
 | |
| 		log.Debug("error whilst reading size for %s in %s. Error: %v", te.ID.String(), te.ptree.repo.Path, err)
 | |
| 		return 0
 | |
| 	}
 | |
| 	defer cancel()
 | |
| 	_, err = wr.Write([]byte(te.ID.String() + "\n"))
 | |
| 	if err != nil {
 | |
| 		log.Debug("error whilst reading size for %s in %s. Error: %v", te.ID.String(), te.ptree.repo.Path, err)
 | |
| 		return 0
 | |
| 	}
 | |
| 	_, _, te.size, err = ReadBatchLine(rd)
 | |
| 	if err != nil {
 | |
| 		log.Debug("error whilst reading size for %s in %s. Error: %v", te.ID.String(), te.ptree.repo.Path, err)
 | |
| 		return 0
 | |
| 	}
 | |
| 
 | |
| 	te.sized = true
 | |
| 	return te.size
 | |
| }
 | |
| 
 | |
| // IsSubModule if the entry is a submodule
 | |
| func (te *TreeEntry) IsSubModule() bool {
 | |
| 	return te.entryMode.IsSubModule()
 | |
| }
 | |
| 
 | |
| // IsDir if the entry is a sub dir
 | |
| func (te *TreeEntry) IsDir() bool {
 | |
| 	return te.entryMode.IsDir()
 | |
| }
 | |
| 
 | |
| // IsLink if the entry is a symlink
 | |
| func (te *TreeEntry) IsLink() bool {
 | |
| 	return te.entryMode.IsLink()
 | |
| }
 | |
| 
 | |
| // IsRegular if the entry is a regular file
 | |
| func (te *TreeEntry) IsRegular() bool {
 | |
| 	return te.entryMode.IsRegular()
 | |
| }
 | |
| 
 | |
| // IsExecutable if the entry is an executable file (not necessarily binary)
 | |
| func (te *TreeEntry) IsExecutable() bool {
 | |
| 	return te.entryMode.IsExecutable()
 | |
| }
 | |
| 
 | |
| // Blob returns the blob object the entry
 | |
| func (te *TreeEntry) Blob() *Blob {
 | |
| 	return &Blob{
 | |
| 		ID:      te.ID,
 | |
| 		name:    te.Name(),
 | |
| 		size:    te.size,
 | |
| 		gotSize: te.sized,
 | |
| 		repo:    te.ptree.repo,
 | |
| 	}
 | |
| }
 |