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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions