projectRoot() . '/storage/tenants'; if (!is_dir($storageBase)) { fwrite(STDOUT, "No storage/tenants directory — nothing to migrate.\n"); return 0; } $entries = scandir($storageBase) ?: []; $migrated = 0; $skipped = 0; $errors = 0; foreach ($entries as $entry) { if ($entry === '.' || $entry === '..') { continue; } $tenantDir = $storageBase . '/' . $entry; if (!is_dir($tenantDir)) { continue; } $avatarDir = $tenantDir . '/avatar'; $logoLightDir = $tenantDir . '/logo/light'; if (!is_dir($avatarDir)) { continue; } if (is_dir($logoLightDir)) { fwrite(STDOUT, sprintf("skip %s (logo/light already exists)\n", $entry)); $skipped++; continue; } if ($dryRun) { fwrite(STDOUT, sprintf("would %s → logo/light\n", $entry)); $migrated++; continue; } $logoParent = $tenantDir . '/logo'; if (!is_dir($logoParent) && !mkdir($logoParent, 0755, true) && !is_dir($logoParent)) { fwrite(STDERR, sprintf("error %s (could not create logo/)\n", $entry)); $errors++; continue; } if (!rename($avatarDir, $logoLightDir)) { fwrite(STDERR, sprintf("error %s (rename failed)\n", $entry)); $errors++; continue; } // Variant files are named 'avatar-{size}.{ext}' — rename them to 'logo-{size}.{ext}'. $variants = glob($logoLightDir . '/avatar-*.*') ?: []; foreach ($variants as $variantPath) { $newName = preg_replace('/\/avatar-/', '/logo-', $variantPath, 1); if ($newName && $newName !== $variantPath) { @rename($variantPath, $newName); } } fwrite(STDOUT, sprintf("done %s\n", $entry)); $migrated++; if ($cleanup) { // rename moved the directory; nothing to clean up. Listed for clarity. } } fwrite(STDOUT, sprintf( "\n%s — migrated=%d skipped=%d errors=%d\n", $dryRun ? 'Dry-run complete' : 'Migration complete', $migrated, $skipped, $errors )); return $errors > 0 ? 1 : 0; } }