Skip to content

Commit 549ba6a

Browse files
authored
Fix GHES version comparison in update-files script (#56175)
1 parent 75a25cf commit 549ba6a

File tree

2 files changed

+88
-10
lines changed

2 files changed

+88
-10
lines changed

src/rest/scripts/utils/update-markdown.js

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,26 @@ export async function updateRestFiles() {
2727

2828
// Reads data files from the directory provided and returns a
2929
// JSON object that lists the versions for each category/subcategory
30+
/**
31+
* Extract GHES version from a file path if it's a GHES directory
32+
* @param {string} filePath - File path to parse
33+
* @returns {string|null} - GHES version or null if not a GHES file
34+
*/
35+
export function getGHESVersionFromFilepath(filePath) {
36+
// Normalize path separators to handle both Unix and Windows paths
37+
const normalizedPath = filePath.replace(/\\/g, '/')
38+
const pathParts = normalizedPath.split('/')
39+
const ghesDir = pathParts.find((part) => part.startsWith('ghes-'))
40+
41+
if (!ghesDir) {
42+
return null
43+
}
44+
45+
// Extract version from ghes-X.Y or ghes-X.Y-YYYY-MM-DD format
46+
const versionMatch = ghesDir.match(/^ghes-(\d+\.\d+)/)
47+
return versionMatch ? versionMatch[1] : null
48+
}
49+
3050
// The data files are split up by version, so all files must be
3151
// read to get a complete list of versions.
3252
async function getDataFrontmatter(dataDirectory, schemaFilename) {
@@ -36,16 +56,15 @@ async function getDataFrontmatter(dataDirectory, schemaFilename) {
3656
// the most recent deprecated version but still allow data to exist.
3757
// This makes the deprecation steps easier.
3858
.filter((file) => {
39-
return !deprecated.some((depVersion) =>
40-
file.split(path.sep).find((pathSplit) => {
41-
if (pathSplit.startsWith('ghes')) {
42-
// An example version format is: ghes-3.6 or ghes-3.6-2022-01-01
43-
const ghesVersion = pathSplit.split('-')[1]
44-
return ghesVersion === depVersion
45-
}
46-
return false
47-
}),
48-
)
59+
const ghesVersion = getGHESVersionFromFilepath(file)
60+
61+
// If it's not a GHES file, include it (e.g., ghae, fpt, ghec)
62+
if (!ghesVersion) {
63+
return true
64+
}
65+
66+
// If it's a GHES file, exclude it only if the version is deprecated
67+
return !deprecated.includes(ghesVersion)
4968
})
5069

5170
const restVersions = {}

src/rest/tests/update-markdown.js

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import { describe, expect, test } from 'vitest'
2+
import { getGHESVersionFromFilepath } from '../scripts/utils/update-markdown.js'
3+
4+
describe('GHES version extraction for update-markdown', () => {
5+
test('extracts GHES version from file path with date suffix', () => {
6+
const filePath = 'src/rest/data/ghes-3.10-2022-11-28/schema.json'
7+
expect(getGHESVersionFromFilepath(filePath)).toBe('3.10')
8+
})
9+
10+
test('extracts GHES version from file path without date suffix', () => {
11+
const filePath = 'src/rest/data/ghes-3.6/schema.json'
12+
expect(getGHESVersionFromFilepath(filePath)).toBe('3.6')
13+
})
14+
15+
test('returns null for non-GHES file paths', () => {
16+
expect(getGHESVersionFromFilepath('src/rest/data/ghae/schema.json')).toBeNull()
17+
expect(getGHESVersionFromFilepath('src/rest/data/fpt-2022-11-28/schema.json')).toBeNull()
18+
expect(getGHESVersionFromFilepath('src/rest/data/ghec-2022-11-28/schema.json')).toBeNull()
19+
})
20+
21+
test('handles various GHES version formats', () => {
22+
expect(getGHESVersionFromFilepath('src/rest/data/ghes-2.22/schema.json')).toBe('2.22')
23+
expect(getGHESVersionFromFilepath('src/rest/data/ghes-3.0-2022-01-01/schema.json')).toBe('3.0')
24+
expect(getGHESVersionFromFilepath('src/rest/data/ghes-3.15-2023-05-15/schema.json')).toBe(
25+
'3.15',
26+
)
27+
})
28+
29+
test('returns null for malformed GHES paths', () => {
30+
expect(getGHESVersionFromFilepath('src/rest/data/ghes-/schema.json')).toBeNull()
31+
expect(getGHESVersionFromFilepath('src/rest/data/ghes-abc/schema.json')).toBeNull()
32+
expect(getGHESVersionFromFilepath('src/rest/data/ghes/schema.json')).toBeNull()
33+
})
34+
35+
test('works with different path separators and nested paths', () => {
36+
const windowsPath = 'src\\rest\\data\\ghes-3.10-2022-11-28\\schema.json'
37+
expect(getGHESVersionFromFilepath(windowsPath)).toBe('3.10')
38+
39+
const nestedPath = 'some/deep/path/src/rest/data/ghes-3.5-2021-12-31/nested/schema.json'
40+
expect(getGHESVersionFromFilepath(nestedPath)).toBe('3.5')
41+
})
42+
43+
test('demonstrates the original bug scenario', () => {
44+
// This test demonstrates the bug described in the issue
45+
// where ghes-3.10 would incorrectly match deprecated version 3.1
46+
const filePath = 'src/rest/data/ghes-3.10-2022-11-28/schema.json'
47+
const extractedVersion = getGHESVersionFromFilepath(filePath)
48+
49+
// Mock deprecated versions array like in the actual code
50+
const deprecated = ['3.0', '3.1', '3.2', '2.22', '2.21']
51+
52+
expect(extractedVersion).toBe('3.10')
53+
// This should be false - 3.10 is NOT in the deprecated list
54+
expect(deprecated.includes(extractedVersion)).toBe(false)
55+
56+
// The old buggy logic would have incorrectly flagged this as deprecated
57+
// because it would find '3.1' as a substring in the path
58+
})
59+
})

0 commit comments

Comments
 (0)