in lib/store/base/file_entry.go [367:409]
func (entry *localFileEntry) Move(targetState FileState) error {
sourcePath := entry.GetPath()
targetPath := filepath.Join(targetState.GetDirectory(), entry.relativeDataPath)
if err := os.MkdirAll(filepath.Dir(targetPath), DefaultDirPermission); err != nil {
return err
}
// Get file stats.
if _, err := os.Stat(sourcePath); err != nil {
// Return os.ErrNotExist.
return err
}
// Copy metadata first.
performCopy := func(md metadata.Metadata) error {
if md.Movable() {
sourceMetadataPath := entry.getMetadataPath(md)
targetMetadataPath := filepath.Join(filepath.Dir(targetPath), md.GetSuffix())
bytes, err := ioutil.ReadFile(sourceMetadataPath)
if err != nil {
return err
}
if _, err := compareAndWriteFile(targetMetadataPath, bytes); err != nil {
return err
}
}
return nil
}
if err := entry.RangeMetadata(performCopy); err != nil {
return err
}
// Move data. This could be a slow operation if source and target are not on the same FS.
if err := os.Rename(sourcePath, targetPath); err != nil {
return err
}
// Update parent dir in memory.
entry.state = targetState
// Delete source dir.
return os.RemoveAll(filepath.Dir(sourcePath))
}