diff --git a/datamodels/2.x/combodo-data-feature-removal/src/Controller/DataFeatureRemovalController.php b/datamodels/2.x/combodo-data-feature-removal/src/Controller/DataFeatureRemovalController.php index d92ca9077a..6a992463d0 100644 --- a/datamodels/2.x/combodo-data-feature-removal/src/Controller/DataFeatureRemovalController.php +++ b/datamodels/2.x/combodo-data-feature-removal/src/Controller/DataFeatureRemovalController.php @@ -88,11 +88,10 @@ class DataFeatureRemovalController extends Controller private function Analyze(): void { $sSourceEnv = MetaModel::GetEnvironment(); - $oDryRemovalRuntimeEnvironment = new DryRemovalRuntimeEnvironment(); - $oDryRemovalRuntimeEnvironment->Prepare($sSourceEnv, $this->aSelectedExtensionsForCheck); + $oDryRemovalRuntimeEnvironment = new DryRemovalRuntimeEnvironment($sSourceEnv, $this->aSelectedExtensionsForCheck); $oDryRemovalRuntimeEnvironment->CompileFrom($sSourceEnv); - $oSetupAudit = new SetupAudit($sSourceEnv, DryRemovalRuntimeEnvironment::DRY_REMOVAL_AUDIT_ENV); + $oSetupAudit = new SetupAudit($sSourceEnv); $aGetRemovedClasses = $oSetupAudit->GetIssues(); IssueLog::Debug(__METHOD__, null, ['aGetRemovedClasses' => $aGetRemovedClasses]); $this->aCountClassesToCleanup = $aGetRemovedClasses; diff --git a/setup/feature_removal/DryRemovalRuntimeEnvironment.php b/setup/feature_removal/DryRemovalRuntimeEnvironment.php index 25b28fc52d..e48467a791 100644 --- a/setup/feature_removal/DryRemovalRuntimeEnvironment.php +++ b/setup/feature_removal/DryRemovalRuntimeEnvironment.php @@ -14,45 +14,35 @@ use utils; class DryRemovalRuntimeEnvironment extends RunTimeEnvironment { - public const DRY_REMOVAL_AUDIT_ENV = "extension-removal"; - protected array $aExtensionsByCode; /** * Toolset for building a run-time environment * - * @param string $sEnvironment (e.g. 'test') - * @param bool $bAutoCommit (make the target environment directly, or build a temporary one) + * @param string $sSourceEnv: environment from which setup is inspired to simulate extension removal and usee CompileFrom... */ - public function __construct($sEnvironment = self::DRY_REMOVAL_AUDIT_ENV, $bAutoCommit = true) + public function __construct($sSourceEnv = 'production', array $aExtensionCodesToRemove = []) { - parent::__construct($sEnvironment, $bAutoCommit); - $this->aExtensionsByCode = []; + parent::__construct($sSourceEnv, false); + $this->aExtensionsByCode = $aExtensionCodesToRemove; + $this->Prepare($sSourceEnv, $this->sTargetEnv); } /** - * @param string $sSourceEnv - * @param array $aExtensionCodesToRemove - * - * @return void - * @throws \Exception + * @param string $sSourceEnv + * @param string $sTargetEnv + * @return void + * @throws \MissingDependencyException */ - public function Prepare(string $sSourceEnv, array $aExtensionCodesToRemove) + private function Prepare(string $sSourceEnv, string $sTargetEnv) { - - $sEnv = $this->sFinalEnv; - $this->aExtensionsByCode = $aExtensionCodesToRemove; - $this->Cleanup(); - SetupUtils::copydir(APPROOT."/data/$sSourceEnv-modules", APPROOT."/data/$sEnv-modules"); + SetupUtils::copydir(APPROOT."/data/$sSourceEnv-modules", APPROOT."/data/$sTargetEnv-modules"); + SetupUtils::copydir(APPROOT."/conf/$sSourceEnv", APPROOT."/conf/$sTargetEnv"); - $this->DeclareExtensionAsRemoved($aExtensionCodesToRemove); + $this->DeclareExtensionAsRemoved($this->aExtensionsByCode); - $oDryRemovalConfig = clone(MetaModel::GetConfig()); - $oDryRemovalConfig->ChangeModulesPath($sSourceEnv, $this->sFinalEnv); - $this->WriteConfigFileSafe($oDryRemovalConfig); - - $sSourceDir = $oDryRemovalConfig->Get('source_dir'); + $sSourceDir = MetaModel::GetConfig()->Get('source_dir'); $aSearchDirs = $this->GetExtraDirsToCompile($sSourceDir); $aModulesToLoad = $this->GetModulesToLoad($sSourceEnv, $aSearchDirs); @@ -67,7 +57,7 @@ class DryRemovalRuntimeEnvironment extends RunTimeEnvironment private function DeclareExtensionAsRemoved(array $aExtensionCodes): void { - $oExtensionsMap = new iTopExtensionsMap($this->sFinalEnv); + $oExtensionsMap = new iTopExtensionsMap($this->sTargetEnv); $oExtensionsMap->DeclareExtensionAsRemoved($aExtensionCodes); } @@ -92,13 +82,31 @@ class DryRemovalRuntimeEnvironment extends RunTimeEnvironment return $aModulesToLoad; } - public function Cleanup() + public function Cleanup(): void { - $sEnv = $this->sFinalEnv; - SetupUtils::rrmdir(APPROOT."/data/$sEnv-modules"); - SetupUtils::rrmdir(APPROOT."/data/cache-$sEnv"); - SetupUtils::rrmdir(APPROOT."/env-$sEnv"); - SetupUtils::rrmdir(APPROOT."/conf/$sEnv"); - @unlink(APPROOT."/data/datamodel-$sEnv.xml"); + $sEnv = $this->sTargetEnv; + + //keep this folder empty + SetupUtils::tidydir(APPROOT."/env-$sEnv"); + + $aFolders = [ + APPROOT."/data/$sEnv-modules", + APPROOT."/data/cache-$sEnv", + APPROOT."/conf/$sEnv", + ]; + foreach ($aFolders as $sFolder) { + SetupUtils::tidydir($sFolder); + SetupUtils::rmdir_safe($sFolder); + } + + $sFiles = [ + APPROOT."/data/datamodel-$sEnv.xml", + APPROOT."/data/$sEnv.delta.prev.xml", + ]; + foreach ($sFiles as $sFile) { + if (is_file($sFile)) { + @unlink($sFile); + } + } } } diff --git a/setup/feature_removal/SetupAudit.php b/setup/feature_removal/SetupAudit.php index 3919a5f6af..7cdcaa3a26 100644 --- a/setup/feature_removal/SetupAudit.php +++ b/setup/feature_removal/SetupAudit.php @@ -7,17 +7,14 @@ require_once APPROOT.'setup/feature_removal/ModelReflectionSerializer.php'; class SetupAudit extends AbstractSetupAudit { - //file used when present to trigger audit exception when testing specific setups - public const GETISSUE_ERROR_MSG_FILE_FORTESTONLY = '.setup_audit_error_msg.txt'; - private string $sEnvBefore; private string $sEnvAfter; - public function __construct(string $sEnvBefore, string $sEnvAfter) + public function __construct(string $sEnvBefore) { parent::__construct(); $this->sEnvBefore = $sEnvBefore; - $this->sEnvAfter = $sEnvAfter; + $this->sEnvAfter = "$sEnvBefore-build"; } public function ComputeClasses(): void diff --git a/setup/sequencers/DataAuditSequencer.php b/setup/sequencers/DataAuditSequencer.php index a65ed6920f..bea3bf0f80 100644 --- a/setup/sequencers/DataAuditSequencer.php +++ b/setup/sequencers/DataAuditSequencer.php @@ -25,6 +25,7 @@ require_once APPROOT.'setup/feature_removal/SetupAudit.php'; require_once(APPROOT.'setup/sequencers/StepSequencer.php'); require_once(APPROOT.'setup/sequencers/ApplicationInstallSequencer.php'); +use Combodo\iTop\Setup\FeatureRemoval\DryRemovalRuntimeEnvironment; use Combodo\iTop\Setup\FeatureRemoval\SetupAudit; class DataAuditSequencer extends ApplicationInstallSequencer @@ -34,7 +35,7 @@ class DataAuditSequencer extends ApplicationInstallSequencer protected function GetTempEnv() { $sTargetEnv = $this->GetTargetEnv(); - return 'dry-'.$sTargetEnv; + return $sTargetEnv.'-build'; } protected function GetTargetDir() @@ -177,10 +178,9 @@ class DataAuditSequencer extends ApplicationInstallSequencer */ $oContextTag = new ContextTag(ContextTag::TAG_SETUP); - $sTargetEnvironment = $this->GetTempEnv(); $sPreviousEnvironment = $this->GetTargetEnv(); - $oSetupAudit = new SetupAudit($sPreviousEnvironment, $sTargetEnvironment); + $oSetupAudit = new SetupAudit($sPreviousEnvironment); //Make sure the MetaModel is started before analysing for issues $sConfFile = utils::GetConfigFilePath($sPreviousEnvironment); @@ -195,8 +195,29 @@ class DataAuditSequencer extends ApplicationInstallSequencer protected function DoCleanup() { - $sDestination = APPROOT.$this->GetTargetDir(); - SetupUtils::tidydir($sDestination); - SetupUtils::rmdir_safe($sDestination); + $sEnv = $this->GetTempEnv(); + + //keep this folder empty + SetupUtils::tidydir(APPROOT."/env-$sEnv"); + + $aFolders = [ + APPROOT."/data/$sEnv-modules", + APPROOT."/data/cache-$sEnv", + APPROOT."/conf/$sEnv", + ]; + foreach ($aFolders as $sFolder) { + SetupUtils::tidydir($sFolder); + SetupUtils::rmdir_safe($sFolder); + } + + $sFiles = [ + APPROOT."/data/datamodel-$sEnv.xml", + APPROOT."/data/$sEnv.delta.prev.xml", + ]; + foreach ($sFiles as $sFile) { + if (is_file($sFile)) { + @unlink($sFile); + } + } } } diff --git a/tests/php-unit-tests/unitary-tests/setup/feature_removal/SetupAuditTest.php b/tests/php-unit-tests/unitary-tests/setup/feature_removal/SetupAuditTest.php index 4fe0014942..ec83a13fc0 100644 --- a/tests/php-unit-tests/unitary-tests/setup/feature_removal/SetupAuditTest.php +++ b/tests/php-unit-tests/unitary-tests/setup/feature_removal/SetupAuditTest.php @@ -51,11 +51,10 @@ class SetupAuditTest extends ItopCustomDatamodelTestCase public function testComputeDryRemoval() { - $oDryRemovalRuntimeEnvt = new DryRemovalRuntimeEnvironment(); - $oDryRemovalRuntimeEnvt->Prepare($this->GetTestEnvironment(), ['nominal_ext1', 'finalclass_ext2']); + $oDryRemovalRuntimeEnvt = new DryRemovalRuntimeEnvironment($this->GetTestEnvironment(), ['nominal_ext1', 'finalclass_ext2']); $oDryRemovalRuntimeEnvt->CompileFrom($this->GetTestEnvironment()); - $oSetupAudit = new SetupAudit(MetaModel::GetEnvironment(), DryRemovalRuntimeEnvironment::DRY_REMOVAL_AUDIT_ENV); + $oSetupAudit = new SetupAudit(MetaModel::GetEnvironment()); $expected = [ "Feature1Module1MyClass", @@ -88,7 +87,7 @@ class SetupAuditTest extends ItopCustomDatamodelTestCase $oOrg = $this->CreateOrganization($sUID); $this->createObject('FinalClassFeature1Module1MyFinalClassFromLocation', ['org_id' => $oOrg->GetKey(), 'name' => $sUID, 'name2' => uniqid()]); - $oSetupAudit = new SetupAudit(MetaModel::GetEnvironment(), DryRemovalRuntimeEnvironment::DRY_REMOVAL_AUDIT_ENV); + $oSetupAudit = new SetupAudit(MetaModel::GetEnvironment()); $aRemovedClasses = [ "Feature1Module1MyClass", "FinalClassFeature1Module1MyClass", @@ -114,7 +113,7 @@ class SetupAuditTest extends ItopCustomDatamodelTestCase $this->createObject('FinalClassFeature1Module1MyFinalClassFromLocation', ['org_id' => $oOrg->GetKey(), 'name' => $sUID, 'name2' => uniqid()]); $this->createObject('FinalClassFeature2Module1MyFinalClassFromLocation', ['org_id' => $oOrg->GetKey(), 'name' => $sUID, 'name2' => uniqid()]); - $oSetupAudit = new SetupAudit(MetaModel::GetEnvironment(), DryRemovalRuntimeEnvironment::DRY_REMOVAL_AUDIT_ENV); + $oSetupAudit = new SetupAudit(MetaModel::GetEnvironment()); $aRemovedClasses = [ "Feature1Module1MyClass", "FinalClassFeature1Module1MyClass",