code.gitea.io/gitea@v1.19.3/modules/git/tree_entry_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  	"github.com/go-git/go-git/v5/plumbing"
    11  	"github.com/go-git/go-git/v5/plumbing/filemode"
    12  	"github.com/go-git/go-git/v5/plumbing/object"
    13  )
    14  
    15  // TreeEntry the leaf in the git tree
    16  type TreeEntry struct {
    17  	ID SHA1
    18  
    19  	gogitTreeEntry *object.TreeEntry
    20  	ptree          *Tree
    21  
    22  	size     int64
    23  	sized    bool
    24  	fullName string
    25  }
    26  
    27  // Name returns the name of the entry
    28  func (te *TreeEntry) Name() string {
    29  	if te.fullName != "" {
    30  		return te.fullName
    31  	}
    32  	return te.gogitTreeEntry.Name
    33  }
    34  
    35  // Mode returns the mode of the entry
    36  func (te *TreeEntry) Mode() EntryMode {
    37  	return EntryMode(te.gogitTreeEntry.Mode)
    38  }
    39  
    40  // Size returns the size of the entry
    41  func (te *TreeEntry) Size() int64 {
    42  	if te.IsDir() {
    43  		return 0
    44  	} else if te.sized {
    45  		return te.size
    46  	}
    47  
    48  	file, err := te.ptree.gogitTree.TreeEntryFile(te.gogitTreeEntry)
    49  	if err != nil {
    50  		return 0
    51  	}
    52  
    53  	te.sized = true
    54  	te.size = file.Size
    55  	return te.size
    56  }
    57  
    58  // IsSubModule if the entry is a sub module
    59  func (te *TreeEntry) IsSubModule() bool {
    60  	return te.gogitTreeEntry.Mode == filemode.Submodule
    61  }
    62  
    63  // IsDir if the entry is a sub dir
    64  func (te *TreeEntry) IsDir() bool {
    65  	return te.gogitTreeEntry.Mode == filemode.Dir
    66  }
    67  
    68  // IsLink if the entry is a symlink
    69  func (te *TreeEntry) IsLink() bool {
    70  	return te.gogitTreeEntry.Mode == filemode.Symlink
    71  }
    72  
    73  // IsRegular if the entry is a regular file
    74  func (te *TreeEntry) IsRegular() bool {
    75  	return te.gogitTreeEntry.Mode == filemode.Regular
    76  }
    77  
    78  // IsExecutable if the entry is an executable file (not necessarily binary)
    79  func (te *TreeEntry) IsExecutable() bool {
    80  	return te.gogitTreeEntry.Mode == filemode.Executable
    81  }
    82  
    83  // Blob returns the blob object the entry
    84  func (te *TreeEntry) Blob() *Blob {
    85  	encodedObj, err := te.ptree.repo.gogitRepo.Storer.EncodedObject(plumbing.AnyObject, te.gogitTreeEntry.Hash)
    86  	if err != nil {
    87  		return nil
    88  	}
    89  
    90  	return &Blob{
    91  		ID:              te.gogitTreeEntry.Hash,
    92  		gogitEncodedObj: encodedObj,
    93  		name:            te.Name(),
    94  	}
    95  }