Compare commits

...
4 Commits
5 changed files with 71 additions and 31 deletions
+4 -12
View File
@@ -42,26 +42,18 @@ module.exports = async (opts, logger) => {
};
}
const repositoryUrl = (await pkgRepoUrl()) || (await repoUrl());
// Set default options values if not defined yet
options = {
branch: 'master',
repositoryUrl: (await pkgRepoUrl()) || (await repoUrl()),
repositoryUrl: repositoryUrl ? getGitAuthUrl(repositoryUrl) : repositoryUrl,
tagFormat: `v\${version}`,
// Remove `null` and `undefined` options so they can be replaced with default ones
...pickBy(options, option => !isUndefined(option) && !isNull(option)),
};
debug('options values: %O', Object.keys(options));
debug('name: %O', options.name);
debug('branch: %O', options.branch);
debug('repositoryUrl: %O', options.repositoryUrl);
debug('analyzeCommits: %O', options.analyzeCommits);
debug('generateNotes: %O', options.generateNotes);
debug('verifyConditions: %O', options.verifyConditions);
debug('verifyRelease: %O', options.verifyRelease);
debug('publish: %O', options.publish);
options.repositoryUrl = options.repositoryUrl ? getGitAuthUrl(options.repositoryUrl) : options.repositoryUrl;
debug('options values: %O', options);
return {options, plugins: await plugins(options, pluginsPath, logger)};
};
+34 -10
View File
@@ -9,7 +9,11 @@ const debug = require('debug')('semantic-release:get-version-head');
* @return {string} The commit sha of the tag in parameter or `null`.
*/
async function gitTagHead(tagName) {
return execa.stdout('git', ['rev-list', '-1', tagName], {reject: false});
try {
return await execa.stdout('git', ['rev-list', '-1', tagName]);
} catch (err) {
debug(err);
}
}
/**
@@ -28,10 +32,14 @@ async function gitTags() {
*
* @param {string} ref The reference to look for.
*
* @return {boolean} `true` if the reference is in the history of the current branch, `false` otherwise.
* @return {boolean} `true` if the reference is in the history of the current branch, falsy otherwise.
*/
async function isRefInHistory(ref) {
return (await execa('git', ['merge-base', '--is-ancestor', ref, 'HEAD'], {reject: false})).code === 0;
try {
return (await execa('git', ['merge-base', '--is-ancestor', ref, 'HEAD'])).code === 0;
} catch (err) {
debug(err);
}
}
/**
@@ -52,14 +60,22 @@ async function gitHead() {
* @return {string} The value of the remote git URL.
*/
async function repoUrl() {
return execa.stdout('git', ['remote', 'get-url', 'origin'], {reject: false});
try {
return await execa.stdout('git', ['remote', 'get-url', 'origin']);
} catch (err) {
debug(err);
}
}
/**
* @return {Boolean} `true` if the current working directory is in a git repository, `false` otherwise.
* @return {Boolean} `true` if the current working directory is in a git repository, falsy otherwise.
*/
async function isGitRepo() {
return (await execa('git', ['rev-parse', '--git-dir'], {reject: false})).code === 0;
try {
return (await execa('git', ['rev-parse', '--git-dir'])).code === 0;
} catch (err) {
debug(err);
}
}
/**
@@ -68,10 +84,14 @@ async function isGitRepo() {
* @param {String} origin The remote repository URL.
* @param {String} branch The repositoru branch for which to verify write access.
*
* @return {Boolean} `true` is authorized to push, `false` otherwise.
* @return {Boolean} `true` is authorized to push, falsy otherwise.
*/
async function verifyAuth(origin, branch) {
return (await execa('git', ['push', '--dry-run', origin, `HEAD:${branch}`], {reject: false})).code === 0;
try {
return (await execa('git', ['push', '--dry-run', origin, `HEAD:${branch}`])).code === 0;
} catch (err) {
debug(err);
}
}
/**
@@ -117,10 +137,14 @@ async function deleteTag(origin, tagName) {
*
* @method verifyTagName
* @param {string} tagName the tag name to verify.
* @return {boolean} `true` if valid, `false` otherwise.
* @return {boolean} `true` if valid, falsy otherwise.
*/
async function verifyTagName(tagName) {
return (await execa('git', ['check-ref-format', `refs/tags/${tagName}`], {reject: false})).code === 0;
try {
return (await execa('git', ['check-ref-format', `refs/tags/${tagName}`])).code === 0;
} catch (err) {
debug(err);
}
}
module.exports = {
+1 -1
View File
@@ -33,7 +33,7 @@
"execa": "^0.9.0",
"get-stream": "^3.0.0",
"git-log-parser": "^1.2.0",
"git-url-parse": "^8.0.0",
"git-url-parse": "^8.1.0",
"hook-std": "^0.4.0",
"lodash": "^4.17.4",
"marked": "^0.3.9",
+24
View File
@@ -29,6 +29,14 @@ test.serial(
}
);
test.serial('Handle "https" URL with group and subgroup', t => {
t.is(getAuthUrl('https://host.com/group/subgroup/owner/repo.git'), 'https://host.com/group/subgroup/owner/repo.git');
});
test.serial('Handle "git" URL with group and subgroup', t => {
t.is(getAuthUrl('git@host.com:group/subgroup/owner/repo.git'), 'git@host.com:group/subgroup/owner/repo.git');
});
test.serial('Return the "https" formatted URL if "gitCredentials" is defined and repositoryUrl is a "git" URL', t => {
process.env.GIT_CREDENTIALS = 'user:pass';
t.is(getAuthUrl('git@host.com:owner/repo.git'), 'https://user:pass@host.com/owner/repo.git');
@@ -79,3 +87,19 @@ test.serial('Return the "https" formatted URL if "gitCredentials" is defined wit
process.env.GITLAB_TOKEN = 'token';
t.is(getAuthUrl('git@host.com:owner/repo.git'), 'https://gitlab-ci-token:token@host.com/owner/repo.git');
});
test.serial('Handle "https" URL with group and subgroup, with "GIT_CREDENTIALS"', t => {
process.env.GIT_CREDENTIALS = 'user:pass';
t.is(
getAuthUrl('https://host.com/group/subgroup/owner/repo.git'),
'https://user:pass@host.com/group/subgroup/owner/repo.git'
);
});
test.serial('Handle "git" URL with group and subgroup, with "GIT_CREDENTIALS', t => {
process.env.GIT_CREDENTIALS = 'user:pass';
t.is(
getAuthUrl('git@host.com:group/subgroup/owner/repo.git'),
'https://user:pass@host.com/group/subgroup/owner/repo.git'
);
});
+8 -8
View File
@@ -88,7 +88,7 @@ test.serial('Verify if the commit `sha` is in the direct history of the current
await gitCheckout('master', false);
t.true(await isRefInHistory(commits[0].hash));
t.false(await isRefInHistory(otherCommits[0].hash));
t.falsy(await isRefInHistory(otherCommits[0].hash));
});
test.serial('Get the commit sha for a given tag or falsy if the tag does not exists', async t => {
@@ -169,11 +169,11 @@ test.serial('Return "true" if in a Git repository', async t => {
t.true(await isGitRepo());
});
test.serial('Return "false" if not in a Git repository', async t => {
test.serial('Return falsy if not in a Git repository', async t => {
const dir = tempy.directory();
process.chdir(dir);
t.false(await isGitRepo());
t.falsy(await isGitRepo());
});
test.serial('Return "true" for valid tag names', async t => {
@@ -183,11 +183,11 @@ test.serial('Return "true" for valid tag names', async t => {
t.true(await verifyTagName('tag/name'));
});
test.serial('Return "false" for invalid tag names', async t => {
t.false(await verifyTagName('?1.0.0'));
t.false(await verifyTagName('*1.0.0'));
t.false(await verifyTagName('[1.0.0]'));
t.false(await verifyTagName('1.0.0..'));
test.serial('Return falsy for invalid tag names', async t => {
t.falsy(await verifyTagName('?1.0.0'));
t.falsy(await verifyTagName('*1.0.0'));
t.falsy(await verifyTagName('[1.0.0]'));
t.falsy(await verifyTagName('1.0.0..'));
});
test.serial('Throws error if obtaining the tags fails', async t => {