diff --git a/backend/FwHeadless/Program.cs b/backend/FwHeadless/Program.cs index 261047d99..3d3484df2 100644 --- a/backend/FwHeadless/Program.cs +++ b/backend/FwHeadless/Program.cs @@ -86,7 +86,8 @@ logger.LogDebug("crdtFile: {crdtFile}", crdtFile); logger.LogDebug("fwDataFile: {fwDataFile}", fwDataProject.FilePath); - var fwdataApi = SetupFwData(fwDataProject, srService, projectCode, logger, fwDataFactory); + var fwdataApi = await SetupFwData(fwDataProject, srService, projectCode, logger, fwDataFactory); + using var deferCloseFwData = fwDataFactory.DeferClose(fwDataProject); var crdtProject = await SetupCrdtProject(crdtFile, projectLookupService, projectId, projectsService, projectFolder, fwdataApi.ProjectId, config.Value.LexboxUrl); var miniLcmApi = await services.OpenCrdtProject(crdtProject); @@ -96,15 +97,14 @@ var result = await syncService.Sync(miniLcmApi, fwdataApi, dryRun); logger.LogInformation("Sync result, CrdtChanges: {CrdtChanges}, FwdataChanges: {FwdataChanges}", result.CrdtChanges, result.FwdataChanges); - fwDataFactory.CloseProject(fwDataProject); await crdtSyncService.Sync(); - var srResult2 = srService.SendReceive(fwDataProject, projectCode); + var srResult2 = await srService.SendReceive(fwDataProject, projectCode); logger.LogInformation("Send/Receive result after CRDT sync: {srResult2}", srResult2.Output); return TypedResults.Ok(result); } -static FwDataMiniLcmApi SetupFwData(FwDataProject fwDataProject, +static async Task SetupFwData(FwDataProject fwDataProject, SendReceiveService srService, string projectCode, ILogger logger, @@ -112,12 +112,12 @@ static FwDataMiniLcmApi SetupFwData(FwDataProject fwDataProject, { if (File.Exists(fwDataProject.FilePath)) { - var srResult = srService.SendReceive(fwDataProject, projectCode); + var srResult = await srService.SendReceive(fwDataProject, projectCode); logger.LogInformation("Send/Receive result: {srResult}", srResult.Output); } else { - var srResult = srService.Clone(fwDataProject, projectCode); + var srResult = await srService.Clone(fwDataProject, projectCode); logger.LogInformation("Send/Receive result: {srResult}", srResult.Output); } diff --git a/backend/FwHeadless/SendReceiveHelpers.cs b/backend/FwHeadless/SendReceiveHelpers.cs index 9c8ac9494..078011bd8 100644 --- a/backend/FwHeadless/SendReceiveHelpers.cs +++ b/backend/FwHeadless/SendReceiveHelpers.cs @@ -17,10 +17,14 @@ public SendReceiveAuth(FwHeadlessConfig config) : this(config.LexboxUsername, co public record LfMergeBridgeResult(string Output, string ProgressMessages); - private static LfMergeBridgeResult CallLfMergeBridge(string method, IDictionary flexBridgeOptions) + private static async Task CallLfMergeBridge(string method, IDictionary flexBridgeOptions) { var progress = new StringBuilderProgress(); - LfMergeBridge.LfMergeBridge.Execute(method, progress, flexBridgeOptions.ToDictionary(), out var lfMergeBridgeOutputForClient); + var lfMergeBridgeOutputForClient = await Task.Run(() => + { + LfMergeBridge.LfMergeBridge.Execute(method, progress, flexBridgeOptions.ToDictionary(), out var output); + return output; + }); return new LfMergeBridgeResult(lfMergeBridgeOutputForClient, progress.ToString()); } @@ -45,7 +49,7 @@ private static Uri BuildSendReceiveUrl(string baseUrl, string projectCode, SendR return builder.Uri; } - public static LfMergeBridgeResult SendReceive(FwDataProject project, string? projectCode = null, string baseUrl = "http://localhost", SendReceiveAuth? auth = null, string fdoDataModelVersion = "7000072", string? commitMessage = null) + public static async Task SendReceive(FwDataProject project, string? projectCode = null, string baseUrl = "http://localhost", SendReceiveAuth? auth = null, string fdoDataModelVersion = "7000072", string? commitMessage = null) { projectCode ??= project.Name; var fwdataInfo = new FileInfo(project.FilePath); @@ -65,10 +69,10 @@ public static LfMergeBridgeResult SendReceive(FwDataProject project, string? pro { "user", "LexBox" }, }; if (commitMessage is not null) flexBridgeOptions["commitMessage"] = commitMessage; - return CallLfMergeBridge("Language_Forge_Send_Receive", flexBridgeOptions); + return await CallLfMergeBridge("Language_Forge_Send_Receive", flexBridgeOptions); } - public static LfMergeBridgeResult CloneProject(FwDataProject project, string? projectCode = null, string baseUrl = "http://localhost", SendReceiveAuth? auth = null, string fdoDataModelVersion = "7000072") + public static async Task CloneProject(FwDataProject project, string? projectCode = null, string baseUrl = "http://localhost", SendReceiveAuth? auth = null, string fdoDataModelVersion = "7000072") { projectCode ??= project.Name; var fwdataInfo = new FileInfo(project.FilePath); @@ -84,6 +88,6 @@ public static LfMergeBridgeResult CloneProject(FwDataProject project, string? pr { "languageDepotRepoUri", repoUrl.ToString() }, { "deleteRepoIfNoSuchBranch", "false" }, }; - return CallLfMergeBridge("Language_Forge_Clone", flexBridgeOptions); + return await CallLfMergeBridge("Language_Forge_Clone", flexBridgeOptions); } } diff --git a/backend/FwHeadless/SendReceiveService.cs b/backend/FwHeadless/SendReceiveService.cs index 37023dc8f..d924034f6 100644 --- a/backend/FwHeadless/SendReceiveService.cs +++ b/backend/FwHeadless/SendReceiveService.cs @@ -5,9 +5,9 @@ namespace FwHeadless; public class SendReceiveService(IOptions config) { - public SendReceiveHelpers.LfMergeBridgeResult SendReceive(FwDataProject project, string? projectCode, string? commitMessage = null) + public async Task SendReceive(FwDataProject project, string? projectCode, string? commitMessage = null) { - return SendReceiveHelpers.SendReceive( + return await SendReceiveHelpers.SendReceive( project: project, projectCode: projectCode, baseUrl: config.Value.HgWebUrl, @@ -17,9 +17,9 @@ public SendReceiveHelpers.LfMergeBridgeResult SendReceive(FwDataProject project, ); } - public SendReceiveHelpers.LfMergeBridgeResult Clone(FwDataProject project, string? projectCode) + public async Task Clone(FwDataProject project, string? projectCode) { - return SendReceiveHelpers.CloneProject( + return await SendReceiveHelpers.CloneProject( project: project, projectCode: projectCode, baseUrl: config.Value.HgWebUrl, diff --git a/backend/FwLite/FwDataMiniLcmBridge/FwDataFactory.cs b/backend/FwLite/FwDataMiniLcmBridge/FwDataFactory.cs index fb085fefe..78fc74092 100644 --- a/backend/FwLite/FwDataMiniLcmBridge/FwDataFactory.cs +++ b/backend/FwLite/FwDataMiniLcmBridge/FwDataFactory.cs @@ -1,5 +1,6 @@ using FwDataMiniLcmBridge.Api; using FwDataMiniLcmBridge.LcmUtils; +using LexCore.Utils; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; @@ -130,4 +131,9 @@ public void CloseProject(FwDataProject project) if (lcmCache is null) return; cache.Remove(cacheKey); } + + public IDisposable DeferClose(FwDataProject project) + { + return Defer.Action(() => CloseProject(project)); + } } diff --git a/backend/FwLite/FwDataMiniLcmBridge/FwDataMiniLcmBridge.csproj b/backend/FwLite/FwDataMiniLcmBridge/FwDataMiniLcmBridge.csproj index 457f4d84e..2192d7724 100644 --- a/backend/FwLite/FwDataMiniLcmBridge/FwDataMiniLcmBridge.csproj +++ b/backend/FwLite/FwDataMiniLcmBridge/FwDataMiniLcmBridge.csproj @@ -28,6 +28,7 @@ +