66 lines
1.2 KiB
Go
66 lines
1.2 KiB
Go
|
package annex
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"io/fs"
|
||
|
"log"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
// SizeFromKey returns size from git-annex key.
|
||
|
func SizeFromKey(name string) (int64, error) {
|
||
|
nameParts := strings.SplitN(name, "--", 2)
|
||
|
backendKVs := nameParts[0]
|
||
|
backendKVParts := strings.Split(backendKVs, "-")
|
||
|
|
||
|
if len(backendKVParts) < 2 {
|
||
|
return 0, fmt.Errorf("key is is missing backend")
|
||
|
}
|
||
|
|
||
|
for _, p := range backendKVParts[1:] {
|
||
|
if p == "" || p[0] != 's' {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
size, err := strconv.ParseInt(p[1:], 10, 64)
|
||
|
if err != nil {
|
||
|
return 0, fmt.Errorf("failed to parse size: %w", err)
|
||
|
}
|
||
|
|
||
|
return size, nil
|
||
|
}
|
||
|
|
||
|
return 0, fmt.Errorf("size not found in key")
|
||
|
}
|
||
|
|
||
|
// AnnexedFileInfo returns a new FileInfo with size from git-annex key.
|
||
|
func AnnexedFileInfo(fi fs.FileInfo, name string) *FileInfo {
|
||
|
size, err := SizeFromKey(name)
|
||
|
if err != nil {
|
||
|
log.Print(err.Error())
|
||
|
return &FileInfo{FileInfo: fi}
|
||
|
}
|
||
|
|
||
|
afi := &FileInfo{
|
||
|
FileInfo: fi,
|
||
|
size: size,
|
||
|
}
|
||
|
|
||
|
return afi
|
||
|
}
|
||
|
|
||
|
var _ fs.FileInfo = (*FileInfo)(nil)
|
||
|
|
||
|
// FileInfo is a wrapper around fs.FileInfo to overwrite the size.
|
||
|
type FileInfo struct {
|
||
|
fs.FileInfo
|
||
|
|
||
|
size int64
|
||
|
}
|
||
|
|
||
|
// Length in bytes for regular files; system-dependent for others
|
||
|
func (fi *FileInfo) Size() int64 {
|
||
|
return int64(fi.size)
|
||
|
}
|