Updated Rector to commit 0c709dfac7

0c709dfac7 Refactor node removing to phpdoc node traverser (#405)
This commit is contained in:
Tomas Votruba 2021-07-08 15:36:45 +00:00
parent c3d5e6fe7b
commit 4f5c3f4a02
51 changed files with 99 additions and 4377 deletions

View File

@ -283,6 +283,10 @@ final class PhpDocInfo
{
$phpDocNodeTraverser = new \RectorPrefix20210708\Symplify\SimplePhpDocParser\PhpDocNodeTraverser();
$phpDocNodeTraverser->traverseWithCallable($this->phpDocNode, '', function (\PHPStan\PhpDocParser\Ast\Node $node) use($typeToRemove) : ?int {
if ($node instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode && \is_a($node->value, $typeToRemove, \true)) {
$this->markAsChanged();
return \RectorPrefix20210708\Symplify\SimplePhpDocParser\PhpDocNodeTraverser::NODE_REMOVE;
}
if (!\is_a($node, $typeToRemove, \true)) {
return null;
}

View File

@ -94,12 +94,11 @@ final class PhpDocInfoFactory
return null;
}
// create empty node
$content = '';
$tokenIterator = new \Rector\BetterPhpDocParser\ValueObject\Parser\BetterTokenIterator([]);
$phpDocNode = new \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode([]);
} else {
$content = $docComment->getText();
$tokens = $this->lexer->tokenize($content);
$text = $docComment->getText();
$tokens = $this->lexer->tokenize($text);
$tokenIterator = new \Rector\BetterPhpDocParser\ValueObject\Parser\BetterTokenIterator($tokens);
$phpDocNode = $this->betterPhpDocParser->parse($tokenIterator);
$this->setPositionOfLastToken($phpDocNode);

View File

@ -34,9 +34,13 @@ final class PhpDocTagRemover
{
$phpDocNode = $phpDocInfo->getPhpDocNode();
$phpDocNodeTraverser = new \RectorPrefix20210708\Symplify\SimplePhpDocParser\PhpDocNodeTraverser();
$phpDocNodeTraverser->traverseWithCallable($phpDocNode, '', function ($node) use($desiredNode, $phpDocInfo) {
$phpDocNodeTraverser->traverseWithCallable($phpDocNode, '', function ($node) use($desiredNode, $phpDocInfo) : ?int {
if ($node instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode && $node->value === $desiredNode) {
$phpDocInfo->markAsChanged();
return \RectorPrefix20210708\Symplify\SimplePhpDocParser\PhpDocNodeTraverser::NODE_REMOVE;
}
if ($node !== $desiredNode) {
return $node;
return null;
}
$phpDocInfo->markAsChanged();
return \RectorPrefix20210708\Symplify\SimplePhpDocParser\PhpDocNodeTraverser::NODE_REMOVE;

View File

@ -11,16 +11,10 @@ use PhpParser\Node\Name;
use PhpParser\Node\Stmt\ClassLike;
use PhpParser\Node\Stmt\Namespace_;
use PhpParser\NodeFinder;
use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode;
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocChildNode;
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode;
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode;
use PHPStan\PhpDocParser\Ast\PhpDoc\PropertyTagValueNode;
use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode;
use PHPStan\PhpDocParser\Ast\PhpDoc\ThrowsTagValueNode;
use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode;
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
use PHPStan\Reflection\ReflectionProvider;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\Core\ValueObject\Application\File;
@ -29,6 +23,7 @@ use Rector\NodeTypeResolver\Node\AttributeKey;
use ReflectionClass;
use RectorPrefix20210708\Symfony\Contracts\Service\Attribute\Required;
use RectorPrefix20210708\Symplify\Astral\NodeTraverser\SimpleCallableNodeTraverser;
use RectorPrefix20210708\Symplify\SimplePhpDocParser\PhpDocNodeTraverser;
final class ShortNameResolver
{
/**
@ -144,60 +139,39 @@ final class ShortNameResolver
$fullyQualifiedName = $this->nodeNameResolver->getName($node);
$shortNamesToFullyQualifiedNames[$originalName->toString()] = $fullyQualifiedName;
});
$docBlockShortNamesToFullyQualifiedNames = $this->resolveFromDocBlocks($stmts);
$docBlockShortNamesToFullyQualifiedNames = $this->resolveFromStmtsDocBlocks($stmts);
return \array_merge($shortNamesToFullyQualifiedNames, $docBlockShortNamesToFullyQualifiedNames);
}
/**
* @param Node[] $stmts
* @return array<string, string>
*/
private function resolveFromDocBlocks(array $stmts) : array
private function resolveFromStmtsDocBlocks(array $stmts) : array
{
$reflectionClass = $this->resolveNativeClassReflection($stmts);
$shortNamesToFullyQualifiedNames = [];
$this->simpleCallableNodeTraverser->traverseNodesWithCallable($stmts, function (\PhpParser\Node $node) use(&$shortNamesToFullyQualifiedNames, $reflectionClass) : void {
$phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node);
foreach ($phpDocInfo->getPhpDocNode()->children as $phpDocChildNode) {
/** @var PhpDocChildNode $phpDocChildNode */
$shortTagName = $this->resolveShortTagNameFromPhpDocChildNode($phpDocChildNode);
if ($shortTagName === null) {
continue;
}
if ($reflectionClass !== null) {
$fullyQualifiedTagName = \RectorPrefix20210708\Nette\Utils\Reflection::expandClassName($shortTagName, $reflectionClass);
} else {
$fullyQualifiedTagName = $shortTagName;
}
$shortNamesToFullyQualifiedNames[$shortTagName] = $fullyQualifiedTagName;
$shortNames = [];
$this->simpleCallableNodeTraverser->traverseNodesWithCallable($stmts, function (\PhpParser\Node $node) use(&$shortNames) : void {
// speed up for nodes that are
$phpDocInfo = $this->phpDocInfoFactory->createFromNode($node);
if (!$phpDocInfo instanceof \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo) {
return;
}
$phpDocNodeTraverser = new \RectorPrefix20210708\Symplify\SimplePhpDocParser\PhpDocNodeTraverser();
$phpDocNodeTraverser->traverseWithCallable($phpDocInfo->getPhpDocNode(), '', function ($node) use(&$shortNames) {
if ($node instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode) {
$shortName = \trim($node->name, '@');
if (\RectorPrefix20210708\Nette\Utils\Strings::match($shortName, self::BIG_LETTER_START_REGEX)) {
$shortNames[] = $shortName;
}
return null;
}
if ($node instanceof \PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode) {
$shortNames[] = $node->name;
}
return null;
});
});
return $shortNamesToFullyQualifiedNames;
}
private function resolveShortTagNameFromPhpDocChildNode(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocChildNode $phpDocChildNode) : ?string
{
if (!$phpDocChildNode instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode) {
return null;
}
$tagName = \ltrim($phpDocChildNode->name, '@');
// is annotation class - big letter?
if (\RectorPrefix20210708\Nette\Utils\Strings::match($tagName, self::BIG_LETTER_START_REGEX)) {
return $tagName;
}
if (!$this->isValueNodeWithType($phpDocChildNode->value)) {
return null;
}
$typeNode = $phpDocChildNode->value->type;
if (!$typeNode instanceof \PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode) {
return null;
}
if (\strpos($typeNode->name, '\\') !== \false) {
return null;
}
return $typeNode->name;
}
private function isValueNodeWithType(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $phpDocTagValueNode) : bool
{
return $phpDocTagValueNode instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\PropertyTagValueNode || $phpDocTagValueNode instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode || $phpDocTagValueNode instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode || $phpDocTagValueNode instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode || $phpDocTagValueNode instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\ThrowsTagValueNode;
return $this->fqnizeShortNames($shortNames, $reflectionClass);
}
/**
* @param Node[] $stmts
@ -218,4 +192,21 @@ final class ShortNameResolver
$classReflection = $this->reflectionProvider->getClass($className);
return $classReflection->getNativeReflection();
}
/**
* @param string[] $shortNames
* @return array<string, string>
*/
private function fqnizeShortNames(array $shortNames, ?\ReflectionClass $reflectionClass) : array
{
$shortNamesToFullyQualifiedNames = [];
foreach ($shortNames as $shortName) {
if ($reflectionClass instanceof \ReflectionClass) {
$fullyQualifiedName = \RectorPrefix20210708\Nette\Utils\Reflection::expandClassName($shortName, $reflectionClass);
} else {
$fullyQualifiedName = $shortName;
}
$shortNamesToFullyQualifiedNames[$shortName] = $fullyQualifiedName;
}
return $shortNamesToFullyQualifiedNames;
}
}

View File

@ -5,6 +5,7 @@ namespace Rector\Php80\PhpDocCleaner;
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode;
use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode;
use Rector\BetterPhpDocParser\PhpDoc\SpacelessPhpDocTagNode;
use Rector\BetterPhpDocParser\ValueObject\PhpDoc\DoctrineAnnotation\CurlyListNode;
use Rector\Php80\ValueObject\AnnotationToAttribute;
use RectorPrefix20210708\Symplify\SimplePhpDocParser\PhpDocNodeTraverser;
@ -16,15 +17,18 @@ final class ConvertedAnnotationToAttributeParentRemover
public function processPhpDocNode(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode $phpDocNode, array $annotationsToAttributes) : void
{
$phpDocNodeTraverser = new \RectorPrefix20210708\Symplify\SimplePhpDocParser\PhpDocNodeTraverser();
$phpDocNodeTraverser->traverseWithCallable($phpDocNode, '', function ($node) use($annotationsToAttributes) {
if (!$node instanceof \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode) {
return $node;
$phpDocNodeTraverser->traverseWithCallable($phpDocNode, '', function ($node) use($annotationsToAttributes) : ?int {
if (!$node instanceof \Rector\BetterPhpDocParser\PhpDoc\SpacelessPhpDocTagNode) {
return null;
}
if (!$node->value instanceof \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode) {
return null;
}
// has only children of annotation to attribute? it will be removed
if ($this->detect($node, $annotationsToAttributes)) {
if ($this->detect($node->value, $annotationsToAttributes)) {
return \RectorPrefix20210708\Symplify\SimplePhpDocParser\PhpDocNodeTraverser::NODE_REMOVE;
}
return $node;
return null;
});
}
/**

View File

@ -13,6 +13,7 @@ use PhpParser\Node\Stmt\Property;
use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode;
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode;
use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode;
use Rector\BetterPhpDocParser\PhpDoc\SpacelessPhpDocTagNode;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover;
use Rector\Core\Contract\Rector\ConfigurableRectorInterface;
@ -177,20 +178,24 @@ CODE_SAMPLE
}
$doctrineTagAndAnnotationToAttributes = [];
$phpDocNodeTraverser = new \RectorPrefix20210708\Symplify\SimplePhpDocParser\PhpDocNodeTraverser();
$phpDocNodeTraverser->traverseWithCallable($phpDocInfo->getPhpDocNode(), '', function ($node) use(&$doctrineTagAndAnnotationToAttributes, $phpDocInfo) {
if (!$node instanceof \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode) {
return $node;
$phpDocNodeTraverser->traverseWithCallable($phpDocInfo->getPhpDocNode(), '', function ($node) use(&$doctrineTagAndAnnotationToAttributes, $phpDocInfo) : ?int {
if ($node instanceof \Rector\BetterPhpDocParser\PhpDoc\SpacelessPhpDocTagNode && $node->value instanceof \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode) {
$doctrineAnnotationTagValueNode = $node->value;
} elseif ($node instanceof \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode) {
$doctrineAnnotationTagValueNode = $node;
} else {
return null;
}
foreach ($this->annotationsToAttributes as $annotationToAttribute) {
if (!$node->hasClassName($annotationToAttribute->getTag())) {
if (!$doctrineAnnotationTagValueNode->hasClassName($annotationToAttribute->getTag())) {
continue;
}
$doctrineTagAndAnnotationToAttributes[] = new \Rector\Php80\ValueObject\DoctrineTagAndAnnotationToAttribute($node, $annotationToAttribute);
$doctrineTagAndAnnotationToAttributes[] = new \Rector\Php80\ValueObject\DoctrineTagAndAnnotationToAttribute($doctrineAnnotationTagValueNode, $annotationToAttribute);
$phpDocInfo->markAsChanged();
// remove the original doctrine annotation, it becomes an attribute
return \RectorPrefix20210708\Symplify\SimplePhpDocParser\PhpDocNodeTraverser::NODE_REMOVE;
}
return $node;
return null;
});
$attrGroups = $this->attrGroupsFactory->create($doctrineTagAndAnnotationToAttributes);
if ($attrGroups === []) {

View File

@ -16,11 +16,11 @@ final class VersionResolver
/**
* @var string
*/
public const PACKAGE_VERSION = 'e0660247021b4a6030a9786510259dbcee1c7564';
public const PACKAGE_VERSION = '0c709dfac727d7ea9b8d121a20daec17ebc0b1cb';
/**
* @var string
*/
public const RELEASE_DATE = '2021-07-08 14:27:19';
public const RELEASE_DATE = '2021-07-08 15:28:06';
public static function resolvePackageVersion() : string
{
$process = new \RectorPrefix20210708\Symfony\Component\Process\Process(['git', 'log', '--pretty="%H"', '-n1', 'HEAD'], __DIR__);

2
vendor/autoload.php vendored
View File

@ -4,4 +4,4 @@
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInitec1756b7016cb728d5c640c220314df9::getLoader();
return ComposerAutoloaderInitfea99aed40b8b9b57974b89e41cb0f3c::getLoader();

View File

@ -1466,18 +1466,6 @@ return array(
'RectorPrefix20210708\\Symplify\\SymplifyKernel\\Strings\\KernelUniqueHasher' => $vendorDir . '/symplify/symplify-kernel/src/Strings/KernelUniqueHasher.php',
'RectorPrefix20210708\\Symplify\\SymplifyKernel\\Strings\\StringsConverter' => $vendorDir . '/symplify/symplify-kernel/src/Strings/StringsConverter.php',
'RectorPrefix20210708\\Symplify\\SymplifyKernel\\ValueObject\\KernelBootAndApplicationRun' => $vendorDir . '/symplify/symplify-kernel/src/ValueObject/KernelBootAndApplicationRun.php',
'RectorPrefix20210708\\Symplify\\VendorPatches\\Command\\GenerateCommand' => $vendorDir . '/symplify/vendor-patches/src/Command/GenerateCommand.php',
'RectorPrefix20210708\\Symplify\\VendorPatches\\Composer\\ComposerPatchesConfigurationUpdater' => $vendorDir . '/symplify/vendor-patches/src/Composer/ComposerPatchesConfigurationUpdater.php',
'RectorPrefix20210708\\Symplify\\VendorPatches\\Composer\\PackageNameResolver' => $vendorDir . '/symplify/vendor-patches/src/Composer/PackageNameResolver.php',
'RectorPrefix20210708\\Symplify\\VendorPatches\\Console\\GenerateCommandReporter' => $vendorDir . '/symplify/vendor-patches/src/Console/GenerateCommandReporter.php',
'RectorPrefix20210708\\Symplify\\VendorPatches\\Console\\VendorPatchesConsoleApplication' => $vendorDir . '/symplify/vendor-patches/src/Console/VendorPatchesConsoleApplication.php',
'RectorPrefix20210708\\Symplify\\VendorPatches\\Differ\\PatchDiffer' => $vendorDir . '/symplify/vendor-patches/src/Differ/PatchDiffer.php',
'RectorPrefix20210708\\Symplify\\VendorPatches\\Exception\\ShouldNotHappenException' => $vendorDir . '/symplify/vendor-patches/src/Exception/ShouldNotHappenException.php',
'RectorPrefix20210708\\Symplify\\VendorPatches\\FileSystem\\PathResolver' => $vendorDir . '/symplify/vendor-patches/src/FileSystem/PathResolver.php',
'RectorPrefix20210708\\Symplify\\VendorPatches\\Finder\\OldToNewFilesFinder' => $vendorDir . '/symplify/vendor-patches/src/Finder/OldToNewFilesFinder.php',
'RectorPrefix20210708\\Symplify\\VendorPatches\\HttpKernel\\VendorPatchesKernel' => $vendorDir . '/symplify/vendor-patches/src/HttpKernel/VendorPatchesKernel.php',
'RectorPrefix20210708\\Symplify\\VendorPatches\\PatchFileFactory' => $vendorDir . '/symplify/vendor-patches/src/PatchFileFactory.php',
'RectorPrefix20210708\\Symplify\\VendorPatches\\ValueObject\\OldAndNewFileInfo' => $vendorDir . '/symplify/vendor-patches/src/ValueObject/OldAndNewFileInfo.php',
'RectorPrefix20210708\\Tracy\\Bar' => $vendorDir . '/tracy/tracy/src/Tracy/Bar/Bar.php',
'RectorPrefix20210708\\Tracy\\BlueScreen' => $vendorDir . '/tracy/tracy/src/Tracy/BlueScreen/BlueScreen.php',
'RectorPrefix20210708\\Tracy\\Bridges\\Nette\\Bridge' => $vendorDir . '/tracy/tracy/src/Bridges/Nette/Bridge.php',
@ -1501,9 +1489,6 @@ return array(
'RectorPrefix20210708\\Webmozart\\Assert\\Assert' => $vendorDir . '/webmozart/assert/src/Assert.php',
'RectorPrefix20210708\\Webmozart\\Assert\\InvalidArgumentException' => $vendorDir . '/webmozart/assert/src/InvalidArgumentException.php',
'RectorPrefix20210708\\Webmozart\\Assert\\Mixin' => $vendorDir . '/webmozart/assert/src/Mixin.php',
'RectorPrefix20210708\\cweagans\\Composer\\PatchEvent' => $vendorDir . '/cweagans/composer-patches/src/PatchEvent.php',
'RectorPrefix20210708\\cweagans\\Composer\\PatchEvents' => $vendorDir . '/cweagans/composer-patches/src/PatchEvents.php',
'RectorPrefix20210708\\cweagans\\Composer\\Patches' => $vendorDir . '/cweagans/composer-patches/src/Patches.php',
'Rector\\Arguments\\ArgumentDefaultValueReplacer' => $baseDir . '/rules/Arguments/ArgumentDefaultValueReplacer.php',
'Rector\\Arguments\\Contract\\ReplaceArgumentDefaultValueInterface' => $baseDir . '/rules/Arguments/Contract/ReplaceArgumentDefaultValueInterface.php',
'Rector\\Arguments\\NodeAnalyzer\\ArgumentAddingScope' => $baseDir . '/rules/Arguments/NodeAnalyzer/ArgumentAddingScope.php',

View File

@ -20,9 +20,7 @@ return array(
'Rector\\Compiler\\' => array($baseDir . '/utils/compiler/src'),
'Rector\\CakePHP\\' => array($vendorDir . '/rector/rector-cakephp/src'),
'Rector\\' => array($baseDir . '/packages', $baseDir . '/rules'),
'RectorPrefix20210708\\cweagans\\Composer\\' => array($vendorDir . '/cweagans/composer-patches/src'),
'RectorPrefix20210708\\Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'),
'RectorPrefix20210708\\Symplify\\VendorPatches\\' => array($vendorDir . '/symplify/vendor-patches/src'),
'RectorPrefix20210708\\Symplify\\SymplifyKernel\\' => array($vendorDir . '/symplify/symplify-kernel/src'),
'RectorPrefix20210708\\Symplify\\SmartFileSystem\\' => array($vendorDir . '/symplify/smart-file-system/src'),
'RectorPrefix20210708\\Symplify\\Skipper\\' => array($vendorDir . '/symplify/skipper/src'),

View File

@ -2,7 +2,7 @@
// autoload_real.php @generated by Composer
class ComposerAutoloaderInitec1756b7016cb728d5c640c220314df9
class ComposerAutoloaderInitfea99aed40b8b9b57974b89e41cb0f3c
{
private static $loader;
@ -22,15 +22,15 @@ class ComposerAutoloaderInitec1756b7016cb728d5c640c220314df9
return self::$loader;
}
spl_autoload_register(array('ComposerAutoloaderInitec1756b7016cb728d5c640c220314df9', 'loadClassLoader'), true, true);
spl_autoload_register(array('ComposerAutoloaderInitfea99aed40b8b9b57974b89e41cb0f3c', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
spl_autoload_unregister(array('ComposerAutoloaderInitec1756b7016cb728d5c640c220314df9', 'loadClassLoader'));
spl_autoload_unregister(array('ComposerAutoloaderInitfea99aed40b8b9b57974b89e41cb0f3c', 'loadClassLoader'));
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
if ($useStaticLoader) {
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInitec1756b7016cb728d5c640c220314df9::getInitializer($loader));
call_user_func(\Composer\Autoload\ComposerStaticInitfea99aed40b8b9b57974b89e41cb0f3c::getInitializer($loader));
} else {
$classMap = require __DIR__ . '/autoload_classmap.php';
if ($classMap) {
@ -42,19 +42,19 @@ class ComposerAutoloaderInitec1756b7016cb728d5c640c220314df9
$loader->register(true);
if ($useStaticLoader) {
$includeFiles = Composer\Autoload\ComposerStaticInitec1756b7016cb728d5c640c220314df9::$files;
$includeFiles = Composer\Autoload\ComposerStaticInitfea99aed40b8b9b57974b89e41cb0f3c::$files;
} else {
$includeFiles = require __DIR__ . '/autoload_files.php';
}
foreach ($includeFiles as $fileIdentifier => $file) {
composerRequireec1756b7016cb728d5c640c220314df9($fileIdentifier, $file);
composerRequirefea99aed40b8b9b57974b89e41cb0f3c($fileIdentifier, $file);
}
return $loader;
}
}
function composerRequireec1756b7016cb728d5c640c220314df9($fileIdentifier, $file)
function composerRequirefea99aed40b8b9b57974b89e41cb0f3c($fileIdentifier, $file)
{
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
require $file;

View File

@ -4,7 +4,7 @@
namespace Composer\Autoload;
class ComposerStaticInitec1756b7016cb728d5c640c220314df9
class ComposerStaticInitfea99aed40b8b9b57974b89e41cb0f3c
{
public static $files = array (
'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
@ -44,9 +44,7 @@ class ComposerStaticInitec1756b7016cb728d5c640c220314df9
'Rector\\Compiler\\' => 16,
'Rector\\CakePHP\\' => 15,
'Rector\\' => 7,
'RectorPrefix20210708\\cweagans\\Composer\\' => 39,
'RectorPrefix20210708\\Webmozart\\Assert\\' => 38,
'RectorPrefix20210708\\Symplify\\VendorPatches\\' => 44,
'RectorPrefix20210708\\Symplify\\SymplifyKernel\\' => 45,
'RectorPrefix20210708\\Symplify\\SmartFileSystem\\' => 46,
'RectorPrefix20210708\\Symplify\\Skipper\\' => 38,
@ -160,18 +158,10 @@ class ComposerStaticInitec1756b7016cb728d5c640c220314df9
0 => __DIR__ . '/../..' . '/packages',
1 => __DIR__ . '/../..' . '/rules',
),
'RectorPrefix20210708\\cweagans\\Composer\\' =>
array (
0 => __DIR__ . '/..' . '/cweagans/composer-patches/src',
),
'RectorPrefix20210708\\Webmozart\\Assert\\' =>
array (
0 => __DIR__ . '/..' . '/webmozart/assert/src',
),
'RectorPrefix20210708\\Symplify\\VendorPatches\\' =>
array (
0 => __DIR__ . '/..' . '/symplify/vendor-patches/src',
),
'RectorPrefix20210708\\Symplify\\SymplifyKernel\\' =>
array (
0 => __DIR__ . '/..' . '/symplify/symplify-kernel/src',
@ -1831,18 +1821,6 @@ class ComposerStaticInitec1756b7016cb728d5c640c220314df9
'RectorPrefix20210708\\Symplify\\SymplifyKernel\\Strings\\KernelUniqueHasher' => __DIR__ . '/..' . '/symplify/symplify-kernel/src/Strings/KernelUniqueHasher.php',
'RectorPrefix20210708\\Symplify\\SymplifyKernel\\Strings\\StringsConverter' => __DIR__ . '/..' . '/symplify/symplify-kernel/src/Strings/StringsConverter.php',
'RectorPrefix20210708\\Symplify\\SymplifyKernel\\ValueObject\\KernelBootAndApplicationRun' => __DIR__ . '/..' . '/symplify/symplify-kernel/src/ValueObject/KernelBootAndApplicationRun.php',
'RectorPrefix20210708\\Symplify\\VendorPatches\\Command\\GenerateCommand' => __DIR__ . '/..' . '/symplify/vendor-patches/src/Command/GenerateCommand.php',
'RectorPrefix20210708\\Symplify\\VendorPatches\\Composer\\ComposerPatchesConfigurationUpdater' => __DIR__ . '/..' . '/symplify/vendor-patches/src/Composer/ComposerPatchesConfigurationUpdater.php',
'RectorPrefix20210708\\Symplify\\VendorPatches\\Composer\\PackageNameResolver' => __DIR__ . '/..' . '/symplify/vendor-patches/src/Composer/PackageNameResolver.php',
'RectorPrefix20210708\\Symplify\\VendorPatches\\Console\\GenerateCommandReporter' => __DIR__ . '/..' . '/symplify/vendor-patches/src/Console/GenerateCommandReporter.php',
'RectorPrefix20210708\\Symplify\\VendorPatches\\Console\\VendorPatchesConsoleApplication' => __DIR__ . '/..' . '/symplify/vendor-patches/src/Console/VendorPatchesConsoleApplication.php',
'RectorPrefix20210708\\Symplify\\VendorPatches\\Differ\\PatchDiffer' => __DIR__ . '/..' . '/symplify/vendor-patches/src/Differ/PatchDiffer.php',
'RectorPrefix20210708\\Symplify\\VendorPatches\\Exception\\ShouldNotHappenException' => __DIR__ . '/..' . '/symplify/vendor-patches/src/Exception/ShouldNotHappenException.php',
'RectorPrefix20210708\\Symplify\\VendorPatches\\FileSystem\\PathResolver' => __DIR__ . '/..' . '/symplify/vendor-patches/src/FileSystem/PathResolver.php',
'RectorPrefix20210708\\Symplify\\VendorPatches\\Finder\\OldToNewFilesFinder' => __DIR__ . '/..' . '/symplify/vendor-patches/src/Finder/OldToNewFilesFinder.php',
'RectorPrefix20210708\\Symplify\\VendorPatches\\HttpKernel\\VendorPatchesKernel' => __DIR__ . '/..' . '/symplify/vendor-patches/src/HttpKernel/VendorPatchesKernel.php',
'RectorPrefix20210708\\Symplify\\VendorPatches\\PatchFileFactory' => __DIR__ . '/..' . '/symplify/vendor-patches/src/PatchFileFactory.php',
'RectorPrefix20210708\\Symplify\\VendorPatches\\ValueObject\\OldAndNewFileInfo' => __DIR__ . '/..' . '/symplify/vendor-patches/src/ValueObject/OldAndNewFileInfo.php',
'RectorPrefix20210708\\Tracy\\Bar' => __DIR__ . '/..' . '/tracy/tracy/src/Tracy/Bar/Bar.php',
'RectorPrefix20210708\\Tracy\\BlueScreen' => __DIR__ . '/..' . '/tracy/tracy/src/Tracy/BlueScreen/BlueScreen.php',
'RectorPrefix20210708\\Tracy\\Bridges\\Nette\\Bridge' => __DIR__ . '/..' . '/tracy/tracy/src/Bridges/Nette/Bridge.php',
@ -1866,9 +1844,6 @@ class ComposerStaticInitec1756b7016cb728d5c640c220314df9
'RectorPrefix20210708\\Webmozart\\Assert\\Assert' => __DIR__ . '/..' . '/webmozart/assert/src/Assert.php',
'RectorPrefix20210708\\Webmozart\\Assert\\InvalidArgumentException' => __DIR__ . '/..' . '/webmozart/assert/src/InvalidArgumentException.php',
'RectorPrefix20210708\\Webmozart\\Assert\\Mixin' => __DIR__ . '/..' . '/webmozart/assert/src/Mixin.php',
'RectorPrefix20210708\\cweagans\\Composer\\PatchEvent' => __DIR__ . '/..' . '/cweagans/composer-patches/src/PatchEvent.php',
'RectorPrefix20210708\\cweagans\\Composer\\PatchEvents' => __DIR__ . '/..' . '/cweagans/composer-patches/src/PatchEvents.php',
'RectorPrefix20210708\\cweagans\\Composer\\Patches' => __DIR__ . '/..' . '/cweagans/composer-patches/src/Patches.php',
'Rector\\Arguments\\ArgumentDefaultValueReplacer' => __DIR__ . '/../..' . '/rules/Arguments/ArgumentDefaultValueReplacer.php',
'Rector\\Arguments\\Contract\\ReplaceArgumentDefaultValueInterface' => __DIR__ . '/../..' . '/rules/Arguments/Contract/ReplaceArgumentDefaultValueInterface.php',
'Rector\\Arguments\\NodeAnalyzer\\ArgumentAddingScope' => __DIR__ . '/../..' . '/rules/Arguments/NodeAnalyzer/ArgumentAddingScope.php',
@ -3870,9 +3845,9 @@ class ComposerStaticInitec1756b7016cb728d5c640c220314df9
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInitec1756b7016cb728d5c640c220314df9::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInitec1756b7016cb728d5c640c220314df9::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInitec1756b7016cb728d5c640c220314df9::$classMap;
$loader->prefixLengthsPsr4 = ComposerStaticInitfea99aed40b8b9b57974b89e41cb0f3c::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInitfea99aed40b8b9b57974b89e41cb0f3c::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInitfea99aed40b8b9b57974b89e41cb0f3c::$classMap;
}, null, ClassLoader::class);
}

View File

@ -151,57 +151,6 @@
],
"install-path": ".\/xdebug-handler"
},
{
"name": "cweagans\/composer-patches",
"version": "1.7.1",
"version_normalized": "1.7.1.0",
"source": {
"type": "git",
"url": "https:\/\/github.com\/cweagans\/composer-patches.git",
"reference": "9888dcc74993c030b75f3dd548bb5e20cdbd740c"
},
"dist": {
"type": "zip",
"url": "https:\/\/api.github.com\/repos\/cweagans\/composer-patches\/zipball\/9888dcc74993c030b75f3dd548bb5e20cdbd740c",
"reference": "9888dcc74993c030b75f3dd548bb5e20cdbd740c",
"shasum": ""
},
"require": {
"composer-plugin-api": "^1.0 || ^2.0",
"php": ">=5.3.0"
},
"require-dev": {
"composer\/composer": "~1.0 || ~2.0",
"phpunit\/phpunit": "~4.6"
},
"time": "2021-06-08T15:12:46+00:00",
"type": "composer-plugin",
"extra": {
"class": "cweagans\\Composer\\Patches"
},
"installation-source": "dist",
"autoload": {
"psr-4": {
"RectorPrefix20210708\\cweagans\\Composer\\": "src"
}
},
"notification-url": "https:\/\/packagist.org\/downloads\/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Cameron Eagans",
"email": "me@cweagans.net"
}
],
"description": "Provides a way to patch Composer packages.",
"support": {
"issues": "https:\/\/github.com\/cweagans\/composer-patches\/issues",
"source": "https:\/\/github.com\/cweagans\/composer-patches\/tree\/1.7.1"
},
"install-path": "..\/cweagans\/composer-patches"
},
{
"name": "danielstjules\/stringy",
"version": "3.1.0",
@ -1829,12 +1778,12 @@
"source": {
"type": "git",
"url": "https:\/\/github.com\/symfony\/console.git",
"reference": "7eec894837bf4c0746040e655fa9ac917e4f44f8"
"reference": "d927f5564049730e2589d4d53c403ede528d6967"
},
"dist": {
"type": "zip",
"url": "https:\/\/api.github.com\/repos\/symfony\/console\/zipball\/7eec894837bf4c0746040e655fa9ac917e4f44f8",
"reference": "7eec894837bf4c0746040e655fa9ac917e4f44f8",
"url": "https:\/\/api.github.com\/repos\/symfony\/console\/zipball\/d927f5564049730e2589d4d53c403ede528d6967",
"reference": "d927f5564049730e2589d4d53c403ede528d6967",
"shasum": ""
},
"require": {
@ -1871,12 +1820,9 @@
"symfony\/lock": "",
"symfony\/process": ""
},
"time": "2021-07-06T15:01:17+00:00",
"time": "2021-07-08T11:11:00+00:00",
"default-branch": true,
"type": "library",
"extra": {
"patches_applied": []
},
"installation-source": "dist",
"autoload": {
"psr-4": {
@ -4546,61 +4492,6 @@
},
"install-path": "..\/symplify\/symplify-kernel"
},
{
"name": "symplify\/vendor-patches",
"version": "9.4.15",
"version_normalized": "9.4.15.0",
"source": {
"type": "git",
"url": "https:\/\/github.com\/symplify\/vendor-patches.git",
"reference": "c2094d7f7c94afe6f4152cd6cb14a32807ff69b3"
},
"dist": {
"type": "zip",
"url": "https:\/\/api.github.com\/repos\/symplify\/vendor-patches\/zipball\/c2094d7f7c94afe6f4152cd6cb14a32807ff69b3",
"reference": "c2094d7f7c94afe6f4152cd6cb14a32807ff69b3",
"shasum": ""
},
"require": {
"cweagans\/composer-patches": "^1.7",
"nette\/utils": "^3.2",
"php": ">=8.0",
"sebastian\/diff": "^4.0",
"symfony\/console": "^5.3",
"symfony\/dependency-injection": "^5.3",
"symfony\/http-kernel": "^5.3",
"symplify\/composer-json-manipulator": "^9.4.15",
"symplify\/symplify-kernel": "^9.4.15"
},
"require-dev": {
"phpunit\/phpunit": "^9.5"
},
"time": "2021-07-08T12:04:17+00:00",
"bin": [
"bin\/vendor-patches"
],
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "9.5-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-4": {
"RectorPrefix20210708\\Symplify\\VendorPatches\\": "src"
}
},
"notification-url": "https:\/\/packagist.org\/downloads\/",
"license": [
"MIT"
],
"description": "Generate vendor patches for packages with single command",
"support": {
"source": "https:\/\/github.com\/symplify\/vendor-patches\/tree\/9.4.15"
},
"install-path": "..\/symplify\/vendor-patches"
},
{
"name": "tracy\/tracy",
"version": "v2.8.5",

File diff suppressed because one or more lines are too long

View File

@ -1,9 +0,0 @@
Copyright 2013 Cameron Eagans
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -1,205 +0,0 @@
# composer-patches
Simple patches plugin for Composer. Applies a patch from a local or remote file to any package required with composer.
Note that the 1.x versions of Composer Patches are supported on a best-effort
basis due to the imminent release of 2.0.0. You may still be interested in
using 1.x if you need Composer to cooperate with earlier PHP versions. No new
features will be added to 1.x releases, but any security or bug fixes will
still be accepted.
## Usage
Example composer.json:
```json
{
"require": {
"cweagans/composer-patches": "~1.0",
"drupal/drupal": "~8.2"
},
"config": {
"preferred-install": "source"
},
"extra": {
"patches": {
"drupal/drupal": {
"Add startup configuration for PHP server": "https://www.drupal.org/files/issues/add_a_startup-1543858-30.patch"
}
}
}
}
```
## Using an external patch file
Instead of a patches key in your root composer.json, use a patches-file key.
```json
{
"require": {
"cweagans/composer-patches": "~1.0",
"drupal/drupal": "~8.2"
},
"config": {
"preferred-install": "source"
},
"extra": {
"patches-file": "local/path/to/your/composer.patches.json"
}
}
```
Then your `composer.patches.json` should look like this:
```
{
"patches": {
"vendor/project": {
"Patch title": "http://example.com/url/to/patch.patch"
}
}
}
```
## Allowing patches to be applied from dependencies
If your project doesn't supply any patches of its own, but you still want to accept patches from dependencies, you must have the following in your composer file:
```json
{
"require": {
"cweagans/composer-patches": "^1.5.0"
},
"extra": {
"enable-patching": true
}
}
```
If you do have a `patches` section in your composer file that defines your own set of patches then the `enable-patching` setting will be ignored and patches from dependencies will always be applied.
## Ignoring patches
There may be situations in which you want to ignore a patch supplied by a dependency. For example:
- You use a different more recent version of a dependency, and now a patch isn't applying.
- You have a more up to date patch than the dependency, and want to use yours instead of theirs.
- A dependency's patch adds a feature to a project that you don't need.
- Your patches conflict with a dependency's patches.
```json
{
"require": {
"cweagans/composer-patches": "~1.0",
"drupal/drupal": "~8.2",
"drupal/lightning": "~8.1"
},
"config": {
"preferred-install": "source"
},
"extra": {
"patches": {
"drupal/drupal": {
"Add startup configuration for PHP server": "https://www.drupal.org/files/issues/add_a_startup-1543858-30.patch"
}
},
"patches-ignore": {
"drupal/lightning": {
"drupal/panelizer": {
"This patch has known conflicts with our Quick Edit integration": "https://www.drupal.org/files/issues/2664682-49.patch"
}
}
}
}
}
```
## Allowing to force the patch level (-pX)
Some situations require to force the patchLevel used to apply patches on a particular package.
Its useful for packages like drupal/core which packages only a subdir of the original upstream project on which patches are based.
```json
{
"extra": {
"patchLevel": {
"drupal/core": "-p2"
}
}
}
```
## Using patches from HTTP URLs
Composer [blocks](https://getcomposer.org/doc/06-config.md#secure-http) you from downloading anything from HTTP URLs, you can disable this for your project by adding a `secure-http` setting in the config section of your `composer.json`. Note that the `config` section should be under the root of your `composer.json`.
```json
{
"config": {
"secure-http": false
}
}
```
However, it's always advised to setup HTTPS to prevent MITM code injection.
## Patches containing modifications to composer.json files
Because patching occurs _after_ Composer calculates dependencies and installs packages, changes to an underlying dependency's `composer.json` file introduced in a patch will have _no effect_ on installed packages.
If you need to modify a dependency's `composer.json` or its underlying dependencies, you cannot use this plugin. Instead, you must do one of the following:
- Work to get the underlying issue resolved in the upstream package.
- Fork the package and [specify your fork as the package repository](https://getcomposer.org/doc/05-repositories.md#vcs) in your root `composer.json`
- Specify compatible package version requirements in your root `composer.json`
## Error handling
If a patch cannot be applied (hunk failed, different line endings, etc.) a message will be shown and the patch will be skipped.
To enforce throwing an error and stopping package installation/update immediately, you have two available options:
1. Add `"composer-exit-on-patch-failure": true` option to the `extra` section of your composer.json file.
1. Export `COMPOSER_EXIT_ON_PATCH_FAILURE=1`
By default, failed patches are skipped.
## Patches reporting
When a patch is applied, the plugin writes a report-file `PATCHES.txt` to a patching directory (e.g. `./patch-me/PATCHES.txt`),
which contains a list of applied patches.
If you want to avoid this behavior, add a specific key to the `extra` section:
```json
"extra": {
"composer-patches-skip-reporting": true
}
```
Or provide an environment variable `COMPOSER_PATCHES_SKIP_REPORTING` with a config.
## Patching composer.json in dependencies
This doesn't work like you'd want. By the time you're running `composer install`,
the metadata from your dependencies' composer.json has already been aggregated by
packagist (or whatever metadata repo you're using). Unfortunately, this means that
you cannot e.g. patch a dependency to be compatible with an earlier version of PHP
or change the framework version that a plugin depends on.
@anotherjames over at @computerminds wrote an article about how to work around
that particular problem for a Drupal 8 -> Drupal 9 upgrade:
[Apply Drupal 9 compatibility patches with Composer](https://www.computerminds.co.uk/articles/apply-drupal-9-compatibility-patches-composer) ([archive](https://web.archive.org/web/20210124171010/https://www.computerminds.co.uk/articles/apply-drupal-9-compatibility-patches-composer))
## Difference between this and netresearch/composer-patches-plugin
- This plugin is much more simple to use and maintain
- This plugin doesn't require you to specify which package version you're patching
- This plugin is easy to use with Drupal modules (which don't use semantic versioning).
- This plugin will gather patches from all dependencies and apply them as if they were in the root composer.json
## Credits
A ton of this code is adapted or taken straight from https://github.com/jpstacey/composer-patcher, which is abandoned in favor of https://github.com/netresearch/composer-patches-plugin, which is (IMHO) overly complex and difficult to use.

View File

@ -1,34 +0,0 @@
{
"name": "cweagans\/composer-patches",
"description": "Provides a way to patch Composer packages.",
"minimum-stability": "dev",
"license": "BSD-3-Clause",
"type": "composer-plugin",
"extra": {
"class": "cweagans\\Composer\\Patches"
},
"authors": [
{
"name": "Cameron Eagans",
"email": "me@cweagans.net"
}
],
"require": {
"php": ">=5.3.0",
"composer-plugin-api": "^1.0 || ^2.0"
},
"require-dev": {
"composer\/composer": "~1.0 || ~2.0",
"phpunit\/phpunit": "~4.6"
},
"autoload": {
"psr-4": {
"RectorPrefix20210708\\cweagans\\Composer\\": "src"
}
},
"autoload-dev": {
"psr-4": {
"RectorPrefix20210708\\cweagans\\Composer\\Tests\\": "tests"
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,18 +0,0 @@
<!--?xml version="1.0" encoding="UTF-8"?-->
<phpunit colors="true" bootstrap="vendor/autoload.php">
<testsuites>
<testsuite name="composer-patches">
<directory>./tests/</directory>
</testsuite>
</testsuites>
<!-- Filter for coverage reports. -->
<filter>
<whitelist>
<directory>src/</directory>
</whitelist>
<blacklist>
<directory>vendor/</directory>
</blacklist>
</filter>
</phpunit>

View File

@ -1,67 +0,0 @@
<?php
/**
* @file
* Dispatch events when patches are applied.
*/
namespace RectorPrefix20210708\cweagans\Composer;
use RectorPrefix20210708\Composer\EventDispatcher\Event;
use RectorPrefix20210708\Composer\Package\PackageInterface;
class PatchEvent extends \RectorPrefix20210708\Composer\EventDispatcher\Event
{
/**
* @var PackageInterface $package
*/
protected $package;
/**
* @var string $url
*/
protected $url;
/**
* @var string $description
*/
protected $description;
/**
* Constructs a PatchEvent object.
*
* @param string $eventName
* @param PackageInterface $package
* @param string $url
* @param string $description
*/
public function __construct($eventName, \RectorPrefix20210708\Composer\Package\PackageInterface $package, $url, $description)
{
parent::__construct($eventName);
$this->package = $package;
$this->url = $url;
$this->description = $description;
}
/**
* Returns the package that is patched.
*
* @return PackageInterface
*/
public function getPackage()
{
return $this->package;
}
/**
* Returns the url of the patch.
*
* @return string
*/
public function getUrl()
{
return $this->url;
}
/**
* Returns the description of the patch.
*
* @return string
*/
public function getDescription()
{
return $this->description;
}
}

View File

@ -1,27 +0,0 @@
<?php
/**
* @file
* Dispatch events when patches are applied.
*/
namespace RectorPrefix20210708\cweagans\Composer;
class PatchEvents
{
/**
* The PRE_PATCH_APPLY event occurs before a patch is applied.
*
* The event listener method receives a cweagans\Composer\PatchEvent instance.
*
* @var string
*/
const PRE_PATCH_APPLY = 'pre-patch-apply';
/**
* The POST_PATCH_APPLY event occurs after a patch is applied.
*
* The event listener method receives a cweagans\Composer\PatchEvent instance.
*
* @var string
*/
const POST_PATCH_APPLY = 'post-patch-apply';
}

View File

@ -1,525 +0,0 @@
<?php
/**
* @file
* Provides a way to patch Composer packages after installation.
*/
namespace RectorPrefix20210708\cweagans\Composer;
use RectorPrefix20210708\Composer\Composer;
use RectorPrefix20210708\Composer\DependencyResolver\Operation\InstallOperation;
use RectorPrefix20210708\Composer\DependencyResolver\Operation\UninstallOperation;
use RectorPrefix20210708\Composer\DependencyResolver\Operation\UpdateOperation;
use RectorPrefix20210708\Composer\DependencyResolver\Operation\OperationInterface;
use RectorPrefix20210708\Composer\EventDispatcher\EventSubscriberInterface;
use RectorPrefix20210708\Composer\IO\IOInterface;
use RectorPrefix20210708\Composer\Package\AliasPackage;
use RectorPrefix20210708\Composer\Package\PackageInterface;
use RectorPrefix20210708\Composer\Plugin\PluginInterface;
use RectorPrefix20210708\Composer\Installer\PackageEvents;
use RectorPrefix20210708\Composer\Script\Event;
use RectorPrefix20210708\Composer\Script\ScriptEvents;
use RectorPrefix20210708\Composer\Installer\PackageEvent;
use RectorPrefix20210708\Composer\Util\ProcessExecutor;
use RectorPrefix20210708\Composer\Util\RemoteFilesystem;
use RectorPrefix20210708\Symfony\Component\Process\Process;
class Patches implements \RectorPrefix20210708\Composer\Plugin\PluginInterface, \RectorPrefix20210708\Composer\EventDispatcher\EventSubscriberInterface
{
/**
* @var Composer $composer
*/
protected $composer;
/**
* @var IOInterface $io
*/
protected $io;
/**
* @var EventDispatcher $eventDispatcher
*/
protected $eventDispatcher;
/**
* @var ProcessExecutor $executor
*/
protected $executor;
/**
* @var array $patches
*/
protected $patches;
/**
* Apply plugin modifications to composer
*
* @param Composer $composer
* @param IOInterface $io
*/
public function activate(\RectorPrefix20210708\Composer\Composer $composer, \RectorPrefix20210708\Composer\IO\IOInterface $io)
{
$this->composer = $composer;
$this->io = $io;
$this->eventDispatcher = $composer->getEventDispatcher();
$this->executor = new \RectorPrefix20210708\Composer\Util\ProcessExecutor($this->io);
$this->patches = array();
$this->installedPatches = array();
}
/**
* Returns an array of event names this subscriber wants to listen to.
*/
public static function getSubscribedEvents()
{
return array(
\RectorPrefix20210708\Composer\Script\ScriptEvents::PRE_INSTALL_CMD => array('checkPatches'),
\RectorPrefix20210708\Composer\Script\ScriptEvents::PRE_UPDATE_CMD => array('checkPatches'),
\RectorPrefix20210708\Composer\Installer\PackageEvents::PRE_PACKAGE_INSTALL => array('gatherPatches'),
\RectorPrefix20210708\Composer\Installer\PackageEvents::PRE_PACKAGE_UPDATE => array('gatherPatches'),
// The following is a higher weight for compatibility with
// https://github.com/AydinHassan/magento-core-composer-installer and more generally for compatibility with
// every Composer plugin which deploys downloaded packages to other locations.
// In such cases you want that those plugins deploy patched files so they have to run after
// the "composer-patches" plugin.
// @see: https://github.com/cweagans/composer-patches/pull/153
\RectorPrefix20210708\Composer\Installer\PackageEvents::POST_PACKAGE_INSTALL => array('postInstall', 10),
\RectorPrefix20210708\Composer\Installer\PackageEvents::POST_PACKAGE_UPDATE => array('postInstall', 10),
);
}
/**
* Before running composer install,
* @param Event $event
*/
public function checkPatches(\RectorPrefix20210708\Composer\Script\Event $event)
{
if (!$this->isPatchingEnabled()) {
return;
}
try {
$repositoryManager = $this->composer->getRepositoryManager();
$localRepository = $repositoryManager->getLocalRepository();
$installationManager = $this->composer->getInstallationManager();
$packages = $localRepository->getPackages();
$extra = $this->composer->getPackage()->getExtra();
$patches_ignore = isset($extra['patches-ignore']) ? $extra['patches-ignore'] : array();
$tmp_patches = $this->grabPatches();
foreach ($packages as $package) {
$extra = $package->getExtra();
if (isset($extra['patches'])) {
if (isset($patches_ignore[$package->getName()])) {
foreach ($patches_ignore[$package->getName()] as $package_name => $patches) {
if (isset($extra['patches'][$package_name])) {
$extra['patches'][$package_name] = \array_diff($extra['patches'][$package_name], $patches);
}
}
}
$this->installedPatches[$package->getName()] = $extra['patches'];
}
$patches = isset($extra['patches']) ? $extra['patches'] : array();
$tmp_patches = $this->arrayMergeRecursiveDistinct($tmp_patches, $patches);
}
if ($tmp_patches == FALSE) {
$this->io->write('<info>No patches supplied.</info>');
return;
}
// Remove packages for which the patch set has changed.
$promises = array();
foreach ($packages as $package) {
if (!$package instanceof \RectorPrefix20210708\Composer\Package\AliasPackage) {
$package_name = $package->getName();
$extra = $package->getExtra();
$has_patches = isset($tmp_patches[$package_name]);
$has_applied_patches = isset($extra['patches_applied']) && \count($extra['patches_applied']) > 0;
if ($has_patches && !$has_applied_patches || !$has_patches && $has_applied_patches || $has_patches && $has_applied_patches && $tmp_patches[$package_name] !== $extra['patches_applied']) {
$uninstallOperation = new \RectorPrefix20210708\Composer\DependencyResolver\Operation\UninstallOperation($package, 'Removing package so it can be re-installed and re-patched.');
$this->io->write('<info>Removing package ' . $package_name . ' so that it can be re-installed and re-patched.</info>');
$promises[] = $installationManager->uninstall($localRepository, $uninstallOperation);
}
}
}
$promises = \array_filter($promises);
if ($promises) {
$this->composer->getLoop()->wait($promises);
}
} catch (\LogicException $e) {
return;
}
}
/**
* Gather patches from dependencies and store them for later use.
*
* @param PackageEvent $event
*/
public function gatherPatches(\RectorPrefix20210708\Composer\Installer\PackageEvent $event)
{
// If we've already done this, then don't do it again.
if (isset($this->patches['_patchesGathered'])) {
$this->io->write('<info>Patches already gathered. Skipping</info>', TRUE, \RectorPrefix20210708\Composer\IO\IOInterface::VERBOSE);
return;
} elseif (!$this->isPatchingEnabled()) {
$this->io->write('<info>Patching is disabled. Skipping.</info>', TRUE, \RectorPrefix20210708\Composer\IO\IOInterface::VERBOSE);
return;
}
$this->patches = $this->grabPatches();
if (empty($this->patches)) {
$this->io->write('<info>No patches supplied.</info>');
}
$extra = $this->composer->getPackage()->getExtra();
$patches_ignore = isset($extra['patches-ignore']) ? $extra['patches-ignore'] : array();
// Now add all the patches from dependencies that will be installed.
$operations = $event->getOperations();
$this->io->write('<info>Gathering patches for dependencies. This might take a minute.</info>');
foreach ($operations as $operation) {
if ($operation instanceof \RectorPrefix20210708\Composer\DependencyResolver\Operation\InstallOperation || $operation instanceof \RectorPrefix20210708\Composer\DependencyResolver\Operation\UpdateOperation) {
$package = $this->getPackageFromOperation($operation);
$extra = $package->getExtra();
if (isset($extra['patches'])) {
if (isset($patches_ignore[$package->getName()])) {
foreach ($patches_ignore[$package->getName()] as $package_name => $patches) {
if (isset($extra['patches'][$package_name])) {
$extra['patches'][$package_name] = \array_diff($extra['patches'][$package_name], $patches);
}
}
}
$this->patches = $this->arrayMergeRecursiveDistinct($this->patches, $extra['patches']);
}
// Unset installed patches for this package
if (isset($this->installedPatches[$package->getName()])) {
unset($this->installedPatches[$package->getName()]);
}
}
}
// Merge installed patches from dependencies that did not receive an update.
foreach ($this->installedPatches as $patches) {
$this->patches = $this->arrayMergeRecursiveDistinct($this->patches, $patches);
}
// If we're in verbose mode, list the projects we're going to patch.
if ($this->io->isVerbose()) {
foreach ($this->patches as $package => $patches) {
$number = \count($patches);
$this->io->write('<info>Found ' . $number . ' patches for ' . $package . '.</info>');
}
}
// Make sure we don't gather patches again. Extra keys in $this->patches
// won't hurt anything, so we'll just stash it there.
$this->patches['_patchesGathered'] = TRUE;
}
/**
* Get the patches from root composer or external file
* @return Patches
* @throws \Exception
*/
public function grabPatches()
{
// First, try to get the patches from the root composer.json.
$extra = $this->composer->getPackage()->getExtra();
if (isset($extra['patches'])) {
$this->io->write('<info>Gathering patches for root package.</info>');
$patches = $extra['patches'];
return $patches;
} elseif (isset($extra['patches-file'])) {
$this->io->write('<info>Gathering patches from patch file.</info>');
$patches = \file_get_contents($extra['patches-file']);
$patches = \json_decode($patches, TRUE);
$error = \json_last_error();
if ($error != 0) {
switch ($error) {
case \JSON_ERROR_DEPTH:
$msg = ' - Maximum stack depth exceeded';
break;
case \JSON_ERROR_STATE_MISMATCH:
$msg = ' - Underflow or the modes mismatch';
break;
case \JSON_ERROR_CTRL_CHAR:
$msg = ' - Unexpected control character found';
break;
case \JSON_ERROR_SYNTAX:
$msg = ' - Syntax error, malformed JSON';
break;
case \JSON_ERROR_UTF8:
$msg = ' - Malformed UTF-8 characters, possibly incorrectly encoded';
break;
default:
$msg = ' - Unknown error';
break;
}
throw new \Exception('There was an error in the supplied patches file:' . $msg);
}
if (isset($patches['patches'])) {
$patches = $patches['patches'];
return $patches;
} elseif (!$patches) {
throw new \Exception('There was an error in the supplied patch file');
}
} else {
return array();
}
}
/**
* @param PackageEvent $event
* @throws \Exception
*/
public function postInstall(\RectorPrefix20210708\Composer\Installer\PackageEvent $event)
{
// Check if we should exit in failure.
$extra = $this->composer->getPackage()->getExtra();
$exitOnFailure = \getenv('COMPOSER_EXIT_ON_PATCH_FAILURE') || !empty($extra['composer-exit-on-patch-failure']);
$skipReporting = \getenv('COMPOSER_PATCHES_SKIP_REPORTING') || !empty($extra['composer-patches-skip-reporting']);
// Get the package object for the current operation.
$operation = $event->getOperation();
/** @var PackageInterface $package */
$package = $this->getPackageFromOperation($operation);
$package_name = $package->getName();
if (!isset($this->patches[$package_name])) {
if ($this->io->isVerbose()) {
$this->io->write('<info>No patches found for ' . $package_name . '.</info>');
}
return;
}
$this->io->write(' - Applying patches for <info>' . $package_name . '</info>');
// Get the install path from the package object.
$manager = $event->getComposer()->getInstallationManager();
$install_path = $manager->getInstaller($package->getType())->getInstallPath($package);
// Set up a downloader.
$downloader = new \RectorPrefix20210708\Composer\Util\RemoteFilesystem($this->io, $this->composer->getConfig());
// Track applied patches in the package info in installed.json
$localRepository = $this->composer->getRepositoryManager()->getLocalRepository();
$localPackage = $localRepository->findPackage($package_name, $package->getVersion());
$extra = $localPackage->getExtra();
$extra['patches_applied'] = array();
foreach ($this->patches[$package_name] as $description => $url) {
$this->io->write(' <info>' . $url . '</info> (<comment>' . $description . '</comment>)');
try {
$this->eventDispatcher->dispatch(NULL, new \RectorPrefix20210708\cweagans\Composer\PatchEvent(\RectorPrefix20210708\cweagans\Composer\PatchEvents::PRE_PATCH_APPLY, $package, $url, $description));
$this->getAndApplyPatch($downloader, $install_path, $url, $package);
$this->eventDispatcher->dispatch(NULL, new \RectorPrefix20210708\cweagans\Composer\PatchEvent(\RectorPrefix20210708\cweagans\Composer\PatchEvents::POST_PATCH_APPLY, $package, $url, $description));
$extra['patches_applied'][$description] = $url;
} catch (\Exception $e) {
$this->io->write(' <error>Could not apply patch! Skipping. The error was: ' . $e->getMessage() . '</error>');
if ($exitOnFailure) {
throw new \Exception("Cannot apply patch {$description} ({$url})!");
}
}
}
$localPackage->setExtra($extra);
$this->io->write('');
if (\true !== $skipReporting) {
$this->writePatchReport($this->patches[$package_name], $install_path);
}
}
/**
* Get a Package object from an OperationInterface object.
*
* @param OperationInterface $operation
* @return PackageInterface
* @throws \Exception
*/
protected function getPackageFromOperation(\RectorPrefix20210708\Composer\DependencyResolver\Operation\OperationInterface $operation)
{
if ($operation instanceof \RectorPrefix20210708\Composer\DependencyResolver\Operation\InstallOperation) {
$package = $operation->getPackage();
} elseif ($operation instanceof \RectorPrefix20210708\Composer\DependencyResolver\Operation\UpdateOperation) {
$package = $operation->getTargetPackage();
} else {
throw new \Exception('Unknown operation: ' . \get_class($operation));
}
return $package;
}
/**
* Apply a patch on code in the specified directory.
*
* @param RemoteFilesystem $downloader
* @param $install_path
* @param $patch_url
* @param PackageInterface $package
* @throws \Exception
*/
protected function getAndApplyPatch(\RectorPrefix20210708\Composer\Util\RemoteFilesystem $downloader, $install_path, $patch_url, \RectorPrefix20210708\Composer\Package\PackageInterface $package)
{
// Local patch file.
if (\file_exists($patch_url)) {
$filename = \realpath($patch_url);
} else {
// Generate random (but not cryptographically so) filename.
$filename = \uniqid(\sys_get_temp_dir() . '/') . ".patch";
// Download file from remote filesystem to this location.
$hostname = \parse_url($patch_url, \PHP_URL_HOST);
try {
$downloader->copy($hostname, $patch_url, $filename, \false);
} catch (\Exception $e) {
// In case of an exception, retry once as the download might
// have failed due to intermittent network issues.
$downloader->copy($hostname, $patch_url, $filename, \false);
}
}
// The order here is intentional. p1 is most likely to apply with git apply.
// p0 is next likely. p2 is extremely unlikely, but for some special cases,
// it might be useful. p4 is useful for Magento 2 patches
$patch_levels = array('-p1', '-p0', '-p2', '-p4');
// Check for specified patch level for this package.
$extra = $this->composer->getPackage()->getExtra();
if (!empty($extra['patchLevel'][$package->getName()])) {
$patch_levels = array($extra['patchLevel'][$package->getName()]);
}
// Attempt to apply with git apply.
$patched = $this->applyPatchWithGit($install_path, $patch_levels, $filename);
// In some rare cases, git will fail to apply a patch, fallback to using
// the 'patch' command.
if (!$patched) {
foreach ($patch_levels as $patch_level) {
// --no-backup-if-mismatch here is a hack that fixes some
// differences between how patch works on windows and unix.
if ($patched = $this->executeCommand("patch %s --no-backup-if-mismatch -d %s < %s", $patch_level, $install_path, $filename)) {
break;
}
}
}
// Clean up the temporary patch file.
if (isset($hostname)) {
\unlink($filename);
}
// If the patch *still* isn't applied, then give up and throw an Exception.
// Otherwise, let the user know it worked.
if (!$patched) {
throw new \Exception("Cannot apply patch {$patch_url}");
}
}
/**
* Checks if the root package enables patching.
*
* @return bool
* Whether patching is enabled. Defaults to TRUE.
*/
protected function isPatchingEnabled()
{
$extra = $this->composer->getPackage()->getExtra();
if (empty($extra['patches']) && empty($extra['patches-ignore']) && !isset($extra['patches-file'])) {
// The root package has no patches of its own, so only allow patching if
// it has specifically opted in.
return isset($extra['enable-patching']) ? $extra['enable-patching'] : FALSE;
} else {
return TRUE;
}
}
/**
* Writes a patch report to the target directory.
*
* @param array $patches
* @param string $directory
*/
protected function writePatchReport($patches, $directory)
{
$output = "This file was automatically generated by Composer Patches (https://github.com/cweagans/composer-patches)\n";
$output .= "Patches applied to this directory:\n\n";
foreach ($patches as $description => $url) {
$output .= $description . "\n";
$output .= 'Source: ' . $url . "\n\n\n";
}
\file_put_contents($directory . "/PATCHES.txt", $output);
}
/**
* Executes a shell command with escaping.
*
* @param string $cmd
* @return bool
*/
protected function executeCommand($cmd)
{
// Shell-escape all arguments except the command.
$args = \func_get_args();
foreach ($args as $index => $arg) {
if ($index !== 0) {
$args[$index] = \escapeshellarg($arg);
}
}
// And replace the arguments.
$command = \call_user_func_array('sprintf', $args);
$output = '';
if ($this->io->isVerbose()) {
$this->io->write('<comment>' . $command . '</comment>');
$io = $this->io;
$output = function ($type, $data) use($io) {
if ($type == \RectorPrefix20210708\Symfony\Component\Process\Process::ERR) {
$io->write('<error>' . $data . '</error>');
} else {
$io->write('<comment>' . $data . '</comment>');
}
};
}
return $this->executor->execute($command, $output) == 0;
}
/**
* Recursively merge arrays without changing data types of values.
*
* Does not change the data types of the values in the arrays. Matching keys'
* values in the second array overwrite those in the first array, as is the
* case with array_merge.
*
* @param array $array1
* The first array.
* @param array $array2
* The second array.
* @return array
* The merged array.
*
* @see http://php.net/manual/en/function.array-merge-recursive.php#92195
*/
protected function arrayMergeRecursiveDistinct(array $array1, array $array2)
{
$merged = $array1;
foreach ($array2 as $key => &$value) {
if (\is_array($value) && isset($merged[$key]) && \is_array($merged[$key])) {
$merged[$key] = $this->arrayMergeRecursiveDistinct($merged[$key], $value);
} else {
$merged[$key] = $value;
}
}
return $merged;
}
/**
* Attempts to apply a patch with git apply.
*
* @param $install_path
* @param $patch_levels
* @param $filename
*
* @return bool
* TRUE if patch was applied, FALSE otherwise.
*/
protected function applyPatchWithGit($install_path, $patch_levels, $filename)
{
// Do not use git apply unless the install path is itself a git repo
// @see https://stackoverflow.com/a/27283285
if (!\is_dir($install_path . '/.git')) {
return FALSE;
}
$patched = FALSE;
foreach ($patch_levels as $patch_level) {
if ($this->io->isVerbose()) {
$comment = 'Testing ability to patch with git apply.';
$comment .= ' This command may produce errors that can be safely ignored.';
$this->io->write('<comment>' . $comment . '</comment>');
}
$checked = $this->executeCommand('git -C %s apply --check -v %s %s', $install_path, $patch_level, $filename);
$output = $this->executor->getErrorOutput();
if (\substr($output, 0, 7) == 'Skipped') {
// Git will indicate success but silently skip patches in some scenarios.
//
// @see https://github.com/cweagans/composer-patches/pull/165
$checked = FALSE;
}
if ($checked) {
// Apply the first successful style.
$patched = $this->executeCommand('git -C %s apply %s %s', $install_path, $patch_level, $filename);
break;
}
}
return $patched;
}
/**
* {@inheritDoc}
*/
public function deactivate(\RectorPrefix20210708\Composer\Composer $composer, \RectorPrefix20210708\Composer\IO\IOInterface $io)
{
}
/**
* {@inheritDoc}
*/
public function uninstall(\RectorPrefix20210708\Composer\Composer $composer, \RectorPrefix20210708\Composer\IO\IOInterface $io)
{
}
}

View File

@ -1,33 +0,0 @@
<?php
/**
* @file
* Tests event dispatching.
*/
namespace RectorPrefix20210708\cweagans\Composer\Tests;
use RectorPrefix20210708\cweagans\Composer\PatchEvent;
use RectorPrefix20210708\cweagans\Composer\PatchEvents;
use RectorPrefix20210708\Composer\Package\PackageInterface;
class PatchEventTest extends \RectorPrefix20210708\PHPUnit_Framework_TestCase
{
/**
* Tests all the getters.
*
* @dataProvider patchEventDataProvider
*/
public function testGetters($event_name, \RectorPrefix20210708\Composer\Package\PackageInterface $package, $url, $description)
{
$patch_event = new \RectorPrefix20210708\cweagans\Composer\PatchEvent($event_name, $package, $url, $description);
$this->assertEquals($event_name, $patch_event->getName());
$this->assertEquals($package, $patch_event->getPackage());
$this->assertEquals($url, $patch_event->getUrl());
$this->assertEquals($description, $patch_event->getDescription());
}
public function patchEventDataProvider()
{
$prophecy = $this->prophesize('RectorPrefix20210708\\Composer\\Package\\PackageInterface');
$package = $prophecy->reveal();
return array(array(\RectorPrefix20210708\cweagans\Composer\PatchEvents::PRE_PATCH_APPLY, $package, 'https://www.drupal.org', 'A test patch'), array(\RectorPrefix20210708\cweagans\Composer\PatchEvents::POST_PATCH_APPLY, $package, 'https://www.drupal.org', 'A test patch'));
}
}

View File

@ -21,7 +21,6 @@ abstract class GenericLanguageInflectorFactory implements \RectorPrefix20210708\
return new \RectorPrefix20210708\Doctrine\Inflector\Inflector(new \RectorPrefix20210708\Doctrine\Inflector\CachedWordInflector(new \RectorPrefix20210708\Doctrine\Inflector\RulesetInflector(...$this->singularRulesets)), new \RectorPrefix20210708\Doctrine\Inflector\CachedWordInflector(new \RectorPrefix20210708\Doctrine\Inflector\RulesetInflector(...$this->pluralRulesets)));
}
/**
* @return
* @param \Doctrine\Inflector\Rules\Ruleset|null $singularRules
* @param bool $reset
*/
@ -36,7 +35,6 @@ abstract class GenericLanguageInflectorFactory implements \RectorPrefix20210708\
return $this;
}
/**
* @return
* @param \Doctrine\Inflector\Rules\Ruleset|null $pluralRules
* @param bool $reset
*/

View File

@ -9,8 +9,8 @@ $loader = require_once __DIR__.'/autoload.php';
if (!class_exists('AutoloadIncluder', false) && !interface_exists('AutoloadIncluder', false) && !trait_exists('AutoloadIncluder', false)) {
spl_autoload_call('RectorPrefix20210708\AutoloadIncluder');
}
if (!class_exists('ComposerAutoloaderInitec1756b7016cb728d5c640c220314df9', false) && !interface_exists('ComposerAutoloaderInitec1756b7016cb728d5c640c220314df9', false) && !trait_exists('ComposerAutoloaderInitec1756b7016cb728d5c640c220314df9', false)) {
spl_autoload_call('RectorPrefix20210708\ComposerAutoloaderInitec1756b7016cb728d5c640c220314df9');
if (!class_exists('ComposerAutoloaderInitfea99aed40b8b9b57974b89e41cb0f3c', false) && !interface_exists('ComposerAutoloaderInitfea99aed40b8b9b57974b89e41cb0f3c', false) && !trait_exists('ComposerAutoloaderInitfea99aed40b8b9b57974b89e41cb0f3c', false)) {
spl_autoload_call('RectorPrefix20210708\ComposerAutoloaderInitfea99aed40b8b9b57974b89e41cb0f3c');
}
if (!class_exists('Doctrine\Inflector\Inflector', false) && !interface_exists('Doctrine\Inflector\Inflector', false) && !trait_exists('Doctrine\Inflector\Inflector', false)) {
spl_autoload_call('RectorPrefix20210708\Doctrine\Inflector\Inflector');
@ -3308,9 +3308,9 @@ if (!function_exists('print_node')) {
return \RectorPrefix20210708\print_node(...func_get_args());
}
}
if (!function_exists('composerRequireec1756b7016cb728d5c640c220314df9')) {
function composerRequireec1756b7016cb728d5c640c220314df9() {
return \RectorPrefix20210708\composerRequireec1756b7016cb728d5c640c220314df9(...func_get_args());
if (!function_exists('composerRequirefea99aed40b8b9b57974b89e41cb0f3c')) {
function composerRequirefea99aed40b8b9b57974b89e41cb0f3c() {
return \RectorPrefix20210708\composerRequirefea99aed40b8b9b57974b89e41cb0f3c(...func_get_args());
}
}
if (!function_exists('parseArgs')) {

View File

@ -1010,7 +1010,7 @@ class Application implements \RectorPrefix20210708\Symfony\Contracts\Service\Res
*/
public function setDefaultCommand($commandName, $isSingleCommand = \false)
{
$this->defaultCommand = $commandName;
$this->defaultCommand = \explode('|', \ltrim($commandName, '|'))[0];
if ($isSingleCommand) {
// Ensure the command exist
$this->find($commandName);

View File

@ -1,7 +0,0 @@
This file was automatically generated by Composer Patches (https://github.com/cweagans/composer-patches)
Patches applied to this directory:
0
Source: patches/symfony-console-style-symfonystyle-php.patch

View File

@ -1,11 +0,0 @@
--- /dev/null
+++ Style/SymfonyStyle.php
@@ -288,7 +288,7 @@
/**
* {@inheritdoc}
*/
- public function confirm($question, $default = true)
+ public function confirm(string $question, bool $default = true)
{
return $this->askQuestion(new ConfirmationQuestion($question, $default));
}

View File

@ -16,9 +16,6 @@ final class AstralBundle extends \RectorPrefix20210708\Symfony\Component\HttpKer
{
$containerBuilder->addCompilerPass(new \RectorPrefix20210708\Symplify\AutowireArrayParameter\DependencyInjection\CompilerPass\AutowireArrayParameterCompilerPass());
}
/**
* @return
*/
protected function createContainerExtension() : ?\RectorPrefix20210708\Symfony\Component\DependencyInjection\Extension\ExtensionInterface
{
return new \RectorPrefix20210708\Symplify\Astral\DependencyInjection\Extension\AstralExtension();

View File

@ -7,9 +7,6 @@ use RectorPrefix20210708\Symfony\Component\HttpKernel\Bundle\Bundle;
use RectorPrefix20210708\Symplify\ComposerJsonManipulator\DependencyInjection\Extension\ComposerJsonManipulatorExtension;
final class ComposerJsonManipulatorBundle extends \RectorPrefix20210708\Symfony\Component\HttpKernel\Bundle\Bundle
{
/**
* @return
*/
protected function createContainerExtension() : ?\RectorPrefix20210708\Symfony\Component\DependencyInjection\Extension\ExtensionInterface
{
return new \RectorPrefix20210708\Symplify\ComposerJsonManipulator\DependencyInjection\Extension\ComposerJsonManipulatorExtension();

View File

@ -7,9 +7,6 @@ use RectorPrefix20210708\Symfony\Component\HttpKernel\Bundle\Bundle;
use RectorPrefix20210708\Symplify\ConsoleColorDiff\DependencyInjection\Extension\ConsoleColorDiffExtension;
final class ConsoleColorDiffBundle extends \RectorPrefix20210708\Symfony\Component\HttpKernel\Bundle\Bundle
{
/**
* @return
*/
protected function createContainerExtension() : ?\RectorPrefix20210708\Symfony\Component\DependencyInjection\Extension\ExtensionInterface
{
return new \RectorPrefix20210708\Symplify\ConsoleColorDiff\DependencyInjection\Extension\ConsoleColorDiffExtension();

View File

@ -7,9 +7,6 @@ use RectorPrefix20210708\Symfony\Component\HttpKernel\Bundle\Bundle;
use RectorPrefix20210708\Symplify\Skipper\DependencyInjection\Extension\SkipperExtension;
final class SkipperBundle extends \RectorPrefix20210708\Symfony\Component\HttpKernel\Bundle\Bundle
{
/**
* @return
*/
protected function createContainerExtension() : ?\RectorPrefix20210708\Symfony\Component\DependencyInjection\Extension\ExtensionInterface
{
return new \RectorPrefix20210708\Symplify\Skipper\DependencyInjection\Extension\SkipperExtension();

View File

@ -16,9 +16,6 @@ final class SymplifyKernelBundle extends \RectorPrefix20210708\Symfony\Component
{
$containerBuilder->addCompilerPass(new \RectorPrefix20210708\Symplify\AutowireArrayParameter\DependencyInjection\CompilerPass\AutowireArrayParameterCompilerPass());
}
/**
* @return
*/
protected function createContainerExtension() : ?\RectorPrefix20210708\Symfony\Component\DependencyInjection\Extension\ExtensionInterface
{
return new \RectorPrefix20210708\Symplify\SymplifyKernel\DependencyInjection\Extension\SymplifyKernelExtension();

View File

@ -1,25 +0,0 @@
The MIT License
---------------
Copyright (c) 2020-present Tomas Votruba (https://tomasvotruba.com)
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

View File

@ -1,5 +0,0 @@
#!/usr/bin/env php
<?php
namespace RectorPrefix20210708;
require __DIR__ . '/vendor-patches.php';

View File

@ -1,16 +0,0 @@
<?php
declare (strict_types=1);
namespace RectorPrefix20210708;
use RectorPrefix20210708\Symplify\SymplifyKernel\ValueObject\KernelBootAndApplicationRun;
use RectorPrefix20210708\Symplify\VendorPatches\HttpKernel\VendorPatchesKernel;
$possibleAutoloadPaths = [__DIR__ . '/../autoload.php', __DIR__ . '/../vendor/autoload.php', __DIR__ . '/../../../autoload.php', __DIR__ . '/../../../vendor/autoload.php'];
foreach ($possibleAutoloadPaths as $possibleAutoloadPath) {
if (!\file_exists($possibleAutoloadPath)) {
continue;
}
require_once $possibleAutoloadPath;
}
$kernelBootAndApplicationRun = new \RectorPrefix20210708\Symplify\SymplifyKernel\ValueObject\KernelBootAndApplicationRun(\RectorPrefix20210708\Symplify\VendorPatches\HttpKernel\VendorPatchesKernel::class);
$kernelBootAndApplicationRun->run();

View File

@ -1,39 +0,0 @@
{
"name": "symplify\/vendor-patches",
"description": "Generate vendor patches for packages with single command",
"license": "MIT",
"bin": [
"bin\/vendor-patches"
],
"require": {
"php": ">=8.0",
"nette\/utils": "^3.2",
"symfony\/console": "^5.3",
"symfony\/dependency-injection": "^5.3",
"symfony\/http-kernel": "^5.3",
"sebastian\/diff": "^4.0",
"cweagans\/composer-patches": "^1.7",
"symplify\/composer-json-manipulator": "^9.4.15",
"symplify\/symplify-kernel": "^9.4.15"
},
"require-dev": {
"phpunit\/phpunit": "^9.5"
},
"autoload": {
"psr-4": {
"RectorPrefix20210708\\Symplify\\VendorPatches\\": "src"
}
},
"autoload-dev": {
"psr-4": {
"RectorPrefix20210708\\Symplify\\VendorPatches\\Tests\\": "tests"
}
},
"extra": {
"branch-alias": {
"dev-main": "9.5-dev"
}
},
"minimum-stability": "dev",
"prefer-stable": true
}

View File

@ -1,27 +0,0 @@
<?php
declare (strict_types=1);
namespace RectorPrefix20210708;
use RectorPrefix20210708\SebastianBergmann\Diff\Differ;
use RectorPrefix20210708\SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder;
use RectorPrefix20210708\Symfony\Component\Console\Application;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use RectorPrefix20210708\Symplify\PackageBuilder\Composer\VendorDirProvider;
use RectorPrefix20210708\Symplify\PackageBuilder\Console\Command\CommandNaming;
use RectorPrefix20210708\Symplify\PackageBuilder\Yaml\ParametersMerger;
use RectorPrefix20210708\Symplify\SmartFileSystem\Json\JsonFileSystem;
use RectorPrefix20210708\Symplify\VendorPatches\Console\VendorPatchesConsoleApplication;
use function RectorPrefix20210708\Symfony\Component\DependencyInjection\Loader\Configurator\service;
return static function (\Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator $containerConfigurator) : void {
$services = $containerConfigurator->services();
$services->defaults()->public()->autowire()->autoconfigure();
$services->load('RectorPrefix20210708\Symplify\\VendorPatches\\', __DIR__ . '/../src')->exclude([__DIR__ . '/../src/HttpKernel', __DIR__ . '/../src/ValueObject']);
$services->set(\RectorPrefix20210708\SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder::class)->args(['$addLineNumbers' => \true]);
$services->set(\RectorPrefix20210708\SebastianBergmann\Diff\Differ::class)->args(['$outputBuilder' => \RectorPrefix20210708\Symfony\Component\DependencyInjection\Loader\Configurator\service(\RectorPrefix20210708\SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder::class)]);
$services->set(\RectorPrefix20210708\Symplify\PackageBuilder\Composer\VendorDirProvider::class);
$services->set(\RectorPrefix20210708\Symplify\SmartFileSystem\Json\JsonFileSystem::class);
$services->alias(\RectorPrefix20210708\Symfony\Component\Console\Application::class, \RectorPrefix20210708\Symplify\VendorPatches\Console\VendorPatchesConsoleApplication::class);
$services->set(\RectorPrefix20210708\Symplify\PackageBuilder\Console\Command\CommandNaming::class);
$services->set(\RectorPrefix20210708\Symplify\PackageBuilder\Yaml\ParametersMerger::class);
};

View File

@ -1,13 +0,0 @@
<phpunit
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
bootstrap="vendor/autoload.php"
colors="true"
verbose="true"
>
<testsuites>
<testsuite name="unit">
<directory>tests</directory>
</testsuite>
</testsuites>
</phpunit>

View File

@ -1,96 +0,0 @@
<?php
declare (strict_types=1);
namespace RectorPrefix20210708\Symplify\VendorPatches\Command;
use RectorPrefix20210708\Symfony\Component\Console\Input\InputInterface;
use RectorPrefix20210708\Symfony\Component\Console\Output\OutputInterface;
use RectorPrefix20210708\Symplify\PackageBuilder\Composer\VendorDirProvider;
use RectorPrefix20210708\Symplify\PackageBuilder\Console\Command\AbstractSymplifyCommand;
use RectorPrefix20210708\Symplify\PackageBuilder\Console\ShellCode;
use RectorPrefix20210708\Symplify\VendorPatches\Composer\ComposerPatchesConfigurationUpdater;
use RectorPrefix20210708\Symplify\VendorPatches\Console\GenerateCommandReporter;
use RectorPrefix20210708\Symplify\VendorPatches\Differ\PatchDiffer;
use RectorPrefix20210708\Symplify\VendorPatches\Finder\OldToNewFilesFinder;
use RectorPrefix20210708\Symplify\VendorPatches\PatchFileFactory;
final class GenerateCommand extends \RectorPrefix20210708\Symplify\PackageBuilder\Console\Command\AbstractSymplifyCommand
{
/**
* @var \Symplify\VendorPatches\Finder\OldToNewFilesFinder
*/
private $oldToNewFilesFinder;
/**
* @var \Symplify\VendorPatches\Differ\PatchDiffer
*/
private $patchDiffer;
/**
* @var \Symplify\VendorPatches\Composer\ComposerPatchesConfigurationUpdater
*/
private $composerPatchesConfigurationUpdater;
/**
* @var \Symplify\PackageBuilder\Composer\VendorDirProvider
*/
private $vendorDirProvider;
/**
* @var \Symplify\VendorPatches\PatchFileFactory
*/
private $patchFileFactory;
/**
* @var \Symplify\VendorPatches\Console\GenerateCommandReporter
*/
private $generateCommandReporter;
public function __construct(\RectorPrefix20210708\Symplify\VendorPatches\Finder\OldToNewFilesFinder $oldToNewFilesFinder, \RectorPrefix20210708\Symplify\VendorPatches\Differ\PatchDiffer $patchDiffer, \RectorPrefix20210708\Symplify\VendorPatches\Composer\ComposerPatchesConfigurationUpdater $composerPatchesConfigurationUpdater, \RectorPrefix20210708\Symplify\PackageBuilder\Composer\VendorDirProvider $vendorDirProvider, \RectorPrefix20210708\Symplify\VendorPatches\PatchFileFactory $patchFileFactory, \RectorPrefix20210708\Symplify\VendorPatches\Console\GenerateCommandReporter $generateCommandReporter)
{
$this->oldToNewFilesFinder = $oldToNewFilesFinder;
$this->patchDiffer = $patchDiffer;
$this->composerPatchesConfigurationUpdater = $composerPatchesConfigurationUpdater;
$this->vendorDirProvider = $vendorDirProvider;
$this->patchFileFactory = $patchFileFactory;
$this->generateCommandReporter = $generateCommandReporter;
parent::__construct();
}
protected function configure() : void
{
$this->setDescription('Generate patches from /vendor directory');
}
/**
* @param \Symfony\Component\Console\Input\InputInterface $input
* @param \Symfony\Component\Console\Output\OutputInterface $output
*/
protected function execute($input, $output) : int
{
$vendorDirectory = $this->vendorDirProvider->provide();
$oldAndNewFileInfos = $this->oldToNewFilesFinder->find($vendorDirectory);
$composerExtraPatches = [];
$addedPatchFilesByPackageName = [];
foreach ($oldAndNewFileInfos as $oldAndNewFileInfo) {
if ($oldAndNewFileInfo->isContentIdentical()) {
$this->generateCommandReporter->reportIdenticalNewAndOldFile($oldAndNewFileInfo);
continue;
}
// write into patches file
$patchFileRelativePath = $this->patchFileFactory->createPatchFilePath($oldAndNewFileInfo, $vendorDirectory);
$composerExtraPatches[$oldAndNewFileInfo->getPackageName()][] = $patchFileRelativePath;
$patchFileAbsolutePath = \dirname($vendorDirectory) . \DIRECTORY_SEPARATOR . $patchFileRelativePath;
// dump the patch
$patchDiff = $this->patchDiffer->diff($oldAndNewFileInfo);
if (\is_file($patchFileAbsolutePath)) {
$message = \sprintf('File "%s" was updated', $patchFileRelativePath);
$this->symfonyStyle->note($message);
} else {
$message = \sprintf('File "%s" was created', $patchFileRelativePath);
$this->symfonyStyle->note($message);
}
$this->smartFileSystem->dumpFile($patchFileAbsolutePath, $patchDiff);
$addedPatchFilesByPackageName[$oldAndNewFileInfo->getPackageName()][] = $patchFileRelativePath;
}
$this->composerPatchesConfigurationUpdater->updateComposerJsonAndPrint(\getcwd() . '/composer.json', $composerExtraPatches);
if ($addedPatchFilesByPackageName !== []) {
$message = \sprintf('Great! %d new patch files added', \count($addedPatchFilesByPackageName));
$this->symfonyStyle->success($message);
} else {
$this->symfonyStyle->success('No new patches were added');
}
return \RectorPrefix20210708\Symplify\PackageBuilder\Console\ShellCode::SUCCESS;
}
}

View File

@ -1,59 +0,0 @@
<?php
declare (strict_types=1);
namespace RectorPrefix20210708\Symplify\VendorPatches\Composer;
use RectorPrefix20210708\Symplify\Astral\Exception\ShouldNotHappenException;
use RectorPrefix20210708\Symplify\ComposerJsonManipulator\ComposerJsonFactory;
use RectorPrefix20210708\Symplify\ComposerJsonManipulator\FileSystem\JsonFileManager;
use RectorPrefix20210708\Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
use RectorPrefix20210708\Symplify\PackageBuilder\Yaml\ParametersMerger;
use Symplify\SmartFileSystem\SmartFileInfo;
/**
* @see \Symplify\VendorPatches\Tests\Composer\ComposerPatchesConfigurationUpdater\ComposerPatchesConfigurationUpdaterTest
*/
final class ComposerPatchesConfigurationUpdater
{
/**
* @var \Symplify\ComposerJsonManipulator\ComposerJsonFactory
*/
private $composerJsonFactory;
/**
* @var \Symplify\ComposerJsonManipulator\FileSystem\JsonFileManager
*/
private $jsonFileManager;
/**
* @var \Symplify\PackageBuilder\Yaml\ParametersMerger
*/
private $parametersMerger;
public function __construct(\RectorPrefix20210708\Symplify\ComposerJsonManipulator\ComposerJsonFactory $composerJsonFactory, \RectorPrefix20210708\Symplify\ComposerJsonManipulator\FileSystem\JsonFileManager $jsonFileManager, \RectorPrefix20210708\Symplify\PackageBuilder\Yaml\ParametersMerger $parametersMerger)
{
$this->composerJsonFactory = $composerJsonFactory;
$this->jsonFileManager = $jsonFileManager;
$this->parametersMerger = $parametersMerger;
}
/**
* @param mixed[] $composerExtraPatches
*/
public function updateComposerJson(string $composerJsonFilePath, array $composerExtraPatches) : \RectorPrefix20210708\Symplify\ComposerJsonManipulator\ValueObject\ComposerJson
{
$extra = ['patches' => $composerExtraPatches];
$composerJson = $this->composerJsonFactory->createFromFilePath($composerJsonFilePath);
// merge "extra" section - deep merge is needed, so original patches are included
$newExtra = $this->parametersMerger->merge($composerJson->getExtra(), $extra);
$composerJson->setExtra($newExtra);
return $composerJson;
}
/**
* @param mixed[] $composerExtraPatches
*/
public function updateComposerJsonAndPrint(string $composerJsonFilePath, array $composerExtraPatches) : void
{
$composerJson = $this->updateComposerJson($composerJsonFilePath, $composerExtraPatches);
$fileInfo = $composerJson->getFileInfo();
if (!$fileInfo instanceof \Symplify\SmartFileSystem\SmartFileInfo) {
throw new \RectorPrefix20210708\Symplify\Astral\Exception\ShouldNotHappenException();
}
$this->jsonFileManager->printComposerJsonToFilePath($composerJson, $fileInfo->getRealPath());
}
}

View File

@ -1,50 +0,0 @@
<?php
declare (strict_types=1);
namespace RectorPrefix20210708\Symplify\VendorPatches\Composer;
use RectorPrefix20210708\Symplify\SmartFileSystem\FileSystemGuard;
use RectorPrefix20210708\Symplify\SmartFileSystem\Json\JsonFileSystem;
use Symplify\SmartFileSystem\SmartFileInfo;
use RectorPrefix20210708\Symplify\SymplifyKernel\Exception\ShouldNotHappenException;
use RectorPrefix20210708\Symplify\VendorPatches\FileSystem\PathResolver;
/**
* @see \Symplify\VendorPatches\Tests\Composer\PackageNameResolverTest
*/
final class PackageNameResolver
{
/**
* @var \Symplify\SmartFileSystem\Json\JsonFileSystem
*/
private $jsonFileSystem;
/**
* @var \Symplify\VendorPatches\FileSystem\PathResolver
*/
private $pathResolver;
/**
* @var \Symplify\SmartFileSystem\FileSystemGuard
*/
private $fileSystemGuard;
public function __construct(\RectorPrefix20210708\Symplify\SmartFileSystem\Json\JsonFileSystem $jsonFileSystem, \RectorPrefix20210708\Symplify\VendorPatches\FileSystem\PathResolver $pathResolver, \RectorPrefix20210708\Symplify\SmartFileSystem\FileSystemGuard $fileSystemGuard)
{
$this->jsonFileSystem = $jsonFileSystem;
$this->pathResolver = $pathResolver;
$this->fileSystemGuard = $fileSystemGuard;
}
public function resolveFromFileInfo(\Symplify\SmartFileSystem\SmartFileInfo $vendorFile) : string
{
$packageComposerJsonFilePath = $this->getPackageComposerJsonFilePath($vendorFile);
$composerJson = $this->jsonFileSystem->loadFilePathToJson($packageComposerJsonFilePath);
if (!isset($composerJson['name'])) {
throw new \RectorPrefix20210708\Symplify\SymplifyKernel\Exception\ShouldNotHappenException();
}
return $composerJson['name'];
}
private function getPackageComposerJsonFilePath(\Symplify\SmartFileSystem\SmartFileInfo $vendorFileInfo) : string
{
$vendorPackageDirectory = $this->pathResolver->resolveVendorDirectory($vendorFileInfo);
$packageComposerJsonFilePath = $vendorPackageDirectory . '/composer.json';
$this->fileSystemGuard->ensureFileExists($packageComposerJsonFilePath, __METHOD__);
return $packageComposerJsonFilePath;
}
}

View File

@ -1,23 +0,0 @@
<?php
declare (strict_types=1);
namespace RectorPrefix20210708\Symplify\VendorPatches\Console;
use RectorPrefix20210708\Symfony\Component\Console\Style\SymfonyStyle;
use RectorPrefix20210708\Symplify\VendorPatches\ValueObject\OldAndNewFileInfo;
final class GenerateCommandReporter
{
/**
* @var \Symfony\Component\Console\Style\SymfonyStyle
*/
private $symfonyStyle;
public function __construct(\RectorPrefix20210708\Symfony\Component\Console\Style\SymfonyStyle $symfonyStyle)
{
$this->symfonyStyle = $symfonyStyle;
}
public function reportIdenticalNewAndOldFile(\RectorPrefix20210708\Symplify\VendorPatches\ValueObject\OldAndNewFileInfo $oldAndNewFileInfo) : void
{
$message = \sprintf('Files "%s" and "%s" have the same content. Did you forgot to change it?', $oldAndNewFileInfo->getOldFileRelativePath(), $oldAndNewFileInfo->getNewFileRelativePath());
$this->symfonyStyle->warning($message);
}
}

View File

@ -1,23 +0,0 @@
<?php
declare (strict_types=1);
namespace RectorPrefix20210708\Symplify\VendorPatches\Console;
use RectorPrefix20210708\Symfony\Component\Console\Application;
use RectorPrefix20210708\Symfony\Component\Console\Command\Command;
use RectorPrefix20210708\Symplify\PackageBuilder\Console\Command\CommandNaming;
final class VendorPatchesConsoleApplication extends \RectorPrefix20210708\Symfony\Component\Console\Application
{
/**
* @param Command[] $commands
*/
public function __construct(\RectorPrefix20210708\Symplify\PackageBuilder\Console\Command\CommandNaming $commandNaming, array $commands)
{
foreach ($commands as $command) {
$commandName = $commandNaming->resolveFromCommand($command);
$command->setName($commandName);
$this->add($command);
}
parent::__construct('Vendor Patches');
}
}

View File

@ -1,56 +0,0 @@
<?php
declare (strict_types=1);
namespace RectorPrefix20210708\Symplify\VendorPatches\Differ;
use RectorPrefix20210708\Nette\Utils\Strings;
use RectorPrefix20210708\SebastianBergmann\Diff\Differ;
use Symplify\SmartFileSystem\SmartFileInfo;
use RectorPrefix20210708\Symplify\SymplifyKernel\Exception\ShouldNotHappenException;
use RectorPrefix20210708\Symplify\VendorPatches\ValueObject\OldAndNewFileInfo;
/**
* @see \Symplify\VendorPatches\Tests\Differ\PatchDifferTest
*/
final class PatchDiffer
{
/**
* @see https://regex101.com/r/0O5NO1/1/
* @var string
*/
private const LOCAL_PATH_REGEX = '#vendor\\/(\\w|\\-)+\\/(\\w|\\-)+\\/(?<local_path>.*?)$#is';
/**
* @see https://regex101.com/r/vNa7PO/1
* @var string
*/
private const START_ORIGINAL_REGEX = '#^--- Original#';
/**
* @see https://regex101.com/r/o8C90E/1
* @var string
*/
private const START_NEW_REGEX = '#^\\+\\+\\+ New#m';
/**
* @var \SebastianBergmann\Diff\Differ
*/
private $differ;
public function __construct(\RectorPrefix20210708\SebastianBergmann\Diff\Differ $differ)
{
$this->differ = $differ;
}
public function diff(\RectorPrefix20210708\Symplify\VendorPatches\ValueObject\OldAndNewFileInfo $oldAndNewFileInfo) : string
{
$oldFileInfo = $oldAndNewFileInfo->getOldFileInfo();
$newFileInfo = $oldAndNewFileInfo->getNewFileInfo();
$diff = $this->differ->diff($oldFileInfo->getContents(), $newFileInfo->getContents());
$patchedFileRelativePath = $this->resolveFileInfoPathRelativeFilePath($newFileInfo);
$diff = \RectorPrefix20210708\Nette\Utils\Strings::replace($diff, self::START_ORIGINAL_REGEX, '--- /dev/null');
return \RectorPrefix20210708\Nette\Utils\Strings::replace($diff, self::START_NEW_REGEX, '+++ ' . $patchedFileRelativePath);
}
private function resolveFileInfoPathRelativeFilePath(\Symplify\SmartFileSystem\SmartFileInfo $beforeFileInfo) : string
{
$match = \RectorPrefix20210708\Nette\Utils\Strings::match($beforeFileInfo->getRealPath(), self::LOCAL_PATH_REGEX);
if (!isset($match['local_path'])) {
throw new \RectorPrefix20210708\Symplify\SymplifyKernel\Exception\ShouldNotHappenException();
}
return '../' . $match['local_path'];
}
}

View File

@ -1,9 +0,0 @@
<?php
declare (strict_types=1);
namespace RectorPrefix20210708\Symplify\VendorPatches\Exception;
use Exception;
final class ShouldNotHappenException extends \Exception
{
}

View File

@ -1,24 +0,0 @@
<?php
declare (strict_types=1);
namespace RectorPrefix20210708\Symplify\VendorPatches\FileSystem;
use RectorPrefix20210708\Nette\Utils\Strings;
use Symplify\SmartFileSystem\SmartFileInfo;
use RectorPrefix20210708\Symplify\SymplifyKernel\Exception\ShouldNotHappenException;
final class PathResolver
{
/**
* @see https://regex101.com/r/KhzCSu/1
* @var string
*/
private const VENDOR_PACKAGE_DIRECTORY_REGEX = '#^(?<vendor_package_directory>.*?vendor\\/(\\w|\\.|\\-)+\\/(\\w|\\.|\\-)+)\\/#si';
public function resolveVendorDirectory(\Symplify\SmartFileSystem\SmartFileInfo $fileInfo) : string
{
$match = \RectorPrefix20210708\Nette\Utils\Strings::match($fileInfo->getRealPath(), self::VENDOR_PACKAGE_DIRECTORY_REGEX);
if (!isset($match['vendor_package_directory'])) {
throw new \RectorPrefix20210708\Symplify\SymplifyKernel\Exception\ShouldNotHappenException('Could not resolve vendor package directory');
}
return $match['vendor_package_directory'];
}
}

View File

@ -1,52 +0,0 @@
<?php
declare (strict_types=1);
namespace RectorPrefix20210708\Symplify\VendorPatches\Finder;
use RectorPrefix20210708\Symfony\Component\Finder\Finder;
use RectorPrefix20210708\Symplify\SmartFileSystem\Finder\FinderSanitizer;
use Symplify\SmartFileSystem\SmartFileInfo;
use RectorPrefix20210708\Symplify\VendorPatches\Composer\PackageNameResolver;
use RectorPrefix20210708\Symplify\VendorPatches\ValueObject\OldAndNewFileInfo;
final class OldToNewFilesFinder
{
/**
* @var \Symplify\SmartFileSystem\Finder\FinderSanitizer
*/
private $finderSanitizer;
/**
* @var \Symplify\VendorPatches\Composer\PackageNameResolver
*/
private $packageNameResolver;
public function __construct(\RectorPrefix20210708\Symplify\SmartFileSystem\Finder\FinderSanitizer $finderSanitizer, \RectorPrefix20210708\Symplify\VendorPatches\Composer\PackageNameResolver $packageNameResolver)
{
$this->finderSanitizer = $finderSanitizer;
$this->packageNameResolver = $packageNameResolver;
}
/**
* @return OldAndNewFileInfo[]
*/
public function find(string $directory) : array
{
$oldAndNewFileInfos = [];
$oldFileInfos = $this->findSmartFileInfosInDirectory($directory);
foreach ($oldFileInfos as $oldFileInfo) {
$newFilePath = \rtrim($oldFileInfo->getRealPath(), '.old');
if (!\file_exists($newFilePath)) {
continue;
}
$newFileInfo = new \Symplify\SmartFileSystem\SmartFileInfo($newFilePath);
$packageName = $this->packageNameResolver->resolveFromFileInfo($newFileInfo);
$oldAndNewFileInfos[] = new \RectorPrefix20210708\Symplify\VendorPatches\ValueObject\OldAndNewFileInfo($oldFileInfo, $newFileInfo, $packageName);
}
return $oldAndNewFileInfos;
}
/**
* @return SmartFileInfo[]
*/
private function findSmartFileInfosInDirectory(string $directory) : array
{
$finder = \RectorPrefix20210708\Symfony\Component\Finder\Finder::create()->in($directory)->files()->exclude('composer/')->exclude('ocramius/')->name('*.old');
return $this->finderSanitizer->sanitize($finder);
}
}

View File

@ -1,27 +0,0 @@
<?php
declare (strict_types=1);
namespace RectorPrefix20210708\Symplify\VendorPatches\HttpKernel;
use RectorPrefix20210708\Symfony\Component\Config\Loader\LoaderInterface;
use RectorPrefix20210708\Symfony\Component\HttpKernel\Bundle\BundleInterface;
use RectorPrefix20210708\Symplify\ComposerJsonManipulator\Bundle\ComposerJsonManipulatorBundle;
use RectorPrefix20210708\Symplify\SymplifyKernel\Bundle\SymplifyKernelBundle;
use RectorPrefix20210708\Symplify\SymplifyKernel\HttpKernel\AbstractSymplifyKernel;
final class VendorPatchesKernel extends \RectorPrefix20210708\Symplify\SymplifyKernel\HttpKernel\AbstractSymplifyKernel
{
/**
* @param \Symfony\Component\Config\Loader\LoaderInterface $loader
*/
public function registerContainerConfiguration($loader) : void
{
$loader->load(__DIR__ . '/../../config/config.php');
}
/**
* @return BundleInterface[]
*/
public function registerBundles() : iterable
{
return [new \RectorPrefix20210708\Symplify\SymplifyKernel\Bundle\SymplifyKernelBundle(), new \RectorPrefix20210708\Symplify\ComposerJsonManipulator\Bundle\ComposerJsonManipulatorBundle()];
}
}

View File

@ -1,18 +0,0 @@
<?php
declare (strict_types=1);
namespace RectorPrefix20210708\Symplify\VendorPatches;
use RectorPrefix20210708\Nette\Utils\Strings;
use RectorPrefix20210708\Symplify\VendorPatches\ValueObject\OldAndNewFileInfo;
final class PatchFileFactory
{
public function createPatchFilePath(\RectorPrefix20210708\Symplify\VendorPatches\ValueObject\OldAndNewFileInfo $oldAndNewFileInfo, string $vendorDirectory) : string
{
$newFileInfo = $oldAndNewFileInfo->getNewFileInfo();
$inVendorRelativeFilePath = $newFileInfo->getRelativeFilePathFromDirectory($vendorDirectory);
$relativeFilePathWithoutSuffix = \RectorPrefix20210708\Nette\Utils\Strings::lower($inVendorRelativeFilePath);
$pathFileName = \RectorPrefix20210708\Nette\Utils\Strings::webalize($relativeFilePathWithoutSuffix) . '.patch';
return 'patches' . \DIRECTORY_SEPARATOR . $pathFileName;
}
}

View File

@ -1,51 +0,0 @@
<?php
declare (strict_types=1);
namespace RectorPrefix20210708\Symplify\VendorPatches\ValueObject;
use Symplify\SmartFileSystem\SmartFileInfo;
final class OldAndNewFileInfo
{
/**
* @var \Symplify\SmartFileSystem\SmartFileInfo
*/
private $oldFileInfo;
/**
* @var \Symplify\SmartFileSystem\SmartFileInfo
*/
private $newFileInfo;
/**
* @var string
*/
private $packageName;
public function __construct(\Symplify\SmartFileSystem\SmartFileInfo $oldFileInfo, \Symplify\SmartFileSystem\SmartFileInfo $newFileInfo, string $packageName)
{
$this->oldFileInfo = $oldFileInfo;
$this->newFileInfo = $newFileInfo;
$this->packageName = $packageName;
}
public function getOldFileInfo() : \Symplify\SmartFileSystem\SmartFileInfo
{
return $this->oldFileInfo;
}
public function getOldFileRelativePath() : string
{
return $this->oldFileInfo->getRelativeFilePathFromCwd();
}
public function getNewFileRelativePath() : string
{
return $this->newFileInfo->getRelativeFilePathFromCwd();
}
public function getNewFileInfo() : \Symplify\SmartFileSystem\SmartFileInfo
{
return $this->newFileInfo;
}
public function isContentIdentical() : bool
{
return $this->newFileInfo->getContents() === $this->oldFileInfo->getContents();
}
public function getPackageName() : string
{
return $this->packageName;
}
}