diff --git a/src/Models/CommitLink.cs b/src/Models/CommitLink.cs
index 544ee3c3..d8a7af32 100644
--- a/src/Models/CommitLink.cs
+++ b/src/Models/CommitLink.cs
@@ -1,12 +1,15 @@
-using System;
+using System;
using System.Collections.Generic;
namespace SourceGit.Models
{
+ ///
+ /// Represents a commit link for a remote repository.
+ ///
public class CommitLink
{
- public string Name { get; set; } = null;
- public string URLPrefix { get; set; } = null;
+ public string Name { get; set; }
+ public string URLPrefix { get; set; }
public CommitLink(string name, string prefix)
{
@@ -14,6 +17,17 @@ namespace SourceGit.Models
URLPrefix = prefix;
}
+ private static readonly (string Host, string Display, string CommitPath, int NameStart)[] Providers = new[]
+ {
+ ("https://github.com/", "Github", "/commit/", 19),
+ ("https://gitlab.", "GitLab", "/-/commit/", 15),
+ ("https://gitee.com/", "Gitee", "/commit/", 18),
+ ("https://bitbucket.org/", "BitBucket", "/commits/", 22),
+ ("https://codeberg.org/", "Codeberg", "/commit/", 21),
+ ("https://gitea.org/", "Gitea", "/commit/", 18),
+ ("https://git.sr.ht/", "sourcehut", "/commit/", 18)
+ };
+
public static List Get(List remotes)
{
var outs = new List();
@@ -22,24 +36,26 @@ namespace SourceGit.Models
{
if (remote.TryGetVisitURL(out var url))
{
- var trimmedUrl = url;
- if (url.EndsWith(".git"))
- trimmedUrl = url.Substring(0, url.Length - 4);
-
- if (url.StartsWith("https://github.com/", StringComparison.Ordinal))
- outs.Add(new($"Github ({trimmedUrl.Substring(19)})", $"{url}/commit/"));
- else if (url.StartsWith("https://gitlab.", StringComparison.Ordinal))
- outs.Add(new($"GitLab ({trimmedUrl.Substring(trimmedUrl.Substring(15).IndexOf('/') + 16)})", $"{url}/-/commit/"));
- else if (url.StartsWith("https://gitee.com/", StringComparison.Ordinal))
- outs.Add(new($"Gitee ({trimmedUrl.Substring(18)})", $"{url}/commit/"));
- else if (url.StartsWith("https://bitbucket.org/", StringComparison.Ordinal))
- outs.Add(new($"BitBucket ({trimmedUrl.Substring(22)})", $"{url}/commits/"));
- else if (url.StartsWith("https://codeberg.org/", StringComparison.Ordinal))
- outs.Add(new($"Codeberg ({trimmedUrl.Substring(21)})", $"{url}/commit/"));
- else if (url.StartsWith("https://gitea.org/", StringComparison.Ordinal))
- outs.Add(new($"Gitea ({trimmedUrl.Substring(18)})", $"{url}/commit/"));
- else if (url.StartsWith("https://git.sr.ht/", StringComparison.Ordinal))
- outs.Add(new($"sourcehut ({trimmedUrl.Substring(18)})", $"{url}/commit/"));
+ var trimmedUrl = url.EndsWith(".git") ? url[..^4] : url;
+ foreach (var provider in Providers)
+ {
+ if (url.StartsWith(provider.Host, StringComparison.Ordinal))
+ {
+ string repoName;
+ if (provider.Host == "https://gitlab.")
+ {
+ // GitLab: find the first '/' after host
+ int idx = trimmedUrl[provider.NameStart..].IndexOf('/') + provider.NameStart + 1;
+ repoName = trimmedUrl[idx..];
+ }
+ else
+ {
+ repoName = trimmedUrl[provider.NameStart..];
+ }
+ outs.Add(new CommitLink($"{provider.Display} ({repoName})", $"{url}{provider.CommitPath}"));
+ break;
+ }
+ }
}
}