Skip to content

Instantly share code, notes, and snippets.

@sebastiantecsi
Forked from michaellwest/CompareFieldChanges.ps1
Created January 29, 2023 13:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sebastiantecsi/5d0db6034e67a2463b94e28e87835b7d to your computer and use it in GitHub Desktop.
Save sebastiantecsi/5d0db6034e67a2463b94e28e87835b7d to your computer and use it in GitHub Desktop.
The following Sitecore PowerShell Extensions script finds items stored in the IAR files that also exist in the database.
$databaseName = $actionData["databaseName"]
$filename = $actionData["filename"]
$resourceLoaderType = ([System.Type]::GetType("Sitecore.Data.DataProviders.ReadOnly.Protobuf.IResourceLoader, Sitecore.Data.ResourceItems.ProtobufNet"))
$resourceLoader = [Sitecore.DependencyInjection.ServiceLocator]::ServiceProvider.GetService($resourceLoaderType)
$paths = [System.Collections.Generic.List[String]]@()
$paths.Add([Sitecore.MainUtil]::MapPath("/App_Data/items/$($databaseName)/$($filename)")) > $null
$paths.Add([Sitecore.MainUtil]::MapPath("/sitecore modules/items/$($databaseName)/$($filename)")) > $null
$defaultFieldValues = New-Object -TypeName 'System.Collections.Generic.Dictionary[[guid], [string]]'
$database = [Sitecore.Configuration.Factory]::GetDatabase($databaseName)
$connectionString = [System.Configuration.ConfigurationManager]::ConnectionStrings[$databaseName]
$callContext = New-Object -TypeName "Sitecore.Data.DataProviders.CallContext, Sitecore.Kernel" -ArgumentList @($database.DataManager, $database.DataProviders.Count)
$sqlDataProvider = New-Object -TypeName "Sitecore.Data.SqlServer.SqlServerDataProvider, Sitecore.Kernel" -ArgumentList @($connectionString)
foreach($item in $selectedData) {
$itemDefinition = $sqlDataProvider.GetItemDefinition($item.ID, $callContext)
if($itemDefinition) {
$sqlDataProvider.DeleteItem($itemDefinition, $callContext) > $null
}
}
$reportItems = [System.Collections.ArrayList]@()
$itemDataSet = $resourceLoader.LoadFromFiles($paths, "dat", $defaultFieldValues)
foreach($itemRecord in $itemDataSet.Definitions.Values) {
$id = New-Object -TypeName "Sitecore.Data.ID, Sitecore.Kernel" -ArgumentList @($itemRecord.ID)
$itemDefinition = $sqlDataProvider.GetItemDefinition($id, $callContext)
if($itemDefinition) {
$reportItems.Add((Get-Item -Path "$($databaseName):" -ID ([ID]::Parse($itemRecord.ID)))) > $null
}
}
$reportItems | Update-ListView
$folder = "C:\Work\company\app\src\Serialization"
$files = Get-ChildItem -Path $folder -Recurse -File -Filter "*.yml"
foreach($file in $files) {
$content = [System.IO.File]::ReadAllText($file.FullName)
if(!$content.Contains("__Revision") -and !$content.Contains("MemberOf:")) {
Write-Host "$($file.FullName)"
#Remove-Item -Path $file.FullName
}
}
#https://www.maartenwillebrands.nl/2022/02/15/sitecore-removing-iar-items-from-the-database/
function Get-ModifiedItem {
param(
$databaseName,
$filename
)
$resourceLoaderType = ([System.Type]::GetType("Sitecore.Data.DataProviders.ReadOnly.Protobuf.IResourceLoader, Sitecore.Data.ResourceItems.ProtobufNet"))
$resourceLoader = [Sitecore.DependencyInjection.ServiceLocator]::ServiceProvider.GetService($resourceLoaderType)
$paths = [System.Collections.Generic.List[String]]@()
$paths.Add([Sitecore.MainUtil]::MapPath("/App_Data/items/$($databaseName)/$($filename)")) > $null
$paths.Add([Sitecore.MainUtil]::MapPath("/sitecore modules/items/$($databaseName)/$($filename)")) > $null
$defaultFieldValues = New-Object -TypeName 'System.Collections.Generic.Dictionary[[guid], [string]]'
$database = [Sitecore.Configuration.Factory]::GetDatabase($databaseName)
$connectionString = [System.Configuration.ConfigurationManager]::ConnectionStrings[$databaseName]
$callContext = New-Object -TypeName "Sitecore.Data.DataProviders.CallContext, Sitecore.Kernel" -ArgumentList @($database.DataManager, $database.DataProviders.Count)
$sqlDataProvider = New-Object -TypeName "Sitecore.Data.SqlServer.SqlServerDataProvider, Sitecore.Kernel" -ArgumentList @($connectionString)
$itemDataSet = $resourceLoader.LoadFromFiles($paths, "dat", $defaultFieldValues)
foreach($itemRecord in $itemDataSet.Definitions.Values) {
<# Find Items in database and IAR file
$id = New-Object -TypeName "Sitecore.Data.ID, Sitecore.Kernel" -ArgumentList @($itemRecord.ID)
$itemDefinition = $sqlDataProvider.GetItemDefinition($id, $callContext)
if($itemDefinition) {
Get-Item -Path "$($databaseName):" -ID ([ID]::Parse($itemRecord.ID))
}
#>
<# Find items where a language version is missing
$item = Get-Item -Path "$($databaseName):" -ID ([ID]::Parse($itemRecord.ID))
if($item.Versions.GetVersions($true).Count -eq 0) {
$item
#Add-ItemVersion -Item $item -TargetLanguage "en" -IfExist Skip -IfNoSourceVersion Add
} else {
#$item
}
#>
<# Update revision on items which use the Standard Value
$id = New-Object -TypeName "Sitecore.Data.ID, Sitecore.Kernel" -ArgumentList @($itemRecord.ID)
$itemDefinition = $sqlDataProvider.GetItemDefinition($id, $callContext)
if(!$itemDefinition) {
$item = Get-Item -Path "$($databaseName):" -ID ([ID]::Parse($itemRecord.ID))
if($item.Fields["__Revision"].ContainsStandardValue) {
Write-Host "Saving revision for $($item.Paths.Path)"
$item.Editing.BeginEdit()
$item["__Updated by"] = "sitecore\admin"
$item.Editing.EndEdit($true, $false) > $null
$item
}
}
#>
}
}
$iarItemNames = Get-ChildItem -Path "$($AppPath)/sitecore modules/items/" -File -Filter *.dat -Recurse | Select-Object -ExpandProperty Name | Sort-Object
$options = [ordered]@{}
foreach($iarItemName in $iarItemNames) {
$options[$iarItemName] = $iarItemName
}
$props = @{
Parameters = @(
@{Name="filename"; Title="Choose an option"; Tooltip="Additional details about the option"; Options=$options; }
)
Title = "Option Selector"
Icon = "OfficeWhite/32x32/question.png"
Description = "Choose an option."
Width = 450
Height = 300
ShowHints = $true
}
$result = Read-Variable @props
if($result -eq "cancel"){
exit
}
$databaseName = $filename.Split(".")[1]
Get-ModifiedItem -Database $databaseName -Filename $filename | Show-ListView -ViewName IARCleanup -ActionData @{"databaseName"=$databaseName;"filename"=$filename} -Property ID, Name, ItemPath, TemplateName, Database, Language, Version, @{Label="Revision";Expression={$_.__Revision}}
$rootIds = @(
"{B237CC51-F696-4D47-8467-BC988DF97686}",
"{B44226A7-42CE-4192-ABC1-2248B47EF213}",
"{0944417E-9A0D-4E65-B440-047E08BBA911}",
"{015B07EF-AB67-44B7-A625-4F447ABF7BD2}",
"{926401BF-A4E0-42A2-87B8-EBA8FF4FB5CF}",
"{2F8232B5-3089-4FEB-999A-D7389C903BB2}",
"{893839B9-14D9-4DA4-B504-51DC9E394DCF}",
"{6332795D-398F-49D6-ABB6-B28972B87E3E}",
"{8A071F63-95C6-46FC-AB37-926C7E1A46EA}",
"{B0AACC00-9D03-4A7A-BF30-CCCCCB30A419}",
"{A8615D05-BD21-4859-9340-892FBAEC64AB}",
"{2FD6E0B8-7A41-4372-8F84-A9B2F5F7F009}",
"{3ABF909C-980B-4A8B-BDE3-97048A1B18D4}",
"{A7F3264E-39CA-4962-805B-AE3D97A3AD63}",
"{1CE18C4B-1B27-469B-940B-45A2D9692178}",
"{DD0F4430-91AA-455B-B792-1C0EB80B8763}",
"{DF7836DE-0EA6-45E6-9530-402C7232A936}"
)
foreach($rootId in $rootIds) {
Get-ChildItem -Path "master:" -ID $rootId -Recurse | ForEach-Object {
$item = $_
if($item.Fields["__Revision"].ContainsStandardValue -or [string]::IsNullOrEmpty($item.Fields["__Revision"])) {
Write-Host "Saving revision for $($item.Paths.Path)"
#$item.Editing.BeginEdit()
#$item["__Updated by"] = "sitecore\admin"
#$item.Editing.EndEdit($true, $false) > $null
}
}
}
$src = "C:\Work\company\"
Push-Location -Path $src
$files = git diff --name-only HEAD
foreach($file in $files) {
Write-Host "Processing $($file)"
$changes = git diff HEAD~1 $file
$additions = 0
$subtractions = 0
foreach($line in $changes) {
if($line.StartsWith("+ ")) {
$additions++
}
if($line.StartsWith("- ")) {
$subtractions++
}
}
if($additions -eq 3 -and $subtractions -eq 0 -and $changes.Contains("+ Hint: __Revision")) {
git add $file
}
}
Pop-Location
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment