Skip to content

Commit

Permalink
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 2 deletions.
26 changes: 25 additions & 1 deletion src/SourceLink.GitLab.UnitTests/GetSourceLinkUrlTests.cs
Expand Up @@ -50,7 +50,31 @@ public void BuildSourceLinkUrl(string s1, string s2)

bool result = task.Execute();
AssertEx.AssertEqualToleratingWhitespaceDifferences("", engine.Log);
AssertEx.AreEqual("https://domain.com/x/y/a/b/raw/0123456789abcdefABCDEF000000000000000000/*", task.SourceLinkUrl);
AssertEx.AreEqual("https://domain.com/x/y/a/b/-/raw/0123456789abcdefABCDEF000000000000000000/*", task.SourceLinkUrl);
Assert.True(result);
}

[Theory]
[InlineData("", "/", "11.0")]
[InlineData("/", "", "11.0")]
[InlineData("/", "/", "11.0")]
public void BuildSourceLinkUrl_DeprecatedVersion(string s1, string s2, string version)
{
var engine = new MockEngine();

var task = new GetSourceLinkUrl()
{
BuildEngine = engine,
SourceRoot = new MockItem("/src/", KVP("RepositoryUrl", "http://subdomain.mygitlab.com:100/a/b" + s1), KVP("SourceControl", "git"), KVP("RevisionId", "0123456789abcdefABCDEF000000000000000000")),
Hosts = new[]
{
new MockItem("mygitlab.com", KVP("ContentUrl", "https://domain.com/x/y" + s2), KVP("Version", version)),
}
};

bool result = task.Execute();
AssertEx.AssertEqualToleratingWhitespaceDifferences("", engine.Log);
AssertEx.AreEqual("https://domain.com/raw/x/y/a/b/0123456789abcdefABCDEF000000000000000000/*", task.SourceLinkUrl);
Assert.True(result);
}
}
Expand Down
29 changes: 28 additions & 1 deletion src/SourceLink.GitLab/GetSourceLinkUrl.cs
Expand Up @@ -18,7 +18,34 @@ public sealed class GetSourceLinkUrl : GetSourceLinkUrlGitTask
protected override string HostsItemGroupName => "SourceLinkGitLabHost";
protected override string ProviderDisplayName => "GitLab";

private const string VersionMetadataName = "Version";

// see https://gitlab.com/gitlab-org/gitlab/-/issues/28848
// see https://gitlab.com/gitlab-org/gitlab-foss/-/blob/v14.1.2/config/routes/repository_deprecated.rb
private static readonly Version s_versionWithNewUrlFormat = new Version(12, 0);

protected override string? BuildSourceLinkUrl(Uri contentUri, Uri gitUri, string relativeUrl, string revisionId, ITaskItem? hostItem)
=> UriUtilities.Combine(UriUtilities.Combine(contentUri.ToString(), relativeUrl), "raw/" + revisionId + "/*");
{
var path = GetVersion(hostItem) >= s_versionWithNewUrlFormat
? "-/raw/" + revisionId + "/*"
: "raw/" + revisionId + "/*";
return UriUtilities.Combine(UriUtilities.Combine(contentUri.ToString(), relativeUrl), path);
}

private Version GetVersion(ITaskItem? hostItem)
{
var versionAsString = hostItem?.GetMetadata(VersionMetadataName);
if (!NullableString.IsNullOrEmpty(versionAsString))
{
if (Version.TryParse(versionAsString, out var version))
{
return version;
}

Log.LogError(CommonResources.ItemOfItemGroupMustSpecifyMetadata, hostItem!.ItemSpec, HostsItemGroupName, VersionMetadataName);
}

return s_versionWithNewUrlFormat;
}
}
}

0 comments on commit 2b41d82

Please sign in to comment.