diff --git a/README.md b/README.md index 2bf6c6968..38a7e99fa 100644 --- a/README.md +++ b/README.md @@ -163,6 +163,14 @@ For **Linux** users: sudo apt install sourcegit ``` +* `AOSC OS`: In addition to AMD64 and ARM64, support for LoongArch and RISC-V has been added. + ```shell + sudo oma install sourcegit + ``` + +> [!NOTE] +> RISC-V support is untested. + * `AppImage` files can be found on [AppImage hub](https://appimage.github.io/SourceGit/), `xdg-open` (`xdg-utils`) must be installed to support open native file manager. * Make sure [git-credential-manager](https://github.com/git-ecosystem/git-credential-manager/releases) or [git-credential-libsecret](https://pkgs.org/search/?q=git-credential-libsecret) is installed on your Linux. * Maybe you need to set environment variable `AVALONIA_SCREEN_SCALE_FACTORS`. See https://github.com/AvaloniaUI/Avalonia/wiki/Configuring-X11-per-monitor-DPI. diff --git a/TRANSLATION.md b/TRANSLATION.md index 2297d1157..47960c547 100644 --- a/TRANSLATION.md +++ b/TRANSLATION.md @@ -6,7 +6,7 @@ This document shows the translation status of each locale file in the repository ### ![en_US](https://img.shields.io/badge/en__US-%E2%88%9A-brightgreen) -### ![de__DE](https://img.shields.io/badge/de__DE-89.98%25-yellow) +### ![de__DE](https://img.shields.io/badge/de__DE-89.52%25-yellow)
Missing keys in de_DE.axaml @@ -81,6 +81,7 @@ This document shows the translation status of each locale file in the repository - Text.Init.CommandTip - Text.Init.ErrorMessageTip - Text.InteractiveRebase.NoVerify +- Text.Launcher.NewVersion - Text.Merge.Test - Text.Merge.Test.NoConflicts - Text.Merge.Test.UnknownError @@ -102,6 +103,9 @@ This document shows the translation status of each locale file in the repository - Text.Rebase.Test.UnknownError - Text.Rebase.Test.WillCauseConflicts - Text.RemoteCM.EnableAutoFetch +- Text.Repository.FilterCommits.Collapse +- Text.Repository.FilterCommits.Expand +- Text.Repository.FilterCommits.Summary - Text.StashCM.ApplyFileChanges - Text.StashCM.Branch - Text.SubmoduleRevisionCompare @@ -110,17 +114,36 @@ This document shows the translation status of each locale file in the repository - Text.TagCM.Merge - Text.UpdateSubmodules.Recursive - Text.WorkingCopy.AddToGitIgnore.UntrackedInSameFolder +- Text.WorkingCopy.FilterChanges - Text.Worktree.Branch - Text.Worktree.Head - Text.Worktree.Path
-### ![el__GR](https://img.shields.io/badge/el__GR-%E2%88%9A-brightgreen) +### ![el__GR](https://img.shields.io/badge/el__GR-99.51%25-yellow) -### ![es__ES](https://img.shields.io/badge/es__ES-%E2%88%9A-brightgreen) +
+Missing keys in el_GR.axaml + +- Text.Launcher.NewVersion +- Text.Repository.FilterCommits.Collapse +- Text.Repository.FilterCommits.Expand +- Text.Repository.FilterCommits.Summary +- Text.WorkingCopy.FilterChanges + +
+ +### ![es__ES](https://img.shields.io/badge/es__ES-99.90%25-yellow) + +
+Missing keys in es_ES.axaml + +- Text.WorkingCopy.FilterChanges + +
-### ![fr__FR](https://img.shields.io/badge/fr__FR-95.97%25-yellow) +### ![fr__FR](https://img.shields.io/badge/fr__FR-95.49%25-yellow)
Missing keys in fr_FR.axaml @@ -153,6 +176,7 @@ This document shows the translation status of each locale file in the repository - Text.GitFlow.FinishWithRebase - Text.GitFlow.StartAt - Text.GitFlow.StartName +- Text.Launcher.NewVersion - Text.Merge.Test - Text.Merge.Test.NoConflicts - Text.Merge.Test.UnknownError @@ -162,14 +186,18 @@ This document shows the translation status of each locale file in the repository - Text.Rebase.Test.OK - Text.Rebase.Test.UnknownError - Text.Rebase.Test.WillCauseConflicts +- Text.Repository.FilterCommits.Collapse +- Text.Repository.FilterCommits.Expand +- Text.Repository.FilterCommits.Summary - Text.TagCM.Checkout - Text.TagCM.Merge - Text.UpdateSubmodules.Recursive - Text.WorkingCopy.AddToGitIgnore.UntrackedInSameFolder +- Text.WorkingCopy.FilterChanges
-### ![he__IL](https://img.shields.io/badge/he__IL-95.97%25-yellow) +### ![he__IL](https://img.shields.io/badge/he__IL-95.49%25-yellow)
Missing keys in he_IL.axaml @@ -202,6 +230,7 @@ This document shows the translation status of each locale file in the repository - Text.GitFlow.FinishWithRebase - Text.GitFlow.StartAt - Text.GitFlow.StartName +- Text.Launcher.NewVersion - Text.Merge.Test - Text.Merge.Test.NoConflicts - Text.Merge.Test.UnknownError @@ -211,196 +240,27 @@ This document shows the translation status of each locale file in the repository - Text.Rebase.Test.OK - Text.Rebase.Test.UnknownError - Text.Rebase.Test.WillCauseConflicts +- Text.Repository.FilterCommits.Collapse +- Text.Repository.FilterCommits.Expand +- Text.Repository.FilterCommits.Summary - Text.TagCM.Checkout - Text.TagCM.Merge - Text.UpdateSubmodules.Recursive - Text.WorkingCopy.AddToGitIgnore.UntrackedInSameFolder +- Text.WorkingCopy.FilterChanges
-### ![id__ID](https://img.shields.io/badge/id__ID-82.91%25-yellow) +### ![id__ID](https://img.shields.io/badge/id__ID-99.90%25-yellow)
Missing keys in id_ID.axaml -- Text.About.ReleaseDate -- Text.About.ReleaseNotes -- Text.AIAssistant.Use -- Text.App.HideOthers -- Text.Apply.3Way -- Text.Apply.Source -- Text.Apply.Source.File -- Text.Apply.Source.Clipboard -- Text.Bisect.WaitingForCheckoutAnother -- Text.Bisect.WaitingForFirstBad -- Text.Blame.BlameOnPreviousRevision -- Text.Blame.IgnoreWhitespace -- Text.BranchCM.CompareTwo -- Text.BranchCM.CompareWith -- Text.BranchCM.CompareWithHead -- Text.BranchCM.CompareWithSpecial -- Text.BranchCM.CreatePR -- Text.BranchCM.CreatePRForUpstream -- Text.BranchCM.EditDescription -- Text.ChangeCM.Merge -- Text.ChangeCM.MergeExternal -- Text.ChangeCM.ResetFileTo -- Text.Checkout.WarnUpdatingSubmodules -- Text.CheckoutBranchFromStash -- Text.CheckoutBranchFromStash.Branch -- Text.CheckoutBranchFromStash.Stash -- Text.CheckoutDetached -- Text.CheckoutDetached.Target -- Text.CheckoutDetached.Warning -- Text.Clone.Bookmark -- Text.Clone.Group -- Text.CommandPalette.Branches -- Text.CommandPalette.BranchesAndTags -- Text.CommandPalette.RepositoryActions -- Text.CommandPalette.RevisionFiles -- Text.CommitCM.CopyAuthorTime -- Text.CommitCM.CopyCommitterTime -- Text.CommitDetail.CollapseToBottom -- Text.CommitMessageTextBox.Column -- Text.CommitMessageTextBox.Placeholder -- Text.Compare.Changes -- Text.Compare.Commits -- Text.Compare.Commits.LeftOnly -- Text.Compare.Commits.RightOnly -- Text.Compare.Commits.Tips -- Text.Configure.CommitMessageTemplate.BuiltinVars -- Text.Configure.Git.AskBeforeAutoUpdatingSubmodules -- Text.Configure.Git.ConventionalTypesOverride -- Text.Configure.Git.EnableRecursiveWhenAutoUpdatingSubmodules -- Text.ConfigureCustomActionControls.StringFormatter -- Text.ConfigureCustomActionControls.StringFormatter.Tip -- Text.ConfigureCustomActionControls.StringValue.Tip -- Text.ConfigureCustomActionControls.UseFriendlyName -- Text.ConfirmEmptyCommit.StageSelectedThenCommit -- Text.CopyAsPatch -- Text.DealWithLocalChanges.DoNothing -- Text.DeleteBranch.AskForRemote -- Text.DeleteBranch.Force -- Text.Diff.EmptyFile -- Text.Diff.Submodule.UncommittedChanges -- Text.Discard.IncludeModified -- Text.EditBranchDescription -- Text.EditBranchDescription.Target -- Text.FileCM.CustomAction -- Text.FileModeChange -- Text.FileModeChange.Deleted -- Text.FileModeChange.Directory -- Text.FileModeChange.Executable -- Text.FileModeChange.New -- Text.FileModeChange.Normal -- Text.FileModeChange.Submodule -- Text.FileModeChange.Symlink -- Text.FileModeChange.Unknown -- Text.GitFlow.Finish -- Text.GitFlow.FinishWithRebase -- Text.GitFlow.StartAt -- Text.GitFlow.StartName -- Text.GitLFS.Locks.UnlockAllMyLocks -- Text.GitLFS.Locks.UnlockAllMyLocks.Confirm -- Text.GotoRevisionSelector -- Text.Histories.HighlightsInGraph -- Text.Histories.HighlightsInGraph.All -- Text.Histories.HighlightsInGraph.CurrentBranchOnly -- Text.Histories.HighlightsInGraph.CurrentBranchAndSelectedCommits -- Text.Histories.HighlightsInGraph.SelectedCommitsOnly -- Text.Histories.ShowColumns -- Text.HistoriesDetailsStandalone -- Text.HistoriesDetailsStandalone.CommitDetail -- Text.HistoriesDetailsStandalone.RevisionCompare -- Text.Hotkeys.Global.OpenLocalRepository -- Text.Hotkeys.Global.ShowWorkspaceDropdownMenu -- Text.Hotkeys.Global.Zoom -- Text.Hotkeys.Repo.CreateBranch -- Text.Hotkeys.Repo.GoToChild -- Text.Hotkeys.Repo.GoToParent -- Text.Hotkeys.Repo.OpenCommandPalette -- Text.Hotkeys.Repo.ToggleHistoriesDetailPanel -- Text.Init.CommandTip -- Text.Init.ErrorMessageTip -- Text.InteractiveRebase.NoVerify -- Text.Launcher.Commands -- Text.Launcher.OpenRepository -- Text.Merge.Test -- Text.Merge.Test.NoConflicts -- Text.Merge.Test.UnknownError -- Text.Merge.Test.WillCauseConflicts -- Text.MergeConflictEditor.AcceptBoth.MineFirst -- Text.MergeConflictEditor.AcceptBoth.TheirsFirst -- Text.MergeConflictEditor.UseBoth -- Text.MergeConflictEditor.AllResolved -- Text.MergeConflictEditor.ConflictsRemaining -- Text.MergeConflictEditor.Mine -- Text.MergeConflictEditor.NextConflict -- Text.MergeConflictEditor.PrevConflict -- Text.MergeConflictEditor.Result -- Text.MergeConflictEditor.SaveAndStage -- Text.MergeConflictEditor.Theirs -- Text.MergeConflictEditor.Title -- Text.MergeConflictEditor.UnsavedChanges -- Text.MergeConflictEditor.UseMine -- Text.MergeConflictEditor.UseTheirs -- Text.MergeConflictEditor.Undo -- Text.No -- Text.Open -- Text.Open.SystemDefaultEditor -- Text.OpenFile -- Text.OpenLocalRepository -- Text.OpenLocalRepository.Bookmark -- Text.OpenLocalRepository.Group -- Text.OpenLocalRepository.Path -- Text.PageTabBar.Tab.MoveToWorkspace -- Text.PageTabBar.Tab.Refresh -- Text.Preferences.AI.AdditionalPrompt -- Text.Preferences.AI.Model -- Text.Preferences.AI.Model.AutoFetchAvailableModels -- Text.Preferences.DiffMerge.DiffArgs -- Text.Preferences.DiffMerge.DiffArgs.Tip -- Text.Preferences.DiffMerge.MergeArgs -- Text.Preferences.DiffMerge.MergeArgs.Tip -- Text.Preferences.General.ShowRelativeTimeInGraph -- Text.Preferences.General.Use24Hours -- Text.Preferences.General.UseCompactBranchNames -- Text.Preferences.Git.UseStashAndReapplyByDefault -- Text.Preferences.Shell.Args -- Text.Preferences.Shell.Args.Tip -- Text.PushToNewBranch -- Text.PushToNewBranch.Title -- Text.Rebase.NoVerify -- Text.Rebase.Test -- Text.Rebase.Test.OK -- Text.Rebase.Test.UnknownError -- Text.Rebase.Test.WillCauseConflicts -- Text.RemoteCM.EnableAutoFetch -- Text.Repository.OpenAsFolder -- Text.Repository.Resolve -- Text.SelfUpdate.CurrentVersion -- Text.SelfUpdate.ReleaseDate -- Text.StashCM.ApplyFileChanges -- Text.StashCM.Branch -- Text.SubmoduleRevisionCompare -- Text.SubmoduleRevisionCompare.OpenDetails -- Text.TagCM.Checkout -- Text.TagCM.CompareTwo -- Text.TagCM.CompareWith -- Text.TagCM.CompareWithHead -- Text.TagCM.Merge -- Text.UpdateSubmodules.Recursive -- Text.WorkingCopy.AddToGitIgnore.UntrackedInSameFolder -- Text.WorkingCopy.Conflicts.Merge -- Text.WorkingCopy.Conflicts.MergeExternal -- Text.Worktree.Branch -- Text.Worktree.Head -- Text.Worktree.Path -- Text.Yes +- Text.WorkingCopy.FilterChanges
-### ![it__IT](https://img.shields.io/badge/it__IT-89.49%25-yellow) +### ![it__IT](https://img.shields.io/badge/it__IT-89.03%25-yellow)
Missing keys in it_IT.axaml @@ -478,6 +338,7 @@ This document shows the translation status of each locale file in the repository - Text.Init.CommandTip - Text.Init.ErrorMessageTip - Text.InteractiveRebase.NoVerify +- Text.Launcher.NewVersion - Text.Merge.Test - Text.Merge.Test.NoConflicts - Text.Merge.Test.UnknownError @@ -499,6 +360,9 @@ This document shows the translation status of each locale file in the repository - Text.Rebase.Test.UnknownError - Text.Rebase.Test.WillCauseConflicts - Text.RemoteCM.EnableAutoFetch +- Text.Repository.FilterCommits.Collapse +- Text.Repository.FilterCommits.Expand +- Text.Repository.FilterCommits.Summary - Text.SelfUpdate.CurrentVersion - Text.SelfUpdate.ReleaseDate - Text.StashCM.ApplyFileChanges @@ -509,15 +373,27 @@ This document shows the translation status of each locale file in the repository - Text.TagCM.Merge - Text.UpdateSubmodules.Recursive - Text.WorkingCopy.AddToGitIgnore.UntrackedInSameFolder +- Text.WorkingCopy.FilterChanges - Text.Worktree.Branch - Text.Worktree.Head - Text.Worktree.Path
-### ![ja__JP](https://img.shields.io/badge/ja__JP-%E2%88%9A-brightgreen) +### ![ja__JP](https://img.shields.io/badge/ja__JP-99.51%25-yellow) + +
+Missing keys in ja_JP.axaml + +- Text.Launcher.NewVersion +- Text.Repository.FilterCommits.Collapse +- Text.Repository.FilterCommits.Expand +- Text.Repository.FilterCommits.Summary +- Text.WorkingCopy.FilterChanges + +
-### ![ko__KR](https://img.shields.io/badge/ko__KR-97.45%25-yellow) +### ![ko__KR](https://img.shields.io/badge/ko__KR-96.96%25-yellow)
Missing keys in ko_KR.axaml @@ -544,14 +420,19 @@ This document shows the translation status of each locale file in the repository - Text.GitFlow.FinishWithRebase - Text.GitFlow.StartAt - Text.GitFlow.StartName +- Text.Launcher.NewVersion +- Text.Repository.FilterCommits.Collapse +- Text.Repository.FilterCommits.Expand +- Text.Repository.FilterCommits.Summary - Text.TagCM.Checkout - Text.TagCM.Merge - Text.UpdateSubmodules.Recursive - Text.WorkingCopy.AddToGitIgnore.UntrackedInSameFolder +- Text.WorkingCopy.FilterChanges
-### ![pt__BR](https://img.shields.io/badge/pt__BR-62.97%25-red) +### ![pt__BR](https://img.shields.io/badge/pt__BR-62.78%25-red)
Missing keys in pt_BR.axaml @@ -615,7 +496,6 @@ This document shows the translation status of each locale file in the repository - Text.CommitDetail.Changes.Count - Text.CommitDetail.CollapseToBottom - Text.CommitDetail.Files.Search -- Text.CommitDetail.Info.Children - Text.CommitDetail.Info.CopyEmail - Text.CommitDetail.Info.CopyName - Text.CommitDetail.Info.CopyNameAndEmail @@ -750,6 +630,7 @@ This document shows the translation status of each locale file in the repository - Text.InteractiveRebase.NoVerify - Text.InteractiveRebase.ReorderTip - Text.Launcher.Commands +- Text.Launcher.NewVersion - Text.Launcher.OpenRepository - Text.Launcher.Pages - Text.Launcher.Workspaces @@ -806,7 +687,6 @@ This document shows the translation status of each locale file in the repository - Text.Preferences.General.EnableCompactFolders - Text.Preferences.General.ShowChangesPageByDefault - Text.Preferences.General.ShowChangesTabInCommitDetailByDefault -- Text.Preferences.General.ShowChildren - Text.Preferences.General.ShowRelativeTimeInGraph - Text.Preferences.General.ShowTagsInGraph - Text.Preferences.General.Use24Hours @@ -836,6 +716,9 @@ This document shows the translation status of each locale file in the repository - Text.Repository.ClearStashes - Text.Repository.Dashboard - Text.Repository.FilterCommits +- Text.Repository.FilterCommits.Collapse +- Text.Repository.FilterCommits.Expand +- Text.Repository.FilterCommits.Summary - Text.Repository.HistoriesLayout - Text.Repository.HistoriesLayout.Horizontal - Text.Repository.HistoriesLayout.Vertical @@ -925,6 +808,7 @@ This document shows the translation status of each locale file in the repository - Text.WorkingCopy.Conflicts.OpenExternalMergeToolAllConflicts - Text.WorkingCopy.Conflicts.UseMine - Text.WorkingCopy.Conflicts.UseTheirs +- Text.WorkingCopy.FilterChanges - Text.WorkingCopy.NoVerify - Text.WorkingCopy.ResetAuthor - Text.WorkingCopy.SignOff @@ -938,7 +822,7 @@ This document shows the translation status of each locale file in the repository ### ![ru__RU](https://img.shields.io/badge/ru__RU-%E2%88%9A-brightgreen) -### ![ta__IN](https://img.shields.io/badge/ta__IN-64.83%25-red) +### ![ta__IN](https://img.shields.io/badge/ta__IN-64.45%25-red)
Missing keys in ta_IN.axaml @@ -1146,6 +1030,7 @@ This document shows the translation status of each locale file in the repository - Text.InteractiveRebase.NoVerify - Text.InteractiveRebase.ReorderTip - Text.Launcher.Commands +- Text.Launcher.NewVersion - Text.Launcher.OpenRepository - Text.Launcher.Pages - Text.Launcher.Workspaces @@ -1221,6 +1106,9 @@ This document shows the translation status of each locale file in the repository - Text.Repository.BranchSort.ByName - Text.Repository.ClearStashes - Text.Repository.Dashboard +- Text.Repository.FilterCommits.Collapse +- Text.Repository.FilterCommits.Expand +- Text.Repository.FilterCommits.Summary - Text.Repository.MoreOptions - Text.Repository.OpenAsFolder - Text.Repository.Resolve @@ -1294,6 +1182,7 @@ This document shows the translation status of each locale file in the repository - Text.WorkingCopy.Conflicts.OpenExternalMergeToolAllConflicts - Text.WorkingCopy.Conflicts.UseMine - Text.WorkingCopy.Conflicts.UseTheirs +- Text.WorkingCopy.FilterChanges - Text.WorkingCopy.NoVerify - Text.WorkingCopy.ResetAuthor - Text.Worktree.Branch @@ -1304,7 +1193,7 @@ This document shows the translation status of each locale file in the repository
-### ![uk__UA](https://img.shields.io/badge/uk__UA-65.62%25-red) +### ![uk__UA](https://img.shields.io/badge/uk__UA-65.23%25-red)
Missing keys in uk_UA.axaml @@ -1508,6 +1397,7 @@ This document shows the translation status of each locale file in the repository - Text.InteractiveRebase.NoVerify - Text.InteractiveRebase.ReorderTip - Text.Launcher.Commands +- Text.Launcher.NewVersion - Text.Launcher.OpenRepository - Text.Launcher.Pages - Text.Launcher.Workspaces @@ -1583,6 +1473,9 @@ This document shows the translation status of each locale file in the repository - Text.Repository.BranchSort.ByName - Text.Repository.ClearStashes - Text.Repository.Dashboard +- Text.Repository.FilterCommits.Collapse +- Text.Repository.FilterCommits.Expand +- Text.Repository.FilterCommits.Summary - Text.Repository.MoreOptions - Text.Repository.OpenAsFolder - Text.Repository.Resolve @@ -1652,6 +1545,7 @@ This document shows the translation status of each locale file in the repository - Text.WorkingCopy.ConfirmCommitWithDetachedHead - Text.WorkingCopy.Conflicts.Merge - Text.WorkingCopy.Conflicts.MergeExternal +- Text.WorkingCopy.FilterChanges - Text.WorkingCopy.NoVerify - Text.WorkingCopy.ResetAuthor - Text.Worktree.Branch diff --git a/VERSION b/VERSION index 3f492ad1c..054d00cdb 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2026.15 \ No newline at end of file +2026.17 \ No newline at end of file diff --git a/build/resources/app/App.plist b/build/resources/app/App.plist index ba6f40a2b..d20efa5e2 100644 --- a/build/resources/app/App.plist +++ b/build/resources/app/App.plist @@ -20,6 +20,21 @@ APPL CFBundleShortVersionString SOURCE_GIT_VERSION + CFBundleDocumentTypes + + + CFBundleTypeName + Supported Folder + CFBundleTypeRole + Viewer + LSHandlerRank + Alternate + LSItemContentTypes + + public.folder + + + NSHighResolutionCapable diff --git a/src/AI/Agent.cs b/src/AI/Agent.cs index e1b102724..a01839063 100644 --- a/src/AI/Agent.cs +++ b/src/AI/Agent.cs @@ -14,7 +14,7 @@ public Agent(Service service) _service = service; } - public async Task GenerateCommitMessageAsync(string repo, string changeList, Action onUpdate, CancellationToken cancellation) + public async Task GenerateCommitMessageAsync(string repo, string currentBranch, string changeList, string amendParent, Action onUpdate, CancellationToken cancellation) { var chatClient = _service.GetChatClient(); if (chatClient == null) @@ -28,6 +28,7 @@ public async Task GenerateCommitMessageAsync(string repo, string changeList, Act .AppendLine("- Output the conventional commit message (with detail changes in list) directly. Do not explain your output nor introduce your answer.") .AppendLine(_service.AdditionalPrompt) .Append("Repository path: ").AppendLine(repo.Quoted()) + .Append("Current branch: ").AppendLine(currentBranch.Quoted()) .AppendLine("Changed files ('A' means added, 'M' means modified, 'D' means deleted, 'T' means type changed, 'R' means renamed, 'C' means copied): ") .Append(changeList); @@ -94,7 +95,7 @@ public async Task GenerateCommitMessageAsync(string repo, string changeList, Act foreach (var call in completion.ToolCalls) { - var result = await ChatTools.ProcessAsync(call, onUpdate); + var result = await ChatTools.ProcessAsync(call, repo, amendParent, onUpdate); messages.Add(result); } diff --git a/src/AI/ChatTools.cs b/src/AI/ChatTools.cs index b9e2f80c6..57a8e1459 100644 --- a/src/AI/ChatTools.cs +++ b/src/AI/ChatTools.cs @@ -15,10 +15,6 @@ public static class ChatTools { "type": "object", "properties": { - "repo": { - "type": "string", - "description": "The path to the repository." - }, "file": { "type": "string", "description": "The path to the file." @@ -28,28 +24,25 @@ public static class ChatTools "description": "The path to the original file when it has been renamed or copied." } }, - "required": ["repo", "file"] + "required": ["file"] } """)), false); - public static async Task ProcessAsync(ChatToolCall call, Action output) + public static async Task ProcessAsync(ChatToolCall call, string repo, string amendParent, Action output) { using var doc = JsonDocument.Parse(call.FunctionArguments); if (call.FunctionName.Equals(GetDetailChangesInFile.FunctionName)) { - var hasRepo = doc.RootElement.TryGetProperty("repo", out var repoPath); var hasFile = doc.RootElement.TryGetProperty("file", out var filePath); var hasOriginalFile = doc.RootElement.TryGetProperty("originalFile", out var originalFilePath); - if (!hasRepo) - throw new ArgumentException("repo", "The repo argument is required"); if (!hasFile) throw new ArgumentException("file", "The file argument is required"); output?.Invoke($"Read changes in file: {filePath.GetString()}"); var orgFilePath = hasOriginalFile ? originalFilePath.GetString() : string.Empty; - var rs = await new Commands.GetFileChangeForAI(repoPath.GetString(), filePath.GetString(), orgFilePath).ReadAsync(); + var rs = await new Commands.GetFileChangeForAI(repo, filePath.GetString(), orgFilePath, amendParent).ReadAsync(); var message = rs.IsSuccess ? rs.StdOut : string.Empty; return new ToolChatMessage(call.Id, message); } diff --git a/src/App.Extensions.cs b/src/App.Extensions.cs index e6d8add25..08c1b5478 100644 --- a/src/App.Extensions.cs +++ b/src/App.Extensions.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Text; +using System.Threading; using Avalonia.Media; namespace SourceGit @@ -79,6 +80,12 @@ public static T Use(this T cmd, Models.ICommandLog log) where T : Commands.Co cmd.Log = log; return cmd; } + + public static T WithCancellation(this T cmd, CancellationToken token) where T : Commands.Command + { + cmd.CancellationToken = token; + return cmd; + } } public static class DirectoryInfoExtension diff --git a/src/App.axaml.cs b/src/App.axaml.cs index 3a7470dc1..a22f764d6 100644 --- a/src/App.axaml.cs +++ b/src/App.axaml.cs @@ -11,6 +11,7 @@ using Avalonia.Markup.Xaml; using Avalonia.Media; using Avalonia.Media.Fonts; +using Avalonia.Platform; using Avalonia.Styling; using Avalonia.Threading; @@ -101,8 +102,11 @@ public static async Task AskConfirmAsync(string message, Models.ConfirmBut public static void SetLocale(string localeKey) { + var locale = Models.Locale.Supported.Find(x => x.Key.Equals(localeKey, StringComparison.OrdinalIgnoreCase)); + var finalLocaleKey = locale?.Key ?? "en_US"; + if (Current is not App app || - app.Resources[localeKey] is not ResourceDictionary targetLocale || + app.Resources[finalLocaleKey] is not ResourceDictionary targetLocale || targetLocale == app._activeLocale) return; @@ -472,6 +476,15 @@ private void TryLaunchAsNormal(IClassicDesktopStyleApplicationLifetime desktop) Native.OS.SetupExternalTools(); Models.AvatarManager.Instance.Start(); + if (this.TryGetFeature() is { } activatable) + { + activatable.Activated += (_, e) => + { + if (e is FileActivatedEventArgs { Files: { Count: > 0 } } fileArgs) + _launcher?.TryOpenRepositoryFromPath(fileArgs.Files[0].Path.LocalPath); + }; + } + string startupRepo = null; if (desktop.Args is { Length: 1 }) { @@ -524,6 +537,9 @@ private void TryLaunchAsNormal(IClassicDesktopStyleApplicationLifetime desktop) #region Check for Updates private void Check4Update(bool manually = false) { + if (_launcher != null) + _launcher.NewVersion = null; + Task.Run(async () => { try @@ -537,23 +553,20 @@ private void Check4Update(bool manually = false) if (ver == null) return; - // Check if already up-to-date. - if (!ver.IsNewVersion) + if (manually) { - if (manually) + if (ver.IsNewVersion) + ShowSelfUpdateResult(ver); + else ShowSelfUpdateResult(new Models.AlreadyUpToDate()); - return; } - - // Should not check ignored tag if this is called manually. - if (!manually) + else if (_launcher != null) { - var pref = ViewModels.Preferences.Instance; - if (ver.TagName == pref.IgnoreUpdateTag) + if (!ver.IsNewVersion || ver.TagName == ViewModels.Preferences.Instance.IgnoreUpdateTag) return; - } - ShowSelfUpdateResult(ver); + _launcher.NewVersion = ver; + } } catch (Exception e) { diff --git a/src/Commands/Branch.cs b/src/Commands/Branch.cs index c80bdab92..6ed017841 100644 --- a/src/Commands/Branch.cs +++ b/src/Commands/Branch.cs @@ -48,9 +48,9 @@ public async Task DeleteLocalAsync(bool force) return await ExecAsync().ConfigureAwait(false); } - public async Task DeleteRemoteAsync(string remote) + public async Task DeleteRemoteAsync(string remote, bool force) { - Args = $"branch -D -r {remote}/{_name}"; + Args = $"branch {(force ? "-D" : "-d")} -r {remote}/{_name}"; return await ExecAsync().ConfigureAwait(false); } diff --git a/src/Commands/Command.cs b/src/Commands/Command.cs index 94c7d84fa..977c81012 100644 --- a/src/Commands/Command.cs +++ b/src/Commands/Command.cs @@ -62,7 +62,7 @@ public async Task ExecAsync() lock (capturedLock) { if (captured is { Process: { HasExited: false } }) - captured.Process.Kill(); + captured.Process.Kill(true); } }); } diff --git a/src/Commands/Diff.cs b/src/Commands/Diff.cs index 6edeff540..89248ddc1 100644 --- a/src/Commands/Diff.cs +++ b/src/Commands/Diff.cs @@ -144,20 +144,23 @@ private void ParseLine(ArraySegment lineBytes) if (line.Length == 0) return; - // If we are reading a chunk body, try to read the current line as body first (because - // the number of chunk body is greater than the number of chunk indicator in most time. + // If we are reading a chunk-body, try to read the current line as chunk-body first (because + // there are usually more chunk-body lines than chunk-indicator lines). if (_isInChunk) { - if (ParseChunkBodyLine(line, lineBytes[1..])) + if (ParseChunkBodyLine(line, lineBytes)) return; ProcessInlineHighlights(); _isInChunk = false; } - // If the current line is not a chunk body, try to parse it as chunk indicator + // If the current line is not a chunk-body, try to parse it as chunk-indicator if (ParseChunkStartLine(line)) + { + _isInChunk = true; return; + } // Fallback to diff headers to support type-changed diff (multiple headers). ParseDiffHeaderLine(line); @@ -193,7 +196,6 @@ private bool ParseChunkStartLine(string line) _newLine = int.Parse(match.Groups[2].Value); _last = new Models.TextDiffLine(Models.TextDiffLineType.Indicator, line, null, 0, 0); _result.TextDiff.Lines.Add(_last); - _isInChunk = true; return true; } @@ -204,13 +206,14 @@ private bool ParseChunkBodyLine(string line, ArraySegment lineBytes) { var prefix = line[0]; var content = line.Substring(1); + var rawContent = lineBytes[1..].ToArray(); if (ParseLFSChange(prefix, content)) return true; if (prefix == PREFIX_DELETED) { _result.TextDiff.DeletedLines++; - _last = new Models.TextDiffLine(Models.TextDiffLineType.Deleted, content, lineBytes.ToArray(), _oldLine, 0); + _last = new Models.TextDiffLine(Models.TextDiffLineType.Deleted, content, rawContent, _oldLine, 0); _deleted.Add(_last); _oldLine++; return true; @@ -219,7 +222,7 @@ private bool ParseChunkBodyLine(string line, ArraySegment lineBytes) if (prefix == PREFIX_ADDED) { _result.TextDiff.AddedLines++; - _last = new Models.TextDiffLine(Models.TextDiffLineType.Added, content, lineBytes.ToArray(), 0, _newLine); + _last = new Models.TextDiffLine(Models.TextDiffLineType.Added, content, rawContent, 0, _newLine); _added.Add(_last); _newLine++; return true; @@ -229,7 +232,7 @@ private bool ParseChunkBodyLine(string line, ArraySegment lineBytes) { ProcessInlineHighlights(); - _last = new Models.TextDiffLine(Models.TextDiffLineType.Normal, content, lineBytes.ToArray(), _oldLine, _newLine); + _last = new Models.TextDiffLine(Models.TextDiffLineType.Normal, content, rawContent, _oldLine, _newLine); _result.TextDiff.Lines.Add(_last); _oldLine++; _newLine++; diff --git a/src/Commands/GetFileChangeForAI.cs b/src/Commands/GetFileChangeForAI.cs index 96ef162dc..128d0aba6 100644 --- a/src/Commands/GetFileChangeForAI.cs +++ b/src/Commands/GetFileChangeForAI.cs @@ -6,13 +6,16 @@ namespace SourceGit.Commands { public class GetFileChangeForAI : Command { - public GetFileChangeForAI(string repo, string file, string originalFile) + public GetFileChangeForAI(string repo, string file, string originalFile, string amendParent) { WorkingDirectory = repo; Context = repo; var builder = new StringBuilder(); - builder.Append("diff --no-color --no-ext-diff --diff-algorithm=minimal --cached -- "); + builder.Append("diff --no-color --no-ext-diff --diff-algorithm=minimal --cached "); + if (!string.IsNullOrEmpty(amendParent)) + builder.Append(amendParent).Append(' '); + builder.Append("-- "); if (!string.IsNullOrEmpty(originalFile) && !file.Equals(originalFile, StringComparison.Ordinal)) builder.Append(originalFile.Quoted()).Append(' '); builder.Append(file.Quoted()); diff --git a/src/Commands/GitFlow.cs b/src/Commands/GitFlow.cs index 56b56a923..0438d76de 100644 --- a/src/Commands/GitFlow.cs +++ b/src/Commands/GitFlow.cs @@ -47,24 +47,32 @@ public async Task InitAsync(string production, string develop, string feat return await ExecAsync().ConfigureAwait(false); } - public async Task StartAsync(Models.GitFlowBranchType type, string name) + public async Task StartAsync(Models.GitFlowBranchType type, string name, Models.Branch based) { + var builder = new StringBuilder(); + builder.Append("flow "); + switch (type) { case Models.GitFlowBranchType.Feature: - Args = $"flow feature start {name}"; + builder.Append("feature"); break; case Models.GitFlowBranchType.Release: - Args = $"flow release start {name}"; + builder.Append("release"); break; case Models.GitFlowBranchType.Hotfix: - Args = $"flow hotfix start {name}"; + builder.Append("hotfix"); break; default: RaiseException("Bad git-flow branch type!!!"); return false; } + builder.Append(" start ").Append(name); + if (based != null) + builder.Append(' ').Append(based.Name); + + Args = builder.ToString(); return await ExecAsync().ConfigureAwait(false); } diff --git a/src/Commands/IsConflictResolved.cs b/src/Commands/IsConflictResolved.cs deleted file mode 100644 index e5b752d35..000000000 --- a/src/Commands/IsConflictResolved.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Threading.Tasks; - -namespace SourceGit.Commands -{ - public class IsConflictResolved : Command - { - public IsConflictResolved(string repo, Models.Change change) - { - var opt = new Models.DiffOption(change, true); - - WorkingDirectory = repo; - Context = repo; - Args = $"diff --no-color --no-ext-diff -a --ignore-cr-at-eol --check {opt}"; - } - - public bool GetResult() - { - return ReadToEnd().IsSuccess; - } - - public async Task GetResultAsync() - { - var rs = await ReadToEndAsync().ConfigureAwait(false); - return rs.IsSuccess; - } - } -} diff --git a/src/Commands/Pull.cs b/src/Commands/Pull.cs index e121445ba..75b433e73 100644 --- a/src/Commands/Pull.cs +++ b/src/Commands/Pull.cs @@ -13,10 +13,13 @@ public Pull(string repo, string remote, string branch, bool useRebase) Context = repo; var builder = new StringBuilder(512); - builder.Append("pull --verbose --progress "); - if (useRebase) - builder.Append("--rebase=true "); - builder.Append(remote).Append(' ').Append(branch); + builder + .Append("pull --verbose --progress --rebase=") + .Append(useRebase ? "true" : "false") + .Append(' ') + .Append(remote) + .Append(' ') + .Append(branch); Args = builder.ToString(); } diff --git a/src/Commands/QueryCommitChildren.cs b/src/Commands/QueryCommitChildren.cs deleted file mode 100644 index 7e7e88877..000000000 --- a/src/Commands/QueryCommitChildren.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; - -namespace SourceGit.Commands -{ - public class QueryCommitChildren : Command - { - public QueryCommitChildren(string repo, string commit, int max) - { - WorkingDirectory = repo; - Context = repo; - _commit = commit; - Args = $"rev-list -{max} --parents --branches --remotes --ancestry-path ^{commit}"; - } - - public async Task> GetResultAsync() - { - var rs = await ReadToEndAsync().ConfigureAwait(false); - var outs = new List(); - if (rs.IsSuccess) - { - var lines = rs.StdOut.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries); - foreach (var line in lines) - { - if (line.Contains(_commit)) - outs.Add(line.Substring(0, _commit.Length)); - } - } - - return outs; - } - - private string _commit; - } -} diff --git a/src/Commands/QueryConflictFileState.cs b/src/Commands/QueryConflictFileState.cs new file mode 100644 index 000000000..f9a52ee12 --- /dev/null +++ b/src/Commands/QueryConflictFileState.cs @@ -0,0 +1,55 @@ +using System; +using System.Diagnostics; +using System.Threading.Tasks; + +namespace SourceGit.Commands +{ + public class QueryConflictFileState : Command + { + public QueryConflictFileState(string repo, Models.Change change) + { + var opt = new Models.DiffOption(change, true); + + WorkingDirectory = repo; + Context = repo; + Args = $"diff --no-color --no-ext-diff --no-textconv --full-index --patch {opt}"; + } + + public async Task GetResultAsync() + { + try + { + using var proc = new Process(); + proc.StartInfo = CreateGitStartInfo(true); + proc.Start(); + + var isBinary = false; + var tokenCount = 0; + + while (await proc.StandardOutput.ReadLineAsync().ConfigureAwait(false) is { } line) + { + if (isBinary) + continue; + + if (line.StartsWith("Binary files ", StringComparison.Ordinal)) + isBinary = true; + else if (line.StartsWith("++<<<<<<<", StringComparison.Ordinal) || + line.StartsWith("++=======", StringComparison.Ordinal) || + line.StartsWith("++>>>>>>>", StringComparison.Ordinal)) + tokenCount++; + } + + await proc.WaitForExitAsync().ConfigureAwait(false); + + if (isBinary) + return Models.ConflictFileState.UnmergedBinary; + + return tokenCount == 0 ? Models.ConflictFileState.Resolved : Models.ConflictFileState.UnmergedText; + } + catch + { + return Models.ConflictFileState.Unknown; + } + } + } +} diff --git a/src/Commands/Statistics.cs b/src/Commands/Statistics.cs index 2d43c7629..3c6ed017b 100644 --- a/src/Commands/Statistics.cs +++ b/src/Commands/Statistics.cs @@ -1,15 +1,28 @@ using System.IO; +using System.Text; using System.Threading.Tasks; namespace SourceGit.Commands { public class Statistics : Command { - public Statistics(string repo, int max) + public Statistics(string repo, int max, Models.Branch specBranch) { WorkingDirectory = repo; Context = repo; - Args = $"log --date-order --branches --remotes -{max} --format=%ct$%aN±%aE"; + + var builder = new StringBuilder(); + builder + .Append("log --date-order -") + .Append(max) + .Append(" --format=%ct$%aN±%aE "); + + if (specBranch == null || string.IsNullOrEmpty(specBranch.FullName)) + builder.Append("--branches --remotes"); + else + builder.Append(specBranch.FullName); + + Args = builder.ToString(); } public async Task ReadAsync() diff --git a/src/Models/Conflict.cs b/src/Models/Conflict.cs index 112fdd9b7..fd9c69030 100644 --- a/src/Models/Conflict.cs +++ b/src/Models/Conflict.cs @@ -2,6 +2,14 @@ namespace SourceGit.Models { + public enum ConflictFileState + { + Unknown, + UnmergedText, + UnmergedBinary, + Resolved + } + public enum ConflictPanelType { Ours, diff --git a/src/Models/ExternalTool.cs b/src/Models/ExternalTool.cs index 1ca448525..7f93cf8bd 100644 --- a/src/Models/ExternalTool.cs +++ b/src/Models/ExternalTool.cs @@ -84,30 +84,18 @@ public class VisualStudioInstance public class JetBrainsState { - [JsonPropertyName("version")] - public int Version { get; set; } = 0; - [JsonPropertyName("appVersion")] - public string AppVersion { get; set; } = string.Empty; [JsonPropertyName("tools")] public List Tools { get; set; } = new List(); } public class JetBrainsTool { - [JsonPropertyName("channelId")] - public string ChannelId { get; set; } - [JsonPropertyName("toolId")] - public string ToolId { get; set; } [JsonPropertyName("productCode")] public string ProductCode { get; set; } - [JsonPropertyName("tag")] - public string Tag { get; set; } [JsonPropertyName("displayName")] public string DisplayName { get; set; } [JsonPropertyName("displayVersion")] public string DisplayVersion { get; set; } - [JsonPropertyName("buildNumber")] - public string BuildNumber { get; set; } [JsonPropertyName("installLocation")] public string InstallLocation { get; set; } [JsonPropertyName("launchCommand")] @@ -198,8 +186,7 @@ public void Cursor(Func platformFinder) public void FindJetBrainsFromToolbox(Func platformFinder) { - var exclude = new List { "fleet", "dotmemory", "dottrace", "resharper-u", "androidstudio" }; - var supportedIcons = new List { "CL", "DB", "DL", "DS", "GO", "JB", "PC", "PS", "PY", "QA", "QD", "RD", "RM", "RR", "WRS", "WS" }; + var supported = new List { "CL", "DB", "DL", "DS", "GO", "JB", "PC", "PS", "PY", "QA", "QD", "RD", "RM", "RR", "WRS", "WS" }; var state = Path.Combine(platformFinder(), "state.json"); if (File.Exists(state)) { @@ -209,12 +196,12 @@ public void FindJetBrainsFromToolbox(Func platformFinder) var stateData = JsonSerializer.Deserialize(stream, JsonCodeGen.Default.JetBrainsState); foreach (var tool in stateData.Tools) { - if (exclude.Contains(tool.ToolId.ToLowerInvariant())) + if (!supported.Contains(tool.ProductCode)) continue; Tools.Add(new ExternalTool( $"{tool.DisplayName} {tool.DisplayVersion}", - supportedIcons.Contains(tool.ProductCode) ? $"JetBrains/{tool.ProductCode}" : "JetBrains/JB", + $"JetBrains/{tool.ProductCode}", Path.Combine(tool.InstallLocation, tool.LaunchCommand), null, true)); diff --git a/src/Models/IpcChannel.cs b/src/Models/IpcChannel.cs index 702f0630b..86c8167ae 100644 --- a/src/Models/IpcChannel.cs +++ b/src/Models/IpcChannel.cs @@ -1,6 +1,8 @@ using System; using System.IO; using System.IO.Pipes; +using System.Security.Cryptography; +using System.Text; using System.Threading; using System.Threading.Tasks; @@ -19,7 +21,7 @@ public IpcChannel() _singletonLock = File.Open(Path.Combine(Native.OS.DataDir, "process.lock"), FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); IsFirstInstance = true; _server = new NamedPipeServerStream( - "SourceGitIPCChannel" + Environment.UserName, + GetPipeName(), PipeDirection.In, -1, PipeTransmissionMode.Byte, @@ -37,7 +39,7 @@ public void SendToFirstInstance(string cmd) { try { - using (var client = new NamedPipeClientStream(".", "SourceGitIPCChannel" + Environment.UserName, PipeDirection.Out, PipeOptions.Asynchronous | PipeOptions.CurrentUserOnly)) + using (var client = new NamedPipeClientStream(".", GetPipeName(), PipeDirection.Out, PipeOptions.Asynchronous | PipeOptions.CurrentUserOnly)) { client.Connect(1000); if (!client.IsConnected) @@ -67,6 +69,19 @@ public void Dispose() _singletonLock?.Dispose(); } + private static string GetPipeName() + { + // SourceGit does not support multiple instances on macOS, so we can use a fixed pipe name for macOS. + if (OperatingSystem.IsMacOS()) + return "SourceGit"; + + // Windows and Linux can have multiple instances of SourceGit running (portable-mode), so we need to generate a unique pipe name based on the data directory. + var dataDir = Native.OS.DataDir.Replace('\\', '/').TrimEnd('/'); + var hashStr = $"{Environment.UserName}_{dataDir}"; + var hash = Convert.ToHexString(SHA256.HashData(Encoding.UTF8.GetBytes(hashStr))).Substring(0, 10); + return $"SG_{hash}"; + } + private async void StartServer() { using var reader = new StreamReader(_server); diff --git a/src/Models/RepositoryUIStates.cs b/src/Models/RepositoryUIStates.cs index 93cb6fc09..723fe900b 100644 --- a/src/Models/RepositoryUIStates.cs +++ b/src/Models/RepositoryUIStates.cs @@ -231,6 +231,12 @@ public AvaloniaList HistoryFilters set; } = []; + public bool IsHistoryFiltersCollapsed + { + get; + set; + } = false; + public List RecentCommitMessages { get; diff --git a/src/Models/ShellOrTerminal.cs b/src/Models/ShellOrTerminal.cs index fa818bfe7..e8e585475 100644 --- a/src/Models/ShellOrTerminal.cs +++ b/src/Models/ShellOrTerminal.cs @@ -44,7 +44,10 @@ static ShellOrTerminal() new ShellOrTerminal("iterm2", "iTerm", "iTerm"), new ShellOrTerminal("warp", "Warp", "Warp"), new ShellOrTerminal("ghostty", "Ghostty", "Ghostty"), - new ShellOrTerminal("kitty", "kitty", "kitty") + new ShellOrTerminal("kitty", "kitty", "kitty"), + new ShellOrTerminal("otty", "Otty", "Otty"), + new ShellOrTerminal("cmux", "cmux", "cmux"), + new ShellOrTerminal("mux0", "mux0", "mux0"), }; } else diff --git a/src/Native/Linux.cs b/src/Native/Linux.cs index 0309a6562..a28d88ebe 100644 --- a/src/Native/Linux.cs +++ b/src/Native/Linux.cs @@ -48,25 +48,7 @@ public string GetDataDir() // Runtime data dir: ~/.sourcegit var home = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); - var dataDir = Path.Combine(home, ".sourcegit"); - if (Directory.Exists(dataDir)) - return dataDir; - - // Migrate old data: ~/.config/SourceGit - var oldDataDir = Path.Combine(home, ".config", "SourceGit"); - if (Directory.Exists(oldDataDir)) - { - try - { - Directory.Move(oldDataDir, dataDir); - } - catch - { - // Ignore errors - } - } - - return dataDir; + return Path.Combine(home, ".sourcegit"); } public string FindGitExecutable() diff --git a/src/Native/Windows.cs b/src/Native/Windows.cs index fd8f31c9b..2ec98ca40 100644 --- a/src/Native/Windows.cs +++ b/src/Native/Windows.cs @@ -127,11 +127,11 @@ public string FindTerminal(Models.ShellOrTerminal shell) finder.VSCode(FindVSCode); finder.VSCodeInsiders(FindVSCodeInsiders); finder.VSCodium(FindVSCodium); + FindVisualStudio(finder); finder.Cursor(() => Path.Combine(localAppDataDir, @"Programs\Cursor\Cursor.exe")); finder.FindJetBrainsFromToolbox(() => Path.Combine(localAppDataDir, @"JetBrains\Toolbox")); finder.SublimeText(FindSublimeText); finder.Zed(FindZed); - FindVisualStudio(finder); return finder.Tools; } diff --git a/src/Resources/Images/ShellIcons/cmux.png b/src/Resources/Images/ShellIcons/cmux.png new file mode 100644 index 000000000..b847bbb70 Binary files /dev/null and b/src/Resources/Images/ShellIcons/cmux.png differ diff --git a/src/Resources/Images/ShellIcons/mux0.png b/src/Resources/Images/ShellIcons/mux0.png new file mode 100644 index 000000000..e16b37400 Binary files /dev/null and b/src/Resources/Images/ShellIcons/mux0.png differ diff --git a/src/Resources/Images/ShellIcons/otty.png b/src/Resources/Images/ShellIcons/otty.png new file mode 100644 index 000000000..e2ce5897f Binary files /dev/null and b/src/Resources/Images/ShellIcons/otty.png differ diff --git a/src/Resources/Locales/de_DE.axaml b/src/Resources/Locales/de_DE.axaml index 6da606aee..57a344c63 100644 --- a/src/Resources/Locales/de_DE.axaml +++ b/src/Resources/Locales/de_DE.axaml @@ -164,7 +164,6 @@ Submodul INFORMATION AUTOR - NACHFOLGER COMMITTER Prüfe Refs, die diesen Commit enthalten COMMIT ENTHALTEN IN @@ -610,7 +609,6 @@ $1, $2, … Werte der Eingabe-Steuerelemente Commit-Historie Standardmäßig ‚ÄNDERUNGEN‘-Ansicht anzeigen Standardmäßig Registerkarte ‚ÄNDERUNGEN‘ in Commit-Details anzeigen - Zeige Nachfolger in den Commit-Details Zeige Tags im Commit-Verlauf Längenvorgabe für Commit-Nachrichten Standard-Avatar im GitHub-Stil generieren diff --git a/src/Resources/Locales/el_GR.axaml b/src/Resources/Locales/el_GR.axaml index 0b537616e..4de2a9003 100644 --- a/src/Resources/Locales/el_GR.axaml +++ b/src/Resources/Locales/el_GR.axaml @@ -188,7 +188,6 @@ Υπομονάδα ΠΛΗΡΟΦΟΡΙΕΣ ΣΥΓΓΡΑΦΕΑΣ - ΑΠΟΓΟΝΟΙ COMMITTER Έλεγχος refs που περιέχουν αυτό το commit ΤΟ COMMIT ΠΕΡΙΕΧΕΤΑΙ ΣΕ @@ -691,7 +690,6 @@ Commits ιστορικού Εμφάνιση της σελίδας `ΤΟΠΙΚΕΣ ΑΛΛΑΓΕΣ` από προεπιλογή Εμφάνιση της καρτέλας `ΑΛΛΑΓΕΣ` στις λεπτομέρειες commit από προεπιλογή - Εμφάνιση απογόνων στις λεπτομέρειες commit Εμφάνιση σχετικού χρόνου στο γράφημα commit Εμφάνιση ετικετών στο γράφημα commit Μήκος οδηγού θέματος diff --git a/src/Resources/Locales/en_US.axaml b/src/Resources/Locales/en_US.axaml index c997f8221..676bd57a0 100644 --- a/src/Resources/Locales/en_US.axaml +++ b/src/Resources/Locales/en_US.axaml @@ -184,7 +184,6 @@ Submodule INFORMATION AUTHOR - CHILDREN COMMITTER Check refs that contains this commit COMMIT IS CONTAINED BY @@ -580,6 +579,7 @@ Commands ERROR NOTICE + New Version Available Open Repositories Tabs Workspaces @@ -687,7 +687,6 @@ History Commits Show `LOCAL CHANGES` page by default Show `CHANGES` tab in commit detail by default - Show children in the commit details Show relative time in commit graph Show tags in commit graph Subject Guide Length @@ -800,9 +799,12 @@ Open in File Browser Search Branches/Tags/Submodules Visibility in Graph + Collapse Filters Unset Hide in commit graph + Expand Filters Filter in commit graph + filter(s) enabled LAYOUT Horizontal Vertical @@ -1007,6 +1009,7 @@ FILE CONFLICTS ARE RESOLVED USE MINE USE THEIRS + Filter Changes... INCLUDE UNTRACKED FILES NO RECENT INPUT MESSAGES NO COMMIT TEMPLATES diff --git a/src/Resources/Locales/es_ES.axaml b/src/Resources/Locales/es_ES.axaml index 5f374f093..ac2e7d76f 100644 --- a/src/Resources/Locales/es_ES.axaml +++ b/src/Resources/Locales/es_ES.axaml @@ -188,7 +188,6 @@ Submódulo INFORMACIÓN AUTOR - HIJOS COMMITTER Ver refs que contienen este commit COMMIT ESTÁ CONTENIDO EN @@ -584,6 +583,7 @@ Comandos ERROR AVISO + Nueva Versión Disponible Abrir Repositorios Páginas Espacios de trabajo @@ -691,7 +691,6 @@ Commits en el historial Mostrar la página `CAMBIOS LOCALES` por defecto Mostrar pestaña de `CAMBIOS` en los detalles del commit por defecto - Mostrar hijos en los detalles de commit Mostrar hora relativa en el gráfico de commits Mostrar etiquetas en el gráfico de commit Longitud de la guía del asunto @@ -804,9 +803,12 @@ Abrir en el Explorador Buscar Ramas/Etiquetas/Submódulos Visibilidad en el Gráfico + Colapsar Filtros Desestablecer Ocultar en el Gráfico de Commits + Expandir Filtros Filtrar en el Gráfico de Commits + filtro(s) activado(s) DISPOSICIÓN Horizontal Vertical diff --git a/src/Resources/Locales/fr_FR.axaml b/src/Resources/Locales/fr_FR.axaml index 8227387c9..a094fb2ae 100644 --- a/src/Resources/Locales/fr_FR.axaml +++ b/src/Resources/Locales/fr_FR.axaml @@ -178,7 +178,6 @@ Sous-module INFORMATIONS AUTEUR - ENFANTS COMMITTER Vérifier les références contenant ce commit LE COMMIT EST CONTENU PAR @@ -659,7 +658,6 @@ Historique de commits Afficher la page 'CHANGEMENTS LOCAUX' par défaut Afficher l'onglet 'CHANGEMENTS' dans les détails du commit par défaut - Afficher les enfants dans les détails du commit Afficher le temps relatif dans le graphe de commits Afficher les tags dans le graphique des commits Guide de longueur du sujet diff --git a/src/Resources/Locales/he_IL.axaml b/src/Resources/Locales/he_IL.axaml index 66430604c..64346545d 100644 --- a/src/Resources/Locales/he_IL.axaml +++ b/src/Resources/Locales/he_IL.axaml @@ -178,7 +178,6 @@ Submodule מידע AUTHOR - צאצאים COMMITTER בדוק refs המכילים את ה־commit הזה ה־COMMIT כלול ב־ @@ -659,7 +658,6 @@ Commits בהיסטוריה הצג דף `LOCAL CHANGES` כברירת מחדל הצג לשונית `CHANGES` בפרטי ה־commit כברירת מחדל - הצג צאצאים בפרטי ה־commit הצג זמן יחסי בגרף ה־commits הצג tags בגרף ה־commits אורך מנחה ל־Subject diff --git a/src/Resources/Locales/id_ID.axaml b/src/Resources/Locales/id_ID.axaml index e5bf64e6e..383ae256d 100644 --- a/src/Resources/Locales/id_ID.axaml +++ b/src/Resources/Locales/id_ID.axaml @@ -5,6 +5,8 @@ Tentang Tentang SourceGit + Tanggal Rilis: {0} + Catatan Rilis Klien Git GUI Opensource & Gratis Tambahkan Berkas ke Abaikan Pola: @@ -23,10 +25,16 @@ Model BUAT ULANG Gunakan AI untuk membuat pesan commit + Gunakan Sembunyikan SourceGit + Sembunyikan Lainnya Tampilkan Semua + Merge 3 Arah Pilih berkas .patch untuk diterapkan Abaikan perubahan whitespace + Sumber: + Berkas + Papan Klip Terapkan Patch Whitespace: Terapkan Stash @@ -50,15 +58,26 @@ Buruk Baik Lewati + Bisect sedang berjalan. Checkout commit lain, lalu tandai sebagai baik atau buruk. + Bisect sedang berjalan. Tandai commit saat ini sebagai buruk atau checkout commit lain, lalu tandai sebagai buruk. Bisect berjalan. Tandai commit saat ini sebagai baik atau buruk dan checkout yang lain. Bisect berjalan. Apakah HEAD saat ini baik atau buruk? Blame + Blame pada Revisi Sebelumnya + Abaikan perubahan whitespace BLAME PADA BERKAS INI TIDAK DIDUKUNG!!! Checkout ${0}$... + Bandingkan 2 branch yang dipilih + Bandingkan dengan... + Bandingkan dengan HEAD + Bandingkan dengan ${0}$ Salin Nama Branch + Buat PR... + Buat PR untuk upstream ${0}$... Aksi Kustom Hapus ${0}$... Hapus {0} branch yang dipilih + Sunting deskripsi ${0}$... Fast-Forward ke ${0}$ Fetch ${0}$ ke ${1}$... Git Flow - Selesaikan ${0}$ @@ -86,6 +105,9 @@ Reset ke Revisi Parent Reset ke Revisi Ini Buat pesan commit + Merge (Bawaan) + Merge (Eksternal) + Reset Berkas ke ${0}$ UBAH MODE TAMPILAN Tampilkan sebagai Daftar Berkas dan Direktori Tampilkan sebagai Daftar Jalur @@ -97,8 +119,15 @@ Perubahan Lokal: Branch: HEAD saat ini mengandung commit yang tidak terhubung ke branch/tag manapun! Lanjutkan? + Submodule berikut perlu diperbarui:{0}Apakah Anda ingin memperbaruinya? Checkout & Fast-Forward Fast-Forward ke: + Checkout Branch dari Stash + Branch Baru: + Stash: + Checkout Commit atau Tag + Target: + Peringatan: Setelah proses ini, HEAD akan terlepas Cherry Pick Tambahkan sumber ke pesan commit Commit: @@ -110,6 +139,8 @@ Clone Repositori Remote Parameter Tambahan: Argumen tambahan untuk clone repositori. Opsional. + Markah: + Grup: Nama Lokal: Nama repositori. Opsional. Folder Parent: @@ -117,14 +148,20 @@ URL Repositori: TUTUP Editor + Branch + Branch & Tag + Aksi Kustom Repositori + Berkas Revisi Checkout Commit Cherry-Pick Commit Cherry-Pick ... Bandingkan dengan HEAD Bandingkan dengan Worktree Author + Waktu Penulis Pesan Committer + Waktu Committer SHA Subjek Aksi Kustom @@ -144,13 +181,13 @@ PERUBAHAN berkas berubah Cari Perubahan... + Ciutkan detail BERKAS Berkas LFS Cari Berkas... Submodule INFORMASI AUTHOR - CHILDREN COMMITTER Periksa ref yang mengandung commit ini COMMIT TERKANDUNG DALAM @@ -165,10 +202,25 @@ SHA Penanda Tangan: Buka di Browser + KOL + Masukkan pesan commit. Gunakan baris kosong untuk memisahkan subjek dan deskripsi! SUBJEK Perbandingan + PERUBAHAN + COMMIT + COMMIT HANYA DI KIRI + COMMIT HANYA DI KANAN + Tips: Anda dapat melakukan cherry-pick pada commit yang dipilih jika sisi lainnya adalah HEAD (melalui menu konteks). Konfigurasi Repositori TEMPLATE COMMIT + Parameter bawaan: + + ${branch_name} Nama branch lokal saat ini. + ${files_num} Jumlah berkas yang berubah + ${files} Jalur berkas yang berubah + ${files:N} Maksimal N jalur berkas yang berubah + ${pure_files} Seperti ${files}, tetapi hanya nama berkas + ${pure_files:N} Seperti ${files:N}, tetapi tanpa folder Konten Template: Nama Template: AKSI KUSTOM @@ -198,9 +250,12 @@ Alamat Email Alamat email GIT + Tanyakan sebelum memperbarui submodule secara otomatis Fetch remote secara otomatis Menit + Tipe Conventional Commit Remote Default + Aktifkan `--recursive` saat memperbarui submodule secara otomatis Mode Merge Pilihan ISSUE TRACKER Tambah Aturan Azure DevOps @@ -233,7 +288,11 @@ Label: Opsi: Gunakan '|' sebagai pembatas untuk opsi + Pemformat String: + Opsional. Digunakan untuk memformat string keluaran. Diabaikan jika input kosong. Gunakan `${VALUE}` untuk mewakili string input. + Variabel bawaan ${REPO}, ${REMOTE}, ${BRANCH}, ${BRANCH_FRIENDLY_NAME}, ${SHA}, ${FILE}, dan ${TAG} tetap tersedia di sini Jenis: + Gunakan Nama Ramah: Workspace Warna Nama @@ -241,6 +300,7 @@ LANJUTKAN Commit kosong terdeteksi! Lanjutkan (--allow-empty)? STAGE SEMUA & COMMIT + STAGE PILIHAN & COMMIT Commit kosong terdeteksi! Lanjutkan (--allow-empty) atau stage semua lalu commit? Perlu Mulai Ulang Anda perlu memulai ulang aplikasi ini untuk menerapkan perubahan. @@ -253,6 +313,7 @@ Jenis Perubahan: Salin Salin Semua Teks + Salin sebagai Patch Salin Jalur Lengkap Salin Jalur Buat Branch... @@ -278,12 +339,15 @@ Tahan Ctrl untuk memulai langsung Potong Buang + Jangan Lakukan Apa Pun Stash & Terapkan Ulang De-initialize Submodule Paksa de-init meski mengandung perubahan lokal. Submodule: Hapus Branch + Apakah Anda juga ingin menghapus remote branch berikut? Branch: + Paksa hapus meskipun berisi commit yang belum di-merge Anda akan menghapus remote branch!!! Hapus Beberapa Branch Anda akan menghapus beberapa branch sekaligus. Pastikan untuk memeriksa ulang sebelum bertindak! @@ -304,6 +368,7 @@ Tag: Hapus dari repositori remote DIFF BINARY + BERKAS KOSONG Perbedaan Pertama Abaikan Perubahan Whitespace BLEND @@ -323,6 +388,7 @@ PERUBAHAN SUBMODULE DIHAPUS BARU + + {0} Perubahan Belum Di-commit Tukar Syntax Highlighting Word Wrap Baris @@ -339,9 +405,12 @@ Semua perubahan lokal dalam working copy. Perubahan: Termasuk berkas yang diabaikan + Sertakan berkas yang diubah/dihapus Termasuk berkas yang tidak dilacak {0} perubahan akan dibuang Anda tidak dapat membatalkan aksi ini!!! + Sunting Deskripsi Branch + Target: Bookmark: Nama Baru: Target: @@ -356,6 +425,7 @@ Remote: Fetch Perubahan dari Remote Asumsikan tidak berubah + Aksi Kustom Buang... Buang {0} berkas... Selesaikan Menggunakan ${0}$ @@ -371,14 +441,25 @@ Riwayat Berkas PERUBAHAN KONTEN + Perubahan mode berkas: + Mode berkas yang dihapus: + Direktori + Dapat Dieksekusi + Mode berkas baru: + Normal + Submodule + Symlink + Tidak Diketahui Git-Flow Branch Development: Feature: Prefix Feature: + Selesaikan ${0}$ FLOW - Selesaikan Feature FLOW - Selesaikan Hotfix FLOW - Selesaikan Release Target: + Rebase sebelum merge Squash saat merge Hotfix: Prefix Hotfix: @@ -387,10 +468,12 @@ Branch Production: Release: Prefix Release: + Mulai dari: Mulai Feature... FLOW - Mulai Feature Mulai Hotfix... FLOW - Mulai Hotfix + Nama: Masukkan nama Mulai Release... FLOW - Mulai Release @@ -410,6 +493,8 @@ Hanya tampilkan lock saya Lock LFS Unlock + Buka semua lock saya + Yakin ingin membuka lock semua berkas yang Anda kunci? Paksa Unlock Prune Jalankan `git lfs prune` untuk menghapus berkas LFS lama dari penyimpanan lokal @@ -422,16 +507,26 @@ Remote: Track berkas bernama '{0}' Track semua berkas *{0} + Pilih Commit RIWAYAT AUTHOR WAKTU AUTHOR WAKTU COMMIT GRAFIK & SUBJEK SHA + SOROTAN DALAM GRAFIK + Semua + Hanya Branch Saat Ini + Branch Saat Ini & Commit Terpilih + Hanya Commit Terpilih DIPILIH {0} COMMIT + TAMPILKAN KOLOM Tahan 'Ctrl' atau 'Shift' untuk memilih beberapa commit. Tahan ⌘ atau ⇧ untuk memilih beberapa commit. TIPS: + Buka di jendela terpisah + Detail Commit + Perbandingan Revisi Referensi Shortcut Keyboard GLOBAL Clone repositori baru @@ -439,18 +534,26 @@ Ke tab berikutnya Ke tab sebelumnya Buat tab baru + Buka repositori lokal Buka dialog Preferensi + Tampilkan menu tarik-turun workspace Ganti tab aktif + Perbesar/perkecil REPOSITORI Commit perubahan yang di-stage Commit dan push perubahan yang di-stage Stage semua perubahan dan commit + Buat branch baru Fetch, langsung dimulai Mode dashboard (Default) + Ke turunan commit yang dipilih + Ke induk commit yang dipilih + Buka palet perintah Mode pencarian commit Pull, langsung dimulai Push, langsung dimulai Paksa muat ulang repositori ini + Bentangkan/Ciutkan panel detail di `RIWAYAT` Pindah ke 'Changes' Pindah ke 'History' Pindah ke 'Stashes' @@ -458,6 +561,8 @@ Stage Unstage Inisialisasi Repositori + Apakah Anda ingin menjalankan perintah `git init` di jalur ini? + Gagal membuka repositori. Alasan: Jalur: Cherry-Pick sedang berjalan. Memproses commit @@ -469,13 +574,17 @@ Melakukan revert commit Interactive Rebase Stash & terapkan ulang perubahan lokal + Lewati hook pre-rebase Pada: Drag-drop untuk mengurutkan ulang commit Branch Target: Salin Link Buka di Browser + Perintah ERROR PEMBERITAHUAN + Versi Baru Tersedia + Buka Repositori Tab Workspace Merge Branch @@ -483,6 +592,26 @@ Ke: Opsi Merge: Sumber: + Menguji merge... + Merge dapat dilakukan tanpa konflik + Terjadi kesalahan yang tidak diketahui saat menguji merge + Merge akan menyebabkan konflik + Milik Saya dahulu, lalu Milik Mereka + Milik Mereka dahulu, lalu Milik Saya + GUNAKAN KEDUANYA + Semua konflik terselesaikan + {0} konflik tersisa + MILIK SAYA + Konflik Berikutnya + Konflik Sebelumnya + HASIL + SIMPAN & STAGE + MILIK MEREKA + Konflik Merge + Buang perubahan yang belum disimpan? + GUNAKAN MILIK SAYA + GUNAKAN MILIK MEREKA + URUNGKAN Merge (Beberapa) Commit semua perubahan Strategi: @@ -493,9 +622,17 @@ Pindahkan Node Repositori Pilih node parent untuk: Nama: + TIDAK Git BELUM dikonfigurasi. Silakan ke [Preferences] dan konfigurasikan terlebih dahulu. + Buka + Editor Default (Sistem) Buka Direktori Penyimpanan Data + Buka Berkas Buka di Merge Tool + Buka Repositori Lokal + Markah: + Grup: + Folder: Opsional. Buat Tab Baru Tutup Tab @@ -503,6 +640,8 @@ Tutup Tab di Kanan Salin Jalur Repositori Sunting + Pindahkan ke Workspace + Segarkan Repositori Tempel {0} hari lalu @@ -517,7 +656,10 @@ Kemarin Preferensi AI + Prompt Tambahan (Gunakan `-` untuk mencantumkan kebutuhan Anda) API Key + Model + Ambil model-id yang tersedia secara otomatis Nama Nilai yang dimasukkan adalah nama untuk memuat API key dari ENV Server @@ -534,6 +676,10 @@ Gunakan lebar tab tetap di titlebar Gunakan frame window native DIFF/MERGE TOOL + Argumen Diff + Variabel tersedia: $LOCAL, $REMOTE + Argumen Merge + Variabel tersedia: $BASE, $LOCAL, $REMOTE, $MERGED Jalur Instalasi Masukkan jalur untuk diff/merge tool Tool @@ -545,9 +691,11 @@ Commit Riwayat Tampilkan halaman `LOCAL CHANGES` secara default Tampilkan tab `CHANGES` di detail commit secara default - Tampilkan children di detail commit + Tampilkan waktu relatif pada grafik commit Tampilkan tag di grafik commit Panjang Panduan Subjek + Format 24 Jam + Gunakan nama branch ringkas pada grafik commit Generate avatar default bergaya GitHub GIT Aktifkan Auto CRLF @@ -562,6 +710,7 @@ Gunakan git-credential-libsecret alih-alih git-credential-manager Nama Pengguna Nama pengguna git global + Stash & terapkan ulang perubahan secara default saat checkout atau merge branch Versi Git PENANDATANGANAN GPG Penandatanganan GPG commit @@ -573,6 +722,8 @@ Kunci penandatanganan gpg pengguna INTEGRASI SHELL/TERMINAL + Argumen + Gunakan '.' untuk menunjukkan direktori kerja Jalur Shell/Terminal Prune Remote @@ -602,10 +753,17 @@ Push ke semua remote Remote: Tag: + Push ke branch BARU + Masukkan nama remote branch baru: Keluar Rebase Branch Saat Ini Stash & terapkan ulang perubahan lokal + Lewati hook pre-rebase Pada: + Menguji rebase... + Rebase dapat dilakukan tanpa konflik + Terjadi kesalahan yang tidak diketahui saat menguji rebase + Rebase akan menyebabkan konflik Tambah Remote Sunting Remote Nama: @@ -616,6 +774,7 @@ Aksi Kustom Hapus... Sunting... + Aktifkan Fetch Otomatis Fetch Buka di Browser Prune @@ -644,9 +803,12 @@ Buka di File Browser Cari Branch/Tag/Submodule Visibilitas di Grafik + Ciutkan Filter Tidak Diatur Sembunyikan di grafik commit + Bentangkan Filter Filter di grafik commit + filter aktif TATA LETAK Horizontal Vertikal @@ -658,10 +820,12 @@ Navigasi ke HEAD Buat Branch BERSIHKAN NOTIFIKASI + Buka sebagai Folder Buka di {0} Buka di Tool Eksternal REMOTE Tambah Remote + SELESAIKAN Cari Commit Author Konten @@ -712,9 +876,11 @@ Pindai direktori kustom lain Periksa Pembaruan... Versi baru dari perangkat lunak ini tersedia: + Versi Saat Ini: Pemeriksaan pembaruan gagal! Unduh Lewati Versi Ini + Tanggal Rilis Versi Baru: Pembaruan Perangkat Lunak Saat ini tidak ada pembaruan yang tersedia. Atur Branch Submodule @@ -740,6 +906,8 @@ Perubahan staged dan unstaged dari berkas yang dipilih akan di-stash!!! Stash Perubahan Lokal Terapkan + Terapkan Perubahan + Checkout Branch Baru Salin Pesan Drop Simpan sebagai Patch... @@ -776,9 +944,15 @@ belum di-merge Perbarui URL + Detail Perubahan Submodule + BUKA DETAIL OK TAGGER WAKTU + Checkout Tag... + Bandingkan 2 tag + Bandingkan dengan... + Bandingkan dengan HEAD Pesan Nama Tagger @@ -786,11 +960,13 @@ Aksi Kustom Hapus ${0}$... Hapus {0} tag yang dipilih... + Merge ${0}$ ke ${1}$... Push ${0}$... Perbarui Submodule Semua submodule Inisialisasi sesuai kebutuhan Submodule: + Perbarui submodule bertingkat Perbarui ke remote tracking branch submodule URL: Log @@ -817,6 +993,7 @@ Abaikan berkas *{0} di folder yang sama Abaikan berkas yang tidak dilacak di folder ini Abaikan hanya berkas ini + Abaikan semua berkas yang tidak dilacak di folder yang sama Amend Anda dapat stage berkas ini sekarang. Bersihkan Riwayat @@ -830,6 +1007,8 @@ Anda membuat commit pada HEAD yang terlepas. Lanjutkan? Anda telah stage {0} berkas tetapi hanya {1} berkas yang ditampilkan ({2} berkas disaring). Lanjutkan? KONFLIK TERDETEKSI + MERGE + Merge dengan Alat Eksternal BUKA SEMUA KONFLIK DI MERGETOOL EKSTERNAL KONFLIK BERKAS DISELESAIKAN GUNAKAN MILIK SAYA @@ -851,9 +1030,13 @@ WORKSPACE: Konfigurasikan Workspace... WORKTREE + BRANCH Salin Jalur + HEAD Lock Buka + JALUR Hapus Unlock + YA diff --git a/src/Resources/Locales/it_IT.axaml b/src/Resources/Locales/it_IT.axaml index 13122e41c..46b2fa9a5 100644 --- a/src/Resources/Locales/it_IT.axaml +++ b/src/Resources/Locales/it_IT.axaml @@ -163,7 +163,6 @@ Sottomodulo INFORMAZIONI AUTORE - FIGLI CHI HA COMMITTATO Controlla i riferimenti che contengono questo commit IL COMMIT È CONTENUTO DA @@ -607,7 +606,6 @@ ${pure_files:N} Come ${files:N}, ma senza cartelle Numero massimo di commit nella cronologia Mostra pagina `MODIFICHE LOCALI` per impostazione predefinita Mostra scheda `MODIFICHE` nei dettagli del commit per impostazione predefinita - Mostra i figli nei dettagli del commit Mostra i tag nel grafico dei commit Lunghezza Guida Oggetto Genera avatar predefinito stile GitHub diff --git a/src/Resources/Locales/ja_JP.axaml b/src/Resources/Locales/ja_JP.axaml index 7f2341eb6..844e70874 100644 --- a/src/Resources/Locales/ja_JP.axaml +++ b/src/Resources/Locales/ja_JP.axaml @@ -188,7 +188,6 @@ サブモジュール コミットの情報 著者 - 子コミット コミッター このコミットが含まれる参照を確認 これらの参照にコミットが含まれています @@ -691,7 +690,6 @@ コミット履歴 初めから `ローカルの変更` ページを表示 初めからコミットの詳細の `変更` タブを表示 - コミットの詳細に子コミットを表示 コミットグラフを相対時間で表記 コミットグラフにタグを表示 適切とするコミットタイトルの長さ diff --git a/src/Resources/Locales/ko_KR.axaml b/src/Resources/Locales/ko_KR.axaml index 4698b0993..5a1d7b053 100644 --- a/src/Resources/Locales/ko_KR.axaml +++ b/src/Resources/Locales/ko_KR.axaml @@ -183,7 +183,6 @@ 서브모듈 정보 작성자 - 자식 커밋터 이 커밋을 포함하는 ref 확인 커밋 포함 REF @@ -662,7 +661,6 @@ 히스토리 커밋 수 기본으로 `로컬 변경 사항` 페이지 표시 커밋 세부 정보에서 기본으로 `변경 사항` 탭 표시 - 커밋 세부 정보에 자식 커밋 표시 커밋 그래프에 상대 시간 표시 커밋 그래프에 태그 표시 제목 가이드 길이 diff --git a/src/Resources/Locales/ru_RU.axaml b/src/Resources/Locales/ru_RU.axaml index ee438ac49..525796412 100644 --- a/src/Resources/Locales/ru_RU.axaml +++ b/src/Resources/Locales/ru_RU.axaml @@ -188,7 +188,6 @@ Подмодуль ИНФОРМАЦИЯ АВТОР - ДОЧЕРНИЙ РЕВИЗОР (ИСПОЛНИТЕЛЬ) Найти все ветки с этой ревизией ВЕТКИ С ЭТОЙ РЕВИЗИЕЙ @@ -584,6 +583,7 @@ Команды ОШИБКА УВЕДОМЛЕНИЕ + Доступна новая версия Открыть репозитории Вкладки Рабочие места @@ -691,7 +691,6 @@ Максимальная длина истории Показывать вкладку «ЛОКАЛЬНЫЕ ИЗМЕНЕНИЯ» по умолчанию Показывать вкладку «Изменения» в сведении ревизии по умолчанию - Показать наследника в деталях комментария Отображение относительного времени на графе ревизии Показывать метки на графике Длина темы ревизии @@ -804,9 +803,12 @@ Открыть в файловом менеджере Поиск веток, меток и подмодулей Видимость на графике + Свернуть фильтры Не установлен (по умолчанию) Скрыть в графе ревизии + Развернуть фильтры Фильтр в графе ревизии + фильтры включены РАСПОЛОЖЕНИЕ Горизонтально Вертикально @@ -1011,6 +1013,7 @@ КОНФЛИКТЫ ФАЙЛОВ РАЗРЕШЕНЫ ИСПОЛЬЗОВАТЬ МОИ ИСПОЛЬЗОВАТЬ ИХ + Фильтр изменений... ВКЛЮЧИТЬ НЕОТСЛЕЖИВАЕМЫЕ ФАЙЛЫ НЕТ ПОСЛЕДНИХ ВХОДНЫХ СООБЩЕНИЙ НЕТ ШАБЛОНОВ РЕВИЗИИ diff --git a/src/Resources/Locales/ta_IN.axaml b/src/Resources/Locales/ta_IN.axaml index e7b89e254..5cbea045b 100644 --- a/src/Resources/Locales/ta_IN.axaml +++ b/src/Resources/Locales/ta_IN.axaml @@ -103,7 +103,6 @@ துணைத்தொகுதி தகவல் ஆசிரியர் - குழந்தைகள் உறுதிமொழியாளர் இந்த உறுதிமொழிடைக் கொண்ட குறிப்புகளைச் சரிபார் உறுதிமொழி இதில் உள்ளது @@ -423,7 +422,6 @@ தேதி வடிவம் மொழி வரலாற்று உறுதிமொழிகள் - உறுதிமொழி விவரங்களில் குழந்தைகளைக் காட்டு உறுதிமொழி வரைபடத்தில் குறிச்சொற்களைக் காட்டு பொருள் வழிகாட்டி நீளம் அறிவிலி diff --git a/src/Resources/Locales/uk_UA.axaml b/src/Resources/Locales/uk_UA.axaml index f8a730a99..9cad040c7 100644 --- a/src/Resources/Locales/uk_UA.axaml +++ b/src/Resources/Locales/uk_UA.axaml @@ -103,7 +103,6 @@ Підмодуль ІНФОРМАЦІЯ АВТОР - ДОЧІРНІ КОМІТЕР Перевірити посилання, що містять цей коміт КОМІТ МІСТИТЬСЯ В @@ -427,7 +426,6 @@ Формат дати Мова Кількість комітів в історії - Показувати дочірні коміти в деталях Показувати теги в графі комітів Довжина лінії-орієнтира для теми GIT diff --git a/src/Resources/Locales/zh_CN.axaml b/src/Resources/Locales/zh_CN.axaml index cf27832e7..d77cd5418 100644 --- a/src/Resources/Locales/zh_CN.axaml +++ b/src/Resources/Locales/zh_CN.axaml @@ -188,7 +188,6 @@ 子模块 基本信息 修改者 - 子提交 提交者 查看包含此提交的分支/标签 本提交已被以下分支/标签包含 @@ -485,7 +484,7 @@ 规则 : 添加LFS追踪文件规则 拉取LFS对象 (fetch) - 执行`git lfs prune`命令,下载远程LFS对象,但不会更新工作副本。 + 执行`git lfs fetch`命令,下载远程LFS对象,但不会更新工作副本。 拉取LFS对象 启用Git LFS支持 显示LFS对象锁 @@ -584,6 +583,7 @@ 命令列表 出错了 系统提示 + 检测到新版本 打开其他仓库 页面列表 工作区列表 @@ -691,7 +691,6 @@ 最大历史提交数 默认显示【本地更改】页 在提交详情页默认打开【变更对比】标签页 - 在提交详情页中显示子提交列表 在提交路线图中显示相对时间 在提交路线图中显示标签 SUBJECT字数检测 @@ -804,9 +803,12 @@ 在文件浏览器中打开 快速查找分支/标签/子模块 设置在列表中的可见性 + 折叠过滤项列表 不指定 在提交列表中隐藏 + 展开过滤项列表 使用其对提交列表过滤 + 个过滤项已被启用 布局方式 水平排布 竖直排布 @@ -1011,6 +1013,7 @@ 文件冲突已解决 使用 MINE 使用 THEIRS + 查找变更... 显示未跟踪文件 没有提交信息记录 没有可应用的提交信息模板 diff --git a/src/Resources/Locales/zh_TW.axaml b/src/Resources/Locales/zh_TW.axaml index fcf0003dd..b07c82996 100644 --- a/src/Resources/Locales/zh_TW.axaml +++ b/src/Resources/Locales/zh_TW.axaml @@ -11,9 +11,9 @@ 新增忽略檔案 比對模式: 儲存路徑: - 新增工作區 - 工作區路徑: - 填寫該工作區的路徑。支援相對路徑。 + 新增工作樹 + 工作樹路徑: + 填寫該工作樹的路徑。支援相對路徑。 分支名稱: 選填。預設使用目標資料夾名稱。 追蹤分支 @@ -68,7 +68,7 @@ 所選擇的檔案不支援該操作! 簽出 (checkout) ${0}$... 比較所選的 2 個分支 - 與分支或標籤進行比較... + 與其他分支或標籤比較... 與目前 HEAD 比較 與 ${0}$ 比較 複製分支名稱 @@ -90,7 +90,7 @@ 重定基底 (rebase) ${0}$ 分支至 ${1}$... 重新命名 ${0}$... 重設 ${0}$ 至 ${1}$... - 切換到 ${0}$ (工作區) + 切換到 ${0}$ (工作樹) 切換上游分支... 領先 {0} 次提交 領先 {0} 次提交,落後 {1} 次提交 @@ -100,7 +100,7 @@ 狀態 上游分支 遠端網址 - 工作區 + 工作樹 取 消 重設檔案到上一版本 重設檔案為此版本 @@ -156,7 +156,7 @@ 揀選 (cherry-pick) 此提交... 揀選 (cherry-pick)... 與目前 HEAD 比較 - 與本機工作區比較 + 與本機工作樹比較 作者 修改時間 提交訊息 @@ -188,7 +188,6 @@ 子模組 基本資訊 作者 - 後續提交 提交者 檢視包含此提交的分支或標籤 本提交包含於以下分支或標籤 @@ -562,7 +561,7 @@ 暫存 取消暫存 初始化存放庫 - 您是否要在該路徑執行 git init 以進行初始化? + 您是否要在該路徑執行 `git init` 以初始化存放庫? 無法在指定路徑開啟本機存放庫。原因: 路徑: 揀選 (cherry-pick) 操作進行中。 @@ -584,6 +583,7 @@ 命令列表 發生錯誤 系統提示 + 有新版本可用 開啟存放庫 頁面列表 工作區列表 @@ -691,7 +691,6 @@ 最大歷史提交數 預設顯示 [本機變更] 頁面 在提交詳細資訊頁面預設顯示 [變更對比] - 在提交詳細資訊中顯示後續提交 在提交路線圖中顯示相對時間 在路線圖中顯示標籤 提交標題字數偵測 @@ -703,7 +702,7 @@ 預設複製 (clone) 路徑 電子郵件 預設 Git 使用者電子郵件 - 拉取變更時進行清理 + 提取後清理遠端已刪除分支 對比檔案時,預設忽略行末的 CR 變更 本軟體要求 Git 最低版本為 2.25.1 安裝路徑 @@ -729,8 +728,8 @@ 終端機/Shell 清理遠端已刪除分支 目標: - 清理工作區 - 清理在 `$GIT_COMMON_DIR/worktrees` 中的無效工作區資訊 + 清理工作樹 + 清理在 `$GIT_COMMON_DIR/worktrees` 中的無效工作樹資訊 拉取 (pull) 拉取分支: 本機分支: @@ -759,7 +758,7 @@ 結束 重定基底 (rebase) 操作 自動擱置變更並復原本機變更 - 繞過 pre-rebase 鉤子 + 繞過 pre-rebase hook 目標提交: 正在偵測重定基底衝突... 重定基底操作不會產生衝突 @@ -779,9 +778,9 @@ 提取 (fetch) 更新 在瀏覽器中開啟網址 清理遠端已刪除分支 - 刪除工作區操作確認 + 刪除工作樹操作確認 啟用 [--force] 選項 - 目標工作區: + 目標工作樹: 分支重新命名 新名稱: 新的分支名稱不能與現有分支名稱相同 @@ -804,9 +803,12 @@ 在檔案瀏覽器中開啟 快速搜尋分支/標籤/子模組 篩選以顯示或隱藏 + 摺疊篩選器 取消指定 在提交列表中隱藏 + 展開篩選器 以其篩選提交列表 + 個篩選規則已啟用 版面配置 橫向顯示 縱向顯示 @@ -850,8 +852,8 @@ 在終端機中開啟 檢視 Git 指令記錄 檢視遠端存放庫 '{0}' - 工作區列表 - 新增工作區 + 工作樹列表 + 新增工作樹 清理 遠端存放庫網址 重設目前分支到指定版本 @@ -949,7 +951,7 @@ 建立時間 簽出標籤... 比較 2 個標籤 - 與分支或標籤進行比較... + 與其他分支或標籤比較... 與目前 HEAD 比較 標籤訊息 標籤名稱 @@ -1011,6 +1013,7 @@ 檔案衝突已解決 使用我方版本 (ours) 使用對方版本 (theirs) + 搜尋變更... 顯示未追蹤檔案 沒有提交訊息記錄 沒有可套用的提交訊息範本 @@ -1027,14 +1030,14 @@ 範本: ${0}$ 工作區: 設定工作區... - 本機工作區 + 本機工作樹 分支 - 複製工作區路徑 + 複製工作樹路徑 最新提交 - 鎖定工作區 - 開啟工作區 + 鎖定工作樹 + 開啟工作樹 位置 - 移除工作區 - 解除鎖定工作區 + 移除工作樹 + 解除鎖定工作樹 diff --git a/src/Resources/Styles.axaml b/src/Resources/Styles.axaml index bcf19edeb..27878b5cc 100644 --- a/src/Resources/Styles.axaml +++ b/src/Resources/Styles.axaml @@ -1215,6 +1215,44 @@ + + + + + + + + + - - - - + + - + diff --git a/src/Views/Launcher.axaml.cs b/src/Views/Launcher.axaml.cs index 27b213c28..99ebf66d9 100644 --- a/src/Views/Launcher.axaml.cs +++ b/src/Views/Launcher.axaml.cs @@ -423,6 +423,20 @@ private void OnCloseCommandPalette(object sender, PointerPressedEventArgs e) e.Handled = true; } + private async void OnShowNewVersion(object sender, RoutedEventArgs e) + { + if (DataContext is ViewModels.Launcher { NewVersion: { } ver } vm) + { + vm.NewVersion = null; + + var ctx = new ViewModels.SelfUpdate { Data = ver }; + var dialog = new SelfUpdate() { DataContext = ctx }; + await dialog.ShowDialog(this); + } + + e.Handled = true; + } + private GridLength _captionHeight = new(32); private WindowState _lastWindowState = WindowState.Normal; } diff --git a/src/Views/LauncherPage.axaml b/src/Views/LauncherPage.axaml index 0a2e3144e..bcbecbeca 100644 --- a/src/Views/LauncherPage.axaml +++ b/src/Views/LauncherPage.axaml @@ -67,7 +67,7 @@ - + @@ -111,8 +111,10 @@ + IsVisible="{Binding InProgress}" + IsHitTestVisible="False"/> diff --git a/src/Views/LauncherTabBar.axaml.cs b/src/Views/LauncherTabBar.axaml.cs index 3e2714ad7..83826afce 100644 --- a/src/Views/LauncherTabBar.axaml.cs +++ b/src/Views/LauncherTabBar.axaml.cs @@ -222,11 +222,16 @@ private void OnPointerPressedTab(object sender, PointerPressedEventArgs e) (DataContext as ViewModels.Launcher)?.CloseTab(page); e.Handled = true; } - else + else if (point.Properties.IsLeftButtonPressed) { _pressedTabEvent = e; _startDragTab = false; } + else + { + _pressedTabEvent = null; + _startDragTab = false; + } } } diff --git a/src/Views/Preferences.axaml b/src/Views/Preferences.axaml index 86d660cfe..b0a4753bb 100644 --- a/src/Views/Preferences.axaml +++ b/src/Views/Preferences.axaml @@ -47,7 +47,7 @@ - + - - - - - - + - + @@ -951,22 +954,53 @@ BorderThickness="1" BorderBrush="{Binding Mode, Converter={x:Static c:FilterModeConverters.ToBorderBrush}}" VerticalAlignment="Center"> - - - - + + + + + + + + + + - - + - diff --git a/src/Views/RevisionFileTreeView.axaml.cs b/src/Views/RevisionFileTreeView.axaml.cs index bf9586765..953aeff54 100644 --- a/src/Views/RevisionFileTreeView.axaml.cs +++ b/src/Views/RevisionFileTreeView.axaml.cs @@ -312,7 +312,7 @@ public async Task SetSearchResultAsync(string file) last.Add(folder); last = folder.Children; - prefix = folder.Backend + "/"; + prefix = folder.Backend.Path + "/"; } last.Add(new ViewModels.RevisionFileTreeNode diff --git a/src/Views/RevisionFiles.axaml b/src/Views/RevisionFiles.axaml index 8f0407e30..edfd73359 100644 --- a/src/Views/RevisionFiles.axaml +++ b/src/Views/RevisionFiles.axaml @@ -109,7 +109,7 @@ - + diff --git a/src/Views/Statistics.axaml b/src/Views/Statistics.axaml index c0e9b448c..8a8ebd648 100644 --- a/src/Views/Statistics.axaml +++ b/src/Views/Statistics.axaml @@ -117,74 +117,85 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + +