Skip to content

File tree

2 files changed

+63
-7
lines changed

2 files changed

+63
-7
lines changed

src/SourceLink.GitLab.UnitTests/GetSourceLinkUrlTests.cs

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,15 @@ public void EmptyHosts()
3030
}
3131

3232
[Theory]
33-
[InlineData("", "")]
34-
[InlineData("", "/")]
35-
[InlineData("/", "")]
36-
[InlineData("/", "/")]
37-
public void BuildSourceLinkUrl(string s1, string s2)
33+
[InlineData("", "", null)]
34+
[InlineData("", "/", null)]
35+
[InlineData("/", "", null)]
36+
[InlineData("/", "/", null)]
37+
[InlineData("", "", "12.0")]
38+
[InlineData("", "/", "12.0")]
39+
[InlineData("/", "", "12.0")]
40+
[InlineData("/", "/", "12.0")]
41+
public void BuildSourceLinkUrl(string s1, string s2, string version)
3842
{
3943
var engine = new MockEngine();
4044

@@ -44,7 +48,33 @@ public void BuildSourceLinkUrl(string s1, string s2)
4448
SourceRoot = new MockItem("/src/", KVP("RepositoryUrl", "http://subdomain.mygitlab.com:100/a/b" + s1), KVP("SourceControl", "git"), KVP("RevisionId", "0123456789abcdefABCDEF000000000000000000")),
4549
Hosts = new[]
4650
{
47-
new MockItem("mygitlab.com", KVP("ContentUrl", "https://domain.com/x/y" + s2)),
51+
version == null
52+
? new MockItem("mygitlab.com", KVP("ContentUrl", "https://domain.com/x/y" + s2))
53+
: new MockItem("mygitlab.com", KVP("ContentUrl", "https://domain.com/x/y" + s2), KVP("Version", version)),
54+
}
55+
};
56+
57+
bool result = task.Execute();
58+
AssertEx.AssertEqualToleratingWhitespaceDifferences("", engine.Log);
59+
AssertEx.AreEqual("https://domain.com/x/y/a/b/-/raw/0123456789abcdefABCDEF000000000000000000/*", task.SourceLinkUrl);
60+
Assert.True(result);
61+
}
62+
63+
[Theory]
64+
[InlineData("", "/", "11.0")]
65+
[InlineData("/", "", "11.0")]
66+
[InlineData("/", "/", "11.0")]
67+
public void BuildSourceLinkUrl_DeprecatedVersion(string s1, string s2, string version)
68+
{
69+
var engine = new MockEngine();
70+
71+
var task = new GetSourceLinkUrl()
72+
{
73+
BuildEngine = engine,
74+
SourceRoot = new MockItem("/src/", KVP("RepositoryUrl", "http://subdomain.mygitlab.com:100/a/b" + s1), KVP("SourceControl", "git"), KVP("RevisionId", "0123456789abcdefABCDEF000000000000000000")),
75+
Hosts = new[]
76+
{
77+
new MockItem("mygitlab.com", KVP("ContentUrl", "https://domain.com/x/y" + s2), KVP("Version", version)),
4878
}
4979
};
5080

src/SourceLink.GitLab/GetSourceLinkUrl.cs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,33 @@ public sealed class GetSourceLinkUrl : GetSourceLinkUrlGitTask
1818
protected override string HostsItemGroupName => "SourceLinkGitLabHost";
1919
protected override string ProviderDisplayName => "GitLab";
2020

21+
private const string VersionMetadataName = "Version";
22+
23+
// see https://gitlab.com/gitlab-org/gitlab/-/issues/28848
24+
private static readonly Version s_versionWithNewUrlFormat = new Version(12, 0);
25+
2126
protected override string? BuildSourceLinkUrl(Uri contentUri, Uri gitUri, string relativeUrl, string revisionId, ITaskItem? hostItem)
22-
=> UriUtilities.Combine(UriUtilities.Combine(contentUri.ToString(), relativeUrl), "raw/" + revisionId + "/*");
27+
{
28+
var path = GetVersion(hostItem) >= s_versionWithNewUrlFormat
29+
? "-/raw/" + revisionId + "/*"
30+
: "raw/" + revisionId + "/*";
31+
return UriUtilities.Combine(UriUtilities.Combine(contentUri.ToString(), relativeUrl), path);
32+
}
33+
34+
private Version GetVersion(ITaskItem? hostItem)
35+
{
36+
var versionAsString = hostItem?.GetMetadata(VersionMetadataName);
37+
if (!NullableString.IsNullOrEmpty(versionAsString))
38+
{
39+
if (Version.TryParse(versionAsString, out var version))
40+
{
41+
return version;
42+
}
43+
44+
Log.LogError(CommonResources.ItemOfItemGroupMustSpecifyMetadata, hostItem!.ItemSpec, HostsItemGroupName, VersionMetadataName);
45+
}
46+
47+
return s_versionWithNewUrlFormat;
48+
}
2349
}
2450
}

0 commit comments

Comments
 (0)