mirror of
https://github.com/rectorphp/rector.git
synced 2024-06-01 17:00:51 +00:00
Updated Rector to commit 7a32610a70a03adf6824fec5f055a63b6355f56b
7a32610a70
[Util] Introduce FileHasher (#3833)
This commit is contained in:
parent
270692ae54
commit
9496663b9b
|
@ -6,6 +6,7 @@ namespace Rector\Caching\Detector;
|
|||
use Rector\Caching\Cache;
|
||||
use Rector\Caching\Config\FileHashComputer;
|
||||
use Rector\Caching\Enum\CacheKey;
|
||||
use Rector\Core\Util\FileHasher;
|
||||
/**
|
||||
* Inspired by https://github.com/symplify/symplify/pull/90/files#diff-72041b2e1029a08930e13d79d298ef11
|
||||
*
|
||||
|
@ -31,10 +32,16 @@ final class ChangedFilesDetector
|
|||
* @var \Rector\Caching\Cache
|
||||
*/
|
||||
private $cache;
|
||||
public function __construct(FileHashComputer $fileHashComputer, Cache $cache)
|
||||
/**
|
||||
* @readonly
|
||||
* @var \Rector\Core\Util\FileHasher
|
||||
*/
|
||||
private $fileHasher;
|
||||
public function __construct(FileHashComputer $fileHashComputer, Cache $cache, FileHasher $fileHasher)
|
||||
{
|
||||
$this->fileHashComputer = $fileHashComputer;
|
||||
$this->cache = $cache;
|
||||
$this->fileHasher = $fileHasher;
|
||||
}
|
||||
/**
|
||||
* @param string[] $dependentFiles
|
||||
|
@ -122,11 +129,11 @@ final class ChangedFilesDetector
|
|||
}
|
||||
private function getFilePathCacheKey(string $filePath) : string
|
||||
{
|
||||
return \sha1($this->resolvePath($filePath));
|
||||
return $this->fileHasher->hash($this->resolvePath($filePath));
|
||||
}
|
||||
private function hashFile(string $filePath) : string
|
||||
{
|
||||
return (string) \sha1_file($this->resolvePath($filePath));
|
||||
return $this->fileHasher->hashFiles([$this->resolvePath($filePath)]);
|
||||
}
|
||||
private function storeConfigurationDataHash(string $filePath, string $configurationHash) : void
|
||||
{
|
||||
|
|
|
@ -7,6 +7,7 @@ use PHPUnit\Framework\TestCase;
|
|||
use RectorPrefix202305\Psr\Container\ContainerInterface;
|
||||
use Rector\Core\Exception\ShouldNotHappenException;
|
||||
use Rector\Core\Kernel\RectorKernel;
|
||||
use Rector\Core\Util\FileHasher;
|
||||
use RectorPrefix202305\Webmozart\Assert\Assert;
|
||||
abstract class AbstractTestCase extends TestCase
|
||||
{
|
||||
|
@ -27,7 +28,8 @@ abstract class AbstractTestCase extends TestCase
|
|||
*/
|
||||
protected function bootFromConfigFiles(array $configFiles) : void
|
||||
{
|
||||
$configsHash = $this->createConfigsHash($configFiles);
|
||||
$fileHasher = new FileHasher();
|
||||
$configsHash = $fileHasher->hashFiles($configFiles);
|
||||
if (isset(self::$kernelsByHash[$configsHash])) {
|
||||
$rectorKernel = self::$kernelsByHash[$configsHash];
|
||||
self::$currentContainer = $rectorKernel->getContainer();
|
||||
|
@ -57,20 +59,4 @@ abstract class AbstractTestCase extends TestCase
|
|||
}
|
||||
return $object;
|
||||
}
|
||||
/**
|
||||
* @param string[] $configFiles
|
||||
*/
|
||||
private function createConfigsHash(array $configFiles) : string
|
||||
{
|
||||
Assert::allString($configFiles);
|
||||
$configHash = '';
|
||||
foreach ($configFiles as $configFile) {
|
||||
$hash = \md5_file($configFile);
|
||||
if ($hash === \false) {
|
||||
throw new ShouldNotHappenException(\sprintf('File %s is not readable', $configFile));
|
||||
}
|
||||
$configHash .= $hash;
|
||||
}
|
||||
return $configHash;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,6 +27,7 @@ use Rector\CodingStyle\Naming\ClassNaming;
|
|||
use Rector\Core\Configuration\Option;
|
||||
use Rector\Core\Configuration\Parameter\ParameterProvider;
|
||||
use Rector\Core\PhpParser\Node\BetterNodeFinder;
|
||||
use Rector\Core\Util\FileHasher;
|
||||
use Rector\Naming\Naming\UseImportsResolver;
|
||||
use Rector\NodeNameResolver\NodeNameResolver;
|
||||
use Rector\NodeRemoval\NodeRemover;
|
||||
|
@ -106,7 +107,12 @@ final class ClassRenamer
|
|||
* @var \Rector\Renaming\Helper\RenameClassCallbackHandler
|
||||
*/
|
||||
private $renameClassCallbackHandler;
|
||||
public function __construct(BetterNodeFinder $betterNodeFinder, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, ClassNaming $classNaming, NodeNameResolver $nodeNameResolver, PhpDocClassRenamer $phpDocClassRenamer, PhpDocInfoFactory $phpDocInfoFactory, DocBlockClassRenamer $docBlockClassRenamer, ReflectionProvider $reflectionProvider, NodeRemover $nodeRemover, ParameterProvider $parameterProvider, UseImportsResolver $useImportsResolver, RenameClassCallbackHandler $renameClassCallbackHandler)
|
||||
/**
|
||||
* @readonly
|
||||
* @var \Rector\Core\Util\FileHasher
|
||||
*/
|
||||
private $fileHasher;
|
||||
public function __construct(BetterNodeFinder $betterNodeFinder, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, ClassNaming $classNaming, NodeNameResolver $nodeNameResolver, PhpDocClassRenamer $phpDocClassRenamer, PhpDocInfoFactory $phpDocInfoFactory, DocBlockClassRenamer $docBlockClassRenamer, ReflectionProvider $reflectionProvider, NodeRemover $nodeRemover, ParameterProvider $parameterProvider, UseImportsResolver $useImportsResolver, RenameClassCallbackHandler $renameClassCallbackHandler, FileHasher $fileHasher)
|
||||
{
|
||||
$this->betterNodeFinder = $betterNodeFinder;
|
||||
$this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser;
|
||||
|
@ -120,6 +126,7 @@ final class ClassRenamer
|
|||
$this->parameterProvider = $parameterProvider;
|
||||
$this->useImportsResolver = $useImportsResolver;
|
||||
$this->renameClassCallbackHandler = $renameClassCallbackHandler;
|
||||
$this->fileHasher = $fileHasher;
|
||||
}
|
||||
/**
|
||||
* @param array<string, string> $oldToNewClasses
|
||||
|
@ -422,13 +429,8 @@ final class ClassRenamer
|
|||
private function createOldToNewTypes(Node $node, array $oldToNewClasses) : array
|
||||
{
|
||||
$oldToNewClasses = $this->resolveOldToNewClassCallbacks($node, $oldToNewClasses);
|
||||
// md4 is faster then md5 https://php.watch/articles/php-hash-benchmark
|
||||
$hashingAlgorithm = 'md4';
|
||||
if (\PHP_VERSION_ID >= 80100) {
|
||||
// if xxh128 is available use it, as it is way faster then md4 https://php.watch/articles/php-hash-benchmark
|
||||
$hashingAlgorithm = 'xxh128';
|
||||
}
|
||||
$cacheKey = \hash($hashingAlgorithm, \serialize($oldToNewClasses));
|
||||
$serialized = \serialize($oldToNewClasses);
|
||||
$cacheKey = $this->fileHasher->hash($serialized);
|
||||
if (isset($this->oldToNewTypesByCacheKey[$cacheKey])) {
|
||||
return $this->oldToNewTypesByCacheKey[$cacheKey];
|
||||
}
|
||||
|
|
|
@ -19,12 +19,12 @@ final class VersionResolver
|
|||
* @api
|
||||
* @var string
|
||||
*/
|
||||
public const PACKAGE_VERSION = '0a7be603fcc467ac3956081bf83db9c0d5350eee';
|
||||
public const PACKAGE_VERSION = '7a32610a70a03adf6824fec5f055a63b6355f56b';
|
||||
/**
|
||||
* @api
|
||||
* @var string
|
||||
*/
|
||||
public const RELEASE_DATE = '2023-05-14 16:09:49';
|
||||
public const RELEASE_DATE = '2023-05-15 01:20:20';
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
|
|
46
src/Util/FileHasher.php
Normal file
46
src/Util/FileHasher.php
Normal file
|
@ -0,0 +1,46 @@
|
|||
<?php
|
||||
|
||||
declare (strict_types=1);
|
||||
namespace Rector\Core\Util;
|
||||
|
||||
use Rector\Core\Exception\ShouldNotHappenException;
|
||||
/**
|
||||
* @see \Rector\Core\Tests\Util\FileHasherTest
|
||||
*/
|
||||
final class FileHasher
|
||||
{
|
||||
/**
|
||||
* cryptographic insecure hasing of a string
|
||||
*/
|
||||
public function hash(string $string) : string
|
||||
{
|
||||
return \hash($this->getAlgo(), $string);
|
||||
}
|
||||
/**
|
||||
* cryptographic insecure hasing of files
|
||||
*
|
||||
* @param string[] $files
|
||||
*/
|
||||
public function hashFiles(array $files) : string
|
||||
{
|
||||
$configHash = '';
|
||||
$algo = $this->getAlgo();
|
||||
foreach ($files as $file) {
|
||||
$hash = \hash_file($algo, $file);
|
||||
if ($hash === \false) {
|
||||
throw new ShouldNotHappenException(\sprintf('File %s is not readable', $file));
|
||||
}
|
||||
$configHash .= $hash;
|
||||
}
|
||||
return $configHash;
|
||||
}
|
||||
private function getAlgo() : string
|
||||
{
|
||||
//see https://php.watch/articles/php-hash-benchmark
|
||||
if (\PHP_VERSION_ID >= 80100) {
|
||||
// if xxh128 is available use it, as it is way faster
|
||||
return 'xxh128';
|
||||
}
|
||||
return 'md4';
|
||||
}
|
||||
}
|
2
vendor/autoload.php
vendored
2
vendor/autoload.php
vendored
|
@ -22,4 +22,4 @@ if (PHP_VERSION_ID < 50600) {
|
|||
|
||||
require_once __DIR__ . '/composer/autoload_real.php';
|
||||
|
||||
return ComposerAutoloaderInita45dccfe8a7ea22904f9b8ba9f59e519::getLoader();
|
||||
return ComposerAutoloaderIniteaf94c22f71b40339fbb1a8a62dc1b53::getLoader();
|
||||
|
|
1
vendor/composer/autoload_classmap.php
vendored
1
vendor/composer/autoload_classmap.php
vendored
|
@ -1530,6 +1530,7 @@ return array(
|
|||
'Rector\\Core\\StaticReflection\\DynamicSourceLocatorDecorator' => $baseDir . '/src/StaticReflection/DynamicSourceLocatorDecorator.php',
|
||||
'Rector\\Core\\Util\\ArrayChecker' => $baseDir . '/src/Util/ArrayChecker.php',
|
||||
'Rector\\Core\\Util\\ArrayParametersMerger' => $baseDir . '/src/Util/ArrayParametersMerger.php',
|
||||
'Rector\\Core\\Util\\FileHasher' => $baseDir . '/src/Util/FileHasher.php',
|
||||
'Rector\\Core\\Util\\MemoryLimiter' => $baseDir . '/src/Util/MemoryLimiter.php',
|
||||
'Rector\\Core\\Util\\MultiInstanceofChecker' => $baseDir . '/src/Util/MultiInstanceofChecker.php',
|
||||
'Rector\\Core\\Util\\PhpVersionFactory' => $baseDir . '/src/Util/PhpVersionFactory.php',
|
||||
|
|
10
vendor/composer/autoload_real.php
vendored
10
vendor/composer/autoload_real.php
vendored
|
@ -2,7 +2,7 @@
|
|||
|
||||
// autoload_real.php @generated by Composer
|
||||
|
||||
class ComposerAutoloaderInita45dccfe8a7ea22904f9b8ba9f59e519
|
||||
class ComposerAutoloaderIniteaf94c22f71b40339fbb1a8a62dc1b53
|
||||
{
|
||||
private static $loader;
|
||||
|
||||
|
@ -22,17 +22,17 @@ class ComposerAutoloaderInita45dccfe8a7ea22904f9b8ba9f59e519
|
|||
return self::$loader;
|
||||
}
|
||||
|
||||
spl_autoload_register(array('ComposerAutoloaderInita45dccfe8a7ea22904f9b8ba9f59e519', 'loadClassLoader'), true, true);
|
||||
spl_autoload_register(array('ComposerAutoloaderIniteaf94c22f71b40339fbb1a8a62dc1b53', 'loadClassLoader'), true, true);
|
||||
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
|
||||
spl_autoload_unregister(array('ComposerAutoloaderInita45dccfe8a7ea22904f9b8ba9f59e519', 'loadClassLoader'));
|
||||
spl_autoload_unregister(array('ComposerAutoloaderIniteaf94c22f71b40339fbb1a8a62dc1b53', 'loadClassLoader'));
|
||||
|
||||
require __DIR__ . '/autoload_static.php';
|
||||
call_user_func(\Composer\Autoload\ComposerStaticInita45dccfe8a7ea22904f9b8ba9f59e519::getInitializer($loader));
|
||||
call_user_func(\Composer\Autoload\ComposerStaticIniteaf94c22f71b40339fbb1a8a62dc1b53::getInitializer($loader));
|
||||
|
||||
$loader->setClassMapAuthoritative(true);
|
||||
$loader->register(true);
|
||||
|
||||
$filesToLoad = \Composer\Autoload\ComposerStaticInita45dccfe8a7ea22904f9b8ba9f59e519::$files;
|
||||
$filesToLoad = \Composer\Autoload\ComposerStaticIniteaf94c22f71b40339fbb1a8a62dc1b53::$files;
|
||||
$requireFile = \Closure::bind(static function ($fileIdentifier, $file) {
|
||||
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
|
||||
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
|
||||
|
|
9
vendor/composer/autoload_static.php
vendored
9
vendor/composer/autoload_static.php
vendored
|
@ -4,7 +4,7 @@
|
|||
|
||||
namespace Composer\Autoload;
|
||||
|
||||
class ComposerStaticInita45dccfe8a7ea22904f9b8ba9f59e519
|
||||
class ComposerStaticIniteaf94c22f71b40339fbb1a8a62dc1b53
|
||||
{
|
||||
public static $files = array (
|
||||
'ad155f8f1cf0d418fe49e248db8c661b' => __DIR__ . '/..' . '/react/promise/src/functions_include.php',
|
||||
|
@ -1772,6 +1772,7 @@ class ComposerStaticInita45dccfe8a7ea22904f9b8ba9f59e519
|
|||
'Rector\\Core\\StaticReflection\\DynamicSourceLocatorDecorator' => __DIR__ . '/../..' . '/src/StaticReflection/DynamicSourceLocatorDecorator.php',
|
||||
'Rector\\Core\\Util\\ArrayChecker' => __DIR__ . '/../..' . '/src/Util/ArrayChecker.php',
|
||||
'Rector\\Core\\Util\\ArrayParametersMerger' => __DIR__ . '/../..' . '/src/Util/ArrayParametersMerger.php',
|
||||
'Rector\\Core\\Util\\FileHasher' => __DIR__ . '/../..' . '/src/Util/FileHasher.php',
|
||||
'Rector\\Core\\Util\\MemoryLimiter' => __DIR__ . '/../..' . '/src/Util/MemoryLimiter.php',
|
||||
'Rector\\Core\\Util\\MultiInstanceofChecker' => __DIR__ . '/../..' . '/src/Util/MultiInstanceofChecker.php',
|
||||
'Rector\\Core\\Util\\PhpVersionFactory' => __DIR__ . '/../..' . '/src/Util/PhpVersionFactory.php',
|
||||
|
@ -3105,9 +3106,9 @@ class ComposerStaticInita45dccfe8a7ea22904f9b8ba9f59e519
|
|||
public static function getInitializer(ClassLoader $loader)
|
||||
{
|
||||
return \Closure::bind(function () use ($loader) {
|
||||
$loader->prefixLengthsPsr4 = ComposerStaticInita45dccfe8a7ea22904f9b8ba9f59e519::$prefixLengthsPsr4;
|
||||
$loader->prefixDirsPsr4 = ComposerStaticInita45dccfe8a7ea22904f9b8ba9f59e519::$prefixDirsPsr4;
|
||||
$loader->classMap = ComposerStaticInita45dccfe8a7ea22904f9b8ba9f59e519::$classMap;
|
||||
$loader->prefixLengthsPsr4 = ComposerStaticIniteaf94c22f71b40339fbb1a8a62dc1b53::$prefixLengthsPsr4;
|
||||
$loader->prefixDirsPsr4 = ComposerStaticIniteaf94c22f71b40339fbb1a8a62dc1b53::$prefixDirsPsr4;
|
||||
$loader->classMap = ComposerStaticIniteaf94c22f71b40339fbb1a8a62dc1b53::$classMap;
|
||||
|
||||
}, null, ClassLoader::class);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user