1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
<?php
/**
* +----------------------------------------------------------------------+
* | Copyright (c) 1997-2023 The PHP Group |
* +----------------------------------------------------------------------+
* | This source file is subject to version 3.01 of the PHP license, |
* | that is bundled with this package in the file LICENSE, and is |
* | available through the world-wide-web at the following url: |
* | https://www.php.net/license/3_01.txt. |
* | If you did not receive a copy of the PHP license and are unable to |
* | obtain it through the world-wide-web, please send a note to |
* | license@php.net, so we can mail you a copy immediately. |
* +----------------------------------------------------------------------+
* | Authors: André L F S Bacci <ae php.net> |
* +----------------------------------------------------------------------+
* | Description: General file transversal, ordered file listing. |
* +----------------------------------------------------------------------+
*/
require_once __DIR__ . '/all.php';
class RevcheckFileList
{
private $list = [];
function __construct( $lang )
{
$this->loadTree( $lang );
}
function get( $file ): RevcheckFileItem|null
{
return $this->list[ $file ] ?? null;
}
function iterator(): Iterator
{
return new ArrayIterator( $this->list );
}
function loadTree( $lang )
{
$dir = new \DirectoryIterator( $lang );
if ( $dir === false )
die( "$lang is not a directory.\n" );
$cwd = getcwd();
chdir( $lang );
$this->loadTreeRecurse( $lang , "" );
chdir( $cwd );
}
function loadTreeRecurse( $lang , $path )
{
$todoDirs = [];
$dir = new DirectoryIterator( $path == "" ? "." : $path );
if ( $dir === false )
die( "$path is not a directory.\n" );
foreach( $dir as $entry )
{
$name = $entry->getFilename();
$key = ltrim( $path . '/' . $name , '/' );
if ( $name[0] == '.' )
continue;
if ( $entry->isDir() )
{
$todoDirs[] = $key;
continue;
}
if ( RevcheckIgnore::ignore( $key ) )
continue;
$file = new RevcheckFileItem( $key , $entry->getSize() );
$this->list[ $key ] = $file;
}
sort( $todoDirs );
foreach( $todoDirs as $path )
$this->loadTreeRecurse( $lang , $path );
}
}
|