(string $metaRoot, string $oldFolder, string $newFolder)
| 82 | } |
| 83 | |
| 84 | public static function renameSubtree(string $metaRoot, string $oldFolder, string $newFolder): void |
| 85 | { |
| 86 | $metaRoot = rtrim($metaRoot, '/\\') . DIRECTORY_SEPARATOR; |
| 87 | $oldFolder = self::folderKey($oldFolder); |
| 88 | $newFolder = self::folderKey($newFolder); |
| 89 | if ($oldFolder === 'root' || $newFolder === 'root') { |
| 90 | return; |
| 91 | } |
| 92 | |
| 93 | $oldExact = $metaRoot . self::encodedFileName($oldFolder); |
| 94 | if (is_file($oldExact)) { |
| 95 | @rename($oldExact, $metaRoot . self::encodedFileName($newFolder)); |
| 96 | } |
| 97 | |
| 98 | $oldPrefix = 'folder-' . rawurlencode($oldFolder . '/'); |
| 99 | $newPrefix = 'folder-' . rawurlencode($newFolder . '/'); |
| 100 | foreach (glob($metaRoot . $oldPrefix . '*_metadata.json') ?: [] as $oldPath) { |
| 101 | if (!is_file($oldPath)) { |
| 102 | continue; |
| 103 | } |
| 104 | $baseName = basename($oldPath); |
| 105 | $newBase = preg_replace('/^' . preg_quote($oldPrefix, '/') . '/', $newPrefix, $baseName); |
| 106 | if (is_string($newBase) && $newBase !== '') { |
| 107 | @rename($oldPath, $metaRoot . $newBase); |
| 108 | } |
| 109 | } |
| 110 | |
| 111 | if (!self::isCollisionSensitive($oldFolder) && !self::isCollisionSensitive($newFolder)) { |
| 112 | $oldLegacyPrefix = str_replace(['/', '\\', ' '], '-', $oldFolder); |
| 113 | $newLegacyPrefix = str_replace(['/', '\\', ' '], '-', $newFolder); |
| 114 | foreach (glob($metaRoot . $oldLegacyPrefix . '*_metadata.json') ?: [] as $oldPath) { |
| 115 | if (!is_file($oldPath)) { |
| 116 | continue; |
| 117 | } |
| 118 | $baseName = basename($oldPath); |
| 119 | $newBase = preg_replace('/^' . preg_quote($oldLegacyPrefix, '/') . '/', $newLegacyPrefix, $baseName); |
| 120 | if (is_string($newBase) && $newBase !== '') { |
| 121 | @rename($oldPath, $metaRoot . $newBase); |
| 122 | } |
| 123 | } |
| 124 | } |
| 125 | } |
| 126 | |
| 127 | private static function isCollisionSensitive(string $folder): bool |
| 128 | { |
no test coverage detected