diff --git a/Flawless.Client/Service/RepositoryService.cs b/Flawless.Client/Service/RepositoryService.cs index 8c6207b..ea8b266 100644 --- a/Flawless.Client/Service/RepositoryService.cs +++ b/Flawless.Client/Service/RepositoryService.cs @@ -1210,6 +1210,7 @@ public class RepositoryService : BaseService { // Check if current version is the latest var api = Api.C; + if (!await UpdateCommitsHistoryFromServerAsync(repo)) return null; var requireUpdate = await IsPointedToCommitNotPeekResultFromServerAsync(repo); if (!requireUpdate.HasValue) return null; @@ -1261,7 +1262,7 @@ public class RepositoryService : BaseService return null; } - var requireDepot = isBaseline ? [] : new[] {localDb.CurrentCommit.ToString()!}; + var requireDepot = isBaseline ? [] : new[] {repo.Commits.First().DepotId.ToString()}; var rsp = await api.Gateway.CreateCommit(repo.OwnerName, repo.Name, new StreamPart(str, Path.GetFileName(tempDepotPath)), message, snapshot, requireDepot, ""); @@ -1283,7 +1284,7 @@ public class RepositoryService : BaseService } var rsp = await api.Gateway.CreateCommit(repo.OwnerName, repo.Name, null!, - message, snapshot, [], localDb.CurrentCommit?.ToString() ?? ""); + message, snapshot, [], repo.Commits.First().DepotId.ToString()); commitId = rsp.CommitId; } diff --git a/Flawless.Client/Views/RepositoryPage/RepoFileTreePageView.axaml b/Flawless.Client/Views/RepositoryPage/RepoFileTreePageView.axaml index 7299d73..8034c88 100644 --- a/Flawless.Client/Views/RepositoryPage/RepoFileTreePageView.axaml +++ b/Flawless.Client/Views/RepositoryPage/RepoFileTreePageView.axaml @@ -3,11 +3,18 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:vm="using:Flawless.Client.ViewModels" + xmlns:u="https://irihi.tech/ursa" x:DataType="vm:RepositoryViewModel" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Flawless.Client.Views.RepositoryPage.RepoFileTreePageView"> - - + + + + + diff --git a/Flawless.Client/Views/RepositoryPage/RepoIssuePageView.axaml b/Flawless.Client/Views/RepositoryPage/RepoIssuePageView.axaml index 0ef54a6..daf3a2b 100644 --- a/Flawless.Client/Views/RepositoryPage/RepoIssuePageView.axaml +++ b/Flawless.Client/Views/RepositoryPage/RepoIssuePageView.axaml @@ -9,15 +9,11 @@ x:Class="Flawless.Client.Views.RepositoryPage.RepoIssuePageView"> - + - - - - diff --git a/Flawless.Client/Views/RepositoryPage/RepoWorkspacePageView.axaml b/Flawless.Client/Views/RepositoryPage/RepoWorkspacePageView.axaml index 253d628..a19e79e 100644 --- a/Flawless.Client/Views/RepositoryPage/RepoWorkspacePageView.axaml +++ b/Flawless.Client/Views/RepositoryPage/RepoWorkspacePageView.axaml @@ -21,15 +21,15 @@ - + - - + + - - - - - - - - + + + + + + + + + diff --git a/Flawless.Server/Controllers/RepositoryInnieController.cs b/Flawless.Server/Controllers/RepositoryInnieController.cs index 9f1ff90..3bb4256 100644 --- a/Flawless.Server/Controllers/RepositoryInnieController.cs +++ b/Flawless.Server/Controllers/RepositoryInnieController.cs @@ -423,7 +423,7 @@ public class RepositoryInnieController( { // Use existed depots var mainDepotId = Guid.Parse(req.MainDepotId!); - var preDepot = await StencilWorkspaceSnapshotViaDatabaseAsync(rp.Id, mainDepotId, test, sizeMap); + var preDepot = await StencilWorkspaceSnapshotViaDatabaseAsync(rp.Id, mainDepotId, test, sizeMap, null); if (preDepot == null) return BadRequest(new FailedResponse("Not a valid main depot!", "NoMainDepot")); @@ -441,7 +441,7 @@ public class RepositoryInnieController( { // Get a new depot from request - this will flat to direct depot reference to avoid deep search that // raise memory issue. - var actualRequiredDepots = new HashSet(); + var directDependDepots = new HashSet(); // Read and create a new depot using var cacheStream = new MemoryStream(new byte[req.Depot.Length], true); @@ -457,21 +457,13 @@ public class RepositoryInnieController( // Yes foreach (var subDepot in req.RequiredDepots?.Select(Guid.Parse) ?? []) { - await StencilWorkspaceSnapshotViaDatabaseAsync(rp.Id, subDepot, test, sizeMap); + await StencilWorkspaceSnapshotViaDatabaseAsync(rp.Id, subDepot, test, sizeMap, directDependDepots); var rest = test.Count; - if (rest == 0) - { - actualRequiredDepots.Add(subDepot); - break; - } - // If test is changed? - if (unresolvedCount != rest) - { - actualRequiredDepots.Add(subDepot); - unresolvedCount = rest; - } + // Quit if nothing to do. + unresolvedCount = rest; + if (rest == 0) break; } // If still not able to resolve @@ -489,7 +481,7 @@ public class RepositoryInnieController( await dbContext.Repositories .Where(r => r.Id == rp.Id) .SelectMany(r => r.Depots) - .Where(cm => actualRequiredDepots.Contains(cm.DepotId)) + .Where(cm => directDependDepots.Contains(cm.DepotId)) .ToArrayAsync()); // Create commit and let it alloc a main key @@ -590,7 +582,8 @@ public class RepositoryInnieController( private async Task StencilWorkspaceSnapshotViaDatabaseAsync( Guid rpId, Guid depotId, HashSet unresolved, - Dictionary sizeMap) + Dictionary sizeMap, + HashSet? directDependDepots) { var depot = await dbContext.Repositories .SelectMany(r => r.Depots) @@ -598,24 +591,28 @@ public class RepositoryInnieController( .ThenInclude(repositoryDepot => repositoryDepot.Dependencies) .FirstOrDefaultAsync(r => r.DepotId == depotId); - await RecurringAsync(transformer, rpId, depot, unresolved, sizeMap); + await RecurringAsync(transformer, rpId, depot, unresolved, sizeMap, directDependDepots); return depot; static async ValueTask RecurringAsync( PathTransformer transformer, Guid rpId, RepositoryDepot? depot, HashSet unresolved, - Dictionary sizeMap) + Dictionary sizeMap, + HashSet? directDependDepots) { if (depot == null) return; var path = transformer.GetDepotPath(rpId, depot.DepotId); // require do not extend lifetime scope. await using (var fs = new BufferedStream(new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))) + { + var before = unresolved.Count; await StencilWorkspaceSnapshotAsync(fs, unresolved, sizeMap); + if (before != unresolved.Count && directDependDepots != null) directDependDepots.Add(depot.DepotId); + } for (var i = 0; i < depot.Dependencies.Count && unresolved.Count > 0; i++) - await RecurringAsync(transformer, rpId, depot.Dependencies[i], unresolved, sizeMap); - + await RecurringAsync(transformer, rpId, depot.Dependencies[i], unresolved, sizeMap, directDependDepots); } } } \ No newline at end of file diff --git a/Flawless.Server/Controllers/RepositoryOutieController.cs b/Flawless.Server/Controllers/RepositoryOutieController.cs index bad3a93..920a60f 100644 --- a/Flawless.Server/Controllers/RepositoryOutieController.cs +++ b/Flawless.Server/Controllers/RepositoryOutieController.cs @@ -39,7 +39,7 @@ public class RepositoryOutieController(AppDbContext dbContext, UserManager> CreateRepositoryAsync([FromQuery] string repositoryName, [FromQuery] string description) + public async Task> CreateRepositoryAsync([FromQuery] string repositoryName, [FromQuery] string? description) { repositoryName = repositoryName.Trim().Replace(' ', '_'); if (repositoryName.Length <= 3)