MCPcopy
hub / github.com/rclone/rclone / newSyncCopyMove

Function newSyncCopyMove

fs/sync/sync.go:131–293  ·  view source on GitHub ↗
(ctx context.Context, fdst, fsrc fs.Fs, deleteMode fs.DeleteMode, DoMove bool, deleteEmptySrcDirs bool, copyEmptySrcDirs bool, allowOverlap bool)

Source from the content-addressed store, hash-verified

129}
130
131func 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)

Callers 1

runSyncCopyMoveFunction · 0.85

Calls 15

OverlappingFilterCheckFunction · 0.92
FatalErrorFunction · 0.92
GetConfigFunction · 0.92
GetConfigFunction · 0.92
GetModifyWindowFunction · 0.92
GetLoggerFunction · 0.92
GetLoggerOptFunction · 0.92
WithLoggerOptFunction · 0.92
InfofFunction · 0.92
StatsFunction · 0.92
ErrorfFunction · 0.92
CanServerSideMoveFunction · 0.92

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…