Skip to content

I made a single-file php script for iterating all projects on a server and purging all releases except the last #2463

@vesper8

Description

@vesper8

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);
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions