star/gdu/pkg/annex/annex.go

66 lines
1.2 KiB
Go
Raw Normal View History

2025-04-26 19:33:14 +08:00
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)
}