diff --git a/data/src/main/java/org/cryptomator/data/cloud/s3/S3Impl.kt b/data/src/main/java/org/cryptomator/data/cloud/s3/S3Impl.kt index f283d6eb..f8d4429f 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/s3/S3Impl.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/s3/S3Impl.kt @@ -162,19 +162,25 @@ internal class S3Impl(context: Context, cloud: S3Cloud) { @Throws(IOException::class, BackendException::class) private fun moveFolder(source: S3Folder, target: S3Folder): S3Folder { target.parent?.let { targetsParent -> - val nodes = list(source) + val request = ListObjectsArgs.builder().bucket(cloud.s3Bucket()).prefix(source.key).recursive(true).build() + val sourceKeysIncludingDescendants = try { + client().listObjects(request).mapNotNull { + run { + it.get().objectName() + } + } + } catch (e: ErrorResponseException) { + throw handleApiError(e, source.path) + } + val objectsToDelete: MutableList = LinkedList() - for (node in nodes) { - objectsToDelete.add(DeleteObject(node.key)) + for (sourceKey in sourceKeysIncludingDescendants) { + objectsToDelete.add(DeleteObject(sourceKey)) - val targetKey = if (node is S3Folder) { - S3CloudNodeFactory.folder(target, node.name).key - } else { - S3CloudNodeFactory.file(target, node.name).key - } + val copySource = CopySource.builder().bucket(cloud.s3Bucket()).`object`(sourceKey).build() + val targetKey = target.key + sourceKey.removePrefix(source.key) - val copySource = CopySource.builder().bucket(cloud.s3Bucket()).`object`(node.key).build() val copyObjectArgs = CopyObjectArgs.builder().bucket(cloud.s3Bucket()).`object`(targetKey).source(copySource).build() try { client().copyObject(copyObjectArgs) diff --git a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveImpl.kt b/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveImpl.kt index efd281c0..18573cbc 100644 --- a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveImpl.kt +++ b/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveImpl.kt @@ -60,10 +60,10 @@ internal class GoogleDriveImpl(context: Context, googleDriveCloud: GoogleDriveCl val fileListQuery = client().files().list() // .setFields("files(id,mimeType,name,size)") // .setSupportsAllDrives(true) - if (parentDriveId != null && parentDriveId == "root") { - fileListQuery.q = "name contains '$name' and '$parentDriveId' in parents and trashed = false or sharedWithMe" + fileListQuery.q = if (parentDriveId != null && parentDriveId == "root") { + "name contains '$name' and '$parentDriveId' in parents and trashed = false or sharedWithMe" } else { - fileListQuery.q = "name contains '$name' and '$parentDriveId' in parents and trashed = false" + "name contains '$name' and '$parentDriveId' in parents and trashed = false" } return fileListQuery.execute().files.firstOrNull { it.name == name } }