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) {