diff --git a/uSync.BackOffice/Models/SyncMergeOptions.cs b/uSync.BackOffice/Models/SyncMergeOptions.cs
new file mode 100644
index 000000000..af5620a25
--- /dev/null
+++ b/uSync.BackOffice/Models/SyncMergeOptions.cs
@@ -0,0 +1,15 @@
+using uSync.BackOffice.SyncHandlers.Interfaces;
+
+namespace uSync.BackOffice.Models;
+
+public class SyncMergeOptions
+{
+ public SyncMergeOptions() { }
+
+ public SyncMergeOptions(SyncUpdateCallback? callback)
+ {
+ UpdateCallback = callback;
+ }
+
+ public SyncUpdateCallback? UpdateCallback { get; set; }
+}
\ No newline at end of file
diff --git a/uSync.BackOffice/Services/SyncService.cs b/uSync.BackOffice/Services/SyncService.cs
index d02719ba9..f7110a33e 100644
--- a/uSync.BackOffice/Services/SyncService.cs
+++ b/uSync.BackOffice/Services/SyncService.cs
@@ -111,7 +111,7 @@ public bool HasRootFiles(string[] folders)
#region Importing
- static SemaphoreSlim _importSemaphoreLock = new SemaphoreSlim(1, 1);
+ static readonly SemaphoreSlim _importSemaphoreLock = new SemaphoreSlim(1, 1);
/// >
public async Task> StartupImportAsync(string[] folders, bool force, SyncHandlerOptions handlerOptions, uSyncCallbacks? callbacks = null)
diff --git a/uSync.BackOffice/SyncHandlers/Handlers/LanguageHandler.cs b/uSync.BackOffice/SyncHandlers/Handlers/LanguageHandler.cs
index 2a9cb8323..1f8234a8d 100644
--- a/uSync.BackOffice/SyncHandlers/Handlers/LanguageHandler.cs
+++ b/uSync.BackOffice/SyncHandlers/Handlers/LanguageHandler.cs
@@ -19,6 +19,7 @@
using Umbraco.Extensions;
using uSync.BackOffice.Configuration;
+using uSync.BackOffice.Models;
using uSync.BackOffice.Services;
using uSync.BackOffice.SyncHandlers.Interfaces;
using uSync.BackOffice.SyncHandlers.Models;
@@ -72,8 +73,8 @@ protected override string GetItemPath(ILanguage item, bool useGuid, bool isFlat)
///
/// order the merged items, making sure the default language is first.
///
- protected override async Task> GetMergedItemsAsync(string[] folders)
- => [.. (await base.GetMergedItemsAsync(folders)).OrderBy(x => x.Node.Element("IsDefault").ValueOrDefault(false) ? 0 : 1)];
+ protected override async Task> GetMergedItemsAsync(string[] folders, SyncMergeOptions options)
+ => [.. (await base.GetMergedItemsAsync(folders, options)).OrderBy(x => x.Node.Element("IsDefault").ValueOrDefault(false) ? 0 : 1)];
///
/// ensure we import the 'default' language first, so we don't get errors doing it.
@@ -162,7 +163,7 @@ protected override async Task CleanUpAsync(ILanguage item, string newFile, strin
}
}
- private static ConcurrentDictionary _newLanguages = new();
+ private readonly static ConcurrentDictionary _newLanguages = new();
///
public override async Task HandleAsync(SavingNotification notification, CancellationToken cancellationToken)
diff --git a/uSync.BackOffice/SyncHandlers/Handlers/TemplateHandler.cs b/uSync.BackOffice/SyncHandlers/Handlers/TemplateHandler.cs
index ea748cbd4..86a454636 100644
--- a/uSync.BackOffice/SyncHandlers/Handlers/TemplateHandler.cs
+++ b/uSync.BackOffice/SyncHandlers/Handlers/TemplateHandler.cs
@@ -68,9 +68,9 @@ public TemplateHandler(
}
///
- protected override async Task> GetMergedItemsAsync(string[] folders)
+ protected override async Task> GetMergedItemsAsync(string[] folders, SyncMergeOptions options)
{
- var items = await base.GetMergedItemsAsync(folders);
+ var items = await base.GetMergedItemsAsync(folders, options);
try
{
var results = new List();
diff --git a/uSync.BackOffice/SyncHandlers/SyncHandlerContainerBase.cs b/uSync.BackOffice/SyncHandlers/SyncHandlerContainerBase.cs
index cf85076fb..1e2715fa3 100644
--- a/uSync.BackOffice/SyncHandlers/SyncHandlerContainerBase.cs
+++ b/uSync.BackOffice/SyncHandlers/SyncHandlerContainerBase.cs
@@ -234,12 +234,17 @@ protected override bool DoItemsMatch(XElement node, TObject item)
///
/// Get merged items from a collection of folders.
///
- protected override async Task> GetMergedItemsAsync(string[] folders)
+ protected override async Task> GetMergedItemsAsync(string[] folders, SyncMergeOptions options)
{
- var items = await base.GetMergedItemsAsync(folders);
+ options.UpdateCallback?.Invoke("Order: Loading files from disk", 1, 5);
+ var items = await base.GetMergedItemsAsync(folders, options);
+
+ options.UpdateCallback?.Invoke("Order: Checking for duplicates", 2, 5);
CheckForDuplicates(items);
+ options.UpdateCallback?.Invoke("Order: Sorting items", 3, 5);
+
var nodes = items.DistinctBy(x => x.Key).ToDictionary(k => k.Key);
var renames = nodes.Where(x => x.Value.Node.IsEmptyItem()).Select(x => x.Value);
var graph = new List>();
@@ -258,12 +263,16 @@ protected override async Task> GetMergedItemsAsyn
var results = new List(sortedList.Count);
+ options.UpdateCallback?.Invoke("Order: Building sorted list", 4, 5);
+
foreach (var key in sortedList)
{
if (nodes.TryGetValue(key, out OrderedNodeInfo? value) && value is not null)
results.Add(value);
}
+ options?.UpdateCallback?.Invoke("Order: Adding actions", 5, 5);
+
if (renames.Any())
{
results.RemoveAll(x => renames.Any(r => r.Key == x.Key));
diff --git a/uSync.BackOffice/SyncHandlers/SyncHandlerLevelBase.cs b/uSync.BackOffice/SyncHandlers/SyncHandlerLevelBase.cs
index 6f17dbfd5..dd681ac37 100644
--- a/uSync.BackOffice/SyncHandlers/SyncHandlerLevelBase.cs
+++ b/uSync.BackOffice/SyncHandlers/SyncHandlerLevelBase.cs
@@ -13,6 +13,7 @@
using Umbraco.Extensions;
using uSync.BackOffice.Configuration;
+using uSync.BackOffice.Models;
using uSync.BackOffice.Services;
using uSync.Core;
@@ -48,8 +49,8 @@ protected SyncHandlerLevelBase(
/// as we are already loading everything to merge, it doesn't
/// then cost us much to sort them when we have to.
///
- protected override async Task> GetMergedItemsAsync(string[] folders)
- => [.. (await base.GetMergedItemsAsync(folders)).OrderBy(x => x.Level)];
+ protected override async Task> GetMergedItemsAsync(string[] folders, SyncMergeOptions options)
+ => [.. (await base.GetMergedItemsAsync(folders, options)).OrderBy(x => x.Level)];
///
override protected string GetItemPath(TObject item, bool useGuid, bool isFlat)
diff --git a/uSync.BackOffice/SyncHandlers/SyncHandlerRoot.cs b/uSync.BackOffice/SyncHandlers/SyncHandlerRoot.cs
index f26b93b14..18f185319 100644
--- a/uSync.BackOffice/SyncHandlers/SyncHandlerRoot.cs
+++ b/uSync.BackOffice/SyncHandlers/SyncHandlerRoot.cs
@@ -256,7 +256,7 @@ public async Task> ImportAllAsync(string[] folders, Han
options.Callbacks?.Update?.Invoke("Calculating import order", 1, 9);
- var items = await GetMergedItemsAsync(folders);
+ var items = await GetMergedItemsAsync(folders, new SyncMergeOptions(options.Callbacks?.Update));
options.Callbacks?.Update?.Invoke($"Processing {items.Count} items", 2, 9);
@@ -327,17 +327,22 @@ public async Task> ImportAllAsync(string[] folders, Han
///
///
public async Task> FetchAllNodesAsync(string[] folders)
- => await GetMergedItemsAsync(folders);
+ => await GetMergedItemsAsync(folders, new SyncMergeOptions());
- ///
- /// method to get the merged folders, handlers that care about orders should override this.
- ///
- protected virtual async Task> GetMergedItemsAsync(string[] folders)
+
+ protected virtual async Task> GetMergedItemsAsync(string[] folders, SyncMergeOptions options)
{
var baseTracker = trackers.FirstOrDefault() as ISyncTrackerBase;
return [.. (await syncFileService.MergeFoldersAsync(folders, uSyncConfig.Settings.DefaultExtension, baseTracker))];
}
+ ///
+ /// method to get the merged folders, handlers that care about orders should override this.
+ ///
+ [Obsolete("Use GetMergedItemsAsync with SyncMergeOptions will be removed in v18")]
+ protected virtual async Task> GetMergedItemsAsync(string[] folders)
+ => await GetMergedItemsAsync(folders, new SyncMergeOptions());
+
///
/// given a file path, will give you the merged values across all folders.
///
@@ -1006,9 +1011,9 @@ public async Task> ReportAsync(string[] folders, Handle
var cacheKey = PrepCaches();
- callback?.Invoke("Organizing import structure", 1, 3);
+ callback?.Invoke("Calculating order", 1, 3);
- var items = await GetMergedItemsAsync(folders);
+ var items = await GetMergedItemsAsync(folders, new SyncMergeOptions(callback));
var options = new uSyncImportOptions();
int count = 0;
@@ -2008,7 +2013,7 @@ private async Task RootItemExistsAsync(TObject item)
public async Task TryFindItemNodeAsync(Guid key)
{
var folders = GetDefaultHandlerFolders();
- var items = await GetMergedItemsAsync(folders);
+ var items = await GetMergedItemsAsync(folders, new SyncMergeOptions());
foreach (var item in items)
{