Updated Rector to commit 7a32610a70a03adf6824fec5f055a63b6355f56b

7a32610a70 [Util] Introduce FileHasher (#3833)
This commit is contained in:
Tomas Votruba 2023-05-14 18:24:01 +00:00
parent 270692ae54
commit 9496663b9b
9 changed files with 83 additions and 40 deletions

View File

@ -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
{

View File

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

View File

@ -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];
}

View File

@ -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
View 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
View File

@ -22,4 +22,4 @@ if (PHP_VERSION_ID < 50600) {
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInita45dccfe8a7ea22904f9b8ba9f59e519::getLoader();
return ComposerAutoloaderIniteaf94c22f71b40339fbb1a8a62dc1b53::getLoader();

View File

@ -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',

View File

@ -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;

View File

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