From 243747500677f2c924178d076282a5aa94b48232 Mon Sep 17 00:00:00 2001 From: heartacker <1876302+heartacker@users.noreply.github.com> Date: Wed, 30 Jul 2025 11:53:29 +0800 Subject: [PATCH] feature: self host GitLab URLs in CommitLink (#1635) --- src/Models/CommitLink.cs | 8 ++++++-- src/Models/Remote.cs | 3 +++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Models/CommitLink.cs b/src/Models/CommitLink.cs index 08caad8d..a260cb7b 100644 --- a/src/Models/CommitLink.cs +++ b/src/Models/CommitLink.cs @@ -1,9 +1,10 @@ using System; using System.Collections.Generic; +using System.Text.RegularExpressions; namespace SourceGit.Models { - public class CommitLink + public partial class CommitLink { public string Name { get; set; } = null; public string URLPrefix { get; set; } = null; @@ -14,6 +15,9 @@ namespace SourceGit.Models URLPrefix = prefix; } + [GeneratedRegex(@"^(http|https)://[^/]*gitlab[^/]*(:[0-9]+)?.*$")] + private static partial Regex REG_GITLAB(); + public static List Get(List remotes) { var outs = new List(); @@ -28,7 +32,7 @@ namespace SourceGit.Models if (url.StartsWith("https://github.com/", StringComparison.Ordinal)) outs.Add(new($"GitHub ({trimmedUrl[19..]})", $"{url}/commit/")); - else if (url.StartsWith("https://gitlab.", StringComparison.Ordinal)) + else if (REG_GITLAB().IsMatch(url)) outs.Add(new($"GitLab ({trimmedUrl[(trimmedUrl[15..].IndexOf('/') + 16)..]})", $"{url}/-/commit/")); else if (url.StartsWith("https://gitee.com/", StringComparison.Ordinal)) outs.Add(new($"Gitee ({trimmedUrl[18..]})", $"{url}/commit/")); diff --git a/src/Models/Remote.cs b/src/Models/Remote.cs index 6e36cfb9..a2592215 100644 --- a/src/Models/Remote.cs +++ b/src/Models/Remote.cs @@ -8,10 +8,13 @@ namespace SourceGit.Models { [GeneratedRegex(@"^https?://[^/]+/.+[^/\.]$")] private static partial Regex REG_HTTPS(); + [GeneratedRegex(@"^git://[^/]+/.+[^/\.]$")] private static partial Regex REG_GIT(); + [GeneratedRegex(@"^[\w\-]+@[\w\.\-]+(\:[0-9]+)?:([a-zA-z0-9~%][\w\-\./~%]*)?[a-zA-Z0-9](\.git)?$")] private static partial Regex REG_SSH1(); + [GeneratedRegex(@"^ssh://([\w\-]+@)?[\w\.\-]+(\:[0-9]+)?/([a-zA-z0-9~%][\w\-\./~%]*)?[a-zA-Z0-9](\.git)?$")] private static partial Regex REG_SSH2();