diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index e973c1ab..074c9544 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -7,8 +7,8 @@ on: required: true type: string jobs: - windows-portable: - name: Package portable Windows app + windows: + name: Package Windows runs-on: ubuntu-latest strategy: matrix: @@ -25,7 +25,7 @@ jobs: env: VERSION: ${{ inputs.version }} RUNTIME: ${{ matrix.runtime }} - run: ./build/scripts/package.windows-portable.sh + run: ./build/scripts/package.windows.sh - name: Upload package artifact uses: actions/upload-artifact@v4 with: @@ -36,7 +36,7 @@ jobs: with: name: sourcegit.${{ matrix.runtime }} osx-app: - name: Package OSX app + name: Package macOS runs-on: macos-latest strategy: matrix: diff --git a/README.md b/README.md index 7abddca6..f0e6b563 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ ## Translation Status -[![en_US](https://img.shields.io/badge/en__US-100%25-brightgreen)](TRANSLATION.md) [![de__DE](https://img.shields.io/badge/de__DE-98.60%25-yellow)](TRANSLATION.md) [![es__ES](https://img.shields.io/badge/es__ES-98.88%25-yellow)](TRANSLATION.md) [![fr__FR](https://img.shields.io/badge/fr__FR-96.08%25-yellow)](TRANSLATION.md) [![it__IT](https://img.shields.io/badge/it__IT-96.64%25-yellow)](TRANSLATION.md) [![pt__BR](https://img.shields.io/badge/pt__BR-97.90%25-yellow)](TRANSLATION.md) [![ru__RU](https://img.shields.io/badge/ru__RU-99.02%25-yellow)](TRANSLATION.md) [![zh__CN](https://img.shields.io/badge/zh__CN-100.00%25-brightgreen)](TRANSLATION.md) [![zh__TW](https://img.shields.io/badge/zh__TW-100.00%25-brightgreen)](TRANSLATION.md) +[![en_US](https://img.shields.io/badge/en__US-100%25-brightgreen)](TRANSLATION.md) [![de__DE](https://img.shields.io/badge/de__DE-100.00%25-brightgreen)](TRANSLATION.md) [![es__ES](https://img.shields.io/badge/es__ES-97.78%25-yellow)](TRANSLATION.md) [![fr__FR](https://img.shields.io/badge/fr__FR-95.00%25-yellow)](TRANSLATION.md) [![it__IT](https://img.shields.io/badge/it__IT-95.56%25-yellow)](TRANSLATION.md) [![pt__BR](https://img.shields.io/badge/pt__BR-96.81%25-yellow)](TRANSLATION.md) [![ru__RU](https://img.shields.io/badge/ru__RU-100.00%25-brightgreen)](TRANSLATION.md) [![zh__CN](https://img.shields.io/badge/zh__CN-100.00%25-brightgreen)](TRANSLATION.md) [![zh__TW](https://img.shields.io/badge/zh__TW-100.00%25-brightgreen)](TRANSLATION.md) ## How to Use @@ -64,7 +64,7 @@ This software creates a folder `$"{System.Environment.SpecialFolder.ApplicationD | macOS | `${HOME}/Library/Application Support/SourceGit` | > [!TIP] -> You can open the app data dir from the main menu. +> You can open this data storage directory from the main menu. For **Windows** users: @@ -80,7 +80,8 @@ For **Windows** users: scoop bucket add extras scoop install sourcegit ``` -* Portable versions can be found in [Releases](https://github.com/sourcegit-scm/sourcegit/releases/latest) +* Pre-built binaries can be found in [Releases](https://github.com/sourcegit-scm/sourcegit/releases/latest) +* You can run `dotnet publish -c Release -r win-x64 -p:EnablePortable=true -o $YOUR_PUBLISH_DIR .\src\SourceGit.csproj` to build a portable version. For **macOS** users: @@ -98,7 +99,33 @@ For **macOS** users: For **Linux** users: -* `DEB` or `RPM` packages are available at [buildkite](https://buildkite.com/organizations/sourcegit/packages). +* For Debian/Ubuntu based distributions, you can add the `sourcegit` repository by following: + You may need to install curl and/or gpg first, if you're on a very minimal host: + ```shell + apt update && apt install curl gpg -y + ``` + Install the registry signing key: + ```shell + curl -fsSL "https://packages.buildkite.com/sourcegit/sourcegit-deb/gpgkey" | gpg --dearmor -o /etc/apt/keyrings/sourcegit_sourcegit-deb-archive-keyring.gpg + ``` + Configure the source: + ```shell + echo -e "deb [signed-by=/etc/apt/keyrings/sourcegit_sourcegit-deb-archive-keyring.gpg] https://packages.buildkite.com/sourcegit/sourcegit-deb/any/ any main\ndeb-src [signed-by=/etc/apt/keyrings/sourcegit_sourcegit-deb-archive-keyring.gpg] https://packages.buildkite.com/sourcegit/sourcegit-deb/any/ any main" > /etc/apt/sources.list.d/buildkite-sourcegit-sourcegit-deb.list + ``` + Update your local repository and install the package: + ```shell + apt update && apt install sourcegit + ``` +* For RHEL/Fedora based distributions, you can add the `sourcegit` repository by following: + Configure the source: + ```shell + sudo sh -c 'echo -e "[sourcegit-rpm]\nname=sourcegit-rpm\nbaseurl=https://packages.buildkite.com/sourcegit/sourcegit-rpm/rpm_any/rpm_any/\$basearch\nenabled=1\nrepo_gpgcheck=1\ngpgcheck=0\ngpgkey=https://packages.buildkite.com/sourcegit/sourcegit-rpm/gpgkey\npriority=1"' > /etc/yum.repos.d/sourcegit-rpm.repo + ``` + Install the package with this command: + ```shell + sudo dnf install -y sourcegit + ``` +* `Appimage` files can be found on [AppimageHub](https://appimage.github.io/SourceGit/) * `xdg-open` must be installed to support open native file manager. * Make sure [git-credential-manager](https://github.com/git-ecosystem/git-credential-manager/releases) 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. @@ -133,7 +160,7 @@ This app supports open repository in external tools listed in the table below. > [!NOTE] > This app will try to find those tools based on some pre-defined or expected locations automatically. If you are using one portable version of these tools, it will not be detected by this app. -> To solve this problem you can add a file named `external_editors.json` in app data dir and provide the path directly. For example: +> To solve this problem you can add a file named `external_editors.json` in app data storage directory and provide the path directly. For example: ```json { "tools": { diff --git a/SourceGit.sln b/SourceGit.sln index 3eeb8a54..88730204 100644 --- a/SourceGit.sln +++ b/SourceGit.sln @@ -81,7 +81,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scripts", "scripts", "{C54D build\scripts\localization-check.js = build\scripts\localization-check.js build\scripts\package.linux.sh = build\scripts\package.linux.sh build\scripts\package.osx-app.sh = build\scripts\package.osx-app.sh - build\scripts\package.windows-portable.sh = build\scripts\package.windows-portable.sh + build\scripts\package.windows.sh = build\scripts\package.windows.sh EndProjectSection EndProject Global diff --git a/TRANSLATION.md b/TRANSLATION.md index 0f89e3a0..c50ce276 100644 --- a/TRANSLATION.md +++ b/TRANSLATION.md @@ -1,40 +1,39 @@ -### de_DE.axaml: 98.60% +### de_DE.axaml: 100.00% + + +
+Missing Keys + + + +
+ +### es_ES.axaml: 97.78%
Missing Keys - Text.BranchCM.MergeMultiBranches +- Text.CommitCM.Merge - Text.CommitCM.MergeMultiple -- Text.CommitDetail.Files.Search - Text.Diff.UseBlockNavigation +- Text.FileCM.ResolveUsing - Text.Hotkeys.Global.Clone +- Text.InProgress.CherryPick.Head +- Text.InProgress.Merge.Operating +- Text.InProgress.Rebase.StoppedAt +- Text.InProgress.Revert.Head +- Text.Merge.Source - Text.MergeMultiple - Text.MergeMultiple.CommitChanges - Text.MergeMultiple.Strategy - Text.MergeMultiple.Targets -- Text.WorkingCopy.CommitToEdit +- Text.Repository.Skip
-### es_ES.axaml: 98.88% - - -
-Missing Keys - -- Text.BranchCM.MergeMultiBranches -- Text.CommitCM.MergeMultiple -- Text.Diff.UseBlockNavigation -- Text.Hotkeys.Global.Clone -- Text.MergeMultiple -- Text.MergeMultiple.CommitChanges -- Text.MergeMultiple.Strategy -- Text.MergeMultiple.Targets - -
- -### fr_FR.axaml: 96.08% +### fr_FR.axaml: 95.00%
@@ -44,11 +43,18 @@ - Text.CherryPick.AppendSourceToMessage - Text.CherryPick.Mainline.Tips - Text.CommitCM.CherryPickMultiple +- Text.CommitCM.Merge - Text.CommitCM.MergeMultiple - Text.CommitDetail.Files.Search - Text.Diff.UseBlockNavigation - Text.Fetch.Force +- Text.FileCM.ResolveUsing - Text.Hotkeys.Global.Clone +- Text.InProgress.CherryPick.Head +- Text.InProgress.Merge.Operating +- Text.InProgress.Rebase.StoppedAt +- Text.InProgress.Revert.Head +- Text.Merge.Source - Text.MergeMultiple - Text.MergeMultiple.CommitChanges - Text.MergeMultiple.Strategy @@ -65,19 +71,21 @@ - Text.Repository.HistoriesOrder - Text.Repository.HistoriesOrder.ByDate - Text.Repository.HistoriesOrder.Topo +- Text.Repository.Skip - Text.ScanRepositories - Text.SHALinkCM.NavigateTo - Text.WorkingCopy.CommitToEdit
-### it_IT.axaml: 96.64% +### it_IT.axaml: 95.56%
Missing Keys - Text.BranchCM.MergeMultiBranches +- Text.CommitCM.Merge - Text.CommitCM.MergeMultiple - Text.CommitDetail.Files.Search - Text.CommitDetail.Info.Children @@ -86,6 +94,12 @@ - Text.Configure.OpenAI.Preferred.Tip - Text.Diff.UseBlockNavigation - Text.Fetch.Force +- Text.FileCM.ResolveUsing +- Text.InProgress.CherryPick.Head +- Text.InProgress.Merge.Operating +- Text.InProgress.Rebase.StoppedAt +- Text.InProgress.Revert.Head +- Text.Merge.Source - Text.MergeMultiple - Text.MergeMultiple.CommitChanges - Text.MergeMultiple.Strategy @@ -98,49 +112,52 @@ - Text.Repository.HistoriesOrder - Text.Repository.HistoriesOrder.ByDate - Text.Repository.HistoriesOrder.Topo +- Text.Repository.Skip - Text.SHALinkCM.CopySHA - Text.SHALinkCM.NavigateTo - Text.WorkingCopy.CommitToEdit
-### pt_BR.axaml: 97.90% +### pt_BR.axaml: 96.81%
Missing Keys - Text.BranchCM.MergeMultiBranches +- Text.CommitCM.Merge - Text.CommitCM.MergeMultiple - Text.CommitDetail.Files.Search - Text.CommitDetail.Info.Children - Text.Diff.UseBlockNavigation - Text.Fetch.Force +- Text.FileCM.ResolveUsing - Text.Hotkeys.Global.Clone +- Text.InProgress.CherryPick.Head +- Text.InProgress.Merge.Operating +- Text.InProgress.Rebase.StoppedAt +- Text.InProgress.Revert.Head +- Text.Merge.Source - Text.MergeMultiple - Text.MergeMultiple.CommitChanges - Text.MergeMultiple.Strategy - Text.MergeMultiple.Targets - Text.Preference.General.ShowChildren - Text.Repository.FilterCommits +- Text.Repository.Skip - Text.SHALinkCM.NavigateTo - Text.WorkingCopy.CommitToEdit
-### ru_RU.axaml: 99.02% +### ru_RU.axaml: 100.00%
Missing Keys -- Text.BranchCM.MergeMultiBranches -- Text.CommitCM.MergeMultiple -- Text.Hotkeys.Global.Clone -- Text.MergeMultiple -- Text.MergeMultiple.CommitChanges -- Text.MergeMultiple.Strategy -- Text.MergeMultiple.Targets +
diff --git a/VERSION b/VERSION index d72e21bd..b6723375 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -8.42 \ No newline at end of file +8.44 \ No newline at end of file diff --git a/build/scripts/package.windows-portable.sh b/build/scripts/package.windows.sh similarity index 100% rename from build/scripts/package.windows-portable.sh rename to build/scripts/package.windows.sh diff --git a/src/App.Commands.cs b/src/App.Commands.cs index 8a485029..18016a1c 100644 --- a/src/App.Commands.cs +++ b/src/App.Commands.cs @@ -25,6 +25,18 @@ namespace SourceGit private Action _action = null; } + public static bool IsCheckForUpdateCommandVisible + { + get + { + #if DISABLE_UPDATE_DETECTION + return false; + #else + return true; + #endif + } + } + public static readonly Command OpenPreferenceCommand = new Command(_ => OpenDialog(new Views.Preference())); public static readonly Command OpenHotkeysCommand = new Command(_ => OpenDialog(new Views.Hotkeys())); public static readonly Command OpenAppDataDirCommand = new Command(_ => Native.OS.OpenInFileManager(Native.OS.DataDir)); diff --git a/src/App.axaml b/src/App.axaml index 0f40031d..55aacb89 100644 --- a/src/App.axaml +++ b/src/App.axaml @@ -33,7 +33,7 @@ - + diff --git a/src/App.axaml.cs b/src/App.axaml.cs index 0615724a..3d1547c9 100644 --- a/src/App.axaml.cs +++ b/src/App.axaml.cs @@ -548,9 +548,11 @@ namespace SourceGit _launcher = new ViewModels.Launcher(startupRepo); desktop.MainWindow = new Views.Launcher() { DataContext = _launcher }; + #if !DISABLE_UPDATE_DETECTION var pref = ViewModels.Preference.Instance; if (pref.ShouldCheck4UpdateOnStartup()) Check4Update(); + #endif } private ViewModels.Launcher _launcher = null; diff --git a/src/Commands/Branch.cs b/src/Commands/Branch.cs index 4ec8da82..391aeeb2 100644 --- a/src/Commands/Branch.cs +++ b/src/Commands/Branch.cs @@ -2,6 +2,15 @@ { public static class Branch { + public static string ShowCurrent(string repo) + { + var cmd = new Command(); + cmd.WorkingDirectory = repo; + cmd.Context = repo; + cmd.Args = $"branch --show-current"; + return cmd.ReadToEnd().StdOut.Trim(); + } + public static bool Create(string repo, string name, string basedOn) { var cmd = new Command(); diff --git a/src/Commands/Command.cs b/src/Commands/Command.cs index 8d304410..3f61de17 100644 --- a/src/Commands/Command.cs +++ b/src/Commands/Command.cs @@ -74,7 +74,11 @@ namespace SourceGit.Commands } if (string.IsNullOrEmpty(e.Data)) + { + errs.Add(string.Empty); return; + } + if (TraitErrorAsOutput) OnReadline(e.Data); @@ -89,6 +93,7 @@ namespace SourceGit.Commands return; if (REG_PROGRESS().IsMatch(e.Data)) return; + errs.Add(e.Data); }; @@ -99,12 +104,8 @@ namespace SourceGit.Commands catch (Exception e) { if (RaiseError) - { - Dispatcher.UIThread.Invoke(() => - { - App.RaiseException(Context, e.Message); - }); - } + Dispatcher.UIThread.Post(() => App.RaiseException(Context, e.Message)); + return false; } @@ -115,15 +116,15 @@ namespace SourceGit.Commands int exitCode = proc.ExitCode; proc.Close(); - if (!isCancelled && exitCode != 0 && errs.Count > 0) + if (!isCancelled && exitCode != 0) { if (RaiseError) { - Dispatcher.UIThread.Invoke(() => - { - App.RaiseException(Context, string.Join("\n", errs)); - }); + var errMsg = string.Join("\n", errs).Trim(); + if (!string.IsNullOrEmpty(errMsg)) + Dispatcher.UIThread.Post(() => App.RaiseException(Context, errMsg)); } + return false; } diff --git a/src/Commands/QueryCommits.cs b/src/Commands/QueryCommits.cs index 80497a90..6318f331 100644 --- a/src/Commands/QueryCommits.cs +++ b/src/Commands/QueryCommits.cs @@ -6,13 +6,11 @@ namespace SourceGit.Commands { public class QueryCommits : Command { - public QueryCommits(string repo, bool useTopoOrder, string limits, bool needFindHead = true) + public QueryCommits(string repo, string limits, bool needFindHead = true) { - var order = useTopoOrder ? "--topo-order" : "--date-order"; - WorkingDirectory = repo; Context = repo; - Args = $"log {order} --no-show-signature --decorate=full --pretty=format:%H%n%P%n%D%n%aN±%aE%n%at%n%cN±%cE%n%ct%n%s {limits}"; + Args = $"log --no-show-signature --decorate=full --pretty=format:%H%n%P%n%D%n%aN±%aE%n%at%n%cN±%cE%n%ct%n%s {limits}"; _findFirstMerged = needFindHead; } diff --git a/src/Commands/QueryCommitsWithFullMessage.cs b/src/Commands/QueryCommitsWithFullMessage.cs index 116cb3cd..c15cdbe1 100644 --- a/src/Commands/QueryCommitsWithFullMessage.cs +++ b/src/Commands/QueryCommitsWithFullMessage.cs @@ -52,16 +52,28 @@ namespace SourceGit.Commands _current.Commit.CommitterTime = ulong.Parse(line); break; default: - if (line.Equals(_boundary, StringComparison.Ordinal)) - nextPartIdx = -1; + var boundary = rs.StdOut.IndexOf(_boundary, end + 1); + if (boundary > end) + { + _current.Message = rs.StdOut.Substring(start, boundary - start - 1); + end = boundary + _boundary.Length; + } else - _current.Message += line; + { + _current.Message = rs.StdOut.Substring(start); + end = rs.StdOut.Length - 2; + } + + nextPartIdx = -1; break; } nextPartIdx++; start = end + 1; + if (start >= rs.StdOut.Length - 1) + break; + end = rs.StdOut.IndexOf('\n', start); } diff --git a/src/Commands/QueryRefsContainsCommit.cs b/src/Commands/QueryRefsContainsCommit.cs index e3b73ccc..82e9b341 100644 --- a/src/Commands/QueryRefsContainsCommit.cs +++ b/src/Commands/QueryRefsContainsCommit.cs @@ -23,6 +23,9 @@ namespace SourceGit.Commands var lines = output.StdOut.Split('\n'); foreach (var line in lines) { + if (line.EndsWith("/HEAD", StringComparison.Ordinal)) + continue; + if (line.StartsWith("refs/heads/", StringComparison.Ordinal)) rs.Add(new() { Name = line.Substring("refs/heads/".Length), Type = Models.DecoratorType.LocalBranchHead }); else if (line.StartsWith("refs/remotes/", StringComparison.Ordinal)) diff --git a/src/Models/AvatarManager.cs b/src/Models/AvatarManager.cs index 313553f9..9f0bceaf 100644 --- a/src/Models/AvatarManager.cs +++ b/src/Models/AvatarManager.cs @@ -35,7 +35,7 @@ namespace SourceGit.Models private static AvatarManager _instance = null; - [GeneratedRegex(@"^(?:(\d+)\+)?(.+?)@users\.noreply\.github\.com$")] + [GeneratedRegex(@"^(?:(\d+)\+)?(.+?)@.+\.github\.com$")] private static partial Regex REG_GITHUB_USER_EMAIL(); private object _synclock = new object(); @@ -43,6 +43,7 @@ namespace SourceGit.Models private List _avatars = new List(); private Dictionary _resources = new Dictionary(); private HashSet _requesting = new HashSet(); + private HashSet _defaultAvatars = new HashSet(); public void Start() { @@ -50,8 +51,8 @@ namespace SourceGit.Models if (!Directory.Exists(_storePath)) Directory.CreateDirectory(_storePath); - var icon = AssetLoader.Open(new Uri($"avares://SourceGit/Resources/Images/github.png", UriKind.RelativeOrAbsolute)); - _resources.Add("noreply@github.com", new Bitmap(icon)); + LoadDefaultAvatar("noreply@github.com", "github.png"); + LoadDefaultAvatar("unrealbot@epicgames.com", "unreal.png"); Task.Run(() => { @@ -140,7 +141,7 @@ namespace SourceGit.Models { if (forceRefetch) { - if (email.Equals("noreply@github.com", StringComparison.Ordinal)) + if (_defaultAvatars.Contains(email)) return null; if (_resources.ContainsKey(email)) @@ -185,6 +186,13 @@ namespace SourceGit.Models return null; } + private void LoadDefaultAvatar(string key, string img) + { + var icon = AssetLoader.Open(new Uri($"avares://SourceGit/Resources/Images/{img}", UriKind.RelativeOrAbsolute)); + _resources.Add(key, new Bitmap(icon)); + _defaultAvatars.Add(key); + } + private string GetEmailHash(string email) { var lowered = email.ToLower(CultureInfo.CurrentCulture).Trim(); diff --git a/src/Models/ExternalMerger.cs b/src/Models/ExternalMerger.cs index a09f808c..49d31df5 100644 --- a/src/Models/ExternalMerger.cs +++ b/src/Models/ExternalMerger.cs @@ -39,7 +39,7 @@ namespace SourceGit.Models new ExternalMerger(4, "tortoise_merge", "Tortoise Merge", "TortoiseMerge.exe;TortoiseGitMerge.exe", "-base:\"$BASE\" -theirs:\"$REMOTE\" -mine:\"$LOCAL\" -merged:\"$MERGED\"", "-base:\"$LOCAL\" -theirs:\"$REMOTE\""), new ExternalMerger(5, "kdiff3", "KDiff3", "kdiff3.exe", "\"$REMOTE\" -b \"$BASE\" \"$LOCAL\" -o \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""), new ExternalMerger(6, "beyond_compare", "Beyond Compare", "BComp.exe", "\"$REMOTE\" \"$LOCAL\" \"$BASE\" \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""), - new ExternalMerger(7, "win_merge", "WinMerge", "WinMergeU.exe", "\"$MERGED\"", "-u -e \"$LOCAL\" \"$REMOTE\""), + new ExternalMerger(7, "win_merge", "WinMerge", "WinMergeU.exe", "\"$MERGED\"", "-u -e -sw \"$LOCAL\" \"$REMOTE\""), new ExternalMerger(8, "codium", "VSCodium", "VSCodium.exe", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""), new ExternalMerger(9, "p4merge", "P4Merge", "p4merge.exe", "-tw 4 \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"", "-tw 4 \"$LOCAL\" \"$REMOTE\""), }; diff --git a/src/Models/Remote.cs b/src/Models/Remote.cs index 2b88c3be..3c452460 100644 --- a/src/Models/Remote.cs +++ b/src/Models/Remote.cs @@ -6,7 +6,7 @@ namespace SourceGit.Models { public partial class Remote { - [GeneratedRegex(@"^https?://([-a-zA-Z0-9:%._\+~#=]+@)?[-a-zA-Z0-9:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}(:[0-9]{1,5})?\b(/[-a-zA-Z0-9()@:%_\+.~#?&=]*)*(\.git)?$")] + [GeneratedRegex(@"^https?://([-a-zA-Z0-9:%._\+~#=]+@)?[-a-zA-Z0-9:%._\+~#=]{1,256}(\.[a-zA-Z0-9()]{1,6})?(:[0-9]{1,5})?\b(/[-a-zA-Z0-9()@:%_\+.~#?&=]+)+(\.git)?$")] private static partial Regex REG_HTTPS(); [GeneratedRegex(@"^[\w\-]+@[\w\.\-]+(\:[0-9]+)?:[\w\-/~%]+/[\w\-\.%]+(\.git)?$")] private static partial Regex REG_SSH1(); diff --git a/src/Models/RepositorySettings.cs b/src/Models/RepositorySettings.cs index 5b3aa331..4673f66a 100644 --- a/src/Models/RepositorySettings.cs +++ b/src/Models/RepositorySettings.cs @@ -14,6 +14,30 @@ namespace SourceGit.Models set; } = string.Empty; + public bool EnableReflog + { + get; + set; + } = false; + + public bool EnableFirstParentInHistories + { + get; + set; + } = false; + + public bool EnableTopoOrderInHistories + { + get; + set; + } = false; + + public bool IncludeUntrackedInLocalChanges + { + get; + set; + } = true; + public DealWithLocalChanges DealWithLocalChangesOnCheckoutBranch { get; @@ -26,6 +50,12 @@ namespace SourceGit.Models set; } = false; + public bool EnableForceOnFetch + { + get; + set; + } = false; + public bool FetchWithoutTags { get; @@ -84,31 +114,31 @@ namespace SourceGit.Models { get; set; - } = new AvaloniaList(); + } = []; public AvaloniaList CommitTemplates { get; set; - } = new AvaloniaList(); + } = []; public AvaloniaList CommitMessages { get; set; - } = new AvaloniaList(); + } = []; public AvaloniaList IssueTrackerRules { get; set; - } = new AvaloniaList(); + } = []; public AvaloniaList CustomActions { get; set; - } = new AvaloniaList(); + } = []; public bool EnableAutoFetch { @@ -152,6 +182,42 @@ namespace SourceGit.Models set; } = "---"; + public bool IsLocalBranchesExpandedInSideBar + { + get; + set; + } = true; + + public bool IsRemotesExpandedInSideBar + { + get; + set; + } = false; + + public bool IsTagsExpandedInSideBar + { + get; + set; + } = false; + + public bool IsSubmodulesExpandedInSideBar + { + get; + set; + } = false; + + public bool IsWorktreeExpandedInSideBar + { + get; + set; + } = false; + + public List ExpandedBranchNodesInSideBar + { + get; + set; + } = []; + public Dictionary CollectHistoriesFilters() { var map = new Dictionary(); diff --git a/src/Models/ShellOrTerminal.cs b/src/Models/ShellOrTerminal.cs index 8ab25788..1decdcfa 100644 --- a/src/Models/ShellOrTerminal.cs +++ b/src/Models/ShellOrTerminal.cs @@ -41,6 +41,7 @@ namespace SourceGit.Models { new ShellOrTerminal("mac-terminal", "Terminal", ""), new ShellOrTerminal("iterm2", "iTerm", ""), + new ShellOrTerminal("warp", "Warp", ""), }; } else diff --git a/src/Native/MacOS.cs b/src/Native/MacOS.cs index 9660920d..62ae8c89 100644 --- a/src/Native/MacOS.cs +++ b/src/Native/MacOS.cs @@ -36,6 +36,8 @@ namespace SourceGit.Native return "Terminal"; case "iterm2": return "iTerm"; + case "warp": + return "Warp"; } return string.Empty; diff --git a/src/Native/OS.cs b/src/Native/OS.cs index b53f81d9..ca56cdac 100644 --- a/src/Native/OS.cs +++ b/src/Native/OS.cs @@ -1,5 +1,8 @@ using System; using System.Collections.Generic; +#if ENABLE_PORTABLE +using System.Diagnostics; +#endif using System.IO; using Avalonia; @@ -55,6 +58,16 @@ namespace SourceGit.Native public static void SetupDataDir() { +#if ENABLE_PORTABLE + if (OperatingSystem.IsWindows()) + { + var execFile = Process.GetCurrentProcess().MainModule!.FileName; + DataDir = Path.Combine(Path.GetDirectoryName(execFile), "data"); + if (!Directory.Exists(DataDir)) + Directory.CreateDirectory(DataDir); + return; + } +#endif var osAppDataDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); if (string.IsNullOrEmpty(osAppDataDir)) DataDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".sourcegit"); diff --git a/src/Resources/Icons.axaml b/src/Resources/Icons.axaml index 59cb1ca1..3eeb4b41 100644 --- a/src/Resources/Icons.axaml +++ b/src/Resources/Icons.axaml @@ -17,7 +17,7 @@ M853 102H171C133 102 102 133 102 171v683C102 891 133 922 171 922h683C891 922 922 891 922 853V171C922 133 891 102 853 102zM390 600l-48 48L205 512l137-137 48 48L301 512l88 88zM465 819l-66-18L559 205l66 18L465 819zm218-171L634 600 723 512l-88-88 48-48L819 512 683 649z M684 736 340 736l0-53 344 1-0 53zM552 565l-213-2 0-53 212 2-0 53zM684 392 340 392l0-53 344 1-0 53zM301 825c-45 0-78-9-100-27-22-18-33-43-33-75v-116c0-22-4-37-12-45-7-9-20-13-40-13v-61c19 0 32-4 40-12 8-9 12-24 12-46v-116c0-32 11-57 33-75 22-18 56-27 100-27h24v61h-24a35 35 0 00-27 12 41 41 0 00-11 29v116c0 35-10 60-31 75a66 66 0 01-31 14c11 2 22 6 31 14 20 17 31 42 31 75v116c0 12 4 22 11 29 7 8 16 12 27 12h24v61h-24zM701 764h24c10 0 19-4 27-12a41 41 0 0011-29v-116c0-33 10-58 31-75 9-7 19-12 31-14a66 66 0 01-31-14c-20-15-31-40-31-75v-116a41 41 0 00-11-29 35 35 0 00-27-12h-24v-61h24c45 0 78 9 100 27 22 18 33 43 33 75v116c0 22 4 37 11 46 8 8 21 12 40 12v61c-19 0-33 4-40 13-7 8-11 23-11 45v116c0 32-11 57-33 75-22 18-55 27-100 27h-24v-61z M128 854h768v86H128zM390 797c13 13 29 19 48 19s35-6 45-19l291-288c26-22 26-64 0-90L435 83l-61 61L426 192l-272 269c-22 22-22 64 0 90l237 246zm93-544 211 211-32 32H240l243-243zM707 694c0 48 38 86 86 86 48 0 86-38 86-86 0-22-10-45-26-61L794 576l-61 61c-13 13-26 35-26 58z - M796 471A292 292 0 00512 256a293 293 0 00-284 215H0v144h228A293 293 0 00512 832a291 291 0 00284-217H1024V471h-228M512 688A146 146 0 01366 544A145 145 0 01512 400c80 0 146 63 146 144A146 146 0 01512 688 + M0 512M1024 512M512 0M512 1024M796 471A292 292 0 00512 256a293 293 0 00-284 215H0v144h228A293 293 0 00512 832a291 291 0 00284-217H1024V471h-228M512 688A146 146 0 01366 544A145 145 0 01512 400c80 0 146 63 146 144A146 146 0 01512 688 M796 561a5 5 0 014 7l-39 90a5 5 0 004 7h100a5 5 0 014 8l-178 247a5 5 0 01-9-4l32-148a5 5 0 00-5-6h-89a5 5 0 01-4-7l86-191a5 5 0 014-3h88zM731 122a73 73 0 0173 73v318a54 54 0 00-8-1H731V195H244v634h408l-16 73H244a73 73 0 01-73-73V195a73 73 0 0173-73h488zm-219 366v73h-195v-73h195zm146-146v73H317v-73h341z M645 448l64 64 220-221L704 64l-64 64 115 115H128v90h628zM375 576l-64-64-220 224L314 960l64-64-116-115H896v-90H262z M608 0q48 0 88 23t63 63 23 87v70h55q35 0 67 14t57 38 38 57 14 67V831q0 34-14 66t-38 57-57 38-67 13H426q-34 0-66-13t-57-38-38-57-14-66v-70h-56q-34 0-66-14t-57-38-38-57-13-67V174q0-47 23-87T109 23 196 0h412m175 244H426q-46 0-86 22T278 328t-26 85v348H608q47 0 86-22t63-62 25-85l1-348m-269 318q18 0 31 13t13 31-13 31-31 13-31-13-13-31 13-31 31-13m0-212q13 0 22 9t11 22v125q0 14-9 23t-22 10-23-7-11-22l-1-126q0-13 10-23t23-10z diff --git a/src/Resources/Images/ShellIcons/warp.png b/src/Resources/Images/ShellIcons/warp.png new file mode 100644 index 00000000..7d604d8e Binary files /dev/null and b/src/Resources/Images/ShellIcons/warp.png differ diff --git a/src/Resources/Images/unreal.png b/src/Resources/Images/unreal.png new file mode 100644 index 00000000..4faae92b Binary files /dev/null and b/src/Resources/Images/unreal.png differ diff --git a/src/Resources/Locales/de_DE.axaml b/src/Resources/Locales/de_DE.axaml index bb31fa8f..ff8a1d97 100644 --- a/src/Resources/Locales/de_DE.axaml +++ b/src/Resources/Locales/de_DE.axaml @@ -61,6 +61,7 @@ Fetche ${0}$ in ${1}$ hinein... Git Flow - Abschließen ${0}$ Merge ${0}$ in ${1}$ hinein... + Merge ausgewählte {0} Branches in aktuellen hinein Pull ${0}$ Pull ${0}$ in ${1}$ hinein... Push ${0}$ @@ -113,6 +114,8 @@ SHA kopieren Benutzerdefinierte Aktion Interactives Rebase von ${0}$ auf diesen Commit + Merge in ${0}$ hinein + Merge ... Rebase von ${0}$ auf diesen Commit Reset ${0}$ auf diesen Commit Commit rückgängig machen @@ -124,6 +127,7 @@ Änderungen durchsuchen... DATEIEN LFS DATEI + Dateien durchsuchen... Submodule INFORMATION AUTOR @@ -249,6 +253,7 @@ Seiten wechseln Syntax Hervorhebung Zeilenumbruch + Aktiviere Block-Navigation Öffne in Merge Tool Alle Zeilen anzeigen Weniger Zeilen anzeigen @@ -280,6 +285,7 @@ Verwerfe {0} Dateien... Verwerfe Änderungen in ausgewählten Zeilen Öffne externes Merge Tool + Löse mit ${0}$ Als Patch speichern... Stagen {0} Dateien stagen @@ -358,6 +364,7 @@ Tastaturkürzel Referenz GLOBAL Aktuelles Popup schließen + Klone neues Repository Aktuellen Tab schließen Zum vorherigen Tab wechseln Zum nächsten Tab wechseln @@ -389,10 +396,14 @@ Verwerfen Initialisiere Repository Pfad: - Cherry-Pick wird durchgeführt. Drücke 'Abbrechen' um den originalen HEAD wiederherzustellen. - Merge request wird durchgeführt. Drücke 'Abbrechen' um den originalen HEAD wiederherzustellen. - Rebase wird durchgeführt. Drücke 'Abbrechen' um den originalen HEAD wiederherzustellen. - Revert wird durchgeführt. Drücke 'Abbrechen' um den originalen HEAD wiederherzustellen. + Cherry-Pick wird durchgeführt. + Verarbeite commit + Merge request wird durchgeführt. + Verarbeite + Rebase wird durchgeführt. + Angehalten bei + Revert wird durchgeführt. + Reverte commit Interaktiver Rebase Ziel Branch: Auf: @@ -403,7 +414,11 @@ Branch mergen Ziel-Branch: Merge Option: - Quell-Branch: + Quelle: + Merge (mehrere) + Alle Änderungen committen + Strategie: + Ziele: Bewege Repository Knoten Wähle Vorgänger-Knoten für: Name: @@ -460,7 +475,7 @@ Längenvorgabe für Commit-Nachrichten GIT Aktiviere Auto-CRLF - Clone Standardordner + Klon Standardordner Benutzer Email Globale Git Benutzer Email Installationspfad @@ -562,7 +577,6 @@ Aktualisiern REMOTES REMOTE HINZUFÜGEN - KONFLIKTE BEHEBEN Commit suchen Dateiname Commit-Nachricht @@ -570,6 +584,7 @@ Autor & Committer Aktueller Branch Zeige Tags als Baum + ÜBERSPRINGEN Statistiken SUBMODULE SUBMODUL HINZUFÜGEN @@ -668,7 +683,7 @@ Öffne alle Repositories Öffne Repository Öffne Terminal - Clone Standardordner erneut nach Repositories durchsuchen + Klon Standardordner erneut nach Repositories durchsuchen Suche Repositories... Sortieren Änderungen @@ -683,6 +698,7 @@ COMMIT & PUSH Template/Historie Klick-Ereignis auslösen + Commit (Bearbeitung) Alle Änderungen stagen und committen Leerer Commit erkannt! Fortfahren (--allow-empty)? KONFLIKTE ERKANNT diff --git a/src/Resources/Locales/en_US.axaml b/src/Resources/Locales/en_US.axaml index 2369c3a6..f2165f3f 100644 --- a/src/Resources/Locales/en_US.axaml +++ b/src/Resources/Locales/en_US.axaml @@ -102,7 +102,7 @@ Repository URL: CLOSE Editor - Cherry-Pick This Commit + Cherry-Pick Commit Cherry-Pick ... Checkout Commit Compare with HEAD @@ -110,15 +110,16 @@ Copy Info Copy SHA Custom Action - Interactive Rebase ${0}$ to Here + Interactively Rebase ${0}$ on Here + Merge to ${0}$ Merge ... - Rebase ${0}$ to Here + Rebase ${0}$ on Here Reset ${0}$ to Here Revert Commit Reword Save as Patch... Squash into Parent - Squash Child Commits to Here + Squash Children into Here CHANGES Search Changes... FILES @@ -272,7 +273,7 @@ Fast-Forward (without checkout) Fetch Fetch all remotes - Enable '--force' option + Override refs check Fetch without tags Remote: Fetch Remote Changes @@ -281,6 +282,7 @@ Discard {0} files... Discard Changes in Selected Line(s) Open External Merge Tool + Resolve Using ${0}$ Save as Patch... Stage Stage {0} files @@ -353,8 +355,8 @@ SHA COMMIT TIME SELECTED {0} COMMITS - Holding 'Ctrl' or 'Shift' to select multiple commits. - Holding ⌘ or ⇧ to select multiple commits. + Hold 'Ctrl' or 'Shift' to select multiple commits. + Hold ⌘ or ⇧ to select multiple commits. TIPS: Keyboard Shortcuts Reference GLOBAL @@ -391,10 +393,14 @@ Discard Initialize Repository Path: - Cherry-Pick in progress. Press 'Abort' to restore original HEAD. - Merge request in progress. Press 'Abort' to restore original HEAD. - Rebase in progress. Press 'Abort' to restore original HEAD. - Revert in progress. Press 'Abort' to restore original HEAD. + Cherry-Pick in progress. + Processing commit + Merge in progress. + Merging + Rebase in progress. + Stopped at + Revert in progress. + Reverting commit Interactive Rebase Target Branch: On: @@ -405,7 +411,7 @@ Merge Branch Into: Merge Option: - Source Branch: + Source: Merge (Multiple) Commit all changes Strategy: @@ -414,7 +420,7 @@ Select parent node for: Name: Git has NOT been configured. Please to go [Preference] and configure it first. - Open App Data Dir + Open Data Storage Directory Open with... Optional. Create New Page @@ -568,7 +574,6 @@ Refresh REMOTES ADD REMOTE - RESOLVE Search Commit File Message @@ -576,6 +581,7 @@ Author & Committer Current Branch Show Tags as Tree + SKIP Statistics SUBMODULES ADD SUBMODULE diff --git a/src/Resources/Locales/es_ES.axaml b/src/Resources/Locales/es_ES.axaml index 2ed79caa..60e26096 100644 --- a/src/Resources/Locales/es_ES.axaml +++ b/src/Resources/Locales/es_ES.axaml @@ -396,10 +396,10 @@ Descartar Inicializar Repositorio Ruta: - Cherry-Pick en progreso. Presiona 'Abort' para restaurar el HEAD original. - Merge en progreso. Presiona 'Abort' para restaurar el HEAD original. - Rebase en progreso. Presiona 'Abort' para restaurar el HEAD original. - Revert en progreso. Presiona 'Abort' para restaurar el HEAD original. + Cherry-Pick en progreso. + Merge en progreso. + Rebase en progreso. + Revert en progreso. Rebase Interactivo Rama Objetivo: En: @@ -572,7 +572,6 @@ Refrescar REMOTOS AÑADIR REMOTO - RESOLVER Buscar Commit Archivo Mensaje diff --git a/src/Resources/Locales/fr_FR.axaml b/src/Resources/Locales/fr_FR.axaml index a9a18be3..20237bb9 100644 --- a/src/Resources/Locales/fr_FR.axaml +++ b/src/Resources/Locales/fr_FR.axaml @@ -386,10 +386,10 @@ Rejeter Initialiser le repository Chemin : - Cherry-Pick en cours. Appuyer sur 'Abort' pour restaurer le HEAD d'origine. - Merge request in progress. Appuyer sur 'Abort' pour restaurer le HEAD d'origine. - Rebase in progress. Appuyer sur 'Abort' pour restaurer le HEAD d'origine. - Revert in progress. Appuyer sur 'Abort' pour restaurer le HEAD d'origine. + Cherry-Pick en cours. + Merge request in progress. + Rebase in progress. + Revert in progress. Rebase interactif Branche cible : Sur : @@ -400,7 +400,6 @@ Merger la branche Dans : Option de merge: - Branche source : Déplacer le noeud du repository Sélectionnier le noeud parent pour : Nom : @@ -549,7 +548,6 @@ Rafraîchir DEPOTS DISTANTS AJOUTER DEPOT DISTANT - RESOUDRE Rechercher un commit Fichier Message diff --git a/src/Resources/Locales/it_IT.axaml b/src/Resources/Locales/it_IT.axaml index fbf918b8..18754c8e 100644 --- a/src/Resources/Locales/it_IT.axaml +++ b/src/Resources/Locales/it_IT.axaml @@ -389,10 +389,10 @@ Scarta Inizializza Repository Percorso: - Cherry-Pick in corso. Premi 'Annulla' per ripristinare l'HEAD originale. - Richiesta di merge in corso. Premi 'Annulla' per ripristinare l'HEAD originale. - Rebase in corso. Premi 'Annulla' per ripristinare l'HEAD originale. - Revert in corso. Premi 'Annulla' per ripristinare l'HEAD originale. + Cherry-Pick in corso. + Richiesta di merge in corso. + Rebase in corso. + Revert in corso. Rebase Interattivo Branch di destinazione: Su: @@ -403,7 +403,6 @@ Unisci Branch In: Opzione di Merge: - Branch Sorgente: Sposta Nodo Repository Seleziona nodo padre per: Nome: @@ -555,7 +554,6 @@ Aggiorna REMOTI AGGIUNGI REMOTO - RISOLVI Cerca Commit File Messaggio diff --git a/src/Resources/Locales/pt_BR.axaml b/src/Resources/Locales/pt_BR.axaml index 4d011b32..d72dd370 100644 --- a/src/Resources/Locales/pt_BR.axaml +++ b/src/Resources/Locales/pt_BR.axaml @@ -412,10 +412,10 @@ Descartar Inicializar Repositório Caminho: - Cherry-Pick em andamento. Pressione 'Abort' para restaurar o HEAD original. - Merge em andamento. Pressione 'Abort' para restaurar o HEAD original. - Rebase em andamento. Pressione 'Abort' para restaurar o HEAD original. - Revert em andamento. Pressione 'Abort' para restaurar o HEAD original. + Cherry-Pick em andamento. + Merge em andamento. + Rebase em andamento. + Revert em andamento. Rebase Interativo Ramo Alvo: Em: @@ -426,7 +426,6 @@ Mesclar Ramo Para: Opção de Mesclagem: - Ramo de Origem: Mover nó do repositório Selecionar nó pai para: Nome: @@ -583,7 +582,6 @@ Atualizar REMOTOS ADICIONAR REMOTO - RESOLVER Pesquisar Commit Arquivo Mensagem diff --git a/src/Resources/Locales/ru_RU.axaml b/src/Resources/Locales/ru_RU.axaml index 5b2cf129..167d9290 100644 --- a/src/Resources/Locales/ru_RU.axaml +++ b/src/Resources/Locales/ru_RU.axaml @@ -48,8 +48,8 @@ УДАЛИТЬ ДВОИЧНЫЙ ФАЙЛ НЕ ПОДДЕРЖИВАЕТСЯ!!! Обвинение - ОБВИНЕНИЕ В ЭТОМ ФАЙЛЕ НЕ ПОДДЕРЖИВАЕТСЯ!!! - Проверить ${0}$... + ПОИСК В ЭТОМ ФАЙЛЕ НЕ ПОДДЕРЖИВАЕТСЯ!!! + Переключиться на ${0}$... Сравнить в веткой Сравнить в заголовком Сравнить в рабочим деревом @@ -61,6 +61,7 @@ Извлечь ${0}$ в ${1}$... Поток Git - Завершение ${0}$ Слить ${0}$ в ${1}$... + Слить {0} выделенных веток в текущую Забрать ${0}$ Забрать ${0}$ в ${1}$... Выложить ${0}$ @@ -104,22 +105,24 @@ Адрес хранилища: ЗАКРЫТЬ Редактор - Выбрать из списка эту фиксацию - Список выбора ... - Проверить фиксацию - Сравнить в заголовком - Сравнить с рабочим деревом + Применить эту фиксацию (частичная-выборка) + Применить несколько фиксаций ... + Переключиться на эту фиксацию + Сравнить c ГОЛОВНЫМ + Сравнить с рабочим каталогом Копировать информацию Копировать SHA Пользовательское действие - Интерактивное перемещение ${0}$ сюда + Интерактивное перемещение (rebase -i) ${0}$ сюда + Слить в ${0}$ + Слить ветки... Переместить ${0}$ сюда Сбросить ${0}$ сюда - Вернуть фиксацию - Переформулировать - Сохранить как исправление... - Втиснуть в родительскую - Втиснуть дочерную фиксацию сюда + Отменить фиксацию + Изменить комментарий + Сохранить как файл исправлений... + Объединить с предыдущей фиксацией + Объединить все следующие фиксации с этим ИЗМЕНЕНИЯ Найти изменения.... ФАЙЛЫ @@ -131,8 +134,8 @@ ИЗМЕНЁННЫЙ ДОЧЕРНИЙ ИСПОЛНИТЕЛЬ - Проверить ссылки, содержащие эту фиксацию - ФИКСАЦИЯ СОДЕРЖИТСЯ В + Найти все ветки с этой фиксацией + ВЕТКИ С ЭТОЙ ФИКСАЦИЕЙ Отображаются только первые 100 изменений. Смотрите все изменения на вкладке ИЗМЕНЕНИЯ. СООБЩЕНИЕ РОДИТЕЛИ @@ -143,12 +146,12 @@ Описание Настройка хранилища ШАБЛОН ФИКСАЦИИ - Имя шаблона: - Шаблон содержания: + Название: + Cодержание: ПОЛЬЗОВАТЕЛЬСКОЕ ДЕЙСТВИЕ Аргументы: - ${REPO} - Путь хранилища; ${SHA} - Выбранные фиксации SHA - Исполняемый фалй: + ${REPO} - Путь к хранилищу; ${SHA} - SHA фиксаций + Исполняемый файл: Имя: Диапазон: Фиксация @@ -156,11 +159,11 @@ Адрес электронной почты Адрес электронной почты GIT - Автоматическое извлечение внешних хранилищ + Автоматическое скачивание изменений Минут(а/ы) - Разрешить --signoff для фиксации + Разрешить --signoff для фиксация Удалённое хранилище по-умолчанию - Разрешить --prune при извлечении + Разрешить --prune при скачивании ОТСЛЕЖИВАНИЕ ПРОБЛЕМ Добавить пример правила для Git Добавить пример правила Jira @@ -253,9 +256,9 @@ Перенос слов в строке Разрешить навигацию по блокам Открыть в инструменте слияния - Показывать все линии - Уменьшить количество видимых линий - Увеличить количество видимых линий + Показывать все строки + Уменьшить количество видимых строк + Увеличить количество видимых строк ВЫБРАТЬ ФАЙЛ ДЛЯ ПРОСМОТРА ИЗМЕНЕНИЙ Открыть в инструменте слияния Отклонить изменения @@ -281,9 +284,10 @@ Допустить без изменений Отклонить... Отклонить {0} файлов... - Отклонить изменения в выбранной(ых) строке(ах) + Отменить изменения в выбранной(ых) строке(ах) Открыть расширенный инструмент слияния - Сохранить как исправление... + Взять версию ${0}$ + Сохранить как patch-файл... Подготовить Подготовленные {0} файлы Подготовленные изменения в выбранной(ых) строке(ах) @@ -360,11 +364,12 @@ ПОДСКАЗКИ: Ссылка на сочетания клавиш ОБЩЕЕ - Отменить текущее всплывающее окно - Закрыть текущее окно - Перейти на предыдущую страницу - Перейти на следующую страницу - Создать новую страницу + Закрыть окно + Клонировать хранилище + Закрыть вкладку + Перейти на предыдущую вкладку + Перейти на следующую вкладку + Создать новую вкладку Открыть диалоговое окно настроек ХРАНИЛИЩЕ Зафиксировать подготовленные изменения @@ -392,10 +397,14 @@ Отклонить Инициализировать хранилище Путь: - Выполняется частичный забор. Нажмите «Отказ» для восстановления заголовка. - Выполняет запрос слияния. Нажмите «Отказ» для восстановления заголовка. - Выполняется перенос. Нажмите «Отказ» для восстановления заголовка. - Выполняется возврат. Нажмите «Отказ» для восстановления заголовка. + Выполняется частичный перенос фиксаций (частичная выборка). + Обрабтка фиксации. + Выполняется слияние. + Обработка + Выполняется перенос. + Остановлен на + Выполняется отмена фиксации. + Выполняется отмена Интерактивное перемещение Целевая ветка: На: @@ -406,9 +415,13 @@ Слить ветку В: Опции слияния: - Исходная ветка: - Переместить узел хранилища - Выбрать родительский узел для: + Источник: + Слить несколько веток + Зафиксировать все изменения + Стратегия: + Цели: + Переместить хранилище в другую группу + Выбрать группу для: Имя: Git НЕ был настроен. Пожалуйста, перейдите в [Настройки] и сначала настройте его. Открыть приложение каталогов данных @@ -454,10 +467,10 @@ Путь установки Введите путь для инструмента различия/слияния Инструмент - ГЛАВНЫЙ + ОСНОВНЫЕ Проверить обновления при старте Язык - История фиксаций + Максимальная длина истории Показывать время автора вместо времени фиксации на графике Показать наследника в деталях комментария Длина темы фиксации @@ -537,7 +550,7 @@ Новое имя: Уникальное имя для данной ветки Ветка: - Отказ + Отменa Автоматическое извлечение изменений с внешних хранилищ... Очистить (Сбор мусора и удаление) Запустить команду «git gc» для данного хранилища. @@ -566,7 +579,6 @@ Обновить ВНЕШНИЕ ХРАНИЛИЩА ДОБАВИТЬ ВНЕШНЕЕ ХРАНИЛИЩЕ - РАЗРЕШИТЬ Поиск фиксации Файл Сообщение @@ -574,15 +586,16 @@ Автор и исполнитель Текущая ветка Показывать метки как дерево - Статистики + ПРОПУСТИТЬ + Статистикa ПОДМОДУЛИ ДОБАВИТЬ ПОДМОДУЛЬ ОБНОВИТЬ ПОДМОДУЛЬ МЕТКИ НОВАЯ МЕТКА Открыть в терминале - РАБОЧИЕ ДЕРЕВЬЯ - ДОБАВИТЬ РАБОЧЕЕ ДЕРЕВО + РАБОЧИЕ КАТАЛОГИ + ДОБАВИТЬ РАБОЧИЙ КАТАЛОГ ОБРЕЗАТЬ Адрес хранилища Git Сбросить текущую втеку до версии @@ -592,7 +605,7 @@ Открыть в файловом менеджере Отменить фиксацию Фиксация: - Отмена изменений фиксации + Отмена фиксации Переформулировать сообщение фиксации Использовать «Shift+Enter» для ввода новой строки. «Enter» - это горячая клавиша кнопки OK Запуск. Подождите пожалуйста... @@ -681,8 +694,8 @@ Игнорировать *{0} файлы в том же каталоге Игнорировать файлы в том же каталоге Игнорировать только эти файлы - Изменить - Теперь вы можете подготовитть этот файл. + Дополнить предыдущую фиксацию + Теперь вы можете отправить файл в индекс. ЗАФИКСИРОВАТЬ ЗАФИКСИРОВАТЬ и ОТПРАВИТЬ Шаблон/Истории @@ -696,12 +709,12 @@ НЕТ ПОСЛЕДНИХ ВХОДНЫХ СООБЩЕНИЙ НЕТ ШАБЛОНОВ ФИКСАЦИИ ПОДГОТОВЛЕННЫЕ - СНЯТЬ ПОДГОТОВЛЕННЫЙ - СНЯТЬ ВСЕ ПОДГОТОВЛЕННЫЕ + УРБАТЬ ИЗ ИНДЕКСА + УБРАТЬ ИЗ ИНДЕКСА ВСЁ НЕПОДГОТОВЛЕННЫЕ ПОДГОТОВИТЬ ВСЕ ПОДГОТОВИТЬ - ВИД ПРЕДПОЛАГАЕТСЯ НЕИЗМЕННЫМ + ПОКАЗАТЬ ПРЕДПОЛАГАЕМЫЕ НЕИЗМЕННЫМИ Шаблон: ${0}$ Щёлкните правой кнопкой мыши выбранный файл(ы) и сделайте свой выбор для разрешения конфликтов. РАБОЧЕЕ ПРОСТРАНСТВО: diff --git a/src/Resources/Locales/zh_CN.axaml b/src/Resources/Locales/zh_CN.axaml index 95224ec2..e53af9a8 100644 --- a/src/Resources/Locales/zh_CN.axaml +++ b/src/Resources/Locales/zh_CN.axaml @@ -114,6 +114,7 @@ 复制提交指纹 自定义操作 交互式变基(rebase -i) ${0}$ 到此处 + 合并(merge)此提交至 ${0}$ 合并(merge)... 变基(rebase) ${0}$ 到此处 重置(reset) ${0}$ 到此处 @@ -275,7 +276,7 @@ 快进(fast-forward,无需checkout) 拉取(fetch) 拉取所有的远程仓库 - 启用 --force 选项 + 覆盖REF检查 不拉取远程标签 远程仓库 : 拉取远程仓库内容 @@ -284,6 +285,7 @@ 放弃 {0} 个文件的更改... 放弃选中的更改 使用外部合并工具打开 + 应用 ${0}$ 另存为补丁... 暂存(add) 暂存(add){0} 个文件 @@ -394,10 +396,14 @@ 丢弃 初始化新仓库 路径 : - 挑选(Cherry-Pick)操作进行中。点击【终止】回滚到操作前的状态。 - 合并操作进行中。点击【终止】回滚到操作前的状态。 - 变基(Rebase)操作进行中。点击【终止】回滚到操作前的状态。 - 回滚提交操作进行中。点击【终止】回滚到操作前的状态。 + 挑选(Cherry-Pick)操作进行中。 + 正在处理提交 + 合并操作进行中。 + 正在处理 + 变基(Rebase)操作进行中。 + 当前停止于 + 回滚提交操作进行中。 + 正在回滚提交 交互式变基 目标分支 : 起始提交 : @@ -408,7 +414,7 @@ 合并分支 目标分支 : 合并方式 : - 合并分支 : + 合并目标 : 合并(多目标) 提交变化 合并策略 : @@ -572,7 +578,6 @@ 重新加载 远程列表 添加远程 - 解决冲突 查找提交 文件 提交信息 @@ -580,6 +585,7 @@ 作者及提交者 仅在当前分支中查找 以树型结构展示 + 跳过此提交 提交统计 子模块列表 添加子模块 diff --git a/src/Resources/Locales/zh_TW.axaml b/src/Resources/Locales/zh_TW.axaml index 6eb31d6b..e96f68ad 100644 --- a/src/Resources/Locales/zh_TW.axaml +++ b/src/Resources/Locales/zh_TW.axaml @@ -114,6 +114,7 @@ 複製提交編號 自訂動作 互動式重定基底 (rebase -i) ${0}$ 到此處 + 合併 (merge) 此提交到 ${0}$ 合併 (merge)... 重定基底 (rebase) ${0}$ 到此處 重設 (reset) ${0}$ 到此處 @@ -275,7 +276,7 @@ 快進 (fast-forward,無需 checkout) 提取 (fetch) 提取所有的遠端存放庫 - 啟用 [--force] 選項 + 覆寫 REFs 檢查 不提取遠端標籤 遠端存放庫: 提取遠端存放庫內容 @@ -284,6 +285,7 @@ 捨棄已選的 {0} 個檔案變更... 捨棄選取的變更 使用外部合併工具開啟 + 使用 ${0}$ 另存為修補檔 (patch)... 暫存 (add) 暫存 (add) 已選的 {0} 個檔案 @@ -394,10 +396,14 @@ 捨棄 初始化存放庫 路徑: - 揀選 (cherry-pick) 操作進行中。點選 [中止] 復原到操作前的狀態。 - 合併操作進行中。點選 [中止] 復原到操作前的狀態。 - 重定基底 (rebase) 操作進行中。點選 [中止] 復原到操作前的狀態。 - 復原提交操作進行中。點選 [中止] 復原到操作前的狀態。 + 揀選 (cherry-pick) 操作進行中。 + 正在處理提交 + 合併操作進行中。 + 正在處理 + 重定基底 (rebase) 操作進行中。 + 当前停止于 + 復原提交操作進行中。 + 正在復原提交 互動式重定基底 目標分支: 起始提交: @@ -408,7 +414,7 @@ 合併分支 目標分支: 合併方式: - 合併分支: + 合併目標: 合併(多目標) 提交變更 合併策略: @@ -571,7 +577,6 @@ 重新載入 遠端列表 新增遠端 - 解決衝突 搜尋提交 檔案 提交訊息 @@ -579,6 +584,7 @@ 作者及提交者 僅搜尋目前分支 以樹型結構展示 + 跳過此提交 提交統計 子模組列表 新增子模組 diff --git a/src/Resources/Styles.axaml b/src/Resources/Styles.axaml index 2cc09e39..28eabbab 100644 --- a/src/Resources/Styles.axaml +++ b/src/Resources/Styles.axaml @@ -4,6 +4,7 @@ xmlns:vm="using:SourceGit.ViewModels" xmlns:c="using:SourceGit.Converters" xmlns:ae="using:AvaloniaEdit" + xmlns:aee="using:AvaloniaEdit.Editing" xmlns:aes="using:AvaloniaEdit.Search"> @@ -580,6 +581,19 @@ + + - - - - - - + + + + + + + + - - - - + + + - - - - - - - + + + + - - - - - + + + + - - - - - - - - - + + - - - - - - + + + + + - + + + + + + + + + - - - - - - + + + + + + + + + + + + + + + - - - - - + + + + + diff --git a/src/Views/WorkingCopy.axaml b/src/Views/WorkingCopy.axaml index 594a72b9..342ea4e0 100644 --- a/src/Views/WorkingCopy.axaml +++ b/src/Views/WorkingCopy.axaml @@ -2,6 +2,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:m="using:SourceGit.Models" xmlns:vm="using:SourceGit.ViewModels" xmlns:v="using:SourceGit.Views" xmlns:c="using:SourceGit.Converters" @@ -169,13 +170,67 @@ - + - + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +