(ctx context.Context, fdst, fsrc fs.Fs, deleteMode fs.DeleteMode, DoMove bool, deleteEmptySrcDirs bool, copyEmptySrcDirs bool, allowOverlap bool)
| 129 | } |
| 130 | |
| 131 | func newSyncCopyMove(ctx context.Context, fdst, fsrc fs.Fs, deleteMode fs.DeleteMode, DoMove bool, deleteEmptySrcDirs bool, copyEmptySrcDirs bool, allowOverlap bool) (*syncCopyMove, error) { |
| 132 | if (deleteMode != fs.DeleteModeOff || DoMove) && operations.OverlappingFilterCheck(ctx, fdst, fsrc) && !allowOverlap { |
| 133 | return nil, fserrors.FatalError(fs.ErrorOverlapping) |
| 134 | } |
| 135 | ci := fs.GetConfig(ctx) |
| 136 | fi := filter.GetConfig(ctx) |
| 137 | s := &syncCopyMove{ |
| 138 | ci: ci, |
| 139 | fi: fi, |
| 140 | fdst: fdst, |
| 141 | fsrc: fsrc, |
| 142 | deleteMode: deleteMode, |
| 143 | DoMove: DoMove, |
| 144 | copyEmptySrcDirs: copyEmptySrcDirs, |
| 145 | deleteEmptySrcDirs: deleteEmptySrcDirs, |
| 146 | dir: "", |
| 147 | srcFilesChan: make(chan fs.Object, ci.Checkers+ci.Transfers), |
| 148 | srcFilesResult: make(chan error, 1), |
| 149 | dstFilesResult: make(chan error, 1), |
| 150 | dstEmptyDirs: make(map[string]fs.DirEntry), |
| 151 | srcEmptyDirs: make(map[string]fs.DirEntry), |
| 152 | srcMoveEmptyDirs: make(map[string]fs.DirEntry), |
| 153 | noTraverse: ci.NoTraverse, |
| 154 | noCheckDest: ci.NoCheckDest, |
| 155 | noUnicodeNormalization: ci.NoUnicodeNormalization, |
| 156 | deleteFilesCh: make(chan fs.Object, ci.Checkers), |
| 157 | trackRenames: ci.TrackRenames, |
| 158 | commonHash: fsrc.Hashes().Overlap(fdst.Hashes()).GetOne(), |
| 159 | modifyWindow: fs.GetModifyWindow(ctx, fsrc, fdst), |
| 160 | trackRenamesCh: make(chan fs.Object, ci.Checkers), |
| 161 | checkFirst: ci.CheckFirst, |
| 162 | setDirMetadata: ci.Metadata && fsrc.Features().ReadDirMetadata && fdst.Features().WriteDirMetadata, |
| 163 | setDirModTime: (!ci.NoUpdateDirModTime && fsrc.Features().CanHaveEmptyDirectories) && (fdst.Features().WriteDirSetModTime || fdst.Features().MkdirMetadata != nil || fdst.Features().DirSetModTime != nil), |
| 164 | setDirModTimeAfter: !ci.NoUpdateDirModTime && (!copyEmptySrcDirs || fsrc.Features().CanHaveEmptyDirectories && fdst.Features().DirModTimeUpdatesOnWrite), |
| 165 | modifiedDirs: make(map[string]struct{}), |
| 166 | allowOverlap: allowOverlap, |
| 167 | } |
| 168 | |
| 169 | s.logger, s.usingLogger = operations.GetLogger(ctx) |
| 170 | |
| 171 | if deleteMode == fs.DeleteModeOff { |
| 172 | loggerOpt := operations.GetLoggerOpt(ctx) |
| 173 | loggerOpt.DeleteModeOff = true |
| 174 | loggerOpt.LoggerFn = s.logger |
| 175 | ctx = operations.WithLoggerOpt(ctx, loggerOpt) |
| 176 | } |
| 177 | |
| 178 | backlog := ci.MaxBacklog |
| 179 | if s.checkFirst { |
| 180 | fs.Infof(s.fdst, "Running all checks before starting transfers") |
| 181 | backlog = -1 |
| 182 | } |
| 183 | var err error |
| 184 | s.toBeChecked, err = newPipe(ci.OrderBy, accounting.Stats(ctx).SetCheckQueue, backlog) |
| 185 | if err != nil { |
| 186 | return nil, err |
| 187 | } |
| 188 | s.toBeUploaded, err = newPipe(ci.OrderBy, accounting.Stats(ctx).SetTransferQueue, backlog) |
no test coverage detected
searching dependent graphs…