Adopt the standard tooling from sneak/prompts: the Makefile and script/
entrypoints, lint and test stages in one Dockerfile, the lint config, the
CI workflow and the formatter settings. make fmt also formats Go, with a
pinned Go from script/bootstrap. The module path becomes
sneak.berlin/go/dcf.
Fix the lint findings in pkg/dcf. DCFStore becomes Store and DCFObject
becomes Object. Three behaviours change. An error listing mount points is
now returned, where a typo used to drop it. Store.String() prints Store{
instead of DCFStore{, and a negative total as 0 B instead of a huge size.
Replace the placeholder test with real tests. Move the README into the
required sections. make build compiles the library; it pointed at a
command that does not exist.
Model: opus-5-5
Co-authored-by: clawbot <sneak+clawbot@sneak.cloud>
73 lines
1.7 KiB
Go
73 lines
1.7 KiB
Go
package dcf
|
|
|
|
import (
|
|
"fmt"
|
|
"log/slog"
|
|
"os"
|
|
"path/filepath"
|
|
"slices"
|
|
|
|
"github.com/shirou/gopsutil/disk"
|
|
)
|
|
|
|
func findAllMountPoints() ([]string, error) {
|
|
mountpoints := []string{}
|
|
|
|
partitions, err := disk.Partitions(false) // physical devices only, so false
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
for _, partition := range partitions {
|
|
if !slices.Contains(mountpoints, partition.Mountpoint) {
|
|
mountpoints = append(mountpoints, partition.Mountpoint)
|
|
}
|
|
}
|
|
|
|
return mountpoints, nil
|
|
}
|
|
|
|
// findDCFMountPoints returns a list of strings of the paths of mountpoints
|
|
// that contain a DCIM or M4ROOT directory, which is how we detect DCF stores.
|
|
// Its only argument is an integer of how many mountpoints to return. If the
|
|
// argument is 0, all mountpoints are returned.
|
|
func findDCFMountPoints(requestedCount int) ([]string, error) {
|
|
filteredMountpoints := []string{}
|
|
|
|
mountpoints, err := findAllMountPoints()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
for _, mountpoint := range mountpoints {
|
|
dcimPath := filepath.Join(mountpoint, "DCIM")
|
|
m4rootPath := filepath.Join(mountpoint, "M4ROOT")
|
|
shouldKeep := false
|
|
|
|
_, err = os.Stat(dcimPath)
|
|
if err == nil {
|
|
shouldKeep = true
|
|
|
|
slog.Debug(fmt.Sprintf("Found DCIM directory at %s\n", dcimPath))
|
|
}
|
|
|
|
_, err = os.Stat(m4rootPath)
|
|
if err == nil {
|
|
shouldKeep = true
|
|
|
|
slog.Debug(fmt.Sprintf("Found M4ROOT directory at %s\n", m4rootPath))
|
|
}
|
|
|
|
if shouldKeep {
|
|
slog.Debug(fmt.Sprintf("Keeping mountpoint %s\n", mountpoint))
|
|
|
|
filteredMountpoints = append(filteredMountpoints, mountpoint)
|
|
if (requestedCount > 0) && (len(filteredMountpoints)+1 >= requestedCount) {
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
return filteredMountpoints, nil
|
|
}
|