ente/pkg/disk.go

138 lines
3.2 KiB
Go
Raw Normal View History

2023-10-16 11:22:45 +00:00
package pkg
import (
"encoding/json"
"errors"
2023-10-21 09:26:13 +00:00
"github.com/ente-io/cli/pkg/model"
"github.com/ente-io/cli/pkg/model/export"
2023-10-18 08:25:29 +00:00
"io"
2023-10-16 11:22:45 +00:00
"os"
)
const (
albumMetaFile = "album_meta.json"
albumMetaFolder = ".meta"
)
type albumDiskInfo struct {
ExportRoot string
AlbumMeta *export.AlbumMetadata
// FileNames contain the name of the files at root level of the album folder
FileNames *map[string]bool
MetaFileNameToDiskFileMap *map[string]*export.DiskFileMetadata
FileIdToDiskFileMap *map[int64]*export.DiskFileMetadata
}
func (a *albumDiskInfo) IsFilePresent(file model.RemoteFile) bool {
// check if file.ID is present
_, ok := (*a.FileIdToDiskFileMap)[file.ID]
return ok
}
2023-10-16 11:22:45 +00:00
func (a *albumDiskInfo) IsFileNamePresent(fileName string) bool {
_, ok := (*a.FileNames)[fileName]
return ok
}
func (a *albumDiskInfo) AddEntry(metadata *export.DiskFileMetadata) error {
if _, ok := (*a.FileIdToDiskFileMap)[metadata.Info.ID]; ok {
return errors.New("fileID already present")
}
2023-10-16 12:54:00 +00:00
if _, ok := (*a.MetaFileNameToDiskFileMap)[metadata.MetaFileName]; ok {
return errors.New("fileName already present")
}
2023-10-16 12:54:00 +00:00
(*a.MetaFileNameToDiskFileMap)[metadata.MetaFileName] = metadata
(*a.FileIdToDiskFileMap)[metadata.Info.ID] = metadata
return nil
}
func (a *albumDiskInfo) RemoveEntry(metadata *export.DiskFileMetadata) error {
if _, ok := (*a.FileIdToDiskFileMap)[metadata.Info.ID]; !ok {
return errors.New("fileID not present")
}
if _, ok := (*a.MetaFileNameToDiskFileMap)[metadata.MetaFileName]; !ok {
return errors.New("fileName not present")
}
delete(*a.MetaFileNameToDiskFileMap, metadata.MetaFileName)
delete(*a.FileIdToDiskFileMap, metadata.Info.ID)
for _, filename := range metadata.Info.FileNames {
delete(*a.FileNames, filename)
}
return nil
}
2023-10-16 11:22:45 +00:00
func (a *albumDiskInfo) IsMetaFileNamePresent(metaFileName string) bool {
_, ok := (*a.MetaFileNameToDiskFileMap)[metaFileName]
return ok
}
func (a *albumDiskInfo) GetDiskFileMetadata(file model.RemoteFile) *export.DiskFileMetadata {
2023-10-16 11:22:45 +00:00
// check if file.ID is present
diskFile, ok := (*a.FileIdToDiskFileMap)[file.ID]
if !ok {
return nil
}
return diskFile
}
func writeJSONToFile(filePath string, data interface{}) error {
file, err := os.Create(filePath)
if err != nil {
return err
}
defer file.Close()
encoder := json.NewEncoder(file)
encoder.SetIndent("", " ")
return encoder.Encode(data)
}
func readJSONFromFile(filePath string, data interface{}) error {
file, err := os.Open(filePath)
if err != nil {
return err
}
defer file.Close()
decoder := json.NewDecoder(file)
return decoder.Decode(data)
}
2023-10-18 08:25:29 +00:00
func Move(source, destination string) error {
err := os.Rename(source, destination)
2023-10-25 12:39:28 +00:00
if err != nil {
2023-10-18 08:25:29 +00:00
return moveCrossDevice(source, destination)
}
return err
}
func moveCrossDevice(source, destination string) error {
src, err := os.Open(source)
if err != nil {
return err
}
dst, err := os.Create(destination)
if err != nil {
src.Close()
return err
}
_, err = io.Copy(dst, src)
src.Close()
dst.Close()
if err != nil {
return err
}
fi, err := os.Stat(source)
if err != nil {
os.Remove(destination)
return err
}
err = os.Chmod(destination, fi.Mode())
if err != nil {
os.Remove(destination)
return err
}
os.Remove(source)
return nil
}