move a file or folder (srcFs, srcRemote, info) to (f, dstRemote) info will be updates
(ctx context.Context, dstRemote string, srcFs *Fs, srcRemote string, info *mega.Node)
| 737 | // |
| 738 | // info will be updates |
| 739 | func (f *Fs) move(ctx context.Context, dstRemote string, srcFs *Fs, srcRemote string, info *mega.Node) (err error) { |
| 740 | var ( |
| 741 | dstFs = f |
| 742 | srcDirNode, dstDirNode *mega.Node |
| 743 | srcParent, dstParent string |
| 744 | srcLeaf, dstLeaf string |
| 745 | ) |
| 746 | |
| 747 | if dstRemote != "" { |
| 748 | // lookup or create the destination parent directory |
| 749 | dstDirNode, dstLeaf, err = dstFs.mkdirParent(ctx, dstRemote) |
| 750 | } else { |
| 751 | // find or create the parent of the root directory |
| 752 | absRoot := dstFs.srv.FS.GetRoot() |
| 753 | dstParent, dstLeaf = path.Split(dstFs.root) |
| 754 | dstDirNode, err = dstFs.mkdir(ctx, absRoot, dstParent) |
| 755 | } |
| 756 | if err != nil { |
| 757 | return fmt.Errorf("server-side move failed to make dst parent dir: %w", err) |
| 758 | } |
| 759 | |
| 760 | if srcRemote != "" { |
| 761 | // lookup the existing parent directory |
| 762 | srcDirNode, srcLeaf, err = srcFs.lookupParentDir(ctx, srcRemote) |
| 763 | } else { |
| 764 | // lookup the existing root parent |
| 765 | absRoot := srcFs.srv.FS.GetRoot() |
| 766 | srcParent, srcLeaf = path.Split(srcFs.root) |
| 767 | srcDirNode, err = f.findDir(absRoot, srcParent) |
| 768 | } |
| 769 | if err != nil { |
| 770 | return fmt.Errorf("server-side move failed to lookup src parent dir: %w", err) |
| 771 | } |
| 772 | |
| 773 | // move the object into its new directory if required |
| 774 | if srcDirNode != dstDirNode && srcDirNode.GetHash() != dstDirNode.GetHash() { |
| 775 | //log.Printf("move src %p %q dst %p %q", srcDirNode, srcDirNode.GetName(), dstDirNode, dstDirNode.GetName()) |
| 776 | err = f.pacer.Call(func() (bool, error) { |
| 777 | err = f.srv.Move(info, dstDirNode) |
| 778 | return shouldRetry(ctx, err) |
| 779 | }) |
| 780 | if err != nil { |
| 781 | return fmt.Errorf("server-side move failed: %w", err) |
| 782 | } |
| 783 | } |
| 784 | |
| 785 | waitEvent := f.srv.WaitEventsStart() |
| 786 | |
| 787 | // rename the object if required |
| 788 | if srcLeaf != dstLeaf { |
| 789 | //log.Printf("rename %q to %q", srcLeaf, dstLeaf) |
| 790 | err = f.pacer.Call(func() (bool, error) { |
| 791 | err = f.srv.Rename(info, f.opt.Enc.FromStandardName(dstLeaf)) |
| 792 | return shouldRetry(ctx, err) |
| 793 | }) |
| 794 | if err != nil { |
| 795 | return fmt.Errorf("server-side rename failed: %w", err) |
| 796 | } |
no test coverage detected