Skip to content

Commit f41b02a

Browse files
authored
Merge pull request #87 from github/repo-sync
repo sync
2 parents f051853 + 0b1c7ad commit f41b02a

14 files changed

+211
-201
lines changed

lib/patterns.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,5 @@ module.exports = {
3838
// new versioning format patterns
3939
adminProduct: /\/admin(\/|$|\?|#)/,
4040
enterpriseServer: /\/enterprise-server@/,
41-
getEnterpriseServerNumber: /\/enterprise-server@(\d+\.\d+)/
41+
getEnterpriseServerNumber: /enterprise-server@(\d+\.\d+)/
4242
}

lib/remove-deprecated-frontmatter.js

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,22 @@
1-
module.exports = function removeDeprecatedFrontmatter (data, devCheckout, versionToDeprecate, nextOldestVersion) {
2-
// there are currently different frontmatter conventions for developer docs vs. help docs
3-
if (devCheckout) {
4-
// skip files with no exclude_version frontmatter
5-
if (!data.exclude_version) return data
1+
const { getEnterpriseServerNumber } = require('./patterns')
62

7-
// remove frontmatter like exclude_version: - "2.13"
8-
if (data.exclude_version.includes(`${versionToDeprecate}`)) {
9-
data.exclude_version = data.exclude_version.filter(version => !version.match(versionToDeprecate))
3+
module.exports = function removeDeprecatedFrontmatter (file, frontmatterVersions, versionToDeprecate, nextOldestVersion) {
4+
// skip files with no versions or Enterprise Server versions frontmatter
5+
if (!frontmatterVersions) return
6+
if (!frontmatterVersions['enterprise-server']) return
107

11-
if (!data.exclude_version.length) delete data.exclude_version
12-
}
13-
} else {
14-
// skip files with no versions or Enterprise versions frontmatter
15-
if (!data.versions) return data
16-
if (!data.versions.enterprise) return data
8+
const enterpriseRange = frontmatterVersions['enterprise-server']
179

18-
// change frontmatter like enterprise: '>=2.13' to enterprise: '*'
19-
if (data.versions.enterprise === `>=${versionToDeprecate}` || data.versions.enterprise === `>=${nextOldestVersion}`) {
20-
data.versions.enterprise = '*'
21-
}
22-
}
10+
// skip files with versions frontmatter that applies to all enterprise-server releases
11+
if (enterpriseRange === '*') return
12+
13+
// get the release numbers alone
14+
const releaseToDeprecate = versionToDeprecate.match(getEnterpriseServerNumber)[1]
15+
const nextOldestRelease = nextOldestVersion.match(getEnterpriseServerNumber)[1]
2316

24-
return data
17+
// if the release to deprecate is 2.13, and the FM is either '>=2.13' or '>=2.14',
18+
// we can safely change the FM to enterprise-server: '*'
19+
if (enterpriseRange === `>=${releaseToDeprecate}` || enterpriseRange === `>=${nextOldestRelease}`) {
20+
frontmatterVersions['enterprise-server'] = '*'
21+
}
2522
}

lib/remove-liquid-statements.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@ module.exports = function removeLiquidStatements (content, versionToDeprecate, n
2525
// see tests/fixtures/remove-liquid-statements for examples
2626
const regexes = {
2727
// remove liquid only
28-
greaterThanVersionToDeprecate: new RegExp(startTag.source + ` if ?(?: page.version == ('|")'?dotcom'?('|") ?or)? page.version ver_gte? ('|")${versionToDeprecate}('|") ` + endTag.source, 'gm'),
29-
andGreaterThanVersionToDeprecate1: new RegExp('(' + startTag.source + ` if .*?) and page.version ver_gte? (?:'|")${versionToDeprecate}(?:'|")( ` + endTag.source + ')', 'gm'),
30-
andGreaterThanVersionToDeprecate2: new RegExp('(' + startTag.source + ` if )page.version ver_gte? (?:'|")${versionToDeprecate}(?:'|") and (.*? ` + endTag.source + ')', 'gm'),
31-
notEqualsVersionToDeprecate: new RegExp('(' + startTag.source + ` if)(?:( page.version .*?) or)? page.version != (?:'|")${versionToDeprecate}(?:'|")( ` + endTag.source + ')', 'gm'),
32-
andNotEqualsVersionToDeprecate: new RegExp('(' + startTag.source + ` if .*?) and page.version != (?:'|")${versionToDeprecate}(?:'|")( ` + endTag.source + ')', 'gm'),
28+
greaterThanVersionToDeprecate: new RegExp(startTag.source + ` if ?(?: currentVersion == ('|")'?free-pro-team@latest'?('|") ?or)? currentVersion ver_gt ('|")${versionToDeprecate}('|") ` + endTag.source, 'gm'),
29+
andGreaterThanVersionToDeprecate1: new RegExp('(' + startTag.source + ` if .*?) and currentVersion ver_gt (?:'|")${versionToDeprecate}(?:'|")( ` + endTag.source + ')', 'gm'),
30+
andGreaterThanVersionToDeprecate2: new RegExp('(' + startTag.source + ` if )currentVersion ver_gt (?:'|")${versionToDeprecate}(?:'|") and (.*? ` + endTag.source + ')', 'gm'),
31+
notEqualsVersionToDeprecate: new RegExp('(' + startTag.source + ` if)(?:( currentVersion .*?) or)? currentVersion != (?:'|")${versionToDeprecate}(?:'|")( ` + endTag.source + ')', 'gm'),
32+
andNotEqualsVersionToDeprecate: new RegExp('(' + startTag.source + ` if .*?) and currentVersion != (?:'|")${versionToDeprecate}(?:'|")( ` + endTag.source + ')', 'gm'),
3333
// remove liquid and content
3434
lessThanNextOldestVersion: new RegExp(startTag.source + ` if .*?ver_lt ('|")${nextOldestVersion}('|") ?` + endTag.source, 'm'),
3535
equalsVersionToDeprecate: new RegExp(startTag.source + ` if .*?== ('|")${versionToDeprecate}('|") ?` + endTag.source, 'm')

script/remove-deprecated-enterprise-version-markup.js

Lines changed: 62 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -4,83 +4,92 @@ const fs = require('fs')
44
const path = require('path')
55
const walk = require('walk-sync')
66
const matter = require('gray-matter')
7-
const readlineSync = require('readline-sync')
7+
const program = require('commander')
8+
const { indexOf, nth } = require('lodash')
89
const removeLiquidStatements = require('../lib/remove-liquid-statements')
910
const removeDeprecatedFrontmatter = require('../lib/remove-deprecated-frontmatter')
10-
const versionToDeprecate = require('../lib/enterprise-server-releases').deprecated[0]
11-
const nextOldestVersion = require('../lib/enterprise-server-releases').oldestSupported
12-
const devCheckout = process.argv[2]
13-
const prompt = `This script will run in the current checkout of help.github.com.
14-
Is that what you want? Press Y to continue, or enter any other key to cancel: `
11+
const enterpriseServerReleases = require('../lib/enterprise-server-releases')
12+
const contentPath = path.join(__dirname, '../content')
13+
const dataPath = path.join(__dirname, '../data')
14+
const removeUnusedAssetsScript = 'script/remove-unused-assets'
15+
const elseifRegex = /{-?% elsif/
1516

1617
// [start-readme]
1718
//
1819
// Run this script after an Enterprise deprecation to remove Liquid statements and frontmatter that contain the deprecated Enterprise version.
1920
// See the Enterprise deprecation issue template for instructions.
2021
//
21-
// You can run this script on either the help docs or the developer docs. To run it on the help docs, enter:
22-
//
23-
// `script/remove-deprecated-enterprise-version-markup.js`
24-
//
25-
// To run it on the developer docs, provide a path to your developer docs checkout as an argument. You can use a tilde to represent your home directory. For example:
26-
//
27-
// `script/remove-deprecated-enterprise-version-markup.js ~/Desktop/internal-developer.github.com/`
28-
//
2922
// [end-readme]
3023

31-
let contentDir = path.join(__dirname, '../content')
32-
let dataDir = path.join(__dirname, '../data')
33-
34-
const elseifRegex = /{-?% elsif/
24+
program
25+
.description('Remove Liquid conditionals and update versions frontmatter for a given Enterprise Server release.')
26+
.option('-r, --release <NUMBER>', 'Enterprise Server release number. Example: 2.19')
27+
.parse(process.argv)
28+
29+
// verify CLI options
30+
if (!program.release) {
31+
console.log(program.description() + '\n')
32+
program.options.forEach(opt => {
33+
console.log(opt.flags)
34+
console.log(opt.description + '\n')
35+
})
36+
process.exit(1)
37+
}
3538

36-
// determine whether to run the script on help docs or developer docs
37-
if (devCheckout) {
38-
try {
39-
process.chdir(devCheckout)
40-
console.log('OK, the script will run in ' + devCheckout)
41-
contentDir = path.join(devCheckout, 'content')
42-
dataDir = path.join(devCheckout, 'data')
43-
} catch (err) {
44-
console.log('No such directory! ' + devCheckout)
45-
}
46-
} else {
47-
const answer = readlineSync.question(prompt)
48-
49-
if (!answer.match(/^Y$/mi)) {
50-
console.log('Exiting!')
51-
process.exit()
52-
}
39+
if (!enterpriseServerReleases.all.includes(program.release)) {
40+
console.log(`You specified ${program.release}! Please specify a supported or deprecated release number from lib/enterprise-server-releases.js`)
41+
process.exit(1)
5342
}
5443

44+
const versionToDeprecate = `enterprise-server@${program.release}`
45+
const currentIndex = indexOf(enterpriseServerReleases.all, program.release)
46+
const nextOldestRelease = nth(enterpriseServerReleases.all, currentIndex - 1)
47+
const nextOldestVersion = `enterprise-server@${nextOldestRelease}`
48+
49+
console.log(`Deprecating ${versionToDeprecate}!\n`)
50+
console.log(`Next oldest version: ${nextOldestVersion}\n`)
51+
5552
// gather content and data files
56-
const contentFiles = walk(contentDir, { includeBasePath: true })
57-
.filter(relativePath => relativePath.endsWith('.md') && !relativePath.match(/README/i))
53+
const contentFiles = walk(contentPath, { includeBasePath: true, directories: false })
54+
.filter(file => file.endsWith('.md'))
55+
.filter(file => !(file.endsWith('README.md') || file === 'LICENSE'))
5856

59-
const dataFiles = walk(dataDir, { includeBasePath: true })
60-
.filter(relativePath => relativePath.endsWith('.yml') || relativePath.endsWith('.md'))
61-
.filter(relativePath => !relativePath.includes('/graphql/'))
57+
const dataFiles = walk(dataPath, { includeBasePath: true, directories: false })
58+
.filter(file => file.includes('data/reusables') || file.includes('data/variables'))
59+
.filter(file => !file.endsWith('README.md'))
6260

63-
const files = contentFiles.concat(dataFiles)
61+
const allFiles = contentFiles.concat(dataFiles)
6462

6563
main()
66-
console.log(`Removed ${versionToDeprecate} markup from content and data files! Review and run script/test.`)
64+
console.log(`\nRunning ${removeUnusedAssetsScript}...`)
65+
require(`../${removeUnusedAssetsScript}`)
66+
67+
function printElseIfFoundWarning (location) {
68+
console.log(`${location} has an 'elsif' condition! Resolve all elsifs by hand, then rerun the script.`)
69+
}
6770

6871
function main () {
69-
files.forEach(file => {
72+
allFiles.forEach(file => {
7073
const oldContents = fs.readFileSync(file, 'utf8')
7174
const { content, data } = matter(oldContents)
7275

73-
// can't safely handle elseifs programmatically, too many possible outcomes
74-
// (only intro and title frontmatter are likely to contain elseif tags)
75-
if (content.match(elseifRegex) || (data.intro && data.intro.match(elseifRegex)) || (data.title && data.title.match(elseifRegex))) {
76-
console.log(`${file} has an 'elsif' condition! Resolve all elsifs by hand, then rerun the script.`)
76+
// we can't safely handle elseifs programmatically, too many possible outcomes
77+
if (elseifRegex.test(content)) {
78+
printElseIfFoundWarning(`content in ${file}`)
7779
process.exit()
7880
}
7981

80-
// update frontmatter data (i.e., productVersions field)
81-
const newData = removeDeprecatedFrontmatter(data, devCheckout, versionToDeprecate, nextOldestVersion)
82+
Object.keys(data).forEach(key => {
83+
if (elseifRegex.test(data[key])) {
84+
printElseIfFoundWarning(`frontmatter '${key}' in ${file}`)
85+
process.exit()
86+
}
87+
})
88+
89+
// update frontmatter versions prop
90+
removeDeprecatedFrontmatter(file, data.versions, versionToDeprecate, nextOldestVersion)
8291

83-
// update liquid statements in body content
92+
// update liquid statements in content and data
8493
const newContent = removeLiquidStatements(content, versionToDeprecate, nextOldestVersion)
8594

8695
// make sure any intro fields that exist and are empty return an empty string, not null
@@ -89,8 +98,10 @@ function main () {
8998
}
9099

91100
// put it all back together
92-
const newContents = matter.stringify(newContent, newData, { lineWidth: 10000 })
101+
const newContents = matter.stringify(newContent, data, { lineWidth: 10000 })
93102

94103
fs.writeFileSync(file, newContents)
95104
})
105+
106+
console.log(`Removed ${versionToDeprecate} markup from content and data files! Review and run script/test.`)
96107
}

0 commit comments

Comments
 (0)