MCPcopy
hub / github.com/rclone/rclone / move

Method move

backend/mega/mega.go:739–802  ·  view source on GitHub ↗

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)

Source from the content-addressed store, hash-verified

737//
738// info will be updates
739func (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 }

Callers 2

MoveMethod · 0.95
DirMoveMethod · 0.95

Calls 10

findDirMethod · 0.95
shouldRetryFunction · 0.70
MoveMethod · 0.65
RenameMethod · 0.65
FromStandardNameMethod · 0.65
mkdirParentMethod · 0.45
mkdirMethod · 0.45
ErrorfMethod · 0.45
lookupParentDirMethod · 0.45
CallMethod · 0.45

Tested by

no test coverage detected