1
0
mirror of synced 2025-12-30 21:02:34 -05:00
Files
docs/.github/actions-scripts/content-changes-table-comment.js
2022-05-04 14:34:16 -04:00

97 lines
3.3 KiB
JavaScript
Executable File

#!/usr/bin/env node
import * as github from '@actions/github'
import { setOutput } from '@actions/core'
import { getContents } from '../../script/helpers/git-utils.js'
import parse from '../../lib/read-frontmatter.js'
import getApplicableVersions from '../../lib/get-applicable-versions.js'
import nonEnterpriseDefaultVersion from '../../lib/non-enterprise-default-version.js'
const { GITHUB_TOKEN, APP_URL } = process.env
const context = github.context
if (!GITHUB_TOKEN) {
throw new Error(`GITHUB_TOKEN environment variable not set`)
}
if (!APP_URL) {
throw new Error(`APP_URL environment variable not set`)
}
const PROD_URL = 'https://docs.github.com'
const octokit = github.getOctokit(GITHUB_TOKEN)
const response = await octokit.rest.repos.compareCommitsWithBasehead({
owner: context.repo.owner,
repo: context.payload.repository.name,
basehead: `${context.payload.pull_request.base.sha}...${context.payload.pull_request.head.sha}`,
})
const { files } = response.data
let markdownTable =
'| **Source** | **Preview** | **Production** | **What Changed** |\n|:----------- |:----------- |:----------- |:----------- |\n'
const pathPrefix = 'content/'
const articleFiles = files.filter(
({ filename }) => filename.startsWith(pathPrefix) && !filename.endsWith('/index.md')
)
for (const file of articleFiles) {
const sourceUrl = file.blob_url
const fileName = file.filename.slice(pathPrefix.length)
const fileUrl = fileName.slice(0, fileName.lastIndexOf('.'))
// get the file contents and decode them
// this script is called from the main branch, so we need the API call to get the contents from the branch, instead
const fileContents = await getContents(
context.repo.owner,
context.payload.repository.name,
context.payload.pull_request.head.sha,
file.filename
)
// parse the frontmatter
const { data } = parse(fileContents)
let contentCell = ''
let previewCell = ''
let prodCell = ''
if (file.status === 'added') contentCell = `New file: `
contentCell += `[\`${fileName}\`](${sourceUrl})`
for (const version in data.versions) {
const currentApplicableVersions = getApplicableVersions({
[version]: data.versions[version],
})
if (currentApplicableVersions.length === 1) {
// for fpt, ghec, and ghae
if (currentApplicableVersions.toString() === nonEnterpriseDefaultVersion) {
// omit version from fpt url
previewCell += `[${version}](${APP_URL}/${fileUrl})<br>`
prodCell += `[${version}](${PROD_URL}/${fileUrl})<br>`
} else {
// for non-versioned releases (ghae, ghec) use full url
previewCell += `[${version}](${APP_URL}/${currentApplicableVersions}/${fileUrl})<br>`
prodCell += `[${version}](${PROD_URL}/${currentApplicableVersions}/${fileUrl})<br>`
}
} else {
// for ghes releases, link each version
previewCell += `${version}@ `
prodCell += `${version}@ `
currentApplicableVersions.forEach((ghesVersion) => {
previewCell += `[${ghesVersion.split('@')[1]}](${APP_URL}/${ghesVersion}/${fileUrl}) `
prodCell += `[${ghesVersion.split('@')[1]}](${PROD_URL}/${ghesVersion}/${fileUrl}) `
})
previewCell += '<br>'
prodCell += '<br>'
}
}
markdownTable += `| ${contentCell} | ${previewCell} | ${prodCell} | |\n`
}
setOutput('changesTable', markdownTable)