From efe8c8640908a4a761b754b1a24a3a32c918320d Mon Sep 17 00:00:00 2001 From: David Ducatel Date: Thu, 6 Jun 2019 10:28:39 +0200 Subject: [PATCH] #211 Add `urlencoded_filename` token in custom URL provider --- src/GitLink/GitLink.csproj | 3 +++ src/GitLink/Linker.cs | 14 +++++++++++--- src/GitLink/Providers/CustomUrlProvider.cs | 9 ++++++--- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/GitLink/GitLink.csproj b/src/GitLink/GitLink.csproj index 9609148..2af0dfb 100644 --- a/src/GitLink/GitLink.csproj +++ b/src/GitLink/GitLink.csproj @@ -26,4 +26,7 @@ + + + \ No newline at end of file diff --git a/src/GitLink/Linker.cs b/src/GitLink/Linker.cs index 9ab86fc..e607514 100644 --- a/src/GitLink/Linker.cs +++ b/src/GitLink/Linker.cs @@ -12,6 +12,7 @@ namespace GitLink using System.IO; using System.Linq; using System.Reflection; + using System.Web; using Catel; using Catel.Logging; using GitTools; @@ -28,6 +29,7 @@ public static class Linker private static readonly ILog Log = LogManager.GetCurrentClassLogger(); private static readonly string FilenamePlaceholder = Uri.EscapeUriString("{filename}"); + private static readonly string UrlEncodedFileNamePlaceHolder = Uri.EscapeUriString("{urlencoded_filename}"); private static readonly string RevisionPlaceholder = Uri.EscapeUriString("{revision}"); private static readonly string PdbStrExePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "pdbstr.exe"); private static readonly string[] ExtensionsToIgnore = new string[] { ".g.cs" }; @@ -170,9 +172,9 @@ public static class Linker } string rawUrl = provider.RawGitUrl; - if (rawUrl.Contains(RevisionPlaceholder) || rawUrl.Contains(FilenamePlaceholder)) + if (rawUrl.Contains(RevisionPlaceholder) || rawUrl.Contains(FilenamePlaceholder) || rawUrl.Contains(UrlEncodedFileNamePlaceHolder)) { - if (!rawUrl.Contains(RevisionPlaceholder) || !rawUrl.Contains(FilenamePlaceholder)) + if (!rawUrl.Contains(RevisionPlaceholder) || !(rawUrl.Contains(FilenamePlaceholder) || rawUrl.Contains(UrlEncodedFileNamePlaceHolder))) { Log.Error("Supplied custom URL pattern must contain both a revision and a filename placeholder."); return false; @@ -180,7 +182,8 @@ public static class Linker rawUrl = rawUrl .Replace(RevisionPlaceholder, "{0}") - .Replace(FilenamePlaceholder, "%var2%"); + .Replace(FilenamePlaceholder, "%var2%") + .Replace(UrlEncodedFileNamePlaceHolder, "%var2%"); } else { @@ -217,6 +220,11 @@ public static class Linker if (sourceFile.Value != null) { var relativePathForUrl = ReplaceSlashes(provider, sourceFile.Value); + if (provider.RawGitUrl.Contains(UrlEncodedFileNamePlaceHolder)) + { + relativePathForUrl = HttpUtility.UrlEncode(relativePathForUrl); + } + srcSrvContext.Paths.Add(Tuple.Create(sourceFile.Key, relativePathForUrl)); } } diff --git a/src/GitLink/Providers/CustomUrlProvider.cs b/src/GitLink/Providers/CustomUrlProvider.cs index 07b1cbd..eb1898d 100644 --- a/src/GitLink/Providers/CustomUrlProvider.cs +++ b/src/GitLink/Providers/CustomUrlProvider.cs @@ -12,6 +12,7 @@ namespace GitLink.Providers public sealed class CustomUrlProvider : ProviderBase { private const string FileNamePlaceHolder = "{filename}"; + private const string UrlEncodedFileNamePlaceHolder = "{urlencoded_filename}"; private const string RevisionPlaceHolder = "{revision}"; private static readonly Regex HostingUrlPattern = new Regex(@"https?://.+"); @@ -27,14 +28,16 @@ public CustomUrlProvider() public override bool Initialize(string url) { if (string.IsNullOrEmpty(url) || !HostingUrlPattern.IsMatch(url) || - (!url.Contains(FileNamePlaceHolder) && !url.Contains(RevisionPlaceHolder))) + (!(url.Contains(FileNamePlaceHolder) || url.Contains(UrlEncodedFileNamePlaceHolder)) && + !url.Contains(RevisionPlaceHolder))) { return false; } - if (url.Contains(FileNamePlaceHolder)) + if (url.Contains(FileNamePlaceHolder) || url.Contains(UrlEncodedFileNamePlaceHolder)) { - _rawUrl = url.Replace(FileNamePlaceHolder, "%var2%"); + _rawUrl = url.Replace(FileNamePlaceHolder, "%var2%") + .Replace(UrlEncodedFileNamePlaceHolder, "%var2%"); } if (url.Contains(RevisionPlaceHolder))