From 557e3ff0f2bb59ee425ec445240fa86b06abcd48 Mon Sep 17 00:00:00 2001 From: "emir.sehovic" Date: Wed, 7 Jan 2026 14:57:47 +0100 Subject: [PATCH 1/2] loop through all fields instead of just local ones for value comparison on upsert --- .../BulkActions/Actions/UpsertBulkAction.cs | 37 ++++++++++++------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/source/Cute.Lib/Contentful/BulkActions/Actions/UpsertBulkAction.cs b/source/Cute.Lib/Contentful/BulkActions/Actions/UpsertBulkAction.cs index ef83b6b..9239833 100644 --- a/source/Cute.Lib/Contentful/BulkActions/Actions/UpsertBulkAction.cs +++ b/source/Cute.Lib/Contentful/BulkActions/Actions/UpsertBulkAction.cs @@ -428,30 +428,41 @@ private bool ValuesDiffer( var contentDisplayField = _contentType!.DisplayField; - foreach (var (fieldName, value) in localFlatEntry) - { - if (fieldName.StartsWith("sys.")) continue; + var allFieldNames = localFlatEntry.Keys + .Concat(cloudFlatEntry.Keys) + .Where(fieldName => !fieldName.StartsWith("sys.")) + .ToHashSet(); - string? oldValue = null; + foreach (var fieldName in allFieldNames) + { + var existsInLocal = localFlatEntry.TryGetValue(fieldName, out var localValue); + var existsInCloud = cloudFlatEntry.TryGetValue(fieldName, out var cloudValue); - if (cloudFlatEntry.TryGetValue(fieldName, out var oldValueObj)) + if (existsInLocal) { - oldValue = cloudFlatEntry[fieldName]?.ToString(); - } + string? oldValue = cloudValue?.ToString(); - var isFieldChanged = serializer.CompareAndUpdateEntry(cloudFlatEntry, fieldName, value, _appendFields); + var isFieldChanged = serializer.CompareAndUpdateEntry(cloudFlatEntry, fieldName, localValue, _appendFields); - if (isFieldChanged) + if (isFieldChanged) + { + changedFields.Add(fieldName, (oldValue, localValue)); + isChanged = true; + } + } + else if (existsInCloud && !string.IsNullOrEmpty(cloudValue?.ToString())) { - changedFields.Add(fieldName, (oldValue, value)); + changedFields.Add(fieldName, (cloudValue?.ToString(), null)); + cloudFlatEntry[fieldName] = null; + isChanged = true; } - - isChanged = isFieldChanged || isChanged; } if (isChanged) { - var newEntryName = localFlatEntry.ContainsKey($"{contentDisplayField}.{defaultLocale}") ? localFlatEntry[$"{contentDisplayField}.{defaultLocale}"] : localFlatEntry[$"{_matchField}.{defaultLocale}"]; + var newEntryName = localFlatEntry.ContainsKey($"{contentDisplayField}.{defaultLocale}") + ? localFlatEntry[$"{contentDisplayField}.{defaultLocale}"] + : localFlatEntry[$"{_matchField}.{defaultLocale}"]; NotifyUserInterface($"'{_contentTypeId}' - '{newEntryName}' will be updated.", progressUpdater); From 1b234dffe6110ac2625db75e60164ae0e7d712a2 Mon Sep 17 00:00:00 2001 From: "emir.sehovic" Date: Mon, 12 Jan 2026 15:48:44 +0100 Subject: [PATCH 2/2] Remove key from cloudFlatEntry instead of setting value to null --- .../Cute.Lib/Contentful/BulkActions/Actions/UpsertBulkAction.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Cute.Lib/Contentful/BulkActions/Actions/UpsertBulkAction.cs b/source/Cute.Lib/Contentful/BulkActions/Actions/UpsertBulkAction.cs index 9239833..bae2e68 100644 --- a/source/Cute.Lib/Contentful/BulkActions/Actions/UpsertBulkAction.cs +++ b/source/Cute.Lib/Contentful/BulkActions/Actions/UpsertBulkAction.cs @@ -453,7 +453,7 @@ private bool ValuesDiffer( else if (existsInCloud && !string.IsNullOrEmpty(cloudValue?.ToString())) { changedFields.Add(fieldName, (cloudValue?.ToString(), null)); - cloudFlatEntry[fieldName] = null; + cloudFlatEntry.Remove(fieldName); isChanged = true; } }