From ef1395945fd9691baa9124b48df64c42335c9a5f Mon Sep 17 00:00:00 2001 From: Ca2didi Date: Wed, 21 May 2025 01:36:38 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=97=A0=E6=B3=95=E6=AD=A3=E7=A1=AE?= =?UTF-8?q?=E5=94=A4=E8=B5=B7Merge=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Models/RepositoryResetMethod.cs | 12 +--- Flawless.Client/Service/RepositoryService.cs | 65 +++++++++---------- .../ModalBox/MergeDialogViewModel.cs | 51 +++++++++------ .../ViewModels/SettingViewModel.cs | 8 ++- .../Views/ModalBox/MergeDialogView.axaml | 24 +++---- Flawless.Client/Views/SettingView.axaml | 32 ++++----- 6 files changed, 94 insertions(+), 98 deletions(-) diff --git a/Flawless.Client/Models/RepositoryResetMethod.cs b/Flawless.Client/Models/RepositoryResetMethod.cs index 756f92e..08a7089 100644 --- a/Flawless.Client/Models/RepositoryResetMethod.cs +++ b/Flawless.Client/Models/RepositoryResetMethod.cs @@ -8,7 +8,7 @@ public enum RepositoryResetMethod Keep, /// - /// Tracked files will being reset, changes will being reset. + /// Tracked files will being reset, changes will being merged. /// Soft, @@ -16,14 +16,4 @@ public enum RepositoryResetMethod /// All files will being reset, changes will being reset, changes list will being cleaned. /// Hard, - - /// - /// Tracked files will being reset, changes will being merged. - /// - Merge, - - /// - /// All files will being reset, changes will being merged. - /// - HardMerge } \ No newline at end of file diff --git a/Flawless.Client/Service/RepositoryService.cs b/Flawless.Client/Service/RepositoryService.cs index 26127d3..be7b13d 100644 --- a/Flawless.Client/Service/RepositoryService.cs +++ b/Flawless.Client/Service/RepositoryService.cs @@ -837,9 +837,9 @@ public class RepositoryService : BaseService try { - var mergeChanges = method is RepositoryResetMethod.Merge or RepositoryResetMethod.HardMerge; + var mergeChanges = method is RepositoryResetMethod.Soft; var resetChanges = method is RepositoryResetMethod.Soft or RepositoryResetMethod.Hard; - var hardMode = method is RepositoryResetMethod.Hard or RepositoryResetMethod.HardMerge; + var hardMode = method is RepositoryResetMethod.Hard; List unmerged = new(); // Apply files excepts local changed. @@ -892,7 +892,6 @@ public class RepositoryService : BaseService } catch (Exception exception) { Console.WriteLine(exception); } - UIHelper.NotifyError(e); Console.WriteLine(e); await DeleteFromDiskAsync(repo); @@ -938,47 +937,45 @@ public class RepositoryService : BaseService } } - public async ValueTask MergeFilesAsync(RepositoryModel repo, RepositoryFileTreeAccessor repoAccessor, IEnumerable unmerged) + public async ValueTask MergeFilesAsync(RepositoryModel repo, RepositoryFileTreeAccessor repoAccessor, IEnumerable unmerged) { var root = PathUtility.GetWorkspaceManagerPath(Api.C.Username.Value, repo.OwnerName, repo.Name); - var srcTem = Path.Combine(root, "MergeInTemp"); - - using (Disposable.Create(srcTem, r => Directory.Delete(r, true))) + var tempFolder = Path.Combine(root, "MergeInTemp"); + var wsRoot = PathUtility.GetWorkspacePath(Api.C.Username.Value, repo.OwnerName, repo.Name); + var left = Path.Combine(tempFolder, "left"); + var right = Path.Combine(tempFolder, "right"); + + using (Disposable.Create(tempFolder, r => Directory.Delete(r, true))) { Directory.CreateDirectory(root); - // Prepare server files - var wsRoot = PathUtility.GetWorkspacePath(Api.C.Username.Value, repo.OwnerName, repo.Name); - var vm = new MergeDialogViewModel(repo, unmerged, srcTem, wsRoot); - - foreach (var f in vm.MergeFiles) + foreach (var p in unmerged) { - var pf = WorkPath.ToPlatformPath(f.WorkPath, vm.SrcFolder); - Directory.CreateDirectory(Path.GetDirectoryName(pf)!); - await using var fs = File.Create(pf); - repoAccessor.TryWriteDataIntoDisk(f.WorkPath, fs, out _); - } + try + { + // Prepare for left and right file + var wfs = WorkPath.ToPlatformPath(wsRoot, p.WorkPath); + File.Copy(wfs, left, true); + await using var rightFs = File.Create(right); + repoAccessor.TryWriteDataIntoDisk(p.WorkPath, rightFs, out _); - // Raise merge window - var opt = UIHelper.DefaultOverlayDialogOptionsYesNo(); - opt.Buttons = DialogButton.OK; - opt.Title = "Merge files"; - opt.FullScreen = true; - opt.IsCloseButtonVisible = false; + // Raise dialog window + var opt = UIHelper.DefaultOverlayDialogOptionsYesNo(); + opt.Buttons = DialogButton.None; + opt.Title = "Merge files"; + opt.IsCloseButtonVisible = true; - await OverlayDialog.ShowModal(vm, AppDefaultValues.HostId, opt); - - // Rollback files - foreach (var f in vm.MergeFiles) - { - var copyFrom = WorkPath.ToPlatformPath(f.WorkPath, vm.TmpFolder); - if (!File.Exists(copyFrom)) continue; // If file existed, override it. - - var copyTo = WorkPath.ToPlatformPath(f.WorkPath, vm.DstFolder); - Directory.CreateDirectory(Path.GetDirectoryName(copyTo)!); - File.Copy(copyFrom, copyTo, true); + var vm = new MergeDialogViewModel(p.WorkPath, wfs, p.WorkPath, left, right); + await OverlayDialog.ShowModal(vm, AppDefaultValues.HostId, opt); + } + catch (Exception e) + { + Console.Error.WriteLine(e); + } } } + + return true; } public async ValueTask UpdateCommitsHistoryFromServerAsync(RepositoryModel repo) diff --git a/Flawless.Client/ViewModels/ModalBox/MergeDialogViewModel.cs b/Flawless.Client/ViewModels/ModalBox/MergeDialogViewModel.cs index 962261c..c785102 100644 --- a/Flawless.Client/ViewModels/ModalBox/MergeDialogViewModel.cs +++ b/Flawless.Client/ViewModels/ModalBox/MergeDialogViewModel.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Diagnostics; using System.IO; using System.Threading.Tasks; using Flawless.Abstraction; @@ -11,34 +12,42 @@ namespace Flawless.Client.ViewModels.ModalBox; public partial class MergeDialogViewModel : ViewModelBase { - public ObservableCollection MergeFiles { get; } + [Reactive] private string _ws; - public RepositoryModel Repository { get; } + [Reactive] private string _final; + + [Reactive] private string _leftFile; // Local file + + [Reactive] private string _rightFile; // Remote file - public string SrcFolder { get; } - - public string DstFolder { get; } - - public string TmpFolder { get; } - - - public MergeDialogViewModel(RepositoryModel repository, IEnumerable files, - string srcFolder, string dstFolder) + public MergeDialogViewModel(string ws, string final, string fileWorkPath, string leftFile, string rightFile) { - Repository = repository; - MergeFiles = new ObservableCollection(files); - SrcFolder = srcFolder; - DstFolder = dstFolder; - TmpFolder = Directory.CreateTempSubdirectory("Flawless_Merge").Name; + _ws = ws; + _final = final; + _leftFile = leftFile; + _rightFile = rightFile; } [ReactiveCommand] private async Task RaiseMergeToolsAsync(string fileWorkPath) { - var srcFile = WorkPath.ToPlatformPath(fileWorkPath, SrcFolder); - var dstFile = Path.Combine(fileWorkPath, DstFolder); - var tmpFile = Path.Combine(fileWorkPath, TmpFolder); - - + var result = Process.Start($"meld \"{LeftFile}\" \"{RightFile}\""); + } + + [ReactiveCommand] + private Task UseLeftFileAsync() + { + return UseFileAsync(LeftFile); + } + + [ReactiveCommand] + private Task UseRightFileAsync() + { + return UseFileAsync(RightFile); + } + + private async Task UseFileAsync(string path) + { + File.Copy(path, _final, true); } } \ No newline at end of file diff --git a/Flawless.Client/ViewModels/SettingViewModel.cs b/Flawless.Client/ViewModels/SettingViewModel.cs index 706659f..b268775 100644 --- a/Flawless.Client/ViewModels/SettingViewModel.cs +++ b/Flawless.Client/ViewModels/SettingViewModel.cs @@ -235,15 +235,19 @@ public partial class SettingViewModel : RoutableViewModelBase Users.Clear(); foreach (var user in users) { - Users.Add(new UserModel + var m = new UserModel { Username = user.Username, Email = user.Email, IsActive = user.IsActive, IsAdmin = user.IsAdmin ?? false, CanEdit = user.Username != Api.C.Username.Value! - }); + }; + + if (m.CanEdit) Users.Insert(0, m); + else Users.Add(m); } + } catch (ApiException ex) { diff --git a/Flawless.Client/Views/ModalBox/MergeDialogView.axaml b/Flawless.Client/Views/ModalBox/MergeDialogView.axaml index ad2f2a6..d2f73a4 100644 --- a/Flawless.Client/Views/ModalBox/MergeDialogView.axaml +++ b/Flawless.Client/Views/ModalBox/MergeDialogView.axaml @@ -6,19 +6,15 @@ xmlns:u="https://irihi.tech/ursa" x:DataType="vm:MergeDialogViewModel" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - MinWidth="400" + MinWidth="600" x:Class="Flawless.Client.Views.ModalBox.MergeDialogView"> - - - - - - - - - - + +