2020-12-17 14:00:47 +00:00
// Copyright 2020 The Gitea Authors. All rights reserved.
2022-11-27 13:20:29 -05:00
// SPDX-License-Identifier: MIT
2020-12-17 14:00:47 +00:00
2021-08-24 11:47:09 -05:00
//go:build !gogit
2020-12-17 14:00:47 +00:00
package git
2022-01-19 23:26:57 +00:00
import "code.gitea.io/gitea/modules/log"
2020-12-17 14:00:47 +00:00
// TreeEntry the leaf in the git tree
type TreeEntry struct {
2023-12-13 21:02:00 +00:00
ID ObjectID
2020-12-17 14:00:47 +00:00
ptree * Tree
entryMode EntryMode
name string
size int64
sized bool
fullName string
}
// Name returns the name of the entry
func ( te * TreeEntry ) Name ( ) string {
if te . fullName != "" {
return te . fullName
}
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
}
2024-08-21 01:04:57 +08:00
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
}
2022-01-19 23:26:57 +00:00
defer cancel ( )
2024-08-21 01:04:57 +08:00
_ , err = wr . Write ( [ ] byte ( te . ID . String ( ) + "\n" ) )
2020-12-17 14:00:47 +00:00
if err != nil {
2022-01-19 23:26:57 +00:00
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 )
2020-12-17 14:00:47 +00:00
return 0
}
te . sized = true
return te . size
}
// IsSubModule if the entry is a sub module
func ( te * TreeEntry ) IsSubModule ( ) bool {
return te . entryMode == EntryModeCommit
}
// IsDir if the entry is a sub dir
func ( te * TreeEntry ) IsDir ( ) bool {
return te . entryMode == EntryModeTree
}
// IsLink if the entry is a symlink
func ( te * TreeEntry ) IsLink ( ) bool {
return te . entryMode == EntryModeSymlink
}
// IsRegular if the entry is a regular file
func ( te * TreeEntry ) IsRegular ( ) bool {
return te . entryMode == EntryModeBlob
}
// IsExecutable if the entry is an executable file (not necessarily binary)
func ( te * TreeEntry ) IsExecutable ( ) bool {
return te . entryMode == EntryModeExec
}
// Blob returns the blob object the entry
func ( te * TreeEntry ) Blob ( ) * Blob {
return & Blob {
2021-05-10 02:27:03 +01:00
ID : te . ID ,
name : te . Name ( ) ,
size : te . size ,
gotSize : te . sized ,
repo : te . ptree . repo ,
2020-12-17 14:00:47 +00:00
}
}