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.
|
// FS represents a file system.
|
||||||
type FS interface {
|
type FS interface {
|
||||||
|
Stat(name string) (fs.FileInfo, error)
|
||||||
Lstat(name string) (fs.FileInfo, error)
|
Lstat(name string) (fs.FileInfo, error)
|
||||||
Open(name string) (fs.ReadDirFile, error)
|
Open(name string) (fs.ReadDirFile, error)
|
||||||
OpenZip(name string) (*ZipFS, error)
|
OpenZip(name string) (*ZipFS, error)
|
||||||
|
@ -30,6 +31,10 @@ type FS interface {
|
||||||
// OsFS is a file system backed by the OS.
|
// OsFS is a file system backed by the OS.
|
||||||
type OsFS struct{}
|
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) {
|
func (f *OsFS) Lstat(name string) (fs.FileInfo, error) {
|
||||||
return os.Lstat(name)
|
return os.Lstat(name)
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"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)
|
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 !s.acceptEntry(ctx, path, info) {
|
||||||
if info.IsDir() {
|
if info.IsDir() {
|
||||||
return fs.SkipDir
|
return fs.SkipDir
|
||||||
|
@ -225,7 +239,7 @@ func (s *scanJob) queueFileFunc(ctx context.Context, f FS, zipFile *scanFile) fs
|
||||||
},
|
},
|
||||||
Path: path,
|
Path: path,
|
||||||
Basename: filepath.Base(path),
|
Basename: filepath.Base(path),
|
||||||
Size: info.Size(),
|
Size: size,
|
||||||
},
|
},
|
||||||
fs: f,
|
fs: f,
|
||||||
info: info,
|
info: info,
|
||||||
|
|
|
@ -65,7 +65,7 @@ func (f *ZipFS) rel(name string) (string, error) {
|
||||||
return relName, nil
|
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)
|
reader, err := f.Open(name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -75,6 +75,10 @@ func (f *ZipFS) Lstat(name string) (fs.FileInfo, error) {
|
||||||
return reader.Stat()
|
return reader.Stat()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (f *ZipFS) Lstat(name string) (fs.FileInfo, error) {
|
||||||
|
return f.Stat(name)
|
||||||
|
}
|
||||||
|
|
||||||
func (f *ZipFS) OpenZip(name string) (*ZipFS, error) {
|
func (f *ZipFS) OpenZip(name string) (*ZipFS, error) {
|
||||||
return nil, errZipFSOpenZip
|
return nil, errZipFSOpenZip
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue