Skip to content
This repository was archived by the owner on Feb 12, 2023. It is now read-only.

Commit 9628f44

Browse files
Merge pull request #212 from Ducatel/add-urlencode-filename-token
Add urlencode filename token
2 parents 3ef11e0 + f17b9be commit 9628f44

File tree

6 files changed

+33
-11
lines changed

6 files changed

+33
-11
lines changed

CONTRIBUTORS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
# Please keep the list sorted.
1212

1313
Andrew Arnott <[email protected]>
14+
David Ducatel <[email protected]>
1415
Geert van Horrik <[email protected]>
1516
Wesley Eledui <[email protected]>
1617
Marek Fišera <[email protected]>

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ When working with a repository using uncommon URL you can use placeholders to sp
7070

7171
GitLink.exe <pdbfile> -u "https://host/projects/catel/repos/catel/browse/{filename}?at={revision}&raw"
7272

73+
Or if you require URL encoded filename you can use `urlencoded_filename` token
74+
75+
GitLink.exe <pdbfile> -u "http://host/api/v4/projects/42/repository/files/{urlencoded_filename}/raw?ref={revision}"
76+
7377
The custom url will be used to fill the placeholders with the relative file path and the revision hash.
7478

7579
### Git repository location

src/GitLink.Tests/Providers/CustomUrlProviderFacts.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public class TheInitialization
2525
[TestCase("https://example.com/repo", false)]
2626
[TestCase("https://bitbucket.intra.company.com/projects/aaa/repos/a/browse/{filename}?raw", true)]
2727
[TestCase("gopher://example.com/repo", false)]
28+
[TestCase("http://gitlab.com/api/v4/projects/42/repository/files/{urlencoded_filename}/raw?ref={revision}&private_token=superToken", true)]
2829
public void CorrectlyValidatesForUrls(string url, bool expectedValue)
2930
{
3031
var provider = new CustomUrlProvider();
@@ -73,14 +74,16 @@ public void ReturnsNullProjectUrl()
7374
Assert.IsNull(provider.ProjectUrl);
7475
}
7576

76-
[TestCase]
77-
public void ReturnsValidRawGitUrl()
77+
[TestCase(CorrectUrl)]
78+
[TestCase("http://gitlab.com/api/v4/projects/42/repository/files/{urlencoded_filename}/raw?ref={revision}&private_token=superToken")]
79+
public void ReturnsValidRawGitUrl(string url)
7880
{
7981
var provider = new CustomUrlProvider();
80-
provider.Initialize(CorrectUrl);
82+
provider.Initialize(url);
8183

82-
string correctReturnedUrl = CorrectUrl.Replace("{filename}", "%var2%");
83-
correctReturnedUrl = correctReturnedUrl.Replace("{revision}", "{0}");
84+
string correctReturnedUrl = url.Replace("{filename}", "%var2%")
85+
.Replace("{revision}", "{0}")
86+
.Replace("{urlencoded_filename}", "%var2%");
8487

8588
Assert.AreEqual(correctReturnedUrl, provider.RawGitUrl);
8689
}

src/GitLink/GitLink.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,7 @@
2626
<ItemGroup>
2727
<Content Include="Logo.ico" />
2828
</ItemGroup>
29+
<ItemGroup>
30+
<Reference Include="System.Web" />
31+
</ItemGroup>
2932
</Project>

src/GitLink/Linker.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ namespace GitLink
1212
using System.IO;
1313
using System.Linq;
1414
using System.Reflection;
15+
using System.Web;
1516
using Catel;
1617
using Catel.Logging;
1718
using GitTools;
@@ -28,6 +29,7 @@ public static class Linker
2829
private static readonly ILog Log = LogManager.GetCurrentClassLogger();
2930

