CommitLink 1

This commit is contained in:
M-L-Ml 2025-04-21 18:53:03 +02:00
parent 9c53894cb4
commit 1a468b37a2

View file

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