const proc = require('child_process'); const read = cmd => proc.execSync(cmd, { encoding: 'utf8' }).trim(); const run = cmd => { proc.execSync(cmd, { stdio: 'inherit' }); }; const tryRead = cmd => { try { return read(cmd); } catch (e) { return undefined; } }; const releaseBranchRegex = /^release-v(?(?\d+)\.(?\d+)(?:\.(?\d+))?)$/; const currentBranch = read('git rev-parse --abbrev-ref HEAD'); const match = currentBranch.match(releaseBranchRegex); if (!match) { console.error('Not currently on a release branch'); process.exit(1); } if (/-.*$/.test(require('../package.json').version)) { console.error('Refusing to update docs: prerelease detected'); process.exit(0); } const current = match.groups; const docsBranch = `docs-v${current.major}.x`; // Fetch remotes and find the docs branch if it exists run('git fetch --all --no-tags'); const matchingDocsBranches = tryRead(`git rev-parse --glob='*/${docsBranch}'`); if (!matchingDocsBranches) { // Create the branch run(`git checkout --orphan ${docsBranch}`); } else { const [publishedRef, ...others] = new Set(matchingDocsBranches.split('\n')); if (others.length > 0) { console.error( `Found conflicting ${docsBranch} branches.\n` + 'Either local branch is outdated or there are multiple matching remote branches.', ); process.exit(1); } const publishedVersion = JSON.parse(read(`git show ${publishedRef}:package.json`)).version; const publishedMinor = publishedVersion.match(/\d+\.(?\d+)\.\d+/).groups.minor; if (current.minor < publishedMinor) { console.error('Refusing to update docs: newer version is published'); process.exit(0); } run('git checkout --quiet --detach'); run(`git reset --soft ${publishedRef}`); run(`git checkout ${docsBranch}`); } run('npm run prepare-docs'); run('git add -f docs'); // --force needed because generated docs files are gitignored run('git commit -m "Update docs"'); run(`git checkout ${currentBranch}`);