Skip to content

Commit

Permalink
Fix #623 - Export should only write changes to child folder.
Browse files Browse the repository at this point in the history
  • Loading branch information
KevinJump committed Apr 22, 2024
1 parent 5756efb commit 1fb533d
Show file tree
Hide file tree
Showing 18 changed files with 117 additions and 132 deletions.
8 changes: 6 additions & 2 deletions uSync.BackOffice/Services/SyncFileService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
using Microsoft.Extensions.Logging;

using Umbraco.Cms.Core.Extensions;
using Umbraco.Extensions;

using uSync.BackOffice.Models;
using uSync.Core;
Expand Down Expand Up @@ -571,10 +572,13 @@ public XElement GetDifferences(List<XElement> nodes, ISyncTrackerBase trackerBas
{
if (nodes?.Count == 0) return null;
if (nodes.Count == 1) return nodes[0];
if (trackerBase is null) return nodes[^1];
return trackerBase?.GetDifferences(nodes);
if (trackerBase is null)
return SyncRootMergerHelper.GetDifferencesByFileContents(nodes);

return trackerBase?.GetDifferences(nodes);
}


/// <summary>
/// get all xml elements that represent this item across
/// all folders.
Expand Down
46 changes: 0 additions & 46 deletions uSync.BackOffice/SyncHandlers/Handlers/ContentTypeBaseHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,51 +39,5 @@ protected ContentTypeBaseHandler(
ISyncItemFactory syncItemFactory)
: base(logger, entityService, appCaches, shortStringHelper, syncFileService, mutexService, uSyncConfig, syncItemFactory)
{ }

/// <inheritdoc />
protected override SyncAttempt<XElement> Export_DoExport(TObject item, string filename, string[] folders, HandlerSettings config)
{
// all the possible files that there could be.
var files = folders.Select(x => GetPath(x, item, config.GuidNames, config.UseFlatStructure)).ToArray();
var nodes = syncFileService.GetAllNodes(files[..^1]);

// with roots enabled - we attempt to merge doctypes !
//
var attempt = SerializeItem(item, new Core.Serialization.SyncSerializerOptions(config.Settings));
if (attempt.Success)
{
if (ShouldExport(attempt.Item, config))
{
if (nodes.Count > 0)
{
nodes.Add(attempt.Item);
var difference = syncFileService.GetDifferences(nodes, trackers.FirstOrDefault());
if (difference != null)
{
syncFileService.SaveXElement(difference, filename);
}
else
{
if (syncFileService.FileExists(filename))
syncFileService.DeleteFile(filename);
}

}
else
{
syncFileService.SaveXElement(attempt.Item, filename);
}

if (config.CreateClean && HasChildren(item))
CreateCleanFile(GetItemKey(item), filename);
}
else
{
return SyncAttempt<XElement>.Succeed(filename, ChangeType.NoChange, "Not Exported (Based on configuration)");
}
}

return attempt;
}
}
}
45 changes: 0 additions & 45 deletions uSync.BackOffice/SyncHandlers/Handlers/DataTypeHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -116,50 +116,5 @@ protected override void DeleteFolder(int id)
protected override string GetItemFileName(IDataType item)
=> GetItemAlias(item).ToSafeAlias(shortStringHelper);

/// <inheritdoc />
protected override SyncAttempt<XElement> Export_DoExport(IDataType item, string filename, string[] folders, HandlerSettings config)
{
// all the possible files that there could be.
var files = folders.Select(x => GetPath(x, item, config.GuidNames, config.UseFlatStructure)).ToArray();
var nodes = syncFileService.GetAllNodes(files[..^1]);

// with roots enabled - we attempt to merge doctypes !
//
var attempt = SerializeItem(item, new Core.Serialization.SyncSerializerOptions(config.Settings));
if (attempt.Success)
{
if (ShouldExport(attempt.Item, config))
{
if (nodes.Count > 0)
{
nodes.Add(attempt.Item);
var difference = syncFileService.GetDifferences(nodes, trackers.FirstOrDefault());
if (difference != null)
{
syncFileService.SaveXElement(difference, filename);
}
else
{
if (syncFileService.FileExists(filename))
syncFileService.DeleteFile(filename);
}

}
else
{
syncFileService.SaveXElement(attempt.Item, filename);
}

if (config.CreateClean && HasChildren(item))
CreateCleanFile(GetItemKey(item), filename);
}
else
{
return SyncAttempt<XElement>.Succeed(filename, ChangeType.NoChange, "Not Exported (Based on configuration)");
}
}

return attempt;
}
}
}
44 changes: 33 additions & 11 deletions uSync.BackOffice/SyncHandlers/SyncHandlerRoot.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@

using uSync.BackOffice.Configuration;
using uSync.BackOffice.Extensions;
using uSync.BackOffice.Models;
using uSync.BackOffice.Services;
using uSync.BackOffice.SyncHandlers.Models;
using uSync.Core;
Expand All @@ -29,13 +28,13 @@

