-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
I made a single-file php script for iterating all projects on a server and purging all releases except the last #2463
Copy link
Copy link
Closed
Description
My server has 40+ projects on it and all of them had 5 releases in the release folder.. this was taking up nearly 30GB of space and I ran out of space so I made this very destructive script to iterate over each folder, confirm that there is a releases folder, then sort the releases by modified time and delete all but the last. Sharing it here as I think it might be useful to others
Run (at your own risk) with
php cleanupReleases.php
cleanupReleases.php
<?php
$devPath = '/home/forge';
$rootFolders = getFolders($devPath);
$keepLastNReleases = 1;
foreach ($rootFolders as $rootFolder) {
if (hasReleases($rootFolder)) {
echo sprintf('<%s> has a <%s> folder', $rootFolder, 'releases') . "\n";
$releases = getFolders(sprintf('%s/%s', $rootFolder, 'releases'));
echo sprintf('<%s> has %d %s', $rootFolder, count($releases), 'releases') . "\n";
if (count($releases) > 1) {
echo "\n";
for ($i = 0; $i < count($releases); $i++) {
if ($i < count($releases) - $keepLastNReleases) {
deleteDir($releases[$i]);
} else {
echo sprintf('Saving <%s>', $releases[$i]) . "\n";
}
}
}
} else {
echo sprintf('<%s> does not have a %s folder', $rootFolder, 'releases') . "\n";
}
echo "\n";
}
function deleteDir($path)
{
if (!empty($path) && is_dir($path)) {
echo sprintf('Purging <%s>', $path) . "\n";
// echo 'rm -rf ' . escapeshellarg($path) . "\n";
system('rm -rf ' . escapeshellarg($path));
}
}
function hasReleases($folder)
{
return file_exists(sprintf('%s/%s', $folder, 'releases'));
}
function getFolders($path)
{
$folderIterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::SKIP_DOTS),
RecursiveIteratorIterator::SELF_FIRST,
RecursiveIteratorIterator::CATCH_GET_CHILD // Ignore "Permission denied"
);
$folderIterator->setMaxDepth(0);
$sortedIterator = new SortedFileIterator($folderIterator);
$folders = [];
foreach ($sortedIterator as $path => $dir) {
if ($dir->isDir()) {
$folders[] = (string)$dir;
}
}
return $folders;
}
/**
* sort by modified time
*/
class SortedFileIterator extends SplHeap
{
public function __construct(Iterator $iterator)
{
foreach ($iterator as $item) {
$this->insert($item);
}
}
public function compare($b, $a)
{
return $a->getMTime() == $b->getMTime() ? 0 : ($a->getMTime() > $b->getMTime() ? 1 : -1);
}
}
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels