diff --git a/src/Models/Remote.cs b/src/Models/Remote.cs index 75ca961f..950dde62 100644 --- a/src/Models/Remote.cs +++ b/src/Models/Remote.cs @@ -1,4 +1,5 @@ -using System.Text.RegularExpressions; +using System; +using System.Text.RegularExpressions; namespace SourceGit.Models { @@ -11,6 +12,9 @@ namespace SourceGit.Models [GeneratedRegex(@"^ssh://([\w\-]+@)?[\w\.\-]+(\:[0-9]+)?/[\w\-/]+/[\w\-\.]+(\.git)?$")] private static partial Regex REG_SSH2(); + [GeneratedRegex(@"^git@([\w\.\-]+):([\w\-/]+/[\w\-\.]+)\.git$")] + private static partial Regex REG_TO_VISIT_URL_CAPTURE(); + private static readonly Regex[] URL_FORMATS = [ REG_HTTPS(), REG_SSH1(), @@ -43,5 +47,29 @@ namespace SourceGit.Models } return false; } + + public bool TryGetVisitURL(out string url) + { + url = null; + + if (URL.StartsWith("http", StringComparison.Ordinal)) + { + if (URL.EndsWith(".git")) + url = URL.Substring(0, URL.Length - 4); + else + url = URL; + + return true; + } + + var match = REG_TO_VISIT_URL_CAPTURE().Match(URL); + if (match.Success) + { + url = $"https://{match.Groups[1].Value}/{match.Groups[2].Value}"; + return true; + } + + return false; + } } } diff --git a/src/Resources/Locales/en_US.axaml b/src/Resources/Locales/en_US.axaml index 91d3ed83..ae541e00 100644 --- a/src/Resources/Locales/en_US.axaml +++ b/src/Resources/Locales/en_US.axaml @@ -345,6 +345,8 @@ Install Path Input path for merge tool Merger + Prune Remote + Target : Pull Branch : Into : @@ -383,8 +385,8 @@ Delete ... Edit ... Fetch ... - Prune - Target : + Open In Browser + Prune ... Rename Branch New Name : Unique name for this branch diff --git a/src/Resources/Locales/zh_CN.axaml b/src/Resources/Locales/zh_CN.axaml index 5ecf6a63..fc773174 100644 --- a/src/Resources/Locales/zh_CN.axaml +++ b/src/Resources/Locales/zh_CN.axaml @@ -348,6 +348,8 @@ 安装路径 填写工具可执行文件所在位置 工具 + 清理远程已删除分支 + 目标 : 拉回(pull) 拉取分支 : 本地分支 : @@ -386,8 +388,8 @@ 删除 ... 编辑 ... 拉取(fetch)更新 ... - 清理远程已删除分支 - 目标 : + 在浏览器中打开 + 清理远程已删除分支 ... 分支重命名 新的名称 : 新的分支名不能与现有分支名相同 diff --git a/src/Resources/Locales/zh_TW.axaml b/src/Resources/Locales/zh_TW.axaml index 9c97df8b..ef50a35e 100644 --- a/src/Resources/Locales/zh_TW.axaml +++ b/src/Resources/Locales/zh_TW.axaml @@ -348,6 +348,8 @@ 安裝路徑 填寫工具可執行檔案所在位置 工具 + 清理遠端已刪除分支 + 目標 : 拉回(pull) 拉取分支 : 本地分支 : @@ -386,8 +388,8 @@ 刪除 ... 編輯 ... 拉取(fetch)更新 ... - 清理遠端已刪除分支 - 目標 : + 在瀏覽器中訪問網址 + 清理遠端已刪除分支 ... 分支重新命名 新的名稱 : 新的分支名不能與現有分支名相同 diff --git a/src/ViewModels/Repository.cs b/src/ViewModels/Repository.cs index 50155133..3f035150 100644 --- a/src/ViewModels/Repository.cs +++ b/src/ViewModels/Repository.cs @@ -1214,6 +1214,21 @@ namespace SourceGit.ViewModels { var menu = new ContextMenu(); + if (remote.TryGetVisitURL(out string visitURL)) + { + var visit = new MenuItem(); + visit.Header = App.Text("RemoteCM.OpenInBrowser"); + visit.Icon = App.CreateMenuIcon("Icons.OpenWith"); + visit.Click += (o, e) => + { + Native.OS.OpenBrowser(visitURL); + e.Handled = true; + }; + + menu.Items.Add(visit); + menu.Items.Add(new MenuItem() { Header = "-" }); + } + var fetch = new MenuItem(); fetch.Header = App.Text("RemoteCM.Fetch"); fetch.Icon = App.CreateMenuIcon("Icons.Fetch"); diff --git a/src/Views/PruneRemote.axaml b/src/Views/PruneRemote.axaml index 2b3dbcf0..72b09d26 100644 --- a/src/Views/PruneRemote.axaml +++ b/src/Views/PruneRemote.axaml @@ -9,9 +9,9 @@ + Text="{DynamicResource Text.PruneRemote}"/> - +