3031
private static readonly string FilenamePlaceholder = Uri.EscapeUriString("{filename}");
32+
private static readonly string UrlEncodedFileNamePlaceHolder = Uri.EscapeUriString("{urlencoded_filename}");
3133
private static readonly string RevisionPlaceholder = Uri.EscapeUriString("{revision}");
3234
private static readonly string PdbStrExePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "pdbstr.exe");
3335
private static readonly string[] ExtensionsToIgnore = new string[] { ".g.cs" };
@@ -170,17 +172,18 @@ public static class Linker
170172
}
171173

172174
string rawUrl = provider.RawGitUrl;
173-
if (rawUrl.Contains(RevisionPlaceholder) || rawUrl.Contains(FilenamePlaceholder))
175+
if (rawUrl.Contains(RevisionPlaceholder) || rawUrl.Contains(FilenamePlaceholder) || rawUrl.Contains(UrlEncodedFileNamePlaceHolder))
174176
{
175-
if (!rawUrl.Contains(RevisionPlaceholder) || !rawUrl.Contains(FilenamePlaceholder))
177+
if (!rawUrl.Contains(RevisionPlaceholder) || !(rawUrl.Contains(FilenamePlaceholder) || rawUrl.Contains(UrlEncodedFileNamePlaceHolder)))
176178
{
177179
Log.Error("Supplied custom URL pattern must contain both a revision and a filename placeholder.");
178180
return false;
179181
}
180182

181183
rawUrl = rawUrl
182184
.Replace(RevisionPlaceholder, "{0}")
183-
.Replace(FilenamePlaceholder, "%var2%");
185+
.Replace(FilenamePlaceholder, "%var2%")
186+
.Replace(UrlEncodedFileNamePlaceHolder, "%var2%");
184187
}
185188
else
186189
{
@@ -217,6 +220,11 @@ public static class Linker
217220
if (sourceFile.Value != null)
218221
{
219222
var relativePathForUrl = ReplaceSlashes(provider, sourceFile.Value);
223+
if (provider.RawGitUrl.Contains(UrlEncodedFileNamePlaceHolder))
224+
{
225+
relativePathForUrl = HttpUtility.UrlEncode(relativePathForUrl);
226+
}
227+
220228
srcSrvContext.Paths.Add(Tuple.Create(sourceFile.Key, relativePathForUrl));
221229
}
222230
}

src/GitLink/Providers/CustomUrlProvider.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ namespace GitLink.Providers
1212
public sealed class CustomUrlProvider : ProviderBase
1313
{
1414
private const string FileNamePlaceHolder = "{filename}";
15+
private const string UrlEncodedFileNamePlaceHolder = "{urlencoded_filename}";
1516
private const string RevisionPlaceHolder = "{revision}";
1617
private static readonly Regex HostingUrlPattern = new Regex(@"https?://.+");
1718

@@ -27,14 +28,16 @@ public CustomUrlProvider()
2728
public override bool Initialize(string url)
2829
{
2930
if (string.IsNullOrEmpty(url) || !HostingUrlPattern.IsMatch(url) ||
30-
(!url.Contains(FileNamePlaceHolder) && !url.Contains(RevisionPlaceHolder)))
31+
(!(url.Contains(FileNamePlaceHolder) || url.Contains(UrlEncodedFileNamePlaceHolder)) &&
32+
!url.Contains(RevisionPlaceHolder)))
3133
{
3234
return false;
3335
}
3436

35-
if (url.Contains(FileNamePlaceHolder))
37+
if (url.Contains(FileNamePlaceHolder) || url.Contains(UrlEncodedFileNamePlaceHolder))
3638
{
37-
_rawUrl = url.Replace(FileNamePlaceHolder, "%var2%");
39+
_rawUrl = url.Replace(FileNamePlaceHolder, "%var2%")
40+
.Replace(UrlEncodedFileNamePlaceHolder, "%var2%");
3841
}
3942

4043
if (url.Contains(RevisionPlaceHolder))

0 commit comments

Comments
 (0)