Skip to content

Commit c8513ab

Browse files
authored
Merge to Master for 2.0.6 release (#32)
* Small change to what triggers a Sitecore field value to be reset (to std value). Rainbow would skip this, for fields that already were .NullOrEmpty - but an unchecked checkbox field is empty and a reset one is null. Now it resets correctly for any value not null. * Added constructor overload to the DefaultDeserializer, to remain compatible with SideKick and other potential projects that have not yet been updated. * The ItemComparer will no longer attempt to find a Field Comparer for null/null values, it will now assume them to be identical. This should help untangle Unicorn Issue 319. * 2.0.6-pre3 * Fixes Unicorn Issue #334 - Changes in Sitecore's internal handling of shared/versioned/unversioned field values conflicted with Rainbow's handling of same * Ticked version to 2.0.6-pre4 * Another fix for Unicorn Issue #319 - Empty field values would not get written back to Sitecore if no field value existed (e.g. field contained standard value) * Ticked version to 2.0.6-pre5 * Fixes Unicorn issue #324 * Ticked version to 2.0.6-pre6 * #30 - Do not reset fields which are excluded in the fieldFilter (#31) * Changed 2 tests related to what should happen, when a field is in target only or source only * Fixed some line endings to deal with some LF/CRLF inconsistency. We probably need a .gitsettings to nail this down * Ticked version to 2.0.6-pre7
1 parent 752859c commit c8513ab

File tree

9 files changed

+1240
-1181
lines changed

9 files changed

+1240
-1181
lines changed

src/Rainbow.Storage.Sc.Tests/Deserialization/DefaultDeserializerTests.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,45 @@ public void Deserialize_IgnoresField_ExcludedWithFieldFilter()
233233
}
234234
}
235235

