feat: move npm workaround for missing gitHead to the npm plugin

This commit is contained in:
Pierre Vanduynslager
2017-12-30 21:17:04 -05:00
parent 754b420fd6
commit 996305d69c
7 changed files with 38 additions and 146 deletions
+22 -27
View File
@@ -1,8 +1,8 @@
const gitLogParser = require('git-log-parser');
const getStream = require('get-stream');
const debug = require('debug')('semantic-release:get-commits');
const {unshallow} = require('./git');
const getVersionHead = require('./get-version-head');
const SemanticReleaseError = require('@semantic-release/error');
const {unshallow, gitCommitTag, gitTagHead, isCommitInHistory} = require('./git');
/**
* Commit message.
@@ -44,22 +44,28 @@ const getVersionHead = require('./get-version-head');
* @return {Promise<Result>} The list of commits on the branch `branch` since the last release and the updated lastRelease with the gitHead used to retrieve the commits.
*
* @throws {SemanticReleaseError} with code `ENOTINHISTORY` if `lastRelease.gitHead` or the commit sha derived from `config.lastRelease.version` is not in the direct history of `branch`.
* @throws {SemanticReleaseError} with code `ENOGITHEAD` if `lastRelease.gitHead` is undefined and no commit sha can be found for the `config.lastRelease.version`.
*/
module.exports = async ({version, gitHead} = {}, branch, logger) => {
let gitTag;
if (gitHead || version) {
try {
({gitHead, gitTag} = await getVersionHead(gitHead, version, branch));
} catch (err) {
if (err.code === 'ENOTINHISTORY') {
logger.error(notInHistoryMessage(err.gitHead, branch, version));
} else {
logger.error(noGitHeadMessage(branch, version));
}
throw err;
if (gitHead) {
// If gitHead doesn't exists in release branch
if (!await isCommitInHistory(gitHead)) {
// Unshallow the repository
await unshallow();
}
logger.log('Retrieving commits since %s, corresponding to version %s', gitHead, version);
// If gitHead still doesn't exists in release branch
if (!await isCommitInHistory(gitHead)) {
// Try to find the commit corresponding to the version, using got tags
const tagHead = (await gitTagHead(`v${version}`)) || (await gitTagHead(version));
// If tagHead doesn't exists in release branch
if (!tagHead || !await isCommitInHistory(tagHead)) {
// Then the commit corresponding to the version cannot be found in the bracnh hsitory
logger.error(notInHistoryMessage(gitHead, branch, version));
throw new SemanticReleaseError('Commit not in history', 'ENOTINHISTORY');
}
gitHead = tagHead;
}
debug('Use gitHead: %s', gitHead);
} else {
logger.log('No previous release found, retrieving all commits');
// If there is no gitHead nor a version, there is no previous release. Unshallow the repo in order to retrieve all commits
@@ -76,20 +82,9 @@ module.exports = async ({version, gitHead} = {}, branch, logger) => {
);
logger.log('Found %s commits since last release', commits.length);
debug('Parsed commits: %o', commits);
return {commits, lastRelease: {version, gitHead, gitTag}};
return {commits, lastRelease: {version, gitHead, gitTag: await gitCommitTag(gitHead)}};
};
function noGitHeadMessage(branch, version) {
return `The commit the last release of this package was derived from cannot be determined from the release metadata nor from the repository tags.
This means semantic-release can not extract the commits between now and then.
This is usually caused by releasing from outside the repository directory or with innaccessible git metadata.
You can recover from this error by creating a tag for the version "${version}" on the commit corresponding to this release:
$ git tag -f v${version} <commit sha1 corresponding to last release>
$ git push -f --tags origin ${branch}
`;
}
function notInHistoryMessage(gitHead, branch, version) {
return `The commit the last release of this package was derived from is not in the direct history of the "${branch}" branch.
This means semantic-release can not extract the commits between now and then.
-52
View File
@@ -1,52 +0,0 @@
const debug = require('debug')('semantic-release:get-version-head');
const SemanticReleaseError = require('@semantic-release/error');
const {gitTagHead, gitCommitTag, isCommitInHistory, unshallow} = require('./git');
/**
* Get the commit sha for a given version, if it's contained in the given branch.
*
* @param {string} gitHead The commit sha to look for.
* @param {string} version The version corresponding to the commit sha to look for. Used to search in git tags.
*
* @return {Promise<Object>} A Promise that resolves to an object with the `gitHead` and `gitTag` for the the `version`.
*
* @throws {SemanticReleaseError} with code `ENOTINHISTORY` if `gitHead` or the commit sha dereived from `version` is not in the direct history of `branch`.
* @throws {SemanticReleaseError} with code `ENOGITHEAD` if `gitHead` is undefined and no commit sha can be found for the `version`.
*/
module.exports = async (gitHead, version) => {
// Check if gitHead is defined and exists in release branch
if (gitHead && (await isCommitInHistory(gitHead))) {
debug('Use gitHead: %s', gitHead);
return {gitHead, gitTag: await gitCommitTag(gitHead)};
}
await unshallow();
// Check if gitHead is defined and exists in release branch again
if (gitHead && (await isCommitInHistory(gitHead))) {
debug('Use gitHead: %s', gitHead);
return {gitHead, gitTag: await gitCommitTag(gitHead)};
}
let tagHead;
if (version) {
// If a version is defined search a corresponding tag
tagHead = (await gitTagHead(`v${version}`)) || (await gitTagHead(version));
// Check if tagHead is found and exists in release branch again
if (tagHead && (await isCommitInHistory(tagHead))) {
debug('Use tagHead: %s', tagHead);
return {gitHead: tagHead, gitTag: await gitCommitTag(tagHead)};
}
}
// Either gitHead is defined or a tagHead has been found but none is in the branch history
if (gitHead || tagHead) {
const error = new SemanticReleaseError('Commit not in history', 'ENOTINHISTORY');
error.gitHead = gitHead || tagHead;
throw error;
}
// There is no gitHead in the last release and there is no tags correponsing to the last release version
throw new SemanticReleaseError('There is no commit associated with last release', 'ENOGITHEAD');
};
+2 -2
View File
@@ -25,7 +25,7 @@ async function gitTagHead(tagName) {
*
* @param {string} gitHead The commit sha for which to retrieve the associated tag.
*
* @return {string} The tag associatedwith the sha in parameter or `null`.
* @return {string} The tag associatedwith the sha in parameter or `undefined`.
*/
async function gitCommitTag(gitHead) {
try {
@@ -34,7 +34,7 @@ async function gitCommitTag(gitHead) {
return shell.stdout;
} catch (err) {
debug(err);
return null;
return undefined;
}
}
+2 -2
View File
@@ -24,9 +24,9 @@ module.exports = {
validator: output =>
!output ||
(isObject(output) && !output.version) ||
(isString(output.version) && Boolean(semver.valid(semver.clean(output.version)))),
(isString(output.version) && Boolean(semver.valid(semver.clean(output.version))) && Boolean(output.gitHead)),
message:
'The "getLastRelease" plugin output if defined, must be an object with an optionnal valid semver version in the "version" property.',
'The "getLastRelease" plugin output if defined, must be an object with a valid semver version in the "version" property and the corresponding git reference in "gitHead" property.',
},
},
analyzeCommits: {