feat: Implement LstatIfPossible

This commit is contained in:
Felicitas Pojtinger
2022-01-02 23:51:52 +01:00
parent fb0e4f5b08
commit eb95e68bc2
4 changed files with 48 additions and 1 deletions

View File

@@ -9,6 +9,10 @@ import (
"github.com/spf13/viper"
)
const (
linkFlag = "link"
)
var inventoryStatCmd = &cobra.Command{
Use: "stat",
Aliases: []string{"sta", "s"},
@@ -29,6 +33,7 @@ var inventoryStatCmd = &cobra.Command{
},
viper.GetString(nameFlag),
viper.GetBool(linkFlag),
logging.NewCSVLogger().PrintHeader,
); err != nil {
@@ -41,6 +46,7 @@ var inventoryStatCmd = &cobra.Command{
func init() {
inventoryStatCmd.PersistentFlags().StringP(nameFlag, "n", "", "File or directory to get info for")
inventoryStatCmd.PersistentFlags().BoolP(linkFlag, "l", false, "Resolve as symlink")
viper.AutomaticEnv()

View File

@@ -207,6 +207,7 @@ func (f *File) enterWriteMode() error {
f.metadata,
f.path,
false,
f.onHeader,
)

View File

@@ -264,6 +264,7 @@ func (f *STFS) OpenFile(name string, flag int, perm os.FileMode) (afero.File, er
f.metadata,
name,
false,
f.onHeader,
)
@@ -278,6 +279,7 @@ func (f *STFS) OpenFile(name string, flag int, perm os.FileMode) (afero.File, er
f.metadata,
name,
false,
f.onHeader,
)
@@ -361,6 +363,7 @@ func (f *STFS) Stat(name string) (os.FileInfo, error) {
f.metadata,
name,
false,
f.onHeader,
)
@@ -414,6 +417,7 @@ func (f *STFS) Chmod(name string, mode os.FileMode) error {
f.metadata,
name,
false,
f.onHeader,
)
@@ -444,6 +448,7 @@ func (f *STFS) Chown(name string, uid, gid int) error {
f.metadata,
name,
false,
f.onHeader,
)
@@ -475,6 +480,7 @@ func (f *STFS) Chtimes(name string, atime time.Time, mtime time.Time) error {
f.metadata,
name,
false,
f.onHeader,
)
@@ -500,7 +506,23 @@ func (f *STFS) LstatIfPossible(name string) (os.FileInfo, bool, error) {
f.ioLock.Lock()
defer f.ioLock.Unlock()
return nil, false, config.ErrNotImplemented
hdr, err := inventory.Stat(
f.metadata,
name,
true,
f.onHeader,
)
if err != nil {
if err == sql.ErrNoRows {
return nil, true, os.ErrNotExist
}
return nil, true, err
}
return ifs.NewFileInfoFromTarHeader(hdr, f.log), true, nil
}
func (f *STFS) SymlinkIfPossible(oldname, newname string) error {

View File

@@ -15,11 +15,29 @@ func Stat(
metadata config.MetadataConfig,
name string,
symlink bool,
onHeader func(hdr *config.Header),
) (*tar.Header, error) {
name = filepath.ToSlash(name)
if symlink {
// Resolve symlink
link, err := metadata.Metadata.GetHeader(context.Background(), name)
if err != nil {
if err == sql.ErrNoRows {
link, err = metadata.Metadata.GetHeader(context.Background(), strings.TrimSuffix(name, "/")+"/")
if err != nil {
return nil, err
}
} else {
return nil, err
}
}
name = link.Linkname
}
dbhdr, err := metadata.Metadata.GetHeader(context.Background(), name)
if err != nil {
if err == sql.ErrNoRows {