2020-12-17 14:00:47 +00:00
// Copyright 2020 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
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 {
ID SHA1
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
}
2022-01-19 23:26:57 +00:00
wr , rd , cancel := te . ptree . repo . CatFileBatchCheck ( te . ptree . repo . Ctx )
defer cancel ( )
_ , 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
}
}