Skip to content

Commit 10d6370

Browse files
authored
Merge pull request #102 from github/repo-sync
repo sync
2 parents a8acccc + cf7ffc9 commit 10d6370

File tree

3 files changed

+28
-9
lines changed

3 files changed

+28
-9
lines changed

lib/old-versions-utils.js

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ const newVersions = Object.keys(require('./all-versions'))
1515

1616
// Given a new version like enterprise-server@2.21,
1717
// return an old version like 2.21.
18-
// Fall back to latest version if one can't be found.
18+
// Fall back to latest GHES version if one can't be found,
19+
// for example, if the new version is private-instances@latest.
1920
function getOldVersionFromNewVersion (newVersion) {
2021
return newVersion === nonEnterpriseDefaultVersion
2122
? 'dotcom'
@@ -24,7 +25,7 @@ function getOldVersionFromNewVersion (newVersion) {
2425

2526
// Given an old version like 2.21,
2627
// return a new version like enterprise-server@2.21.
27-
// Fall back to latest version if one can't be found.
28+
// Fall back to latest GHES version if one can't be found.
2829
function getNewVersionFromOldVersion (oldVersion) {
2930
return oldVersion === 'dotcom'
3031
? nonEnterpriseDefaultVersion
@@ -33,17 +34,32 @@ function getNewVersionFromOldVersion (oldVersion) {
3334

3435
// Given an old path like /enterprise/2.21/user/github/category/article,
3536
// return an old version like 2.21.
36-
function getOldVersionFromOldPath (oldPath) {
37+
function getOldVersionFromOldPath (oldPath, languageCode) {
38+
// We should never be calling this function on a path that starts with a new version,
39+
// so we can assume the path either uses the old /enterprise format or it's dotcom.
3740
if (!patterns.enterprise.test(oldPath)) return 'dotcom'
41+
3842
const ghesNumber = oldPath.match(patterns.getEnterpriseVersionNumber)
3943
return ghesNumber ? ghesNumber[1] : latest
4044
}
4145

4246
// Given an old path like /en/enterprise/2.21/user/github/category/article,
4347
// return a new path like /en/enterprise-server@2.21/github/category/article.
4448
function getNewVersionedPath (oldPath, languageCode = '') {
45-
const oldVersion = getOldVersionFromOldPath(oldPath)
46-
const newVersion = getNewVersionFromOldVersion(oldVersion)
49+
// It's possible a new version has been injected into an old path
50+
// via syntax like: /en/enterprise/{{ currentVersion }}/admin/category/article
51+
// which could resolve to /en/enterprise/private-instances@latest/admin/category/article,
52+
// in which case the new version is the `private-instances@latest` segment.
53+
// Get the second or third segment depending on whether there is a lang code.
54+
const pathParts = oldPath.split('/')
55+
const possibleVersion = languageCode ? pathParts[3] : pathParts[2]
56+
let newVersion = newVersions.includes(possibleVersion) ? possibleVersion : ''
57+
58+
// If no new version was found, assume path contains an old version, like 2.21
59+
if (!newVersion) {
60+
const oldVersion = getOldVersionFromOldPath(oldPath, languageCode)
61+
newVersion = getNewVersionFromOldVersion(oldVersion)
62+
}
4763

4864
// Remove /<lang>?/enterprise?/<version>?/user? if present.
4965
// This leaves only the part of the string that starts with the product.

lib/path-utils.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@ function getVersionedPathWithoutLanguage (href, version) {
2222
// example: enterprise-server@2.22 or free-pro-team@latest
2323
let versionFromPath = getVersionStringFromPath(href)
2424

25-
// if this is an old versioned path, convert to new versioned path
26-
// OLD: /enterprise/2.22/admin/installation or /enterprise/admin/installation
25+
// if versionFromPath doesn't match any current versions, this may be an old
26+
// versioned path that should be converted to new versioned path. Examples:
27+
// OLD: /enterprise/2.22/admin/installation OR /enterprise/admin/installation
2728
// NEW: /enterprise-server@2.22/admin/installation
2829
// OLD: /desktop/installing-and-configuring-github-desktop
2930
// NEW: /free-pro-team@latest/desktop/installing-and-configuring-github-desktop

lib/patterns.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@ module.exports = {
3333
oldApiPath: /\/v[34]\/(?!guides|overview).+?\/.+/,
3434
staticRedirect: /<link rel="canonical" href="(.+?)">/,
3535
enterpriseNoVersion: /\/enterprise\/([^\d].*$)/,
36-
// currentVersion in Liquid statements may inject 'enterprise-server@release' into old paths
37-
oldEnterprisePath: /\/([a-z]{2}\/)?(enterprise\/)?(enterprise-server@)?(\d.\d+\/)?(user[/$])?/,
36+
// a {{ currentVersion }} in internal links may inject '<new-version@release>' into old paths,
37+
// so the oldEnterprisePath regex must match: /enterprise/private-instances@latest/user,
38+
// /enterprise/enterprise-server@2.22/user, /enterprise/2.22/user, and /enterprise/user
39+
oldEnterprisePath: /\/([a-z]{2}\/)?(enterprise\/)?(\S+?@(\S+?\/))?(\d.\d+\/)?(user[/$])?/,
3840
// new versioning format patterns
3941
adminProduct: /\/admin(\/|$|\?|#)/,
4042
enterpriseServer: /\/enterprise-server@/,

0 commit comments

Comments
 (0)