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}"/>
-
+