in e2etest/declarativeScenario.go [471:537]
func (s *scenario) getTransferInfo() (srcRoot string, dstRoot string, expectFolders bool, expectedRootFolder bool, addedDirAtDest string) {
srcRoot = s.state.source.getParam(s.a, false, false, objectTarget{})
dstRoot = s.state.dest.getParam(s.a, false, false, objectTarget{})
srcBase := filepath.Base(srcRoot)
srcRootURL, err := url.Parse(srcRoot)
if err == nil {
srcBase, _ = trimBaseSnapshotDetails(s.a, srcRootURL, s.fromTo.From(), s.srcAccountType)
srcBase = filepath.Base(srcBase)
}
// do we expect folder transfers
expectFolders = (s.fromTo.From().IsFolderAware() &&
s.fromTo.To().IsFolderAware() &&
s.p.allowsFolderTransfers()) ||
(s.p.preserveSMBPermissions && s.FromTo().From().SupportsHnsACLs() && s.FromTo().To().SupportsHnsACLs()) ||
(s.p.preservePOSIXProperties && (s.FromTo() == common.EFromTo.LocalBlob() || s.FromTo() == common.EFromTo.BlobBlob() || s.FromTo() == common.EFromTo.BlobLocal()))
expectRootFolder := expectFolders
// compute dest, taking into account our stripToDir rules
addedDirAtDest = ""
areBothContainerLike := s.state.source.isContainerLike() && s.state.dest.isContainerLike() && !s.p.preserveSMBPermissions // There are no permission-compatible sources and destinations that do not feature support for root folder perms anymore*
tf := s.GetTestFiles()
if s.stripTopDir || s.operation == eOperation.Sync() || areBothContainerLike {
// Sync always acts like stripTopDir is true.
// For copies between two container-like locations, we don't expect the root directory to be transferred, regardless of stripTopDir.
// Yes, this is arguably inconsistent. But its the way its always been, and it does seem to match user expectations for copies
// of that kind.
expectRootFolder = false
} else if expectRootFolder && s.fromTo == common.EFromTo.BlobLocal() && s.destAccountType != EAccountType.HierarchicalNamespaceEnabled() && tf.objectTarget.objectName == "" {
expectRootFolder = false // we can only persist the root folder if it's a subfolder of the container on Blob.
if tf.objectTarget.objectName == "" && tf.destTarget == "" {
addedDirAtDest = path.Base(srcRoot)
} else if tf.destTarget != "" {
addedDirAtDest = tf.destTarget
}
dstRoot = fmt.Sprintf("%s/%s", dstRoot, addedDirAtDest)
} else if s.fromTo.From().IsLocal() {
if tf.objectTarget.objectName == "" && tf.destTarget == "" {
addedDirAtDest = srcBase
} else if tf.destTarget != "" {
addedDirAtDest = tf.destTarget
}
dstRoot = fmt.Sprintf("%s%c%s", dstRoot, os.PathSeparator, addedDirAtDest)
} else if s.state.source.isContainerLike() && s.state.dest.isContainerLike() && s.p.preserveSMBPermissions {
// Preserving permissions includes the root folder, but for container-container, we don't expect any added folder name.
expectRootFolder = true
} else {
if tf.objectTarget.objectName == "" && tf.destTarget == "" {
addedDirAtDest = srcBase
} else if tf.destTarget != "" {
addedDirAtDest = tf.destTarget
}
dstRoot = fmt.Sprintf("%s/%s", dstRoot, addedDirAtDest)
}
if s.fromTo.From() == common.ELocation.Local() {
srcRoot = common.ToExtendedPath(srcRoot)
}
if s.fromTo.To() == common.ELocation.Local() {
dstRoot = common.ToExtendedPath(dstRoot)
}
return srcRoot, dstRoot, expectFolders, expectRootFolder, addedDirAtDest
}