namespace uSync.BackOffice.SyncHandlers
{
/// <summary>
/// Root base class for all handlers
/// </summary>
/// <remarks>
/// If the Handler manages something that Implements IEntity use SyncBaseHandler
/// </remarks>
public abstract class SyncHandlerRoot<TObject, TContainer>
/// <summary>
/// Root base class for all handlers
/// </summary>
/// <remarks>
/// If the Handler manages something that Implements IEntity use SyncBaseHandler
/// </remarks>
public abstract class SyncHandlerRoot<TObject, TContainer>
{
/// <summary>
/// Reference to the Logger
Expand Down Expand Up @@ -1064,8 +1063,32 @@ protected virtual SyncAttempt<XElement> Export_DoExport(TObject item, string fil
{
if (ShouldExport(attempt.Item, config))
{
// only write the file to disk if it should be exported.
syncFileService.SaveXElement(attempt.Item, filename);
var files = folders.Select(x => GetPath(x, item, config.GuidNames, config.UseFlatStructure)).ToArray();
var nodes = syncFileService.GetAllNodes(files[..^1]);
if (nodes.Count > 0)
{
nodes.Add(attempt.Item);
var differences = syncFileService.GetDifferences(nodes, trackers.FirstOrDefault());
if (differences is not null && differences.HasElements)
{
syncFileService.SaveXElement(attempt.Item, filename);
}
else
{

if (syncFileService.FileExists(filename))
{
// we don't delete them - because in deployments they might then hang around
// we mark them as reverted and then they don't get processed.
var emptyNode = XElementExtensions.MakeEmpty(attempt.Item.GetKey(), SyncActionType.None, "Reverted to root");
syncFileService.SaveXElement(emptyNode, filename);
}
}
}
else
{
syncFileService.SaveXElement(attempt.Item, filename);
}

if (config.CreateClean && HasChildren(item))
{
Expand All @@ -1077,7 +1100,6 @@ protected virtual SyncAttempt<XElement> Export_DoExport(TObject item, string fil
return SyncAttempt<XElement>.Succeed(Path.GetFileName(filename), ChangeType.NoChange, "Not Exported (Based on configuration)");
}
}

return attempt;
}

Expand Down
24 changes: 24 additions & 0 deletions uSync.Core/Extensions/XElementExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Xml;
using System.Xml.Linq;

using Umbraco.Extensions;
Expand Down Expand Up @@ -309,5 +312,26 @@ public static TObject ValueOrDefault<TObject>(this XAttribute attribute, TObject
return defaultValue;
}
#endregion

/// <summary>
/// gets a hash of the xml, in a platform agnostic way.
/// </summary>
public static string MakePlatformSafeHash(this XElement node)
{
using (MemoryStream s = new MemoryStream())
{
// for consistency across platforms we need to harmonize line endings.
using (var writer = XmlWriter.Create(s, new XmlWriterSettings { NewLineChars = "\r\n" }))
{
node.Save(writer);
writer.Flush();
s.Position = 0;
using (HashAlgorithm hashAlgorithm = CryptoConfig.AllowOnlyFipsAlgorithms ? SHA1.Create() : MD5.Create())
{
return BitConverter.ToString(hashAlgorithm.ComputeHash(s)).Replace("-", "").ToLower();
}
}
}
}
}
}
2 changes: 2 additions & 0 deletions uSync.Core/Roots/Configs/BlockListConfigMerger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ public virtual object GetDifferenceConfig(string root, string target)
x => x.ContentElementTypeKey,
(x, label) => x.Label = $"{_removedLabel}:{x.Label}");

if (targetConfig.Blocks.Length == 0) return null;

return targetConfig;
}

Expand Down
2 changes: 2 additions & 0 deletions uSync.Core/Roots/Configs/ImageCropperConfigMerger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ public object GetDifferenceConfig(string root, string target)
x => x.Alias,
(x, label) => x.Alias = $"{_removedLabel}:{x.Alias}");

if (targetConfig.Crops.Length == 0) return null;

return targetConfig;
}
}
15 changes: 1 addition & 14 deletions uSync.Core/Serialization/SyncSerializerRoot.cs
Original file line number Diff line number Diff line change
Expand Up @@ -294,20 +294,7 @@ private string MakeHash(XElement node)
if (node == null) return string.Empty;
node = CleanseNode(node);

using (MemoryStream s = new MemoryStream())
{
// for consistency across platforms we need to harmonize line endings.
using (var writer = XmlWriter.Create(s, new XmlWriterSettings { NewLineChars = "\r\n" }))
{
node.Save(writer);
writer.Flush();
s.Position = 0;
using (HashAlgorithm hashAlgorithm = CryptoConfig.AllowOnlyFipsAlgorithms ? SHA1.Create() : MD5.Create())
{
return BitConverter.ToString(hashAlgorithm.ComputeHash(s)).Replace("-", "").ToLower();
}
}
}
return node.MakePlatformSafeHash();
}

/// <summary>
Expand Down
2 changes: 1 addition & 1 deletion uSync.Core/Tracking/Impliment/ContentBaseTracker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

