func()

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))
}