code.gitea.io/gitea@v1.22.3/modules/git/tree_entry_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 "code.gitea.io/gitea/modules/log"
     9  
    10  // TreeEntry the leaf in the git tree
    11  type TreeEntry struct {
    12  	ID ObjectID
    13  
    14  	ptree *Tree
    15  
    16  	entryMode EntryMode
    17  	name      string
    18  
    19  	size     int64
    20  	sized    bool
    21  	fullName string
    22  }
    23  
    24  // Name returns the name of the entry
    25  func (te *TreeEntry) Name() string {
    26  	if te.fullName != "" {
    27  		return te.fullName
    28  	}
    29  	return te.name
    30  }
    31  
    32  // Mode returns the mode of the entry
    33  func (te *TreeEntry) Mode() EntryMode {
    34  	return te.entryMode
    35  }
    36  
    37  // Size returns the size of the entry
    38  func (te *TreeEntry) Size() int64 {
    39  	if te.IsDir() {
    40  		return 0
    41  	} else if te.sized {
    42  		return te.size
    43  	}
    44  
    45  	wr, rd, cancel, err := te.ptree.repo.CatFileBatchCheck(te.ptree.repo.Ctx)
    46  	if err != nil {
    47  		log.Debug("error whilst reading size for %s in %s. Error: %v", te.ID.String(), te.ptree.repo.Path, err)
    48  		return 0
    49  	}
    50  	defer cancel()
    51  	_, err = wr.Write([]byte(te.ID.String() + "\n"))
    52  	if err != nil {
    53  		log.Debug("error whilst reading size for %s in %s. Error: %v", te.ID.String(), te.ptree.repo.Path, err)
    54  		return 0
    55  	}
    56  	_, _, te.size, err = ReadBatchLine(rd)
    57  	if err != nil {
    58  		log.Debug("error whilst reading size for %s in %s. Error: %v", te.ID.String(), te.ptree.repo.Path, err)
    59  		return 0
    60  	}
    61  
    62  	te.sized = true
    63  	return te.size
    64  }
    65  
    66  // IsSubModule if the entry is a sub module
    67  func (te *TreeEntry) IsSubModule() bool {
    68  	return te.entryMode == EntryModeCommit
    69  }
    70  
    71  // IsDir if the entry is a sub dir
    72  func (te *TreeEntry) IsDir() bool {
    73  	return te.entryMode == EntryModeTree
    74  }
    75  
    76  // IsLink if the entry is a symlink
    77  func (te *TreeEntry) IsLink() bool {
    78  	return te.entryMode == EntryModeSymlink
    79  }
    80  
    81  // IsRegular if the entry is a regular file
    82  func (te *TreeEntry) IsRegular() bool {
    83  	return te.entryMode == EntryModeBlob
    84  }
    85  
    86  // IsExecutable if the entry is an executable file (not necessarily binary)
    87  func (te *TreeEntry) IsExecutable() bool {
    88  	return te.entryMode == EntryModeExec
    89  }
    90  
    91  // Blob returns the blob object the entry
    92  func (te *TreeEntry) Blob() *Blob {
    93  	return &Blob{
    94  		ID:      te.ID,
    95  		name:    te.Name(),
    96  		size:    te.size,
    97  		gotSize: te.sized,
    98  		repo:    te.ptree.repo,
    99  	}
   100  }