236+
[Fact]
237+
public void Deserialize_IgnoresField_ExcludedWithFieldFilterNotSerialized()
238+
{
239+
var ignoredFieldId = ID.NewID;
240+
var ignoredSharedFieldId = ID.NewID;
241+
242+
var fieldFilter = Substitute.For<IFieldFilter>();
243+
fieldFilter.Includes(Arg.Any<Guid>()).Returns(true);
244+
fieldFilter.Includes(ignoredFieldId.Guid).Returns(false);
245+
fieldFilter.Includes(ignoredSharedFieldId.Guid).Returns(false);
246+
247+
var deserializer = new DefaultDeserializer(false, Substitute.For<IDefaultDeserializerLogger>(), fieldFilter);
248+
deserializer.ParentDataStore = new SitecoreDataStore(deserializer);
249+
250+
using (var db = new Db())
251+
{
252+
var itemId = ID.NewID;
253+
254+
db.Add(new DbItem("Test Item", itemId)
255+
{
256+
new DbField(ignoredFieldId) { Value = "Test Value", Shared = false },
257+
new DbField(ignoredSharedFieldId) { Value = "Shared Test Value", Shared = true }
258+
});
259+
260+
var itemData = new ProxyItem(new ItemData(db.GetItem(itemId)));
261+
262+
var fields = new List<IItemFieldValue>();
263+
((ProxyItemVersion)itemData.Versions.First()).Fields = fields;
264+
itemData.SharedFields = fields;
265+
266+
deserializer.Deserialize(itemData);
267+
268+
var fromDb = db.GetItem(itemId);
269+
270+
Assert.Equal(fromDb[ignoredFieldId], "Test Value");
271+
Assert.Equal(fromDb[ignoredSharedFieldId], "Shared Test Value");
272+
}
273+
}
274+
236275
protected IDeserializer CreateTestDeserializer(Db db)
237276
{
238277
var fieldFilter = Substitute.For<IFieldFilter>();

src/Rainbow.Storage.Sc/Deserialization/DefaultDeserializer.cs

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ public class DefaultDeserializer : IDeserializer
3737

3838
public bool IgnoreBranchId { get; }
3939

40+
// Overload constructor, implemented for keeping compatibility with external tools that may not yet have updated their codebase to support the branchId switch (e.g. SideKick)
41+
// ReSharper disable once UnusedMember.Global
42+
public DefaultDeserializer(IDefaultDeserializerLogger logger, IFieldFilter fieldFilter) : this(true, logger, fieldFilter) { }
43+
4044
public DefaultDeserializer(bool ignoreBranchId, IDefaultDeserializerLogger logger, IFieldFilter fieldFilter)
4145
{
4246
Assert.ArgumentNotNull(logger, "logger");
@@ -77,14 +81,14 @@ public IItemData Deserialize(IItemData serializedItemData)
7781

7882
ResetTemplateEngineIfItemIsTemplate(targetItem);
7983

80-
UpdateFieldSharingIfNeeded(serializedItemData, targetItem);
81-
8284
PasteSharedFields(serializedItemData, targetItem, newItemWasCreated, softErrors);
8385

84-
PasteVersions(serializedItemData, targetItem, newItemWasCreated, softErrors);
85-
8686
PasteUnversionedFields(serializedItemData, targetItem, newItemWasCreated, softErrors);
8787

88+
UpdateFieldSharingIfNeeded(serializedItemData, targetItem);
89+
90+
PasteVersions(serializedItemData, targetItem, newItemWasCreated, softErrors);
91+
8892
if (softErrors.Count > 0) throw TemplateMissingFieldException.Merge(softErrors);
8993

9094
return new ItemData(targetItem, ParentDataStore);
@@ -279,6 +283,11 @@ protected void ChangeTemplateIfNeeded(IItemData serializedItemData, Item targetI
279283
/// </summary>
280284
protected void UpdateFieldSharingIfNeeded(IItemData serializedItemData, Item targetItem)
281285
{
286+
// This is what Sitecore's internal deserializer does instead. Will investigate if this is a better option. Also depends on which Sitecore version introduced this.
287+
//if (EventDisabler.IsActive)
288+
// ReflectionUtil.CallMethod(targetItem.Database.Engines.TemplateEngine, "HandleItemSaved", new object[] {targetItem, (ItemChanges) ReflectionUtil.CallMethod(targetItem, "GetFullChanges"), false});
289+
//return;
290+
282291
Assert.ArgumentNotNull(serializedItemData, nameof(serializedItemData));
283292
Assert.ArgumentNotNull(targetItem, nameof(targetItem));
284293

@@ -353,7 +362,7 @@ protected virtual void PasteSharedFields(IItemData serializedItemData, Item targ
353362

354363
foreach (Field field in targetItem.Fields)
355364
{
356-
if (field.Shared && !allTargetSharedFields.Contains(field.ID.Guid))
365+
if (field.Shared && !allTargetSharedFields.Contains(field.ID.Guid) && _fieldFilter.Includes(field.ID.Guid))
357366
{
358367
_logger.ResetFieldThatDidNotExistInSerialized(field);
359368

@@ -472,6 +481,9 @@ protected virtual Item PasteVersion(Item item, IItemVersion serializedVersion, b
472481
// (we do all these checks so we can back out of the edit context and avoid a DB write if we don't need one)
473482
foreach (Field field in languageVersionItem.Fields)
474483
{
484+
// if the field is excluded by the fieldFilter
485+
if (!_fieldFilter.Includes(field.ID.Guid)) continue;
486+
475487
// shared/unversioned fields = ignore, those are handled in their own paste methods
476488
if (field.Shared || field.Unversioned) continue;
477489

@@ -587,7 +599,8 @@ protected virtual void PasteUnversionedLanguage(Item item, IItemLanguage seriali
587599
foreach (Field field in targetItem.Fields)
588600
{
589601
// field was not serialized. Which means the field is either blank or has its standard value, so let's reset it
590-
if (field.Unversioned && !field.Shared && !allTargetUnversionedFields.Contains(field.ID.Guid))
602+
if (field.Unversioned && !field.Shared && !allTargetUnversionedFields.Contains(field.ID.Guid) &&
603+
_fieldFilter.Includes(field.ID.Guid))
591604
{
592605
_logger.ResetFieldThatDidNotExistInSerialized(field);
593606

0 commit comments

Comments
 (0)