mirror of https://github.com/stashapp/stash.git
Fix symlink size calculation (#3046)
This commit is contained in:
parent
5fae3cf127
commit
1c92336798
|
@ -22,6 +22,7 @@ func (o *fsOpener) Open() (io.ReadCloser, error) {
|
|||
|
||||
// FS represents a file system.
|
||||
type FS interface {
|
||||
Stat(name string) (fs.FileInfo, error)
|
||||
Lstat(name string) (fs.FileInfo, error)
|
||||
Open(name string) (fs.ReadDirFile, error)
|
||||
OpenZip(name string) (*ZipFS, error)
|
||||
|
@ -30,6 +31,10 @@ type FS interface {
|
|||
// OsFS is a file system backed by the OS.
|
||||
type OsFS struct{}
|
||||
|
||||
func (f *OsFS) Stat(name string) (fs.FileInfo, error) {
|
||||
return os.Stat(name)
|
||||
}
|
||||
|
||||
func (f *OsFS) Lstat(name string) (fs.FileInfo, error) {
|
||||
return os.Lstat(name)
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@ import (
|
|||
"errors"
|
||||
"fmt"
|
||||
"io/fs"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"sync"
|
||||
|
@ -210,6 +211,19 @@ func (s *scanJob) queueFileFunc(ctx context.Context, f FS, zipFile *scanFile) fs
|
|||
return fmt.Errorf("reading info for %q: %w", path, err)
|
||||
}
|
||||
|
||||
var size int64
|
||||
|
||||
// #2196/#3042 - replace size with target size if file is a symlink
|
||||
if info.Mode()&os.ModeSymlink == os.ModeSymlink {
|
||||
targetInfo, err := f.Stat(path)
|
||||
if err != nil {
|
||||
return fmt.Errorf("reading info for symlink %q: %w", path, err)
|
||||
}
|
||||
size = targetInfo.Size()
|
||||
} else {
|
||||
size = info.Size()
|
||||
}
|
||||
|
||||
if !s.acceptEntry(ctx, path, info) {
|
||||
if info.IsDir() {
|
||||
return fs.SkipDir
|
||||
|
@ -225,7 +239,7 @@ func (s *scanJob) queueFileFunc(ctx context.Context, f FS, zipFile *scanFile) fs
|
|||
},
|
||||
Path: path,
|
||||
Basename: filepath.Base(path),
|
||||
Size: info.Size(),
|
||||
Size: size,
|
||||
},
|
||||
fs: f,
|
||||
info: info,
|
||||
|
|
|
@ -65,7 +65,7 @@ func (f *ZipFS) rel(name string) (string, error) {
|
|||
return relName, nil
|
||||
}
|
||||
|
||||
func (f *ZipFS) Lstat(name string) (fs.FileInfo, error) {
|
||||
func (f *ZipFS) Stat(name string) (fs.FileInfo, error) {
|
||||
reader, err := f.Open(name)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -75,6 +75,10 @@ func (f *ZipFS) Lstat(name string) (fs.FileInfo, error) {
|
|||
return reader.Stat()
|
||||
}
|
||||
|
||||
func (f *ZipFS) Lstat(name string) (fs.FileInfo, error) {
|
||||
return f.Stat(name)
|
||||
}
|
||||
|
||||
func (f *ZipFS) OpenZip(name string) (*ZipFS, error) {
|
||||
return nil, errZipFSOpenZip
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue