Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Menu option to export production to support migrating to production decomposition (#665)

### Fixed
- Fixed errors on production page when item settings need to be XML escaped (#667)

## [2.8.0] - 2024-12-06

### Added
Expand Down
48 changes: 27 additions & 21 deletions cls/SourceControl/Git/Production.cls
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ ClassMethod DeleteProductionDefinitionShards(productionClass As %String, deleteM
while rs.%Next(.sc) {
quit:$$$ISERR(sc)
set ptdFilename = rs.Data("Name")
set sc = ##class(%Studio.SourceControl.Production).ParseExternalName(ptdFilename, .ptdInternalName)
set sc = ..ParseExternalName(ptdFilename, .ptdInternalName)
quit:$$$ISERR(sc)
// TODO: Consider reverting delete if any ptd is not editable by current user
set sc = $method(%SourceControl, deleteMethod, ptdInternalName)
Expand Down Expand Up @@ -371,26 +371,32 @@ ClassMethod IsProductionClass(className As %String, nameMethod As %String) As %B
ClassMethod ParseExternalName(externalName, Output internalName = "", Output productionName = "") As %Status
{
set sc = $$$OK
set extNameNormalized = $replace(externalName, "\", "/")
set file = $piece(extNameNormalized, "/", *)
if $extract(file,1,9) = "ProdStgs-" {
set productionName = $replace($extract(file,10,*-4), "_", ".")
set internalName = ..CreateInternalName(productionName,,,1)
} else {
if ##class(%File).Exists(externalName) {
// Special case for Config Item Settings PTD, requires checking PTD CDATA for Item and Class name
set deployDoc = ##class(EnsLib.EDI.XML.Document).%New(externalName)
set exportNotesPTDText = $ZCVT(deployDoc.GetValueAt("/Export/Document[1]/1"),"I","XML")
set exportNotesPTD = ##class(EnsLib.EDI.XML.Document).%New(exportNotesPTDText)
set productionName = exportNotesPTD.GetValueAt("/Deployment/Creation/SourceProduction")
set settingsPTDText = $zconvert(deployDoc.GetValueAt("/Export/Document[2]/1"),"I","XML")
set settingsPTD = ##class(EnsLib.EDI.XML.Document).%New(settingsPTDText)
set itemClass = settingsPTD.GetValueAt("/Item/@ClassName")
set itemName = settingsPTD.GetValueAt("/Item/@Name")
set internalName = ..CreateInternalName(productionName, itemName, itemClass, 0)
} else {
set sc = $$$ERROR($$$GeneralError, "Item settings PTD file " _ externalName _ " does not exist. Cannot parse external name.")
}
try {
set extNameNormalized = $replace(externalName, "\", "/")
set file = $piece(extNameNormalized, "/", *)
if $extract(file,1,9) = "ProdStgs-" {
set productionName = $replace($extract(file,10,*-4), "_", ".")
set internalName = ..CreateInternalName(productionName,,,1)
} else {
if ##class(%File).Exists(externalName) {
// Special case for Config Item Settings PTD, requires checking PTD CDATA for Item and Class name
set deployDoc = ##class(EnsLib.EDI.XML.Document).%New(externalName)
set exportNotesPTDText = $ZCVT(deployDoc.GetValueAt("/Export/Document[1]/1"),"I","XML")
set exportNotesPTD = ##class(EnsLib.EDI.XML.Document).%New(exportNotesPTDText)
set productionName = exportNotesPTD.GetValueAt("/Deployment/Creation/SourceProduction")
set settingsPTDText = $zconvert(deployDoc.GetValueAt("/Export/Document[2]/1"),"I","XML")
// unquote embedded CDATA close markers - see Ens.Util.ProjectTextDocument StreamToGbl method
set settingsPTDText = $replace(settingsPTDText,"]*]>", "]]>")
set settingsPTD = ##class(EnsLib.EDI.XML.Document).%New(settingsPTDText)
set itemClass = settingsPTD.GetValueAt("/Item/@ClassName")
set itemName = settingsPTD.GetValueAt("/Item/@Name")
set internalName = ..CreateInternalName(productionName, itemName, itemClass, 0)
} else {
set sc = $$$ERROR($$$GeneralError, "Item settings PTD file " _ externalName _ " does not exist. Cannot parse external name.")
}
}
} catch err {
set sc = err.AsStatus()
}
return sc
}
Expand Down
10 changes: 6 additions & 4 deletions test/UnitTest/SourceControl/Git/ProductionDecomposition.cls
Original file line number Diff line number Diff line change
Expand Up @@ -82,10 +82,10 @@ Method TestEditProduction()
$$$ThrowOnError(%SourceControl.OnBeforeSave(..#ProductionName_".cls"))
do ..ReplaceProductionDefinition("ProductionDefinition3")
$$$ThrowOnError(%SourceControl.OnAfterSave(..#ProductionName_".cls"))
do $$$AssertTrue(##class(SourceControl.Git.Utils).IsInSourceControl("UnitTest.SampleProduction||Settings-b|Ens.Activity.Operation.Local.PTD"))
do $$$AssertTrue(##class(SourceControl.Git.Utils).IsInSourceControl("UnitTest.SampleProduction||Settings-b|EnsLib.SOAP.GenericOperation.PTD"))
do ##class(SourceControl.Git.Utils).RunGitCommand("add",,,".")
do ##class(SourceControl.Git.Utils).Commit("UnitTest.SampleProduction||Settings-a|Ens.Activity.Operation.Local.PTD")
do ##class(SourceControl.Git.Utils).Commit("UnitTest.SampleProduction||Settings-b|Ens.Activity.Operation.Local.PTD")
do ##class(SourceControl.Git.Utils).Commit("UnitTest.SampleProduction||Settings-b|EnsLib.SOAP.GenericOperation.PTD")
$$$ThrowOnError(production.%Reload())
do $$$AssertEquals(production.Items.Count(), 2)
do $$$AssertEquals(production.Items.GetAt(1).Settings.GetAt(1).Name, "RecordStatsInterval")
Expand Down Expand Up @@ -135,7 +135,8 @@ XData ProductionDefinition2
<Item Name="a" Category="" ClassName="Ens.Activity.Operation.Local" PoolSize="1" Enabled="true" Foreground="false" Comment="" LogTraceEvents="false" Schedule="">
<Setting Target="Host" Name="RecordStatsInterval">61</Setting>
</Item>
<Item Name="b" Category="" ClassName="Ens.Activity.Operation.Local" PoolSize="1" Enabled="true" Foreground="false" Comment="" LogTraceEvents="false" Schedule="">
<Item Name="b" Category="" ClassName="EnsLib.SOAP.GenericOperation" PoolSize="1" Enabled="false" Foreground="false" Comment="" LogTraceEvents="false" Schedule="">
<Setting Target="Adapter" Name="HTTPServer"><![CDATA[<something that must be escaped>]]></Setting>
</Item>
</Production>
}
Expand All @@ -147,7 +148,8 @@ XData ProductionDefinition3
<Item Name="a" Category="" ClassName="Ens.Activity.Operation.Local" PoolSize="1" Enabled="true" Foreground="false" Comment="" LogTraceEvents="false" Schedule="">
<Setting Target="Host" Name="RecordStatsInterval">71</Setting>
</Item>
<Item Name="b" Category="" ClassName="Ens.Activity.Operation.Local" PoolSize="1" Enabled="true" Foreground="false" Comment="" LogTraceEvents="false" Schedule="">
<Item Name="b" Category="" ClassName="EnsLib.SOAP.GenericOperation" PoolSize="1" Enabled="false" Foreground="false" Comment="" LogTraceEvents="false" Schedule="">
<Setting Target="Adapter" Name="HTTPServer"><![CDATA[<something that must be escaped>]]></Setting>
</Item>
</Production>
}
Expand Down
Loading