Skip to content

Commit

Permalink
Merge 7e658e8 into d53e284
Browse files Browse the repository at this point in the history
  • Loading branch information
pomek committed May 18, 2023
2 parents d53e284 + 7e658e8 commit 633f0e2
Show file tree
Hide file tree
Showing 14 changed files with 314 additions and 225 deletions.
19 changes: 10 additions & 9 deletions packages/ckeditor5-dev-release-tools/lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,29 +21,30 @@ const updateVersions = require( './tasks/updateversions' );
const cleanUpPackages = require( './tasks/cleanuppackages' );
const { getLastFromChangelog, getCurrent, getLastTagFromGit } = require( './utils/versions' );
const { getChangesForVersion, getChangelog, saveChangelog } = require( './utils/changelog' );

const executeInParallel = require( './utils/executeinparallel' );
const validateRepositoryToRelease = require( './utils/validaterepositorytorelease' );

module.exports = {
executeInParallel,
releaseSubRepositories,
preparePackages,
bumpVersions,
generateChangelogForSinglePackage,
generateChangelogForMonoRepository,
updateCKEditor5Dependencies,
updateDependencies,
updateVersions,
prepareRepository,
commitAndTag,
createGithubRelease,
push,
cleanUpPackages,
updateDependenciesVersions,
executeInParallel,
getLastFromChangelog,
getCurrent,
getLastTagFromGit,
getChangesForVersion,
getChangelog,
saveChangelog,
updateDependenciesVersions,
updateVersions,
prepareRepository,
commitAndTag,
createGithubRelease,
push,
cleanUpPackages
validateRepositoryToRelease
};
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ const getPackageJson = require( '../utils/getpackagejson' );
const getPackagesToRelease = require( '../utils/getpackagestorelease' );
const getPackagesPaths = require( '../utils/getpackagespaths' );
const updateDependenciesVersions = require( '../utils/updatedependenciesversions' );
const validatePackageToRelease = require( '../utils/validatepackagetorelease' );
const validateRepositoryToRelease = require( '../utils/validaterepositorytorelease' );

const BREAK_RELEASE_MESSAGE = 'You aborted updating versions. Why? Oh why?!';

Expand Down Expand Up @@ -257,14 +257,14 @@ module.exports = async function bumpVersions( options ) {
// Validate the main repository.
//
// @params {Map.<String, ReleaseDetails>} packages
// @returns {Map.<String, ReleaseDetails>}
function validateRepository( packages ) {
// @returns {Promise.<Map.<String, ReleaseDetails>>}
async function validateRepository( packages ) {
logProcess( 'Validating the main repository...' );

const mainPackageJson = getPackageJson( options.cwd );
const releaseDetails = packages.get( mainPackageJson.name );

const errors = validatePackageToRelease( {
const errors = await validateRepositoryToRelease( {
branch: releaseBranch,
changes: releaseDetails.changes,
version: releaseDetails.version
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
const fs = require( 'fs-extra' );
const upath = require( 'upath' );
const { glob } = require( 'glob' );
const { logger } = require( '@ckeditor/ckeditor5-dev-utils' );

/**
* The purpose of the script is to clean all packages prepared for the release. The cleaning consists of two stages:
Expand All @@ -29,10 +28,6 @@ const { logger } = require( '@ckeditor/ckeditor5-dev-utils' );
* @returns {Promise}
*/
module.exports = async function cleanUpPackages( options ) {
const log = logger();

log.info( 'Task: cleanUpPackages()' );

const { packagesDirectory, packageJsonFieldsToRemove, cwd } = parseOptions( options );

const packageJsonPaths = await glob( '*/package.json', {
Expand All @@ -45,8 +40,6 @@ module.exports = async function cleanUpPackages( options ) {
const packagePath = upath.dirname( packageJsonPath );
const packageJson = await fs.readJson( packageJsonPath );

log.info( `Cleaning up: "${ packagePath }".` );

await cleanUpPackageDirectory( packageJson, packagePath );
cleanUpPackageJson( packageJson, packageJsonFieldsToRemove );

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,50 +6,99 @@
'use strict';

const { Octokit } = require( '@octokit/rest' );
const semver = require( 'semver' );

/**
* Create a Github release.
* Create a GitHub release.
*
* @param {Object} options
* @param {String} options.token Token used to authenticate with GitHub.
* @param {String} options.version Name of tag connected with the release.
* @param {String} options.repositoryOwner Owner of the repository.
* @param {String} options.repositoryName Repository name.
* @param {String} options.description Description of the release.
* @param {Boolean} options.isPrerelease Indicates whether the release is a pre-release.
* @returns {Promise}
* @returns {Promise.<String>}
*/
module.exports = function createGithubRelease( options ) {
module.exports = async function createGithubRelease( options ) {
const {
token,
version,
repositoryOwner,
repositoryName,
description,
isPrerelease
description
} = options;

const github = new Octokit( {
version: '3.0.0',
auth: `token ${ token }`
} );

const releaseParams = {
tag_name: `v${ version }`,
if ( await shouldCreateRelease( github, repositoryOwner, repositoryName, version ) ) {
await github.repos.createRelease( {
tag_name: `v${ version }`,
owner: repositoryOwner,
repo: repositoryName,
body: description,
prerelease: getVersionTag( version ) !== 'latest'
} );
}

return `https://github.com/${ repositoryOwner }/${ repositoryName }/releases/tag/v${ version }`;
};

/**
* Returns an npm tag based on the specified release version.
*
* @param {String} version
* @returns {String}
*/
function getVersionTag( version ) {
const [ versionTag ] = semver.prerelease( version ) || [ 'latest' ];

return versionTag;
}

/**
* Resolves a promise containing a flag if the GitHub contains the release page for given version.
*
* @param {Octokit} github
* @param {String} repositoryOwner
* @param {String} repositoryName
* @param {String} version
* @returns {Promise.<boolean>}
*/
async function shouldCreateRelease( github, repositoryOwner, repositoryName, version ) {
const releaseDetails = await getLastRelease( github, repositoryOwner, repositoryName );

// It can be `null` if there is no releases on GitHub.
let githubVersion = releaseDetails.data.tag_name;

if ( githubVersion ) {
githubVersion = releaseDetails.data.tag_name.replace( /^v/, '' );
}

// If versions are different, we are ready to create a new release.
return githubVersion !== version;
}

function getLastRelease( github, repositoryOwner, repositoryName ) {
const requestParams = {
owner: repositoryOwner,
repo: repositoryName,
body: description,
prerelease: isPrerelease
repo: repositoryName
};

return github.repos.createRelease( releaseParams )
.then( () => {
const url = `https://github.com/${ repositoryOwner }/${ repositoryName }/releases/tag/v${ version }`;

console.log( `Created the release on GitHub: ${ url }` );
} )
return github.repos.getLatestRelease( requestParams )
.catch( err => {
console.log( 'An error occurred while creating the release on GitHub:' );
console.log( err.message );
// If the "last release" returned the 404 error page, it means that this release
// will be the first one for specified `repositoryOwner/repositoryName` package.
if ( err.status == 404 ) {
return Promise.resolve( {
data: {
tag_name: null
}
} );
}

return Promise.reject( err );
} );
};
}
5 changes: 3 additions & 2 deletions packages/ckeditor5-dev-release-tools/lib/tasks/push.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@ const { tools } = require( '@ckeditor/ckeditor5-dev-utils' );
* @param {String} options.releaseBranch A name of the branch that should be used for releasing packages.
* @param {String} options.version Name of tag connected with the release.
* @param {String} [options.cwd] Root of the repository to prepare. `process.cwd()` by default.
* @returns {Promise}
*/
module.exports = function push( options ) {
module.exports = async function push( options ) {
const {
releaseBranch,
version,
Expand All @@ -24,5 +25,5 @@ module.exports = function push( options ) {

const command = `git push origin ${ releaseBranch } v${ version }`;

tools.shExec( command, { cwd, verbosity: 'error' } );
return tools.shExec( command, { cwd, verbosity: 'error', async: true } );
};
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

const fs = require( 'fs-extra' );
const { glob } = require( 'glob' );
const { logger } = require( '@ckeditor/ckeditor5-dev-utils' );
const normalizePath = require( '../utils/normalizepath' );

/**
Expand All @@ -31,10 +30,6 @@ const normalizePath = require( '../utils/normalizepath' );
* @returns {Promise}
*/
module.exports = async function updateDependencies( options ) {
const log = logger();

log.info( 'Task: updateDependencies()' );

const {
version,
packagesDirectory,
Expand All @@ -59,8 +54,6 @@ module.exports = async function updateDependencies( options ) {
const pkgJsonPaths = await glob( globPatterns, globOptions );

for ( const pkgJsonPath of pkgJsonPaths ) {
log.info( `Updating dependencies in "${ pkgJsonPath }".` );

const pkgJson = await fs.readJson( pkgJsonPath );

updateVersion( version, shouldUpdateVersionCallback, pkgJson.dependencies );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,23 +9,28 @@ const { tools } = require( '@ckeditor/ckeditor5-dev-utils' );

/**
* @param {Object} options
* @param {String} options.version Version of the current release.
* @param {String|null} options.version Version of the current release.
* @param {String} options.changes Changelog entries for the current release.
* @param {Boolean} [options.ignoreBranchCheck=false] If set on true, branch checking will be skipped.
* @param {String} [options.branch='master'] A name of the branch that should be used for releasing packages.
* @returns {Array.<String>}
* @returns {Promise.<Array.<String>>}
*/
module.exports = function validatePackageToRelease( options ) {
module.exports = async function validateRepositoryToRelease( options ) {
const {
version,
changes,
ignoreBranchCheck = false,
branch = 'master'
} = options;
const errors = [];
const branch = options.branch || 'master';

// Check whether the repository is ready for the release.
const status = exec( 'git status -sb', { verbosity: 'error' } ).trim();
const status = ( await exec( 'git status -sb' ) ).trim();

if ( !options.ignoreBranchCheck ) {
if ( !ignoreBranchCheck ) {
// Check whether current branch is "master".
if ( !status.startsWith( `## ${ branch }...origin/${ branch }` ) ) {
errors.push( `Not on ${ branch } branch.` );
if ( !status.startsWith( `## ${ branch }` ) ) {
errors.push( `Not on the "#${ branch }" branch.` );
}
}

Expand All @@ -42,13 +47,13 @@ module.exports = function validatePackageToRelease( options ) {
}

// Check whether the changelog entries are correct.
if ( !options.changes ) {
errors.push( `Cannot find changelog entries for version "${ options.version }".` );
if ( !changes ) {
errors.push( `Cannot find changelog entries for version "${ version }".` );
}

return errors;

function exec( command ) {
return tools.shExec( command, { verbosity: 'error' } );
async function exec( command ) {
return tools.shExec( command, { verbosity: 'error', async: true } );
}
};
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,6 @@ describe( 'dev-release-tools/tasks', () => {
},
glob: {
glob: sandbox.stub().callsFake( ( ...args ) => glob( ...args ) )
},
devUtils: {
logger: sandbox.stub().returns( {
error: sandbox.stub(),
warning: sandbox.stub(),
info: sandbox.stub()
} )
}
};

Expand All @@ -51,7 +44,6 @@ describe( 'dev-release-tools/tasks', () => {

mockery.registerMock( 'fs-extra', stubs.fs );
mockery.registerMock( 'glob', stubs.glob );
mockery.registerMock( '@ckeditor/ckeditor5-dev-utils', stubs.devUtils );

cleanUpPackages = require( '../../lib/tasks/cleanuppackages' );
} );
Expand Down
Loading

0 comments on commit 633f0e2

Please sign in to comment.