Skip to content

Commit df9814b

Browse files
committed
Added support for TFVC versioned item links.
1 parent 7349de9 commit df9814b

File tree

1 file changed

+48
-1
lines changed

1 file changed

+48
-1
lines changed

src/HistoryDiffPageScript.js

+48-1
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ async function GetUserFriendlyStringsForRelationChange(currentProjectName, relat
282282
const [displayText, url, additionalInfo] = data;
283283
let value = `<a href="${url}" target="_parent">${EscapeHtml(displayText)}</a>`;
284284
if (additionalInfo) {
285-
value = `${additionalInfo}: ${value}`;
285+
value = `${EscapeHtml(additionalInfo)}: ${value}`;
286286
}
287287
return [friendlyName, value];
288288
}
@@ -546,6 +546,53 @@ async function TryGetHTMLLinkNameAndUrlForArtifactLink(currentProjectName, artif
546546
});
547547
return [changesetID, url, ''];
548548
}
549+
// Example link to latest version: vstfs:///VersionControl/VersionedItem/%252524%25252FTFVC%252520Project%25252FSomeFile.txt%2526changesetVersion%253DT%2526deletionId%253D0
550+
// Example link to changeset 4: vstfs:///VersionControl/VersionedItem/%252524%25252FTFVC%252520Project%25252FSomeFile.txt%2526changesetVersion%253D4%2526deletionId%253D0
551+
// Example link to changeset 7, file in a folder, filename contains a '&': vstfs:///VersionControl/VersionedItem/%252524%25252FTFVC%252520Project%25252FSome%252520folder%25252FFile%252520%252526%252520And.txt%2526changesetVersion%253DT%2526deletionId%253D0
552+
else if (artifactType === 'VersionedItem') {
553+
// Example for file in a folder, the filename contains a '&':
554+
// artifactId: '%252524%25252FTFVC%252520Project%25252FSome%252520folder%25252FFile%252520%252526%252520And.txt%2526changesetVersion%253DT%2526deletionId%253D0'
555+
// decodeURIComponent(artifactId): '%2524%252FTFVC%2520Project%252FSome%2520folder%252FFile%2520%2526%2520And.txt%26changesetVersion%3DT%26deletionId%3D0'
556+
// decodeURIComponent(decodeURIComponent(artifactId)): '%24%2FTFVC%20Project%2FSome%20folder%2FFile%20%26%20And.txt&changesetVersion=T&deletionId=0'
557+
// decodeURIComponent(decodeURIComponent(decodeURIComponent(artifactId))): '$/TFVC Project/Some folder/File & And.txt&changesetVersion=T&deletionId=0'
558+
// => Need to extract the 'changesetVersion' after the second decodeURIComponent().
559+
const twiceDecoded = decodeURIComponent(decodeURIComponent(artifactId));
560+
const encodedPathAndArgumentsSplit = twiceDecoded.split('&');
561+
562+
const details = SplitArtifactIdForRouteUrl(encodedPathAndArgumentsSplit[0], 3);
563+
if (details.length !== 3) {
564+
return undefined;
565+
}
566+
567+
const [dollar, projectName, filepath] = details;
568+
569+
let changesetVersion;
570+
for (let idx = 1; idx < encodedPathAndArgumentsSplit.length; ++idx) {
571+
const startStr = 'changesetVersion=';
572+
if (encodedPathAndArgumentsSplit[idx].indexOf(startStr) === 0) {
573+
changesetVersion = encodedPathAndArgumentsSplit[idx].substring(startStr.length);
574+
break;
575+
}
576+
}
577+
578+
/*
579+
"routeTemplates": [
580+
"{project}/{team}/_versionControl",
581+
"{project}/_versionControl"
582+
],
583+
*/
584+
const url = await gLocationService.routeUrl(
585+
'ms.vss-code-web.files-route-tfvc',
586+
{
587+
project: projectName,
588+
path: filepath,
589+
version: changesetVersion
590+
});
591+
592+
// 'T' for 'tip'. Compare 'repos-common\Util\Version.js' in the ADO server installation.
593+
const readableChangeset = changesetVersion === 'T' ? 'Latest changeset' : `Changeset ${changesetVersion}`;
594+
return [filepath, url, readableChangeset];
595+
}
549596
}
550597

551598
// Unknown artifact link.

0 commit comments

Comments
 (0)