namespace uSync.Core.Tracking.Impliment
{
public abstract class ContentBaseTracker<TObject> : SyncXmlTracker<TObject>
public abstract class ContentBaseTracker<TObject> : SyncXmlTrackAndMerger<TObject>
where TObject : IContentBase
{
public ContentBaseTracker(SyncSerializerCollection serializers)
Expand Down
6 changes: 3 additions & 3 deletions uSync.Core/Tracking/Impliment/DataTypeTracker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

namespace uSync.Core.Tracking.Impliment
{
public class DataTypeTracker : SyncXmlTracker<IDataType>, ISyncTracker<IDataType>
public class DataTypeTracker : SyncXmlTrackAndMerger<IDataType>, ISyncTracker<IDataType>
{
private readonly JsonSerializerSettings _jsonSettings = new JsonSerializerSettings()
{
Expand Down Expand Up @@ -77,7 +77,7 @@ public override XElement GetDifferences(List<XElement> nodes)
return GetDifferences(nodes[0], nodes[1], merger);
}

return base.GetDifferences(nodes);
return SyncRootMergerHelper.GetDifferences(nodes, TrackingItems);
}

public XElement GetDifferences(XElement root, XElement target, ISyncConfigMerger merger) {
Expand All @@ -99,7 +99,7 @@ public XElement GetDifferences(XElement root, XElement target, ISyncConfigMerger

}

return base.GetDifferences([root, target]);
return SyncRootMergerHelper.GetDifferences([root, target], TrackingItems);
}

private string GetEditorAlias(XElement node)
Expand Down
2 changes: 1 addition & 1 deletion uSync.Core/Tracking/Impliment/DictionaryItemTracker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

namespace uSync.Core.Tracking.Impliment
{
public class DictionaryItemTracker : SyncXmlTracker<IDictionaryItem>, ISyncTracker<IDictionaryItem>
public class DictionaryItemTracker : SyncXmlTrackAndMerger<IDictionaryItem>, ISyncTracker<IDictionaryItem>
{
public DictionaryItemTracker(SyncSerializerCollection serializers)
: base(serializers)
Expand Down
2 changes: 1 addition & 1 deletion uSync.Core/Tracking/Impliment/DomainTracker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

namespace uSync.Core.Tracking.Impliment
{
public class DomainTracker : SyncXmlTracker<IDomain>, ISyncTracker<IDomain>
public class DomainTracker : SyncXmlTrackAndMerger<IDomain>, ISyncTracker<IDomain>
{
public DomainTracker(SyncSerializerCollection serializers)
: base(serializers)
Expand Down
2 changes: 1 addition & 1 deletion uSync.Core/Tracking/Impliment/LanguageTracker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

namespace uSync.Core.Tracking.Impliment
{
public class LanguageTracker : SyncXmlTracker<ILanguage>, ISyncTracker<ILanguage>
public class LanguageTracker : SyncXmlTrackAndMerger<ILanguage>, ISyncTracker<ILanguage>
{
public LanguageTracker(SyncSerializerCollection serializers)
: base(serializers)
Expand Down
2 changes: 1 addition & 1 deletion uSync.Core/Tracking/Impliment/MacroTracker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

namespace uSync.Core.Tracking.Impliment
{
public class MacroTracker : SyncXmlTracker<IMacro>, ISyncTracker<IMacro>
public class MacroTracker : SyncXmlTrackAndMerger<IMacro>, ISyncTracker<IMacro>
{
public MacroTracker(SyncSerializerCollection serializers)
: base(serializers)
Expand Down
2 changes: 1 addition & 1 deletion uSync.Core/Tracking/Impliment/RelationTypeTracker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
namespace uSync.Core.Tracking.Impliment
{
public class RelationTypeTracker
: SyncXmlTracker<IRelationType>, ISyncTracker<IRelationType>
: SyncXmlTrackAndMerger<IRelationType>, ISyncTracker<IRelationType>
{
public RelationTypeTracker(SyncSerializerCollection serializers)
: base(serializers)
Expand Down
2 changes: 1 addition & 1 deletion uSync.Core/Tracking/Impliment/TemplateTracker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

namespace uSync.Core.Tracking.Impliment
{
public class TemplateTracker : SyncXmlTracker<ITemplate>, ISyncTracker<ITemplate>
public class TemplateTracker : SyncXmlTrackAndMerger<ITemplate>, ISyncTracker<ITemplate>
{
public TemplateTracker(SyncSerializerCollection serializers)
: base(serializers)
Expand Down
2 changes: 1 addition & 1 deletion uSync.Core/Tracking/Impliment/WebhookTracker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

namespace uSync.Core.Tracking.Impliment
{
public class WebhookTracker : SyncXmlTracker<IWebhook>, ISyncTracker<IWebhook>
public class WebhookTracker : SyncXmlTrackAndMerger<IWebhook>, ISyncTracker<IWebhook>
{
public WebhookTracker(SyncSerializerCollection serializers) : base(serializers)
{
Expand Down
Loading

0 comments on commit 1fb533d

Please sign in to comment.