trm-core 9.10.5 → 10.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -0
- package/changelog.txt +3 -2
- package/dist/actions/cg3y/download.js +34 -4
- package/dist/actions/cg3y/index.d.ts +23 -0
- package/dist/actions/cg3y/index.js +13 -10
- package/dist/actions/cg3z/index.d.ts +67 -3
- package/dist/actions/cg3z/index.js +25 -14
- package/dist/actions/cg3z/upload.d.ts +20 -0
- package/dist/actions/cg3z/upload.js +165 -36
- package/dist/actions/checkEngines/analyze.d.ts +11 -0
- package/dist/actions/checkEngines/analyze.js +294 -0
- package/dist/actions/checkEngines/index.d.ts +87 -0
- package/dist/actions/checkEngines/index.js +38 -0
- package/dist/actions/checkEngines/init.d.ts +11 -0
- package/dist/actions/checkEngines/init.js +45 -0
- package/dist/actions/checkPackageDependencies/analyze.d.ts +10 -0
- package/dist/actions/checkPackageDependencies/analyze.js +37 -39
- package/dist/actions/checkPackageDependencies/index.d.ts +56 -0
- package/dist/actions/checkPackageDependencies/index.js +13 -10
- package/dist/actions/checkPackageDependencies/init.d.ts +8 -0
- package/dist/actions/checkPackageDependencies/init.js +24 -2
- package/dist/actions/checkSapEntries/analyze.d.ts +12 -0
- package/dist/actions/checkSapEntries/analyze.js +63 -47
- package/dist/actions/checkSapEntries/index.d.ts +35 -0
- package/dist/actions/checkSapEntries/index.js +12 -10
- package/dist/actions/checkSapEntries/init.d.ts +8 -0
- package/dist/actions/checkSapEntries/init.js +10 -2
- package/dist/actions/commons/IActionContext.d.ts +10 -0
- package/dist/actions/commons/checkServerAuth.d.ts +7 -0
- package/dist/actions/commons/checkServerAuth.js +10 -5
- package/dist/actions/commons/index.d.ts +1 -1
- package/dist/actions/commons/index.js +1 -1
- package/dist/actions/commons/prompts/index.d.ts +1 -0
- package/dist/actions/commons/prompts/index.js +1 -0
- package/dist/actions/commons/prompts/setLandscapeTarget.d.ts +14 -0
- package/dist/actions/commons/prompts/setLandscapeTarget.js +40 -0
- package/dist/actions/commons/prompts/setTransportTarget.d.ts +15 -0
- package/dist/actions/commons/prompts/setTransportTarget.js +20 -2
- package/dist/actions/commons/setSystemPackages.d.ts +7 -0
- package/dist/actions/commons/setSystemPackages.js +12 -2
- package/dist/actions/commons/utils/actionLocks.d.ts +32 -0
- package/dist/actions/commons/utils/actionLocks.js +135 -0
- package/dist/actions/commons/utils/dirtyEntries.d.ts +12 -0
- package/dist/actions/commons/utils/dirtyEntries.js +54 -0
- package/dist/actions/commons/utils/index.d.ts +10 -0
- package/dist/actions/commons/utils/index.js +26 -0
- package/dist/actions/commons/utils/installRegistry.d.ts +18 -0
- package/dist/actions/commons/utils/installRegistry.js +46 -0
- package/dist/actions/commons/utils/installedDependency.d.ts +15 -0
- package/dist/actions/commons/utils/installedDependency.js +30 -0
- package/dist/actions/commons/utils/owningInstallation.d.ts +6 -0
- package/dist/actions/commons/utils/owningInstallation.js +47 -0
- package/dist/actions/commons/utils/packageCleanup.d.ts +168 -0
- package/dist/actions/commons/utils/packageCleanup.js +1017 -0
- package/dist/actions/commons/utils/releaseDeletionTransport.d.ts +5 -0
- package/dist/actions/commons/utils/releaseDeletionTransport.js +67 -0
- package/dist/actions/commons/utils/restoreTransport.d.ts +6 -0
- package/dist/actions/commons/utils/restoreTransport.js +50 -0
- package/dist/actions/commons/utils/retainedWorkflow.d.ts +6 -0
- package/dist/actions/commons/utils/retainedWorkflow.js +49 -0
- package/dist/actions/commons/utils/withScopedPrefix.d.ts +5 -0
- package/dist/actions/commons/utils/withScopedPrefix.js +32 -0
- package/dist/actions/commons/workflowCallbacks.d.ts +21 -0
- package/dist/actions/commons/workflowCallbacks.js +157 -0
- package/dist/actions/index.d.ts +3 -0
- package/dist/actions/index.js +5 -0
- package/dist/actions/install/addNamespace.d.ts +18 -0
- package/dist/actions/install/addNamespace.js +121 -51
- package/dist/actions/install/checkDependants.d.ts +15 -0
- package/dist/actions/install/checkDependants.js +74 -0
- package/dist/actions/install/checkDependencies.d.ts +11 -0
- package/dist/actions/install/checkDependencies.js +32 -13
- package/dist/actions/install/checkDependencyCycles.d.ts +17 -0
- package/dist/actions/install/checkDependencyCycles.js +105 -0
- package/dist/actions/install/checkEngines.d.ts +11 -0
- package/dist/actions/install/checkEngines.js +100 -0
- package/dist/actions/install/checkInstallDevclass.d.ts +24 -0
- package/dist/actions/install/checkInstallDevclass.js +110 -0
- package/dist/actions/install/checkSapEntries.d.ts +9 -0
- package/dist/actions/install/checkSapEntries.js +20 -12
- package/dist/actions/install/checkTransports.d.ts +34 -0
- package/dist/actions/install/checkTransports.js +329 -170
- package/dist/actions/install/cleanupCheckpoint.d.ts +11 -0
- package/dist/actions/install/cleanupCheckpoint.js +62 -0
- package/dist/actions/install/defaultTransportLayer.d.ts +5 -0
- package/dist/actions/install/defaultTransportLayer.js +36 -0
- package/dist/actions/install/executePostActivities.d.ts +6 -0
- package/dist/actions/install/executePostActivities.js +28 -38
- package/dist/actions/install/generateDevclass.d.ts +10 -0
- package/dist/actions/install/generateDevclass.js +66 -20
- package/dist/actions/install/generateLandscapeTransport.d.ts +23 -0
- package/dist/actions/install/generateLandscapeTransport.js +136 -0
- package/dist/actions/install/generateUpdateTransport.d.ts +20 -0
- package/dist/actions/install/generateUpdateTransport.js +122 -0
- package/dist/actions/install/importBatch.d.ts +22 -0
- package/dist/actions/install/importBatch.js +0 -0
- package/dist/actions/install/index.d.ts +273 -44
- package/dist/actions/install/index.js +139 -59
- package/dist/actions/install/init.d.ts +14 -0
- package/dist/actions/install/init.js +215 -108
- package/dist/actions/install/installDependencies.d.ts +14 -0
- package/dist/actions/install/installDependencies.js +122 -45
- package/dist/actions/install/lockResources.d.ts +8 -0
- package/dist/actions/install/lockResources.js +100 -0
- package/dist/actions/install/prepareCust.d.ts +13 -0
- package/dist/actions/install/prepareCust.js +138 -0
- package/dist/actions/install/prepareDevc.d.ts +15 -0
- package/dist/actions/install/prepareDevc.js +113 -0
- package/dist/actions/install/prepareLang.d.ts +13 -0
- package/dist/actions/install/prepareLang.js +110 -0
- package/dist/actions/install/prepareTadir.d.ts +13 -0
- package/dist/actions/install/prepareTadir.js +95 -0
- package/dist/actions/install/releaseLandscapeTransport.d.ts +11 -0
- package/dist/actions/install/releaseLandscapeTransport.js +79 -0
- package/dist/actions/install/setInstallDevclass.d.ts +10 -0
- package/dist/actions/install/setInstallDevclass.js +140 -54
- package/dist/actions/install/updatePackageData.d.ts +9 -0
- package/dist/actions/install/updatePackageData.js +117 -13
- package/dist/actions/installDependency/checkInstalledRelease.d.ts +13 -0
- package/dist/actions/installDependency/checkInstalledRelease.js +50 -0
- package/dist/actions/installDependency/confirmDowngrade.d.ts +11 -0
- package/dist/actions/installDependency/confirmDowngrade.js +53 -0
- package/dist/actions/installDependency/findInstallRelease.d.ts +24 -0
- package/dist/actions/installDependency/findInstallRelease.js +42 -19
- package/dist/actions/installDependency/index.d.ts +64 -3
- package/dist/actions/installDependency/index.js +30 -13
- package/dist/actions/installDependency/init.d.ts +14 -0
- package/dist/actions/installDependency/init.js +24 -3
- package/dist/actions/installDependency/installRelease.d.ts +6 -0
- package/dist/actions/installDependency/installRelease.js +22 -12
- package/dist/actions/publish/enginesUi.d.ts +53 -0
- package/dist/actions/publish/enginesUi.js +289 -0
- package/dist/actions/publish/findDependencies.d.ts +19 -0
- package/dist/actions/publish/findDependencies.js +72 -37
- package/dist/actions/publish/generateCustTransport.d.ts +6 -0
- package/dist/actions/publish/generateCustTransport.js +42 -19
- package/dist/actions/publish/generateDevcTransport.d.ts +6 -0
- package/dist/actions/publish/generateDevcTransport.js +16 -18
- package/dist/actions/publish/generateLangTransport.d.ts +6 -0
- package/dist/actions/publish/generateLangTransport.js +20 -23
- package/dist/actions/publish/generateTadirTransport.d.ts +6 -0
- package/dist/actions/publish/generateTadirTransport.js +18 -17
- package/dist/actions/publish/getSystemEngines.d.ts +27 -0
- package/dist/actions/publish/getSystemEngines.js +112 -0
- package/dist/actions/publish/index.d.ts +162 -37
- package/dist/actions/publish/index.js +51 -34
- package/dist/actions/publish/init.d.ts +28 -0
- package/dist/actions/publish/init.js +304 -120
- package/dist/actions/publish/lockResources.d.ts +4 -0
- package/dist/actions/{install/refreshTmsTxt.js → publish/lockResources.js} +14 -17
- package/dist/actions/publish/publishToRegistry.d.ts +8 -0
- package/dist/actions/publish/publishToRegistry.js +18 -8
- package/dist/actions/publish/releaseTransports.d.ts +6 -0
- package/dist/actions/publish/releaseTransports.js +48 -20
- package/dist/actions/publish/setCustomizingTransports.d.ts +6 -0
- package/dist/actions/publish/setCustomizingTransports.js +227 -101
- package/dist/actions/publish/setManifestValues.d.ts +22 -0
- package/dist/actions/publish/setManifestValues.js +455 -119
- package/dist/actions/publish/setOptionalPublishData.d.ts +11 -0
- package/dist/actions/publish/setOptionalPublishData.js +133 -0
- package/dist/actions/publish/updatePackageData.d.ts +8 -0
- package/dist/actions/publish/updatePackageData.js +20 -7
- package/dist/actions/stopWarning.d.ts +5 -0
- package/dist/actions/stopWarning.js +5 -0
- package/dist/actions/uninstall/checkDependants.d.ts +7 -0
- package/dist/actions/uninstall/checkDependants.js +55 -0
- package/dist/actions/uninstall/forwardDeletionTransport.d.ts +10 -0
- package/dist/actions/uninstall/forwardDeletionTransport.js +51 -0
- package/dist/actions/uninstall/generateDeletionTransport.d.ts +10 -0
- package/dist/actions/uninstall/generateDeletionTransport.js +45 -0
- package/dist/actions/uninstall/index.d.ts +153 -0
- package/dist/actions/uninstall/index.js +141 -0
- package/dist/actions/uninstall/init.d.ts +17 -0
- package/dist/actions/uninstall/init.js +146 -0
- package/dist/actions/uninstall/lockResources.d.ts +4 -0
- package/dist/actions/{publish/setTransportTarget.js → uninstall/lockResources.js} +16 -7
- package/dist/actions/uninstall/removePackageData.d.ts +9 -0
- package/dist/actions/uninstall/removePackageData.js +64 -0
- package/dist/actions/uninstall/uninstallNestedPackages.d.ts +26 -0
- package/dist/actions/uninstall/uninstallNestedPackages.js +174 -0
- package/dist/client/ClientError.d.ts +3 -1
- package/dist/client/ClientError.js +2 -1
- package/dist/client/RESTClient.d.ts +18 -5
- package/dist/client/RESTClient.js +194 -56
- package/dist/client/RESTClientError.d.ts +1 -2
- package/dist/client/RESTClientError.js +3 -2
- package/dist/client/RFCClient.d.ts +28 -7
- package/dist/client/RFCClient.js +325 -77
- package/dist/client/RFCClientError.d.ts +1 -1
- package/dist/client/RFCClientError.js +2 -2
- package/dist/client/TransportEntries.d.ts +8 -0
- package/dist/client/TransportEntries.js +2 -0
- package/dist/client/components/BORM_ID.d.ts +1 -0
- package/dist/client/components/BORM_ID.js +2 -0
- package/dist/client/components/BORM_NAME.d.ts +1 -0
- package/dist/client/components/BORM_NAME.js +2 -0
- package/dist/client/components/BORM_NAMEL.d.ts +1 -0
- package/dist/client/components/BORM_NAMEL.js +2 -0
- package/dist/client/components/BORM_VEND.d.ts +1 -0
- package/dist/client/components/BORM_VEND.js +2 -0
- package/dist/client/components/BORM_VERS.d.ts +1 -0
- package/dist/client/components/BORM_VERS.js +2 -0
- package/dist/client/components/CWBNTNUMM.d.ts +1 -0
- package/dist/client/components/CWBNTNUMM.js +2 -0
- package/dist/client/components/CWBNTSTAT.d.ts +1 -0
- package/dist/client/components/CWBNTSTAT.js +2 -0
- package/dist/client/components/CWBNTVERS.d.ts +1 -0
- package/dist/client/components/CWBNTVERS.js +2 -0
- package/dist/client/components/CWBPRSTAT.d.ts +1 -0
- package/dist/client/components/CWBPRSTAT.js +2 -0
- package/dist/client/components/INSTSTATE.d.ts +1 -0
- package/dist/client/components/INSTSTATE.js +2 -0
- package/dist/client/components/RELC_TYPE.d.ts +1 -0
- package/dist/client/components/RELC_TYPE.js +2 -0
- package/dist/client/components/SAPPATCHLV.d.ts +1 -0
- package/dist/client/components/SAPPATCHLV.js +2 -0
- package/dist/client/components/SAPRELEASE.d.ts +1 -0
- package/dist/client/components/SAPRELEASE.js +2 -0
- package/dist/client/components/SYSYSID.d.ts +1 -0
- package/dist/client/components/SYSYSID.js +2 -0
- package/dist/client/components/ZTRM_INSTALLTR_TYPE.d.ts +1 -0
- package/dist/client/components/ZTRM_INSTALLTR_TYPE.js +2 -0
- package/dist/client/components/index.d.ts +15 -0
- package/dist/client/components/index.js +15 -0
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.js +1 -0
- package/dist/client/messageLog.d.ts +7 -0
- package/dist/client/messageLog.js +21 -0
- package/dist/client/struct/ActionLockKey.d.ts +6 -0
- package/dist/client/struct/ActionLockKey.js +2 -0
- package/dist/client/struct/CVERS.d.ts +7 -0
- package/dist/client/struct/CVERS.js +2 -0
- package/dist/client/struct/CWBNTCUST.d.ts +6 -0
- package/dist/client/struct/CWBNTCUST.js +2 -0
- package/dist/client/struct/CWBNTHEAD.d.ts +5 -0
- package/dist/client/struct/CWBNTHEAD.js +2 -0
- package/dist/client/struct/E070.d.ts +2 -1
- package/dist/client/struct/E071K.d.ts +9 -0
- package/dist/client/struct/E071K.js +2 -0
- package/dist/client/struct/PRDVERS.d.ts +9 -0
- package/dist/client/struct/PRDVERS.js +2 -0
- package/dist/client/struct/SCOMPKDTLN.d.ts +21 -0
- package/dist/client/struct/STMSCALERT.d.ts +21 -0
- package/dist/client/struct/STMSCALERT.js +2 -0
- package/dist/client/struct/STMS_TP_IMPORT.d.ts +14 -0
- package/dist/client/struct/STMS_TP_IMPORT.js +2 -0
- package/dist/client/struct/STMS_TR_REQUEST.d.ts +8 -0
- package/dist/client/struct/STMS_TR_REQUEST.js +2 -0
- package/dist/client/struct/TDEVC.d.ts +38 -0
- package/dist/client/struct/TPLOGPTR.d.ts +13 -0
- package/dist/client/struct/TPLOGPTR.js +2 -0
- package/dist/client/struct/TPSTDOUT.d.ts +3 -0
- package/dist/client/struct/TPSTDOUT.js +2 -0
- package/dist/client/struct/ZTRM_INSTALLTR.d.ts +8 -0
- package/dist/client/struct/ZTRM_INSTALLTR.js +2 -0
- package/dist/client/struct/index.d.ts +12 -0
- package/dist/client/struct/index.js +12 -0
- package/dist/commons/checkCoreTrmDependencies.js +1 -1
- package/dist/commons/getAxiosInstance.js +8 -17
- package/dist/commons/getNodePackage.js +7 -0
- package/dist/commons/getPackageHierarchy.js +2 -0
- package/dist/commons/getPackagesNamespace.d.ts +9 -0
- package/dist/commons/getPackagesNamespace.js +19 -0
- package/dist/commons/index.d.ts +4 -0
- package/dist/commons/index.js +4 -0
- package/dist/commons/packageDataFromTdevc.d.ts +12 -0
- package/dist/commons/packageDataFromTdevc.js +25 -0
- package/dist/commons/resolveCoreVersion.d.ts +10 -0
- package/dist/commons/resolveCoreVersion.js +24 -0
- package/dist/commons/summarizeForLog.d.ts +22 -0
- package/dist/commons/summarizeForLog.js +120 -0
- package/dist/connection/OpenRFCConnect.d.ts +13 -0
- package/dist/connection/OpenRFCConnect.js +23 -0
- package/dist/connection/index.d.ts +1 -0
- package/dist/connection/index.js +17 -0
- package/dist/dependencies/PackageDependencies.d.ts +2 -0
- package/dist/dependencies/PackageDependencies.js +24 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/lockfile/Lockfile.d.ts +23 -1
- package/dist/lockfile/Lockfile.js +45 -9
- package/dist/manifest/Manifest.d.ts +9 -5
- package/dist/manifest/Manifest.js +82 -29
- package/dist/manifest/PostActivity.js +3 -3
- package/dist/manifest/TrmManifest.d.ts +0 -2
- package/dist/manifest/TrmManifestBase.d.ts +2 -0
- package/dist/manifest/TrmManifestEngines.d.ts +64 -0
- package/dist/manifest/TrmManifestEngines.js +2 -0
- package/dist/manifest/engines/index.d.ts +2 -0
- package/dist/manifest/engines/index.js +18 -0
- package/dist/manifest/engines/sapRange.d.ts +38 -0
- package/dist/manifest/engines/sapRange.js +135 -0
- package/dist/manifest/engines/validateEngines.d.ts +44 -0
- package/dist/manifest/engines/validateEngines.js +282 -0
- package/dist/manifest/index.d.ts +3 -0
- package/dist/manifest/index.js +3 -0
- package/dist/manifest/sapEntries.d.ts +14 -0
- package/dist/manifest/sapEntries.js +63 -0
- package/dist/protocol/Protocol.js +7 -0
- package/dist/registry/AbstractRegistry.d.ts +18 -3
- package/dist/registry/FileSystem.d.ts +22 -13
- package/dist/registry/FileSystem.js +69 -18
- package/dist/registry/RegistryDeletionTransportUnauthorizedError.d.ts +4 -0
- package/dist/registry/RegistryDeletionTransportUnauthorizedError.js +12 -0
- package/dist/registry/RegistryDeletionTransportUnavailableError.d.ts +9 -0
- package/dist/registry/RegistryDeletionTransportUnavailableError.js +17 -0
- package/dist/registry/RegistryPackageNotFoundError.d.ts +7 -0
- package/dist/registry/RegistryPackageNotFoundError.js +14 -0
- package/dist/registry/RegistryV2.d.ts +15 -5
- package/dist/registry/RegistryV2.js +308 -48
- package/dist/registry/index.d.ts +4 -0
- package/dist/registry/index.js +4 -0
- package/dist/registry/registryKey.d.ts +7 -0
- package/dist/registry/registryKey.js +21 -0
- package/dist/systemConnector/ActionLock.d.ts +1 -0
- package/dist/systemConnector/ActionLock.js +2 -0
- package/dist/systemConnector/ISystemConnector.d.ts +21 -4
- package/dist/systemConnector/ISystemConnectorBase.d.ts +16 -0
- package/dist/systemConnector/InstallTransport.d.ts +6 -0
- package/dist/systemConnector/InstallTransport.js +2 -0
- package/dist/systemConnector/OpenRFCSystemConnector.d.ts +12 -0
- package/dist/systemConnector/OpenRFCSystemConnector.js +51 -0
- package/dist/systemConnector/RESTSystemConnector.d.ts +22 -7
- package/dist/systemConnector/RESTSystemConnector.js +95 -23
- package/dist/systemConnector/RFCConnection.d.ts +0 -1
- package/dist/systemConnector/RFCSystemConnector.d.ts +25 -7
- package/dist/systemConnector/RFCSystemConnector.js +75 -16
- package/dist/systemConnector/SystemConnector.d.ts +38 -6
- package/dist/systemConnector/SystemConnector.js +138 -12
- package/dist/systemConnector/SystemConnectorBase.d.ts +24 -1
- package/dist/systemConnector/SystemConnectorBase.js +174 -22
- package/dist/systemConnector/index.d.ts +3 -0
- package/dist/systemConnector/index.js +3 -0
- package/dist/transport/E071KOwner.d.ts +10 -0
- package/dist/transport/E071KOwner.js +15 -0
- package/dist/transport/R3transLogParser.d.ts +19 -0
- package/dist/transport/R3transLogParser.js +148 -0
- package/dist/transport/Transport.d.ts +36 -3
- package/dist/transport/Transport.js +304 -138
- package/dist/transport/index.d.ts +2 -0
- package/dist/transport/index.js +2 -0
- package/dist/trmPackage/TransportBinary.d.ts +4 -1
- package/dist/trmPackage/TrmArtifact.d.ts +12 -8
- package/dist/trmPackage/TrmArtifact.js +93 -74
- package/dist/trmPackage/TrmPackage.d.ts +20 -6
- package/dist/trmPackage/TrmPackage.js +27 -1
- package/dist/validators/validateDevclass.js +4 -0
- package/package.json +15 -7
- package/dist/actions/commons/trmServerPa.d.ts +0 -3
- package/dist/actions/commons/trmServerPa.js +0 -40
- package/dist/actions/install/checkAlreadyInstalled.d.ts +0 -3
- package/dist/actions/install/checkAlreadyInstalled.js +0 -71
- package/dist/actions/install/checkObjectTypes.d.ts +0 -3
- package/dist/actions/install/checkObjectTypes.js +0 -50
- package/dist/actions/install/checkObjectsLock.d.ts +0 -3
- package/dist/actions/install/checkObjectsLock.js +0 -52
- package/dist/actions/install/generateInstallTransports.d.ts +0 -3
- package/dist/actions/install/generateInstallTransports.js +0 -128
- package/dist/actions/install/importCustTransport.d.ts +0 -3
- package/dist/actions/install/importCustTransport.js +0 -73
- package/dist/actions/install/importDevcTransport.d.ts +0 -3
- package/dist/actions/install/importDevcTransport.js +0 -93
- package/dist/actions/install/importLangTransport.d.ts +0 -3
- package/dist/actions/install/importLangTransport.js +0 -72
- package/dist/actions/install/importTadirTransport.d.ts +0 -3
- package/dist/actions/install/importTadirTransport.js +0 -83
- package/dist/actions/install/readDevc.d.ts +0 -3
- package/dist/actions/install/readDevc.js +0 -33
- package/dist/actions/install/readTadir.d.ts +0 -3
- package/dist/actions/install/readTadir.js +0 -101
- package/dist/actions/install/refreshTmsTxt.d.ts +0 -3
- package/dist/actions/install/releaseInstallTransport.d.ts +0 -3
- package/dist/actions/install/releaseInstallTransport.js +0 -80
- package/dist/actions/publish/checkAllObjectsReleased.d.ts +0 -3
- package/dist/actions/publish/checkAllObjectsReleased.js +0 -46
- package/dist/actions/publish/getSourceCode.d.ts +0 -3
- package/dist/actions/publish/getSourceCode.js +0 -49
- package/dist/actions/publish/setChangelog.d.ts +0 -3
- package/dist/actions/publish/setChangelog.js +0 -69
- package/dist/actions/publish/setDevclass.d.ts +0 -3
- package/dist/actions/publish/setDevclass.js +0 -74
- package/dist/actions/publish/setReadme.d.ts +0 -3
- package/dist/actions/publish/setReadme.js +0 -52
- package/dist/actions/publish/setTransportTarget.d.ts +0 -3
|
@@ -0,0 +1,1017 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.getPackagesInstalledIn = getPackagesInstalledIn;
|
|
13
|
+
exports.getInstalledObjectsLocks = getInstalledObjectsLocks;
|
|
14
|
+
exports.deleteTemporaryCleanupPackages = deleteTemporaryCleanupPackages;
|
|
15
|
+
exports.deleteCleanupStagingPackages = deleteCleanupStagingPackages;
|
|
16
|
+
exports.restoreTadirAssignments = restoreTadirAssignments;
|
|
17
|
+
exports.createStagingPackage = createStagingPackage;
|
|
18
|
+
exports.cleanupInstalledPackage = cleanupInstalledPackage;
|
|
19
|
+
exports.isDeletionForwardable = isDeletionForwardable;
|
|
20
|
+
exports.forwardDeletionTransport = forwardDeletionTransport;
|
|
21
|
+
exports.removeFromImportQueue = removeFromImportQueue;
|
|
22
|
+
exports.revertForwardedDeletionTransport = revertForwardedDeletionTransport;
|
|
23
|
+
exports.revertInstalledPackageCleanup = revertInstalledPackageCleanup;
|
|
24
|
+
const trm_commons_1 = require("trm-commons");
|
|
25
|
+
const systemConnector_1 = require("../../../systemConnector");
|
|
26
|
+
const transport_1 = require("../../../transport");
|
|
27
|
+
const registry_1 = require("../../../registry");
|
|
28
|
+
const commons_1 = require("../../../commons");
|
|
29
|
+
const crypto_1 = require("crypto");
|
|
30
|
+
const releaseDeletionTransport_1 = require("./releaseDeletionTransport");
|
|
31
|
+
const restoreTransport_1 = require("./restoreTransport");
|
|
32
|
+
const withScopedPrefix_1 = require("./withScopedPrefix");
|
|
33
|
+
const actionLocks_1 = require("./actionLocks");
|
|
34
|
+
const owningInstallation_1 = require("./owningInstallation");
|
|
35
|
+
function normalize(value) {
|
|
36
|
+
return value.trim().toUpperCase();
|
|
37
|
+
}
|
|
38
|
+
function objectKey(object) {
|
|
39
|
+
return `${normalize(object.pgmid)}\u0000${normalize(object.object)}\u0000${normalize(object.objName)}`;
|
|
40
|
+
}
|
|
41
|
+
function isDevclass(object) {
|
|
42
|
+
return normalize(object.pgmid) === 'R3TR' && normalize(object.object) === 'DEVC';
|
|
43
|
+
}
|
|
44
|
+
function isNamespace(object) {
|
|
45
|
+
return normalize(object.pgmid) === 'R3TR' && normalize(object.object) === 'NSPC';
|
|
46
|
+
}
|
|
47
|
+
/** Custom (`/XXX/`) namespace of a SAP package, if any. */
|
|
48
|
+
function getCustomNamespace(devclass) {
|
|
49
|
+
try {
|
|
50
|
+
const namespace = (0, commons_1.getPackageNamespace)(devclass);
|
|
51
|
+
return namespace.startsWith('/') ? namespace : undefined;
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
// devclass doesn't use a custom namespace
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* TRM packages, other than `installed`, installed in one of `devclasses` (normalized SAP package
|
|
60
|
+
* names, usually the live subtree of the installed release).
|
|
61
|
+
*/
|
|
62
|
+
function getPackagesInstalledIn(systemPackages, installed, devclasses) {
|
|
63
|
+
const installedDevclass = normalize(installed.getDevclass() || '');
|
|
64
|
+
return systemPackages.filter(pkg => {
|
|
65
|
+
const devclass = normalize(pkg.getDevclass() || '');
|
|
66
|
+
return devclass && devclass !== installedDevclass && devclasses.has(devclass);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Objects of the installed transport the cleanup deletes, and the namespaces it carries.
|
|
71
|
+
*/
|
|
72
|
+
function readInstalledTransportObjects(installed) {
|
|
73
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
74
|
+
const installedTransportObjects = installed.getTransport()
|
|
75
|
+
? yield installed.getTransport().getE071()
|
|
76
|
+
: [];
|
|
77
|
+
// Table content (entries with E071K keys, e.g. a landscape transport carrying the CUST
|
|
78
|
+
// transports) is deleted by key through the customizing transports. Added without
|
|
79
|
+
// its keys, it would request the deletion of the whole table object.
|
|
80
|
+
const keyedObjects = new Set(installed.getTransport() && installedTransportObjects.length > 0
|
|
81
|
+
? (yield installed.getTransport().getE071K()).map(key => objectKey((0, transport_1.getE071KOwner)(key)))
|
|
82
|
+
: []);
|
|
83
|
+
return {
|
|
84
|
+
// A namespace may be used by packages outside this installation: it's only deleted
|
|
85
|
+
// through the usage check, never because the installed transport carries it.
|
|
86
|
+
previousNamespaces: installedTransportObjects.filter(object => !keyedObjects.has(objectKey(object)) && isNamespace(object)),
|
|
87
|
+
// Translations (LANG rows, e.g. a landscape transport carrying the LANG transport) are deleted
|
|
88
|
+
// with their objects: SAP rejects them as deletion entries.
|
|
89
|
+
previousTransportObjects: installedTransportObjects.filter(object => !keyedObjects.has(objectKey(object))
|
|
90
|
+
&& !isNamespace(object) && normalize(object.pgmid) !== 'LANG')
|
|
91
|
+
};
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/** SAP packages of an installed release, as they are on the system now. */
|
|
95
|
+
function readInstallationTree(installed, previousInstallPackages, previousTransportObjects, deletedObjects, systemPackages) {
|
|
96
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
97
|
+
const previousDevclasses = new Map();
|
|
98
|
+
previousInstallPackages.forEach(replacement => {
|
|
99
|
+
previousDevclasses.set(normalize(replacement.installDevclass), replacement.installDevclass);
|
|
100
|
+
});
|
|
101
|
+
// Older installations that kept the publisher package names have no replacement rows.
|
|
102
|
+
if (previousDevclasses.size === 0 && installed.getDevclass()) {
|
|
103
|
+
const previousRoot = installed.getDevclass();
|
|
104
|
+
previousDevclasses.set(normalize(previousRoot), previousRoot);
|
|
105
|
+
}
|
|
106
|
+
previousTransportObjects.forEach(object => {
|
|
107
|
+
if (isDevclass(object)) {
|
|
108
|
+
previousDevclasses.set(normalize(object.objName), object.objName);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
const installedDevclasses = new Set(previousDevclasses.keys());
|
|
112
|
+
// Installation mappings do not include subpackages created locally afterwards.
|
|
113
|
+
// Inspect the live hierarchy even when the installation keeps its root package.
|
|
114
|
+
const deletedKeys = new Set(deletedObjects.map(objectKey));
|
|
115
|
+
const packageParents = new Map();
|
|
116
|
+
for (const devclass of Array.from(previousDevclasses.values())) {
|
|
117
|
+
for (const subpackage of yield systemConnector_1.SystemConnector.getSubpackages(devclass)) {
|
|
118
|
+
if (deletedKeys.has(objectKey({ pgmid: 'R3TR', object: 'DEVC', objName: subpackage.devclass }))) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const key = normalize(subpackage.devclass);
|
|
122
|
+
previousDevclasses.set(key, subpackage.devclass);
|
|
123
|
+
if (subpackage.parentcl) {
|
|
124
|
+
packageParents.set(key, normalize(subpackage.parentcl));
|
|
125
|
+
}
|
|
126
|
+
// Without mapping rows (a published development copy, or an older installation that kept the
|
|
127
|
+
// publisher names) the installed transport doesn't list the SAP packages: the live ones are the installation's.
|
|
128
|
+
if (previousInstallPackages.length === 0) {
|
|
129
|
+
installedDevclasses.add(key);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Other TRM packages installed underneath have their own lifecycle and are ignored: the uninstall
|
|
134
|
+
// action deletes them first, an upgrade removes everything else. Their ancestors stay as packages.
|
|
135
|
+
const otherInstallations = new Map(getPackagesInstalledIn(systemPackages, installed, new Set(previousDevclasses.keys())).map(pkg => [normalize(pkg.getDevclass()), pkg]));
|
|
136
|
+
const isOtherInstallation = (devclass) => {
|
|
137
|
+
const visited = new Set();
|
|
138
|
+
let current = normalize(devclass);
|
|
139
|
+
while (current && !visited.has(current)) {
|
|
140
|
+
if (otherInstallations.has(current)) {
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
visited.add(current);
|
|
144
|
+
current = packageParents.get(current);
|
|
145
|
+
}
|
|
146
|
+
return false;
|
|
147
|
+
};
|
|
148
|
+
return { previousDevclasses, installedDevclasses, packageParents, otherInstallations, isOtherInstallation };
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Installed objects now in a SAP package outside the installation, or in the SAP package of
|
|
153
|
+
* another TRM package installed underneath.
|
|
154
|
+
*/
|
|
155
|
+
function readRelocatedObjects(objects, tree) {
|
|
156
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
157
|
+
return (yield systemConnector_1.SystemConnector.getExistingObjects(objects
|
|
158
|
+
.filter(object => normalize(object.pgmid) === 'R3TR' && !isDevclass(object))
|
|
159
|
+
.map(object => ({ pgmid: object.pgmid, object: object.object, objName: object.objName, devclass: '' }))))
|
|
160
|
+
.filter(object => object.devclass && (!tree.previousDevclasses.has(normalize(object.devclass)) || tree.isOtherInstallation(object.devclass)));
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Locks on those of `objects` that removing `installed` certainly deletes: the objects of its
|
|
165
|
+
* installed transport still in its SAP packages. These would abort the cleanup at its objects
|
|
166
|
+
* lock check, so they can be checked before asking anything. Objects added locally or moved
|
|
167
|
+
* outside the installation are left out, as the cleanup may keep them.
|
|
168
|
+
*/
|
|
169
|
+
function getInstalledObjectsLocks(installed, previousInstallPackages, systemPackages, objects) {
|
|
170
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
171
|
+
if (objects.length === 0) {
|
|
172
|
+
return [];
|
|
173
|
+
}
|
|
174
|
+
const { previousTransportObjects } = yield readInstalledTransportObjects(installed);
|
|
175
|
+
const installedKeys = new Set(previousTransportObjects.map(objectKey));
|
|
176
|
+
const candidates = new Map(objects
|
|
177
|
+
.filter(object => installedKeys.has(objectKey(object)))
|
|
178
|
+
.map(object => [objectKey(object), object]));
|
|
179
|
+
if (candidates.size === 0) {
|
|
180
|
+
return [];
|
|
181
|
+
}
|
|
182
|
+
const tree = yield readInstallationTree(installed, previousInstallPackages, previousTransportObjects, [], systemPackages);
|
|
183
|
+
(yield readRelocatedObjects(Array.from(candidates.values()), tree)).forEach(object => candidates.delete(objectKey(object)));
|
|
184
|
+
if (candidates.size === 0) {
|
|
185
|
+
return [];
|
|
186
|
+
}
|
|
187
|
+
return systemConnector_1.SystemConnector.getObjectsLocks(Array.from(candidates.values(), object => ({
|
|
188
|
+
PGMID: object.pgmid,
|
|
189
|
+
OBJECT: object.object,
|
|
190
|
+
OBJ_NAME: object.objName
|
|
191
|
+
})));
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
/** Deletes every temporary package, reporting the first failure after the cleanup pass. */
|
|
195
|
+
function deleteTemporaryCleanupPackages(temporaryPackages) {
|
|
196
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
197
|
+
let firstError;
|
|
198
|
+
for (const devclass of temporaryPackages) {
|
|
199
|
+
try {
|
|
200
|
+
yield systemConnector_1.SystemConnector.deleteTemporaryPackage(devclass.objName);
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
firstError || (firstError = error);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
if (firstError) {
|
|
207
|
+
throw firstError;
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Deletes the staging packages created by the cleanup, once their objects were assigned back.
|
|
213
|
+
* Every package is attempted; the first failure is thrown afterwards.
|
|
214
|
+
*/
|
|
215
|
+
function deleteCleanupStagingPackages(context) {
|
|
216
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
217
|
+
let firstError;
|
|
218
|
+
for (const devclass of context.revert.stagingPackages || []) {
|
|
219
|
+
try {
|
|
220
|
+
if (!(yield systemConnector_1.SystemConnector.getDevclass(devclass))) {
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
const objects = (yield systemConnector_1.SystemConnector.getDevclassObjects(devclass, false)).filter(object => !isDevclass(object));
|
|
224
|
+
if (objects.length > 0) {
|
|
225
|
+
throw new Error(`SAP package ${devclass} still contains ${objects.length} objects: manual cleanup is necessary.`);
|
|
226
|
+
}
|
|
227
|
+
trm_commons_1.Logger.loading(`Deleting package ${devclass}...`, true);
|
|
228
|
+
const transport = yield transport_1.Transport.createToc({
|
|
229
|
+
text: `@X1@TRM (DELE) ${context.rawInput.packageData.name} ${context.runtime.update.manifest.get().version}`,
|
|
230
|
+
target: systemConnector_1.SystemConnector.getDest()
|
|
231
|
+
});
|
|
232
|
+
try {
|
|
233
|
+
yield transport.addObjects([{ pgmid: 'R3TR', object: 'DEVC', objName: devclass }], false);
|
|
234
|
+
yield (0, releaseDeletionTransport_1.releaseDeletionTransport)(transport, context.rawInput.packageData.registry, context, false);
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
try {
|
|
238
|
+
if (yield transport.canBeDeleted()) {
|
|
239
|
+
yield transport.delete();
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
catch (deleteError) {
|
|
243
|
+
trm_commons_1.Logger.warning(`Could not delete transport ${transport.trkorr}: ${String(deleteError)}`, { important: true });
|
|
244
|
+
}
|
|
245
|
+
throw error;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
trm_commons_1.Logger.warning(`Could not delete SAP package ${devclass}, manual cleanup might be necessary.`, { important: true });
|
|
250
|
+
firstError || (firstError = error);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// Namespaces imported for the staging go once no package uses them.
|
|
254
|
+
for (const namespace of context.revert.temporaryNamespaces || []) {
|
|
255
|
+
try {
|
|
256
|
+
if (!(yield systemConnector_1.SystemConnector.getNamespace(namespace))) {
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
const packages = yield systemConnector_1.SystemConnector.getNamespacePackages(namespace);
|
|
260
|
+
if (packages.length > 0) {
|
|
261
|
+
throw new Error(`Namespace ${namespace} is still used by SAP packages ${packages.map(o => o.devclass).join(', ')}.`);
|
|
262
|
+
}
|
|
263
|
+
trm_commons_1.Logger.loading(`Deleting namespace ${namespace}...`, true);
|
|
264
|
+
const transport = yield transport_1.Transport.createToc({
|
|
265
|
+
text: `@X1@TRM (DELE) ${context.rawInput.packageData.name} ${context.runtime.update.manifest.get().version}`,
|
|
266
|
+
target: systemConnector_1.SystemConnector.getDest()
|
|
267
|
+
});
|
|
268
|
+
try {
|
|
269
|
+
yield transport.addObjects([{ pgmid: 'R3TR', object: 'NSPC', objName: namespace }], false);
|
|
270
|
+
yield (0, releaseDeletionTransport_1.releaseDeletionTransport)(transport, context.rawInput.packageData.registry, context, false);
|
|
271
|
+
}
|
|
272
|
+
catch (error) {
|
|
273
|
+
try {
|
|
274
|
+
if (yield transport.canBeDeleted()) {
|
|
275
|
+
yield transport.delete();
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
catch (deleteError) {
|
|
279
|
+
trm_commons_1.Logger.warning(`Could not delete transport ${transport.trkorr}: ${String(deleteError)}`, { important: true });
|
|
280
|
+
}
|
|
281
|
+
throw error;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
catch (error) {
|
|
285
|
+
trm_commons_1.Logger.warning(`Could not delete namespace ${namespace}, imported for the cleanup: manual cleanup might be necessary.`, { important: true });
|
|
286
|
+
firstError || (firstError = error);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
if (firstError) {
|
|
290
|
+
throw firstError;
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
function restoreCleanupPackages(context) {
|
|
295
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
296
|
+
// Snapshots are stored in deletion order: reverse it to recreate parents first.
|
|
297
|
+
let firstError;
|
|
298
|
+
for (const pkg of [...(context.revert.cleanupTemporaryPackages || [])].reverse()) {
|
|
299
|
+
try {
|
|
300
|
+
if (yield systemConnector_1.SystemConnector.getDevclass(pkg.devclass)) {
|
|
301
|
+
continue;
|
|
302
|
+
}
|
|
303
|
+
yield systemConnector_1.SystemConnector.createPackage(Object.assign(Object.assign({}, (0, commons_1.packageDataFromTdevc)(pkg, {
|
|
304
|
+
devclass: pkg.devclass,
|
|
305
|
+
ctext: pkg.ctext || '',
|
|
306
|
+
as4user: pkg.as4user || systemConnector_1.SystemConnector.getLogonUser(),
|
|
307
|
+
dlvunit: pkg.dlvunit,
|
|
308
|
+
pdevclass: pkg.pdevclass || ''
|
|
309
|
+
})), { parentcl: pkg.parentcl, tpclass: pkg.tpclass }));
|
|
310
|
+
}
|
|
311
|
+
catch (error) {
|
|
312
|
+
firstError || (firstError = error);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
if (firstError) {
|
|
316
|
+
throw firstError;
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
function restoreCleanupAssignments(context, restorePackages) {
|
|
321
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
322
|
+
if (restorePackages) {
|
|
323
|
+
yield restoreCleanupPackages(context);
|
|
324
|
+
}
|
|
325
|
+
yield restoreTadirAssignments(context.revert.cleanupOriginalTadir || []);
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Assigns the objects that still exist back to their previous TADIR rows. Every object is
|
|
330
|
+
* attempted; the first failure is thrown afterwards.
|
|
331
|
+
*/
|
|
332
|
+
function restoreTadirAssignments(originals) {
|
|
333
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
334
|
+
if (originals.length === 0) {
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
const existing = new Set((yield systemConnector_1.SystemConnector.getExistingObjects(originals)).map(objectKey));
|
|
338
|
+
let firstError;
|
|
339
|
+
for (const object of originals) {
|
|
340
|
+
if (existing.has(objectKey(object))) {
|
|
341
|
+
try {
|
|
342
|
+
yield systemConnector_1.SystemConnector.tadirInterface(object);
|
|
343
|
+
}
|
|
344
|
+
catch (error) {
|
|
345
|
+
firstError || (firstError = error);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
if (firstError) {
|
|
350
|
+
throw firstError;
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Releases a transport of copies with the previous definition of the retained tables,
|
|
356
|
+
* so a rollback can restore them without dropping their data.
|
|
357
|
+
*/
|
|
358
|
+
function backupRetainedTables(context, retainedTables) {
|
|
359
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
360
|
+
trm_commons_1.Logger.loading(`Backing up ${retainedTables.length} retained tables...`, true);
|
|
361
|
+
const backup = yield transport_1.Transport.createToc({
|
|
362
|
+
text: `@X1@TRM (BKP) ${context.rawInput.packageData.name} ${context.runtime.update.manifest.get().version}`,
|
|
363
|
+
target: systemConnector_1.SystemConnector.getDest()
|
|
364
|
+
});
|
|
365
|
+
context.revert.updateTablesBackupTransport = backup;
|
|
366
|
+
yield backup.addObjects(retainedTables.map(object => ({
|
|
367
|
+
pgmid: object.pgmid,
|
|
368
|
+
object: object.object,
|
|
369
|
+
objName: object.objName
|
|
370
|
+
})), false);
|
|
371
|
+
yield backup.release(false, true);
|
|
372
|
+
context.revert.retainedTables = {
|
|
373
|
+
trkorr: backup.trkorr,
|
|
374
|
+
entries: undefined,
|
|
375
|
+
binaries: (yield backup.download()).binaries
|
|
376
|
+
};
|
|
377
|
+
context.revert.retainedTableObjects = retainedTables.map(object => ({
|
|
378
|
+
pgmid: object.pgmid,
|
|
379
|
+
object: object.object,
|
|
380
|
+
objName: object.objName
|
|
381
|
+
}));
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Customizing transports of the installed release whose rows must be deleted. Only transports
|
|
386
|
+
* recorded at install time and still on the system count.
|
|
387
|
+
*/
|
|
388
|
+
function getCustomizingSources(context, target) {
|
|
389
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
390
|
+
const sources = [];
|
|
391
|
+
for (const transport of context.runtime.previousInstallTransports || []) {
|
|
392
|
+
if (normalize(transport.trmType || '') !== transport_1.TrmTransportIdentifier.CUST) {
|
|
393
|
+
continue;
|
|
394
|
+
}
|
|
395
|
+
if (yield new transport_1.Transport(transport.trkorr).getE070()) {
|
|
396
|
+
sources.push(transport.trkorr);
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
trm_commons_1.Logger.warning(`Customizing transport ${transport.trkorr} is no longer on ${systemConnector_1.SystemConnector.getDest()}: its rows can't be deleted.`, { important: true });
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
if (sources.length === 0) {
|
|
403
|
+
return [];
|
|
404
|
+
}
|
|
405
|
+
if (target.keepCustomizing) {
|
|
406
|
+
trm_commons_1.Logger.warning(`Keeping customizing of ${sources.length} transports (${sources.join(', ')}).`, { important: true });
|
|
407
|
+
return [];
|
|
408
|
+
}
|
|
409
|
+
return sources;
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Lists the customizing rows the cleanup deletes and asks to continue: always for a generic key or a
|
|
414
|
+
* whole table, which also delete rows not shipped by the package (default no); otherwise only when
|
|
415
|
+
* the incoming release doesn't ship customizing that rewrites them (default yes).
|
|
416
|
+
* Without prompts, it only warns.
|
|
417
|
+
*/
|
|
418
|
+
function confirmCustomizingDeletion(context, target, sources) {
|
|
419
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
420
|
+
var _a;
|
|
421
|
+
const rows = [];
|
|
422
|
+
for (const trkorr of sources) {
|
|
423
|
+
rows.push(...yield new transport_1.Transport(trkorr).getCustomizingKeys());
|
|
424
|
+
}
|
|
425
|
+
const generic = rows.filter(row => row.tabkey === undefined || row.tabkey.includes('*'));
|
|
426
|
+
// Rows the incoming release ships again are rewritten by its import: only the others are lost.
|
|
427
|
+
const incoming = target.incomingCustomizing || [];
|
|
428
|
+
const wholeTables = new Set(incoming.filter(row => row.tabkey === undefined).map(row => normalize(row.table)));
|
|
429
|
+
const incomingKeys = new Set(incoming.filter(row => row.tabkey !== undefined).map(row => `${normalize(row.table)}\u0000${row.tabkey}`));
|
|
430
|
+
const lost = rows.filter(row => !generic.includes(row)
|
|
431
|
+
&& !wholeTables.has(normalize(row.table)) && !incomingKeys.has(`${normalize(row.table)}\u0000${row.tabkey}`));
|
|
432
|
+
const listed = [...generic, ...lost];
|
|
433
|
+
if (listed.length === 0) {
|
|
434
|
+
trm_commons_1.Logger.log(`Deleting ${rows.length} customizing rows rewritten by the incoming release`, true);
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
const label = (row) => row.tabkey === undefined ? `${row.table} (all rows)` : `${row.table} ${row.tabkey}`;
|
|
438
|
+
const shown = listed.slice(0, 20).map(label);
|
|
439
|
+
if (listed.length > shown.length) {
|
|
440
|
+
shown.push(`...and ${listed.length - shown.length} more`);
|
|
441
|
+
}
|
|
442
|
+
const name = context.rawInput.packageData.name;
|
|
443
|
+
const version = context.runtime.update.manifest.get().version;
|
|
444
|
+
const message = generic.length > 0
|
|
445
|
+
? `${generic.length} customizing ${generic.length === 1 ? 'entry' : 'entries'} of ${name} v${version} ${generic.length === 1 ? 'uses' : 'use'} a generic key or a whole table: every matching row will be deleted, including rows not shipped by ${name}`
|
|
446
|
+
: `${listed.length} customizing ${listed.length === 1 ? 'row' : 'rows'} shipped by ${name} v${version} will be deleted${incoming.length > 0 ? ' (not shipped by the new release)' : ''}`;
|
|
447
|
+
trm_commons_1.Logger.warning(`${message}:\n${shown.join('\n')}`, { important: true });
|
|
448
|
+
if ((_a = context.rawInput.contextData) === null || _a === void 0 ? void 0 : _a.noInquirer) {
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
const { deleteCustomizing } = yield trm_commons_1.Inquirer.prompt({
|
|
452
|
+
name: 'deleteCustomizing',
|
|
453
|
+
type: 'confirm',
|
|
454
|
+
message: `${message}. Continue?`,
|
|
455
|
+
default: generic.length === 0
|
|
456
|
+
});
|
|
457
|
+
if (!deleteCustomizing) {
|
|
458
|
+
throw new Error(`${target.actionName} aborted.`);
|
|
459
|
+
}
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
/** Whether `namespace` has the producer role (P) on the system: its objects are developed here. */
|
|
463
|
+
function isProducerNamespace(namespace) {
|
|
464
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
465
|
+
const rows = yield systemConnector_1.SystemConnector.readTable('TRNSPACE', [{ fieldName: 'ROLE' }], `NAMESPACE EQ '${namespace.replace(/'/g, "''")}'`);
|
|
466
|
+
return rows.some(row => normalize(row.role || '') === 'P');
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Imports a custom namespace missing on the system, with the repair license of the installed
|
|
471
|
+
* release, so its objects can be staged in a package of the namespace.
|
|
472
|
+
*/
|
|
473
|
+
function importStagingNamespace(context, namespace) {
|
|
474
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
475
|
+
var _a;
|
|
476
|
+
if (yield systemConnector_1.SystemConnector.getNamespace(namespace)) {
|
|
477
|
+
return;
|
|
478
|
+
}
|
|
479
|
+
const manifestNamespace = context.runtime.update.manifest.get().namespace;
|
|
480
|
+
if (!(manifestNamespace === null || manifestNamespace === void 0 ? void 0 : manifestNamespace.replicense) || normalize(manifestNamespace.ns || '') !== normalize(namespace)) {
|
|
481
|
+
throw new Error(`Namespace ${namespace} doesn't exist in ${systemConnector_1.SystemConnector.getDest()} and its repair license is unknown: add it in SE03 to delete the objects of the local installation.`);
|
|
482
|
+
}
|
|
483
|
+
trm_commons_1.Logger.loading(`Importing namespace ${namespace}...`, true);
|
|
484
|
+
// Track before the mutating await: SAP may commit the namespace and still fail the response.
|
|
485
|
+
(_a = context.revert).temporaryNamespaces || (_a.temporaryNamespaces = []);
|
|
486
|
+
context.revert.temporaryNamespaces.push(namespace);
|
|
487
|
+
yield systemConnector_1.SystemConnector.addNamespace(namespace, manifestNamespace.replicense, manifestNamespace.texts.map(o => ({
|
|
488
|
+
namespace,
|
|
489
|
+
spras: o.language,
|
|
490
|
+
descriptn: o.description,
|
|
491
|
+
owner: o.owner
|
|
492
|
+
})));
|
|
493
|
+
});
|
|
494
|
+
}
|
|
495
|
+
/** Creates a short-lived transportable package, in `namespace` when set, so CTS can export local objects. */
|
|
496
|
+
function createStagingPackage(context, namespace) {
|
|
497
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
498
|
+
var _a;
|
|
499
|
+
const prefix = namespace ? `${namespace}TRMD_` : 'ZTRM_DELE_';
|
|
500
|
+
// DEVCLASS allows 30 characters.
|
|
501
|
+
const hexLength = Math.min(16, 30 - prefix.length);
|
|
502
|
+
let stagingDevclass;
|
|
503
|
+
do {
|
|
504
|
+
stagingDevclass = `${prefix}${(0, crypto_1.randomBytes)(8).toString('hex').toUpperCase().substring(0, hexLength)}`;
|
|
505
|
+
} while (yield systemConnector_1.SystemConnector.getDevclass(stagingDevclass));
|
|
506
|
+
trm_commons_1.Logger.loading(`Creating package ${stagingDevclass}...`, true);
|
|
507
|
+
// Track before the mutating await because SAP may commit the package
|
|
508
|
+
// even when the connector response fails.
|
|
509
|
+
(_a = context.revert).stagingPackages || (_a.stagingPackages = []);
|
|
510
|
+
context.revert.stagingPackages.push(stagingDevclass);
|
|
511
|
+
yield systemConnector_1.SystemConnector.createPackage({
|
|
512
|
+
devclass: stagingDevclass,
|
|
513
|
+
ctext: 'TRM upgrade cleanup',
|
|
514
|
+
as4user: systemConnector_1.SystemConnector.getLogonUser(),
|
|
515
|
+
dlvunit: 'HOME',
|
|
516
|
+
pdevclass: yield systemConnector_1.SystemConnector.getDefaultTransportLayer()
|
|
517
|
+
});
|
|
518
|
+
yield systemConnector_1.SystemConnector.tadirInterface({
|
|
519
|
+
pgmid: 'R3TR', object: 'DEVC', objName: stagingDevclass,
|
|
520
|
+
devclass: stagingDevclass, srcsystem: 'TRM'
|
|
521
|
+
});
|
|
522
|
+
return stagingDevclass;
|
|
523
|
+
});
|
|
524
|
+
}
|
|
525
|
+
/**
|
|
526
|
+
* Removes the objects of the installed release (`context.runtime.update`) that are not part
|
|
527
|
+
* of `target`, through a deletion transport generated by the registry.
|
|
528
|
+
*
|
|
529
|
+
* Shared by upgrades, where the target is the incoming release, and by uninstalls, where the
|
|
530
|
+
* target is empty. It also removes SAP packages left empty, locally added objects (after
|
|
531
|
+
* confirmation), the package namespace when no other package uses it, and the customizing rows
|
|
532
|
+
* of the installed release. Tables shipped again by the target are kept and
|
|
533
|
+
* backed up so a rollback preserves their data.
|
|
534
|
+
*/
|
|
535
|
+
function cleanupInstalledPackage(context, target) {
|
|
536
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
537
|
+
yield (0, withScopedPrefix_1.withScopedPrefix)(target.prefix, () => __awaiter(this, void 0, void 0, function* () {
|
|
538
|
+
var _a, _b, _c;
|
|
539
|
+
const installed = context.runtime.update;
|
|
540
|
+
//1- generate dummy transport
|
|
541
|
+
trm_commons_1.Logger.loading(`Generating transport...`);
|
|
542
|
+
const dummy = yield transport_1.Transport.createToc({
|
|
543
|
+
text: `@X1@TRM (DELE) ${context.rawInput.packageData.name} ${installed.manifest.get().version}`,
|
|
544
|
+
target: systemConnector_1.SystemConnector.getDest()
|
|
545
|
+
});
|
|
546
|
+
context.revert.updateCleanupTransport = dummy;
|
|
547
|
+
const { previousNamespaces, previousTransportObjects } = yield readInstalledTransportObjects(installed);
|
|
548
|
+
const incomingObjects = target.incomingObjects;
|
|
549
|
+
// Tables shipped again by the new release are adjusted by its import instead of
|
|
550
|
+
// being dropped and re-created, which would lose their data.
|
|
551
|
+
const incomingKeys = new Set(incomingObjects.map(objectKey));
|
|
552
|
+
const retainedTables = previousTransportObjects.filter(object => normalize(object.pgmid) === 'R3TR' && normalize(object.object) === 'TABL'
|
|
553
|
+
&& incomingKeys.has(objectKey(object)));
|
|
554
|
+
const retainedKeys = new Set(retainedTables.map(objectKey));
|
|
555
|
+
retainedTables.forEach(object => trm_commons_1.Logger.log(`Keeping table ${object.objName} (present in new release)`, true));
|
|
556
|
+
const currentDevclasses = new Set(target.keptDevclasses.map(normalize));
|
|
557
|
+
const deletedKeys = new Set((context.runtime.deletedObjects || []).map(objectKey));
|
|
558
|
+
const { previousDevclasses, installedDevclasses, packageParents, otherInstallations, isOtherInstallation } = yield readInstallationTree(installed, context.runtime.previousInstallPackages, previousTransportObjects, context.runtime.deletedObjects || [], ((_a = context.rawInput.contextData) === null || _a === void 0 ? void 0 : _a.systemPackages) || []);
|
|
559
|
+
const generatedDevclasses = new Set(context.revert.sapPackages.map(normalize));
|
|
560
|
+
otherInstallations.forEach(pkg => trm_commons_1.Logger.log(`Ignoring SAP package ${pkg.getDevclass()}: TRM package ${pkg.packageName} is installed there`, true));
|
|
561
|
+
// Local additions remain cleanup candidates even when reused as incoming targets.
|
|
562
|
+
// The first local package owns the decision for its locally added descendants.
|
|
563
|
+
const cleanupGroups = new Map();
|
|
564
|
+
for (const normalizedDevclass of previousDevclasses.keys()) {
|
|
565
|
+
const locallyAdded = !installedDevclasses.has(normalizedDevclass);
|
|
566
|
+
if (generatedDevclasses.has(normalizedDevclass) || (!locallyAdded && currentDevclasses.has(normalizedDevclass))
|
|
567
|
+
|| isOtherInstallation(normalizedDevclass)) {
|
|
568
|
+
continue;
|
|
569
|
+
}
|
|
570
|
+
let root = normalizedDevclass;
|
|
571
|
+
const visited = new Set([root]);
|
|
572
|
+
let parent = packageParents.get(root);
|
|
573
|
+
while (parent && previousDevclasses.has(parent) && !generatedDevclasses.has(parent)
|
|
574
|
+
&& (!installedDevclasses.has(parent) === locallyAdded)
|
|
575
|
+
&& (locallyAdded || !currentDevclasses.has(parent)) && !visited.has(parent)) {
|
|
576
|
+
root = parent;
|
|
577
|
+
visited.add(root);
|
|
578
|
+
parent = packageParents.get(root);
|
|
579
|
+
}
|
|
580
|
+
if (!cleanupGroups.has(root)) {
|
|
581
|
+
cleanupGroups.set(root, new Set());
|
|
582
|
+
}
|
|
583
|
+
cleanupGroups.get(root).add(normalizedDevclass);
|
|
584
|
+
}
|
|
585
|
+
const changedDevclassesToDelete = [];
|
|
586
|
+
const extraObjectsToDelete = new Map();
|
|
587
|
+
for (const [root, group] of cleanupGroups) {
|
|
588
|
+
const devclass = previousDevclasses.get(root);
|
|
589
|
+
// Only objects outside both releases need an extra cleanup decision.
|
|
590
|
+
const objectsAfterImport = new Map();
|
|
591
|
+
for (const member of group) {
|
|
592
|
+
for (const object of yield systemConnector_1.SystemConnector.getDevclassObjects(previousDevclasses.get(member), false)) {
|
|
593
|
+
// Package definitions follow the decision for the whole subtree; namespaces the usage check.
|
|
594
|
+
if (!isDevclass(object) && !isNamespace(object) && !deletedKeys.has(objectKey(object))) {
|
|
595
|
+
objectsAfterImport.set(objectKey(object), object);
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
previousTransportObjects.forEach(object => objectsAfterImport.delete(objectKey(object)));
|
|
600
|
+
incomingObjects.forEach(object => {
|
|
601
|
+
objectsAfterImport.delete(objectKey(object));
|
|
602
|
+
});
|
|
603
|
+
// Every locally added package definition is an extra object, including
|
|
604
|
+
// the root of this cleanup group, regardless of whether it has contents.
|
|
605
|
+
const packagesToRemove = Array.from(group).filter(member => !currentDevclasses.has(member));
|
|
606
|
+
const extraObjectCount = objectsAfterImport.size + packagesToRemove.filter(member => !installedDevclasses.has(member)).length;
|
|
607
|
+
if (extraObjectCount > 0) {
|
|
608
|
+
const extraObjectsMessage = `Cleanup of SAP package ${devclass}${group.size > 1 ? ' and its subpackages' : ''} will delete ${extraObjectCount} extra objects outside this installation`;
|
|
609
|
+
// Name the objects, so the user can tell local developments worth keeping.
|
|
610
|
+
const extraObjects = [
|
|
611
|
+
...Array.from(objectsAfterImport.values()).map(object => `${object.pgmid} ${object.object} ${object.objName}`),
|
|
612
|
+
...packagesToRemove.filter(member => !installedDevclasses.has(member)).map(member => `R3TR DEVC ${previousDevclasses.get(member)}`)
|
|
613
|
+
];
|
|
614
|
+
trm_commons_1.Logger.warning(`${extraObjectsMessage}:\n${extraObjects.join('\n')}`, { important: true });
|
|
615
|
+
const { deleteExtraObjects } = context.rawInput.contextData.noInquirer
|
|
616
|
+
? { deleteExtraObjects: true }
|
|
617
|
+
: yield trm_commons_1.Inquirer.prompt({
|
|
618
|
+
name: 'deleteExtraObjects',
|
|
619
|
+
type: 'confirm',
|
|
620
|
+
message: `${extraObjectsMessage}. Continue?`,
|
|
621
|
+
default: true
|
|
622
|
+
});
|
|
623
|
+
if (!deleteExtraObjects) {
|
|
624
|
+
continue;
|
|
625
|
+
}
|
|
626
|
+
objectsAfterImport.forEach((object, key) => extraObjectsToDelete.set(key, {
|
|
627
|
+
pgmid: object.pgmid,
|
|
628
|
+
object: object.object,
|
|
629
|
+
objName: object.objName
|
|
630
|
+
}));
|
|
631
|
+
}
|
|
632
|
+
changedDevclassesToDelete.push(...packagesToRemove.map(member => previousDevclasses.get(member)));
|
|
633
|
+
}
|
|
634
|
+
// A retained child still needs its ancestors, including when cleanup was declined.
|
|
635
|
+
const deletableDevclasses = new Set(changedDevclassesToDelete.map(normalize));
|
|
636
|
+
for (const devclass of previousDevclasses.keys()) {
|
|
637
|
+
if (deletableDevclasses.has(devclass)) {
|
|
638
|
+
continue;
|
|
639
|
+
}
|
|
640
|
+
const visited = new Set();
|
|
641
|
+
let parent = packageParents.get(devclass);
|
|
642
|
+
while (parent && !visited.has(parent)) {
|
|
643
|
+
visited.add(parent);
|
|
644
|
+
deletableDevclasses.delete(parent);
|
|
645
|
+
parent = packageParents.get(parent);
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
const packagesToDelete = changedDevclassesToDelete.filter(devclass => deletableDevclasses.has(normalize(devclass)));
|
|
649
|
+
// A namespace can only be cleaned up alongside its last remaining package: any other SAP
|
|
650
|
+
// package in it (TDEVC NAMESPACE), installed by TRM or not, keeps it. Namespaces of the
|
|
651
|
+
// incoming release are kept, as its packages may not have been imported yet.
|
|
652
|
+
const incomingNamespaces = new Set(target.keptDevclasses.map(getCustomNamespace).filter(Boolean).map(normalize));
|
|
653
|
+
const namespaceCandidates = new Map();
|
|
654
|
+
previousNamespaces.forEach(object => namespaceCandidates.set(normalize(object.objName), object.objName));
|
|
655
|
+
const rootNamespace = installed.getDevclass() ? getCustomNamespace(installed.getDevclass()) : undefined;
|
|
656
|
+
if (rootNamespace) {
|
|
657
|
+
namespaceCandidates.set(normalize(rootNamespace), rootNamespace);
|
|
658
|
+
}
|
|
659
|
+
const deletingDevclasses = new Set(packagesToDelete.map(normalize));
|
|
660
|
+
const namespacesToDelete = [];
|
|
661
|
+
for (const [key, namespace] of namespaceCandidates) {
|
|
662
|
+
if (incomingNamespaces.has(key)) {
|
|
663
|
+
trm_commons_1.Logger.log(`Keeping namespace ${namespace}: used by the incoming release`, true);
|
|
664
|
+
continue;
|
|
665
|
+
}
|
|
666
|
+
try {
|
|
667
|
+
if (!(yield systemConnector_1.SystemConnector.getNamespace(namespace))) {
|
|
668
|
+
continue;
|
|
669
|
+
}
|
|
670
|
+
// A producer namespace is developed on this system (TRM imports namespaces as recipient, role C): never delete it.
|
|
671
|
+
if (yield isProducerNamespace(namespace)) {
|
|
672
|
+
trm_commons_1.Logger.log(`Keeping namespace ${namespace}: it's a producer namespace of ${systemConnector_1.SystemConnector.getDest()}`, true);
|
|
673
|
+
continue;
|
|
674
|
+
}
|
|
675
|
+
const remainingPackages = (yield systemConnector_1.SystemConnector.getNamespacePackages(namespace))
|
|
676
|
+
.filter(pkg => !deletingDevclasses.has(normalize(pkg.devclass)));
|
|
677
|
+
if (remainingPackages.length === 0) {
|
|
678
|
+
namespacesToDelete.push(namespace);
|
|
679
|
+
}
|
|
680
|
+
else {
|
|
681
|
+
trm_commons_1.Logger.log(`Keeping namespace ${namespace}: still used by SAP packages ${remainingPackages.map(pkg => pkg.devclass).join(', ')}`, true);
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
catch (e) {
|
|
685
|
+
trm_commons_1.Logger.warning(`Keeping namespace ${namespace}: its usage could not be checked (${String(e)})`, { important: true });
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
// Installed objects moved to a package outside this installation (customer development)
|
|
689
|
+
// are kept unless confirmed; those now in another TRM package belong to it and are kept.
|
|
690
|
+
const relocatedObjects = yield readRelocatedObjects(previousTransportObjects.filter(object => !retainedKeys.has(objectKey(object))), { previousDevclasses, isOtherInstallation });
|
|
691
|
+
const movedKeys = new Set();
|
|
692
|
+
const movedObjects = [];
|
|
693
|
+
for (const object of relocatedObjects) {
|
|
694
|
+
// Shipped again by the incoming release: its import overwrites them and moves them back (confirmed at check-transports).
|
|
695
|
+
if (incomingKeys.has(objectKey(object))) {
|
|
696
|
+
trm_commons_1.Logger.log(`Keeping ${object.pgmid} ${object.object} ${object.objName}: the incoming release overwrites it`, true);
|
|
697
|
+
movedKeys.add(objectKey(object));
|
|
698
|
+
continue;
|
|
699
|
+
}
|
|
700
|
+
if (isOtherInstallation(object.devclass)) {
|
|
701
|
+
trm_commons_1.Logger.log(`Keeping ${object.pgmid} ${object.object} ${object.objName}: it's in SAP package ${object.devclass} of another TRM package`, true);
|
|
702
|
+
movedKeys.add(objectKey(object));
|
|
703
|
+
continue;
|
|
704
|
+
}
|
|
705
|
+
// An object now shipped by another installed TRM package belongs to it: never offer to delete it.
|
|
706
|
+
const owner = yield (0, owningInstallation_1.getOwningInstallation)(object.devclass, ((_b = context.rawInput.contextData) === null || _b === void 0 ? void 0 : _b.systemPackages) || [], installed);
|
|
707
|
+
if (owner) {
|
|
708
|
+
trm_commons_1.Logger.info(`Keeping ${object.pgmid} ${object.object} ${object.objName}: it belongs to TRM package ${owner.packageName} (SAP package ${object.devclass}).`);
|
|
709
|
+
movedKeys.add(objectKey(object));
|
|
710
|
+
continue;
|
|
711
|
+
}
|
|
712
|
+
movedObjects.push(object);
|
|
713
|
+
}
|
|
714
|
+
if (movedObjects.length > 0) {
|
|
715
|
+
movedObjects.forEach(object => trm_commons_1.Logger.warning(`${object.pgmid} ${object.object} ${object.objName} was moved to SAP package ${object.devclass}, outside this installation`));
|
|
716
|
+
const { deleteMovedObjects } = context.rawInput.contextData.noInquirer
|
|
717
|
+
? { deleteMovedObjects: false }
|
|
718
|
+
: yield trm_commons_1.Inquirer.prompt({
|
|
719
|
+
name: 'deleteMovedObjects',
|
|
720
|
+
type: 'confirm',
|
|
721
|
+
message: `Delete ${movedObjects.length} installed objects moved outside this installation too?`,
|
|
722
|
+
default: false
|
|
723
|
+
});
|
|
724
|
+
if (!deleteMovedObjects) {
|
|
725
|
+
movedObjects.forEach(object => movedKeys.add(objectKey(object)));
|
|
726
|
+
trm_commons_1.Logger.warning(`Keeping ${movedObjects.length} objects moved outside this installation.`, { important: true });
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
const customizingSources = yield getCustomizingSources(context, target);
|
|
730
|
+
if (customizingSources.length > 0) {
|
|
731
|
+
yield confirmCustomizingDeletion(context, target, customizingSources);
|
|
732
|
+
}
|
|
733
|
+
const additionalObjects = [...extraObjectsToDelete.values(), ...packagesToDelete.map(devclass => ({
|
|
734
|
+
pgmid: 'R3TR',
|
|
735
|
+
object: 'DEVC',
|
|
736
|
+
objName: devclass
|
|
737
|
+
})), ...namespacesToDelete.map(namespace => ({
|
|
738
|
+
pgmid: 'R3TR',
|
|
739
|
+
object: 'NSPC',
|
|
740
|
+
objName: namespace
|
|
741
|
+
}))];
|
|
742
|
+
// Validate the complete deletion selection before adding anything to the transport.
|
|
743
|
+
// SAP packages the incoming release keeps are never deleted: a renamed installation has already
|
|
744
|
+
// generated them (generate-devclass), and the import of the others updates them in place.
|
|
745
|
+
const deletionObjects = new Map([...previousTransportObjects, ...additionalObjects]
|
|
746
|
+
.filter(object => !retainedKeys.has(objectKey(object)) && !movedKeys.has(objectKey(object)))
|
|
747
|
+
.filter(object => !(isDevclass(object) && currentDevclasses.has(normalize(object.objName))))
|
|
748
|
+
.map(object => [objectKey(object), object]));
|
|
749
|
+
// TRM comment rows of the installed transport are not objects to delete.
|
|
750
|
+
const hasObjectsToDelete = Array.from(deletionObjects.values()).some(object => normalize(object.pgmid) !== '*');
|
|
751
|
+
if (!hasObjectsToDelete && retainedTables.length === 0 && customizingSources.length === 0) {
|
|
752
|
+
trm_commons_1.Logger.warning(`Nothing to delete for package ${context.rawInput.packageData.name}: deletion transport was not generated. Manual cleanup of previous release install might be necessary.`, { important: true });
|
|
753
|
+
try {
|
|
754
|
+
if (yield dummy.canBeDeleted()) {
|
|
755
|
+
yield dummy.delete();
|
|
756
|
+
context.revert.updateCleanupTransport = undefined;
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
catch (e) {
|
|
760
|
+
trm_commons_1.Logger.warning(`Could not delete transport ${dummy.trkorr}: ${String(e)}`, { important: true });
|
|
761
|
+
}
|
|
762
|
+
return;
|
|
763
|
+
}
|
|
764
|
+
yield context.lockScope.acquire([
|
|
765
|
+
// TRM comment rows are not objects and are shared by every package.
|
|
766
|
+
...Array.from(deletionObjects.values()).filter(object => normalize(object.pgmid) !== '*').map(actionLocks_1.objectLockResource),
|
|
767
|
+
...Array.from(deletionObjects.values())
|
|
768
|
+
.filter(isDevclass)
|
|
769
|
+
.map(object => ({ type: "DEVCLASS", name: object.objName }))
|
|
770
|
+
]);
|
|
771
|
+
if (deletionObjects.size > 0) {
|
|
772
|
+
trm_commons_1.Logger.loading(`Checking cleanup objects locks...`, true);
|
|
773
|
+
const locks = yield systemConnector_1.SystemConnector.getObjectsLocks(Array.from(deletionObjects.values(), object => ({
|
|
774
|
+
PGMID: object.pgmid,
|
|
775
|
+
OBJECT: object.object,
|
|
776
|
+
OBJ_NAME: object.objName
|
|
777
|
+
})));
|
|
778
|
+
if (locks.length > 0) {
|
|
779
|
+
locks.forEach(lock => trm_commons_1.Logger.error(`${lock.pgmid} ${lock.object} ${lock.objName} is currently locked in transport ${lock.trkorr}`, { important: true }));
|
|
780
|
+
throw new Error(`${target.actionName} aborted. To continue, all cleanup objects and SAP packages must be released`);
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
const temporaryPackages = Array.from(deletionObjects.values()).filter(object => isDevclass(object) && normalize(object.objName).startsWith('$'));
|
|
784
|
+
const objectsToTransport = Array.from(deletionObjects.values()).filter(object => !temporaryPackages.includes(object));
|
|
785
|
+
// Cleanup exports the previous installation's objects, regardless of the new namespace.
|
|
786
|
+
const needsStaging = normalize(installed.getDevclass() || '').startsWith('$');
|
|
787
|
+
const stagingDevclasses = [];
|
|
788
|
+
let retainedOriginalTadir = [];
|
|
789
|
+
if (needsStaging && (objectsToTransport.length > 0 || retainedTables.length > 0)) {
|
|
790
|
+
const existingObjects = yield systemConnector_1.SystemConnector.getExistingObjects([...objectsToTransport, ...retainedTables].map(object => ({
|
|
791
|
+
pgmid: object.pgmid, object: object.object, objName: object.objName, devclass: ''
|
|
792
|
+
})));
|
|
793
|
+
// SAP only accepts objects of a custom namespace in packages of that namespace:
|
|
794
|
+
// stage them by namespace.
|
|
795
|
+
const stagingGroups = new Map();
|
|
796
|
+
for (const object of existingObjects) {
|
|
797
|
+
const namespace = getCustomNamespace(object.objName) || '';
|
|
798
|
+
stagingGroups.set(namespace, [...(stagingGroups.get(namespace) || []), object]);
|
|
799
|
+
}
|
|
800
|
+
context.revert.cleanupOriginalTadir = [];
|
|
801
|
+
for (const [namespace, objects] of stagingGroups) {
|
|
802
|
+
if (namespace) {
|
|
803
|
+
yield importStagingNamespace(context, namespace);
|
|
804
|
+
}
|
|
805
|
+
const stagingDevclass = yield createStagingPackage(context, namespace);
|
|
806
|
+
stagingDevclasses.push(stagingDevclass);
|
|
807
|
+
for (const object of objects) {
|
|
808
|
+
context.revert.cleanupOriginalTadir.push(Object.assign({}, object));
|
|
809
|
+
if (retainedKeys.has(objectKey(object))) {
|
|
810
|
+
retainedOriginalTadir.push(Object.assign({}, object));
|
|
811
|
+
}
|
|
812
|
+
yield systemConnector_1.SystemConnector.tadirInterface(Object.assign(Object.assign({}, object), { devclass: stagingDevclass, srcsystem: 'TRM' }));
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
if (retainedTables.length > 0) {
|
|
817
|
+
yield backupRetainedTables(context, retainedTables);
|
|
818
|
+
// Retained tables stay installed: move them out of the staging package before it is deleted.
|
|
819
|
+
yield restoreTadirAssignments(retainedOriginalTadir);
|
|
820
|
+
}
|
|
821
|
+
if (objectsToTransport.length > 0) {
|
|
822
|
+
yield dummy.addObjects(objectsToTransport, false);
|
|
823
|
+
}
|
|
824
|
+
if (stagingDevclasses.length > 0) {
|
|
825
|
+
yield dummy.addObjects(stagingDevclasses.map(devclass => ({ pgmid: 'R3TR', object: 'DEVC', objName: devclass })), false);
|
|
826
|
+
}
|
|
827
|
+
// Namespaces imported for the staging go with their staging packages.
|
|
828
|
+
const temporaryNamespaces = (context.revert.temporaryNamespaces || [])
|
|
829
|
+
.filter(namespace => !namespacesToDelete.some(o => normalize(o) === normalize(namespace)));
|
|
830
|
+
if (temporaryNamespaces.length > 0) {
|
|
831
|
+
yield dummy.addObjects(temporaryNamespaces.map(namespace => ({ pgmid: 'R3TR', object: 'NSPC', objName: namespace })), false);
|
|
832
|
+
}
|
|
833
|
+
// The copy keeps the E071K keys and OBJFUNC K: the release exports the current rows
|
|
834
|
+
// (restored by a rollback) and the registry turns them into deletions by key.
|
|
835
|
+
context.revert.cleanupCustomizingSources = [];
|
|
836
|
+
for (const trkorr of customizingSources) {
|
|
837
|
+
trm_commons_1.Logger.loading(`Including customizing from transport ${trkorr}...`, true);
|
|
838
|
+
yield dummy.addObjectsFromTransport(trkorr);
|
|
839
|
+
context.revert.cleanupCustomizingSources.push(trkorr);
|
|
840
|
+
}
|
|
841
|
+
const packageDepth = (devclass) => {
|
|
842
|
+
const visited = new Set();
|
|
843
|
+
let parent = packageParents.get(normalize(devclass));
|
|
844
|
+
while (parent && !visited.has(parent)) {
|
|
845
|
+
visited.add(parent);
|
|
846
|
+
parent = packageParents.get(parent);
|
|
847
|
+
}
|
|
848
|
+
return visited.size;
|
|
849
|
+
};
|
|
850
|
+
// Delete descendants before their parents, regardless of transport entry order.
|
|
851
|
+
temporaryPackages.sort((a, b) => packageDepth(b.objName) - packageDepth(a.objName));
|
|
852
|
+
context.revert.cleanupTemporaryPackages = [];
|
|
853
|
+
// Snapshot every definition before deleting any package, including for partial failures.
|
|
854
|
+
for (const devclass of temporaryPackages) {
|
|
855
|
+
const pkg = yield systemConnector_1.SystemConnector.getDevclass(devclass.objName);
|
|
856
|
+
if (!pkg) {
|
|
857
|
+
throw new Error(`Cannot back up temporary SAP package ${devclass.objName}`);
|
|
858
|
+
}
|
|
859
|
+
context.revert.cleanupTemporaryPackages.push(Object.assign({}, pkg));
|
|
860
|
+
}
|
|
861
|
+
try {
|
|
862
|
+
yield deleteTemporaryCleanupPackages(temporaryPackages);
|
|
863
|
+
}
|
|
864
|
+
catch (e) {
|
|
865
|
+
// Their objects are already in the deletion transport: an empty local package is a harmless leftover.
|
|
866
|
+
trm_commons_1.Logger.warning(`Could not delete local SAP package(s) ${temporaryPackages.map(o => o.objName).join(', ')} (${e instanceof Error ? e.message : String(e)}): delete them manually.`, { important: true });
|
|
867
|
+
}
|
|
868
|
+
//guard: clean and rebuild comments
|
|
869
|
+
yield dummy.removeComments();
|
|
870
|
+
yield dummy.addComment(`name=${installed.manifest.get().name}`);
|
|
871
|
+
yield dummy.addComment(`version=${installed.manifest.get().version}`);
|
|
872
|
+
try {
|
|
873
|
+
yield (0, releaseDeletionTransport_1.releaseDeletionTransport)(dummy, context.rawInput.packageData.registry, context);
|
|
874
|
+
}
|
|
875
|
+
catch (e) {
|
|
876
|
+
if (!(e instanceof registry_1.RegistryDeletionTransportUnavailableError)) {
|
|
877
|
+
throw e;
|
|
878
|
+
}
|
|
879
|
+
//at this point the dummy is already released, transport cannot be deleted but it's a harmless release of a transport of copies.
|
|
880
|
+
yield restoreCleanupAssignments(context, true);
|
|
881
|
+
if (target.requireDeletion) {
|
|
882
|
+
trm_commons_1.Logger.error(e.message, { important: true });
|
|
883
|
+
throw e;
|
|
884
|
+
}
|
|
885
|
+
trm_commons_1.Logger.warning(`${e.message} Manual cleanup of previous release install might be necessary.`, { important: true });
|
|
886
|
+
// Deleting the staging packages needs a deletion transport too.
|
|
887
|
+
if (stagingDevclasses.length > 0) {
|
|
888
|
+
trm_commons_1.Logger.warning(`SAP package(s) ${stagingDevclasses.join(', ')}, created for the cleanup, were left on ${systemConnector_1.SystemConnector.getDest()}: delete them manually.`, { important: true });
|
|
889
|
+
}
|
|
890
|
+
if (((_c = context.revert.temporaryNamespaces) === null || _c === void 0 ? void 0 : _c.length) > 0) {
|
|
891
|
+
trm_commons_1.Logger.warning(`Namespace(s) ${context.revert.temporaryNamespaces.join(', ')}, imported for the cleanup, were left on ${systemConnector_1.SystemConnector.getDest()}: delete them manually.`, { important: true });
|
|
892
|
+
}
|
|
893
|
+
}
|
|
894
|
+
}));
|
|
895
|
+
});
|
|
896
|
+
}
|
|
897
|
+
/**
|
|
898
|
+
* Whether the deletion transport generated by {@link cleanupInstalledPackage} must be carried
|
|
899
|
+
* through the landscape. Objects of a temporary (`$`) installation only exist on this system.
|
|
900
|
+
*/
|
|
901
|
+
function isDeletionForwardable(context) {
|
|
902
|
+
var _a;
|
|
903
|
+
return !!context.revert.dele && !normalize(((_a = context.runtime.update) === null || _a === void 0 ? void 0 : _a.getDevclass()) || '').startsWith('$');
|
|
904
|
+
}
|
|
905
|
+
/**
|
|
906
|
+
* Adds the deletion transport to the import queue of the landscape target system, so the
|
|
907
|
+
* removed objects are also deleted there.
|
|
908
|
+
* For a clean landscape, it has to be imported before any transport of a later release.
|
|
909
|
+
*/
|
|
910
|
+
function forwardDeletionTransport(context, targetSystem) {
|
|
911
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
912
|
+
// The queue may be changed even when the connector response fails.
|
|
913
|
+
context.revert.deleInTargetTms = true;
|
|
914
|
+
yield systemConnector_1.SystemConnector.forwardTransport(context.revert.dele.trkorr, targetSystem, systemConnector_1.SystemConnector.getDest(), true);
|
|
915
|
+
});
|
|
916
|
+
}
|
|
917
|
+
/**
|
|
918
|
+
* Removes a transport from the import queue of `targetSystem`. Only the queue of the connected
|
|
919
|
+
* system can be changed: another system's queue would need its credentials, so the operator is
|
|
920
|
+
* warned to remove it manually. Returns whether the transport was removed.
|
|
921
|
+
*/
|
|
922
|
+
function removeFromImportQueue(trkorr, targetSystem, description) {
|
|
923
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
924
|
+
if (normalize(targetSystem) === normalize(systemConnector_1.SystemConnector.getDest())) {
|
|
925
|
+
yield systemConnector_1.SystemConnector.deleteTmsTransport(trkorr, targetSystem);
|
|
926
|
+
return true;
|
|
927
|
+
}
|
|
928
|
+
trm_commons_1.Logger.warning(`${description} ${trkorr} may be in the ${targetSystem} import queue: remove it manually in STMS (it can't be removed from ${systemConnector_1.SystemConnector.getDest()}).`, { important: true });
|
|
929
|
+
return false;
|
|
930
|
+
});
|
|
931
|
+
}
|
|
932
|
+
/** Removes the deletion transport from the target system import queue, when it was forwarded. */
|
|
933
|
+
function revertForwardedDeletionTransport(context, targetSystem) {
|
|
934
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
935
|
+
if (context.revert.deleInTargetTms) {
|
|
936
|
+
yield removeFromImportQueue(context.revert.dele.trkorr, targetSystem, `Deletion transport`);
|
|
937
|
+
}
|
|
938
|
+
});
|
|
939
|
+
}
|
|
940
|
+
/**
|
|
941
|
+
* Rolls back {@link cleanupInstalledPackage}: recreates deleted temporary packages, deletes the
|
|
942
|
+
* deletion transport or, once its import started, re-imports the copy of the deleted objects,
|
|
943
|
+
* restores retained tables, and restores object assignments.
|
|
944
|
+
* With `restore` set to `false` (a later destructive cleanup failed), previous state is not
|
|
945
|
+
* restored over objects that were not deleted: only the unreleased transports are deleted.
|
|
946
|
+
* Every independent operation is attempted; the first failure is thrown afterwards.
|
|
947
|
+
*/
|
|
948
|
+
function revertInstalledPackageCleanup(context_1) {
|
|
949
|
+
return __awaiter(this, arguments, void 0, function* (context, restore = true) {
|
|
950
|
+
let firstError;
|
|
951
|
+
if (restore) {
|
|
952
|
+
try {
|
|
953
|
+
yield restoreCleanupPackages(context);
|
|
954
|
+
}
|
|
955
|
+
catch (error) {
|
|
956
|
+
firstError = error;
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
try {
|
|
960
|
+
if (context.revert.dele) {
|
|
961
|
+
//check if it can be deleted -> the exception might have been raised before the transport release, we can still cleanup nicely
|
|
962
|
+
const transport = new transport_1.Transport(context.revert.dele.trkorr);
|
|
963
|
+
if (yield (transport.canBeDeleted())) {
|
|
964
|
+
yield transport.delete();
|
|
965
|
+
}
|
|
966
|
+
else if (context.revert.deleImportStarted) {
|
|
967
|
+
if (restore) {
|
|
968
|
+
yield (0, restoreTransport_1.restoreTransport)(context.revert.dele);
|
|
969
|
+
}
|
|
970
|
+
else {
|
|
971
|
+
trm_commons_1.Logger.warning(`Objects deleted by ${context.revert.dele.trkorr} were not restored, as the cleanup of the imported objects failed: manual restore might be necessary.`, { important: true });
|
|
972
|
+
}
|
|
973
|
+
}
|
|
974
|
+
else {
|
|
975
|
+
// Released but never imported: the objects were not deleted, re-importing the copy would overwrite them.
|
|
976
|
+
trm_commons_1.Logger.log(`Deletion transport ${context.revert.dele.trkorr} was not imported, objects restore skipped`, true);
|
|
977
|
+
}
|
|
978
|
+
}
|
|
979
|
+
else if (context.revert.updateCleanupTransport
|
|
980
|
+
&& (yield context.revert.updateCleanupTransport.canBeDeleted())) {
|
|
981
|
+
yield context.revert.updateCleanupTransport.delete();
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
catch (error) {
|
|
985
|
+
firstError || (firstError = error);
|
|
986
|
+
}
|
|
987
|
+
try {
|
|
988
|
+
if (context.revert.retainedTables) {
|
|
989
|
+
if (restore) {
|
|
990
|
+
// Old table definitions are imported over the new ones: data is kept.
|
|
991
|
+
yield (0, restoreTransport_1.restoreTransport)(context.revert.retainedTables);
|
|
992
|
+
}
|
|
993
|
+
else {
|
|
994
|
+
trm_commons_1.Logger.warning(`Retained tables backup ${context.revert.retainedTables.trkorr} was not restored, as the cleanup of the imported objects failed: manual restore might be necessary.`, { important: true });
|
|
995
|
+
}
|
|
996
|
+
}
|
|
997
|
+
else if (context.revert.updateTablesBackupTransport
|
|
998
|
+
&& (yield context.revert.updateTablesBackupTransport.canBeDeleted())) {
|
|
999
|
+
yield context.revert.updateTablesBackupTransport.delete();
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
catch (error) {
|
|
1003
|
+
firstError || (firstError = error);
|
|
1004
|
+
}
|
|
1005
|
+
if (restore) {
|
|
1006
|
+
try {
|
|
1007
|
+
yield restoreCleanupAssignments(context, false);
|
|
1008
|
+
}
|
|
1009
|
+
catch (error) {
|
|
1010
|
+
firstError || (firstError = error);
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1013
|
+
if (firstError) {
|
|
1014
|
+
throw firstError;
|
|
1015
|
+
}
|
|
1016
|
+
});
|
|
1017
|
+
}
|