fix: modify fetch function to handle CircleCI specifics
This commit is contained in:
parent
b2c1b2c670
commit
cbef9d18da
2
index.js
2
index.js
@ -53,7 +53,7 @@ async function run(context, plugins) {
|
|||||||
await verify(context);
|
await verify(context);
|
||||||
|
|
||||||
options.repositoryUrl = await getGitAuthUrl(context);
|
options.repositoryUrl = await getGitAuthUrl(context);
|
||||||
context.branches = await getBranches(options.repositoryUrl, context);
|
context.branches = await getBranches(options.repositoryUrl, ciBranch, context);
|
||||||
context.branch = context.branches.find(({name}) => name === ciBranch);
|
context.branch = context.branches.find(({name}) => name === ciBranch);
|
||||||
|
|
||||||
if (!context.branch) {
|
if (!context.branch) {
|
||||||
|
@ -8,7 +8,7 @@ const expand = require('./expand');
|
|||||||
const getTags = require('./get-tags');
|
const getTags = require('./get-tags');
|
||||||
const normalize = require('./normalize');
|
const normalize = require('./normalize');
|
||||||
|
|
||||||
module.exports = async (repositoryUrl, context) => {
|
module.exports = async (repositoryUrl, ciBranch, context) => {
|
||||||
const {cwd, env} = context;
|
const {cwd, env} = context;
|
||||||
|
|
||||||
const remoteBranches = await expand(
|
const remoteBranches = await expand(
|
||||||
@ -18,7 +18,7 @@ module.exports = async (repositoryUrl, context) => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
await pEachSeries(remoteBranches, async ({name}) => {
|
await pEachSeries(remoteBranches, async ({name}) => {
|
||||||
await fetch(repositoryUrl, name, {cwd, env});
|
await fetch(repositoryUrl, name, ciBranch, {cwd, env});
|
||||||
});
|
});
|
||||||
|
|
||||||
await fetchNotes(repositoryUrl, {cwd, env});
|
await fetchNotes(repositoryUrl, {cwd, env});
|
||||||
|
10
lib/git.js
10
lib/git.js
@ -119,7 +119,7 @@ async function isRefExists(ref, execaOpts) {
|
|||||||
* @param {String} branch The repository branch to fetch.
|
* @param {String} branch The repository branch to fetch.
|
||||||
* @param {Object} [execaOpts] Options to pass to `execa`.
|
* @param {Object} [execaOpts] Options to pass to `execa`.
|
||||||
*/
|
*/
|
||||||
async function fetch(repositoryUrl, branch, execaOpts) {
|
async function fetch(repositoryUrl, branch, ciBranch, execaOpts) {
|
||||||
const isLocalExists =
|
const isLocalExists =
|
||||||
(await execa('git', ['rev-parse', '--verify', branch], {...execaOpts, reject: false})).exitCode === 0;
|
(await execa('git', ['rev-parse', '--verify', branch], {...execaOpts, reject: false})).exitCode === 0;
|
||||||
|
|
||||||
@ -130,7 +130,9 @@ async function fetch(repositoryUrl, branch, execaOpts) {
|
|||||||
'fetch',
|
'fetch',
|
||||||
'--unshallow',
|
'--unshallow',
|
||||||
'--tags',
|
'--tags',
|
||||||
...(isLocalExists ? [repositoryUrl] : [repositoryUrl, `+refs/heads/${branch}:refs/heads/${branch}`]),
|
...(branch === ciBranch && isLocalExists
|
||||||
|
? [repositoryUrl]
|
||||||
|
: ['--update-head-ok', repositoryUrl, `+refs/heads/${branch}:refs/heads/${branch}`]),
|
||||||
],
|
],
|
||||||
execaOpts
|
execaOpts
|
||||||
);
|
);
|
||||||
@ -140,7 +142,9 @@ async function fetch(repositoryUrl, branch, execaOpts) {
|
|||||||
[
|
[
|
||||||
'fetch',
|
'fetch',
|
||||||
'--tags',
|
'--tags',
|
||||||
...(isLocalExists ? [repositoryUrl] : [repositoryUrl, `+refs/heads/${branch}:refs/heads/${branch}`]),
|
...(branch === ciBranch && isLocalExists
|
||||||
|
? [repositoryUrl]
|
||||||
|
: ['--update-head-ok', repositoryUrl, `+refs/heads/${branch}:refs/heads/${branch}`]),
|
||||||
],
|
],
|
||||||
execaOpts
|
execaOpts
|
||||||
);
|
);
|
||||||
|
@ -24,7 +24,10 @@ test('Enforce ranges with branching release workflow', async t => {
|
|||||||
];
|
];
|
||||||
const getBranches = proxyquire('../../lib/branches', {'./get-tags': () => branches, './expand': () => []});
|
const getBranches = proxyquire('../../lib/branches', {'./get-tags': () => branches, './expand': () => []});
|
||||||
|
|
||||||
let result = (await getBranches('repositoryUrl', {options: {branches}})).map(({name, range}) => ({name, range}));
|
let result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
|
||||||
|
name,
|
||||||
|
range,
|
||||||
|
}));
|
||||||
t.is(getBranch(result, '1.0.x').range, '>=1.0.0 <1.0.0', 'Cannot release on 1.0.x before a releasing on master');
|
t.is(getBranch(result, '1.0.x').range, '>=1.0.0 <1.0.0', 'Cannot release on 1.0.x before a releasing on master');
|
||||||
t.is(getBranch(result, '1.x').range, '>=1.1.0 <1.0.0', 'Cannot release on 1.x before a releasing on master');
|
t.is(getBranch(result, '1.x').range, '>=1.1.0 <1.0.0', 'Cannot release on 1.x before a releasing on master');
|
||||||
t.is(getBranch(result, 'master').range, '>=1.0.0 <1.1.0', 'Can release only patch on master');
|
t.is(getBranch(result, 'master').range, '>=1.0.0 <1.1.0', 'Can release only patch on master');
|
||||||
@ -32,43 +35,64 @@ test('Enforce ranges with branching release workflow', async t => {
|
|||||||
t.is(getBranch(result, 'next-major').range, '>=2.0.0', 'Can release only major on next-major');
|
t.is(getBranch(result, 'next-major').range, '>=2.0.0', 'Can release only major on next-major');
|
||||||
|
|
||||||
release(branches, 'master', '1.0.0');
|
release(branches, 'master', '1.0.0');
|
||||||
result = (await getBranches('repositoryUrl', {options: {branches}})).map(({name, range}) => ({name, range}));
|
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
|
||||||
|
name,
|
||||||
|
range,
|
||||||
|
}));
|
||||||
t.is(getBranch(result, '1.0.x').range, '>=1.0.0 <1.0.0', 'Cannot release on 1.0.x before a releasing on master');
|
t.is(getBranch(result, '1.0.x').range, '>=1.0.0 <1.0.0', 'Cannot release on 1.0.x before a releasing on master');
|
||||||
t.is(getBranch(result, '1.x').range, '>=1.1.0 <1.0.0', 'Cannot release on 1.x before a releasing on master');
|
t.is(getBranch(result, '1.x').range, '>=1.1.0 <1.0.0', 'Cannot release on 1.x before a releasing on master');
|
||||||
t.is(getBranch(result, 'master').range, '>=1.0.0 <1.1.0', 'Can release only patch on master');
|
t.is(getBranch(result, 'master').range, '>=1.0.0 <1.1.0', 'Can release only patch on master');
|
||||||
|
|
||||||
release(branches, 'master', '1.0.1');
|
release(branches, 'master', '1.0.1');
|
||||||
result = (await getBranches('repositoryUrl', {options: {branches}})).map(({name, range}) => ({name, range}));
|
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
|
||||||
|
name,
|
||||||
|
range,
|
||||||
|
}));
|
||||||
t.is(getBranch(result, 'master').range, '>=1.0.1 <1.1.0', 'Can release only patch, > than 1.0.1 on master');
|
t.is(getBranch(result, 'master').range, '>=1.0.1 <1.1.0', 'Can release only patch, > than 1.0.1 on master');
|
||||||
|
|
||||||
merge(branches, 'master', 'next');
|
merge(branches, 'master', 'next');
|
||||||
merge(branches, 'master', 'next-major');
|
merge(branches, 'master', 'next-major');
|
||||||
result = (await getBranches('repositoryUrl', {options: {branches}})).map(({name, range}) => ({name, range}));
|
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
|
||||||
|
name,
|
||||||
|
range,
|
||||||
|
}));
|
||||||
t.is(getBranch(result, 'master').range, '>=1.0.1 <1.1.0', 'Can release only patch, > than 1.0.1 on master');
|
t.is(getBranch(result, 'master').range, '>=1.0.1 <1.1.0', 'Can release only patch, > than 1.0.1 on master');
|
||||||
t.is(getBranch(result, 'next').range, '>=1.1.0 <2.0.0', 'Can release only minor on next');
|
t.is(getBranch(result, 'next').range, '>=1.1.0 <2.0.0', 'Can release only minor on next');
|
||||||
t.is(getBranch(result, 'next-major').range, '>=2.0.0', 'Can release only major on next-major');
|
t.is(getBranch(result, 'next-major').range, '>=2.0.0', 'Can release only major on next-major');
|
||||||
|
|
||||||
release(branches, 'next', '1.1.0');
|
release(branches, 'next', '1.1.0');
|
||||||
release(branches, 'next', '1.1.1');
|
release(branches, 'next', '1.1.1');
|
||||||
result = (await getBranches('repositoryUrl', {options: {branches}})).map(({name, range}) => ({name, range}));
|
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
|
||||||
|
name,
|
||||||
|
range,
|
||||||
|
}));
|
||||||
t.is(getBranch(result, 'next').range, '>=1.1.1 <2.0.0', 'Can release only patch or minor, > than 1.1.0 on next');
|
t.is(getBranch(result, 'next').range, '>=1.1.1 <2.0.0', 'Can release only patch or minor, > than 1.1.0 on next');
|
||||||
|
|
||||||
release(branches, 'next-major', '2.0.0');
|
release(branches, 'next-major', '2.0.0');
|
||||||
release(branches, 'next-major', '2.0.1');
|
release(branches, 'next-major', '2.0.1');
|
||||||
result = (await getBranches('repositoryUrl', {options: {branches}})).map(({name, range}) => ({name, range}));
|
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
|
||||||
|
name,
|
||||||
|
range,
|
||||||
|
}));
|
||||||
t.is(getBranch(result, 'next-major').range, '>=2.0.1', 'Can release any version, > than 2.0.1 on next-major');
|
t.is(getBranch(result, 'next-major').range, '>=2.0.1', 'Can release any version, > than 2.0.1 on next-major');
|
||||||
|
|
||||||
merge(branches, 'next-major', 'beta');
|
merge(branches, 'next-major', 'beta');
|
||||||
release(branches, 'beta', '3.0.0-beta.1');
|
release(branches, 'beta', '3.0.0-beta.1');
|
||||||
merge(branches, 'beta', 'alpha');
|
merge(branches, 'beta', 'alpha');
|
||||||
release(branches, 'alpha', '4.0.0-alpha.1');
|
release(branches, 'alpha', '4.0.0-alpha.1');
|
||||||
result = (await getBranches('repositoryUrl', {options: {branches}})).map(({name, range}) => ({name, range}));
|
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
|
||||||
|
name,
|
||||||
|
range,
|
||||||
|
}));
|
||||||
t.is(getBranch(result, 'next-major').range, '>=2.0.1', 'Can release any version, > than 2.0.1 on next-major');
|
t.is(getBranch(result, 'next-major').range, '>=2.0.1', 'Can release any version, > than 2.0.1 on next-major');
|
||||||
|
|
||||||
merge(branches, 'master', '1.0.x');
|
merge(branches, 'master', '1.0.x');
|
||||||
merge(branches, 'master', '1.x');
|
merge(branches, 'master', '1.x');
|
||||||
release(branches, 'master', '1.0.1');
|
release(branches, 'master', '1.0.1');
|
||||||
result = (await getBranches('repositoryUrl', {options: {branches}})).map(({name, range}) => ({name, range}));
|
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
|
||||||
|
name,
|
||||||
|
range,
|
||||||
|
}));
|
||||||
t.is(getBranch(result, 'master').range, '>=1.0.1 <1.1.0', 'Can release only patch, > than 1.0.1 on master');
|
t.is(getBranch(result, 'master').range, '>=1.0.1 <1.1.0', 'Can release only patch, > than 1.0.1 on master');
|
||||||
t.is(
|
t.is(
|
||||||
getBranch(result, '1.0.x').range,
|
getBranch(result, '1.0.x').range,
|
||||||
@ -80,7 +104,10 @@ test('Enforce ranges with branching release workflow', async t => {
|
|||||||
release(branches, 'master', '1.0.2');
|
release(branches, 'master', '1.0.2');
|
||||||
release(branches, 'master', '1.0.3');
|
release(branches, 'master', '1.0.3');
|
||||||
release(branches, 'master', '1.0.4');
|
release(branches, 'master', '1.0.4');
|
||||||
result = (await getBranches('repositoryUrl', {options: {branches}})).map(({name, range}) => ({name, range}));
|
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
|
||||||
|
name,
|
||||||
|
range,
|
||||||
|
}));
|
||||||
t.is(getBranch(result, 'master').range, '>=1.0.4 <1.1.0', 'Can release only patch, > than 1.0.4 on master');
|
t.is(getBranch(result, 'master').range, '>=1.0.4 <1.1.0', 'Can release only patch, > than 1.0.4 on master');
|
||||||
t.is(
|
t.is(
|
||||||
getBranch(result, '1.0.x').range,
|
getBranch(result, '1.0.x').range,
|
||||||
@ -90,7 +117,10 @@ test('Enforce ranges with branching release workflow', async t => {
|
|||||||
t.is(getBranch(result, '1.x').range, '>=1.1.0 <1.0.2', 'Cannot release on 1.x before >= 1.2.0 is released on master');
|
t.is(getBranch(result, '1.x').range, '>=1.1.0 <1.0.2', 'Cannot release on 1.x before >= 1.2.0 is released on master');
|
||||||
|
|
||||||
merge(branches, 'next', 'master');
|
merge(branches, 'next', 'master');
|
||||||
result = (await getBranches('repositoryUrl', {options: {branches}})).map(({name, range}) => ({name, range}));
|
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
|
||||||
|
name,
|
||||||
|
range,
|
||||||
|
}));
|
||||||
t.is(getBranch(result, 'master').range, '>=1.1.1 <1.2.0', 'Can release only patch, > than 1.1.1 on master');
|
t.is(getBranch(result, 'master').range, '>=1.1.1 <1.2.0', 'Can release only patch, > than 1.1.1 on master');
|
||||||
t.is(getBranch(result, 'next').range, '>=1.2.0 <2.0.0', 'Can release only patch or minor, > than 1.2.0 on next');
|
t.is(getBranch(result, 'next').range, '>=1.2.0 <2.0.0', 'Can release only patch or minor, > than 1.2.0 on next');
|
||||||
t.is(getBranch(result, 'next-major').range, '>=2.0.1', 'Can release any version, > than 2.0.1 on next-major');
|
t.is(getBranch(result, 'next-major').range, '>=2.0.1', 'Can release any version, > than 2.0.1 on next-major');
|
||||||
@ -102,34 +132,49 @@ test('Enforce ranges with branching release workflow', async t => {
|
|||||||
t.is(getBranch(result, '1.x').range, '>=1.1.0 <1.0.2', 'Cannot release on 1.x before >= 2.0.0 is released on master');
|
t.is(getBranch(result, '1.x').range, '>=1.1.0 <1.0.2', 'Cannot release on 1.x before >= 2.0.0 is released on master');
|
||||||
|
|
||||||
merge(branches, 'master', '1.0.x', '1.0.4');
|
merge(branches, 'master', '1.0.x', '1.0.4');
|
||||||
result = (await getBranches('repositoryUrl', {options: {branches}})).map(({name, range}) => ({name, range}));
|
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
|
||||||
|
name,
|
||||||
|
range,
|
||||||
|
}));
|
||||||
t.is(getBranch(result, 'master').range, '>=1.1.1 <1.2.0', 'Can release only patch, > than 1.1.1 on master');
|
t.is(getBranch(result, 'master').range, '>=1.1.1 <1.2.0', 'Can release only patch, > than 1.1.1 on master');
|
||||||
t.is(getBranch(result, '1.0.x').range, '>=1.0.4 <1.1.0', 'Can release on 1.0.x only within range');
|
t.is(getBranch(result, '1.0.x').range, '>=1.0.4 <1.1.0', 'Can release on 1.0.x only within range');
|
||||||
t.is(getBranch(result, '1.x').range, '>=1.1.0 <1.1.0', 'Cannot release on 1.x before >= 2.0.0 is released on master');
|
t.is(getBranch(result, '1.x').range, '>=1.1.0 <1.1.0', 'Cannot release on 1.x before >= 2.0.0 is released on master');
|
||||||
|
|
||||||
merge(branches, 'master', '1.x');
|
merge(branches, 'master', '1.x');
|
||||||
result = (await getBranches('repositoryUrl', {options: {branches}})).map(({name, range}) => ({name, range}));
|
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
|
||||||
|
name,
|
||||||
|
range,
|
||||||
|
}));
|
||||||
t.is(getBranch(result, 'master').range, '>=1.1.1 <1.2.0', 'Can release only patch, > than 1.1.1 on master');
|
t.is(getBranch(result, 'master').range, '>=1.1.1 <1.2.0', 'Can release only patch, > than 1.1.1 on master');
|
||||||
t.is(getBranch(result, '1.0.x').range, '>=1.0.4 <1.1.0', 'Can release on 1.0.x only within range');
|
t.is(getBranch(result, '1.0.x').range, '>=1.0.4 <1.1.0', 'Can release on 1.0.x only within range');
|
||||||
t.is(getBranch(result, '1.x').range, '>=1.1.1 <1.1.1', 'Cannot release on 1.x before >= 2.0.0 is released on master');
|
t.is(getBranch(result, '1.x').range, '>=1.1.1 <1.1.1', 'Cannot release on 1.x before >= 2.0.0 is released on master');
|
||||||
|
|
||||||
merge(branches, 'next-major', 'next');
|
merge(branches, 'next-major', 'next');
|
||||||
merge(branches, 'next', 'master');
|
merge(branches, 'next', 'master');
|
||||||
result = (await getBranches('repositoryUrl', {options: {branches}})).map(({name, range}) => ({name, range}));
|
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
|
||||||
|
name,
|
||||||
|
range,
|
||||||
|
}));
|
||||||
t.is(getBranch(result, 'master').range, '>=2.0.1 <2.1.0', 'Can release only patch, > than 2.0.1 on master');
|
t.is(getBranch(result, 'master').range, '>=2.0.1 <2.1.0', 'Can release only patch, > than 2.0.1 on master');
|
||||||
t.is(getBranch(result, 'next').range, '>=2.1.0 <3.0.0', 'Can release only minor on next');
|
t.is(getBranch(result, 'next').range, '>=2.1.0 <3.0.0', 'Can release only minor on next');
|
||||||
t.is(getBranch(result, 'next-major').range, '>=3.0.0', 'Can release only major on next-major');
|
t.is(getBranch(result, 'next-major').range, '>=3.0.0', 'Can release only major on next-major');
|
||||||
t.is(getBranch(result, '1.x').range, '>=1.1.1 <2.0.0', 'Can release on 1.x only within range');
|
t.is(getBranch(result, '1.x').range, '>=1.1.1 <2.0.0', 'Can release on 1.x only within range');
|
||||||
|
|
||||||
merge(branches, 'beta', 'master');
|
merge(branches, 'beta', 'master');
|
||||||
result = (await getBranches('repositoryUrl', {options: {branches}})).map(({name, range}) => ({name, range}));
|
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
|
||||||
|
name,
|
||||||
|
range,
|
||||||
|
}));
|
||||||
t.is(getBranch(result, 'master').range, '>=2.0.1 <2.1.0', 'Can release only patch, > than 2.0.1 on master');
|
t.is(getBranch(result, 'master').range, '>=2.0.1 <2.1.0', 'Can release only patch, > than 2.0.1 on master');
|
||||||
t.is(getBranch(result, 'next').range, '>=2.1.0 <3.0.0', 'Can release only minor on next');
|
t.is(getBranch(result, 'next').range, '>=2.1.0 <3.0.0', 'Can release only minor on next');
|
||||||
t.is(getBranch(result, 'next-major').range, '>=3.0.0', 'Can release only major on next-major');
|
t.is(getBranch(result, 'next-major').range, '>=3.0.0', 'Can release only major on next-major');
|
||||||
|
|
||||||
branches.push({name: '1.1.x', tags: []});
|
branches.push({name: '1.1.x', tags: []});
|
||||||
merge(branches, '1.x', '1.1.x');
|
merge(branches, '1.x', '1.1.x');
|
||||||
result = (await getBranches('repositoryUrl', {options: {branches}})).map(({name, range}) => ({name, range}));
|
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
|
||||||
|
name,
|
||||||
|
range,
|
||||||
|
}));
|
||||||
t.is(getBranch(result, '1.0.x').range, '>=1.0.4 <1.1.0', 'Can release on 1.0.x only within range');
|
t.is(getBranch(result, '1.0.x').range, '>=1.0.4 <1.1.0', 'Can release on 1.0.x only within range');
|
||||||
t.is(getBranch(result, '1.1.x').range, '>=1.1.1 <1.2.0', 'Can release on 1.1.x only within range');
|
t.is(getBranch(result, '1.1.x').range, '>=1.1.1 <1.2.0', 'Can release on 1.1.x only within range');
|
||||||
t.is(getBranch(result, '1.x').range, '>=1.2.0 <2.0.0', 'Can release on 1.x only within range');
|
t.is(getBranch(result, '1.x').range, '>=1.2.0 <2.0.0', 'Can release on 1.x only within range');
|
||||||
@ -146,7 +191,7 @@ test('Throw SemanticReleaseError for invalid configurations', async t => {
|
|||||||
{name: 'preview', prerelease: 'alpha', tags: []},
|
{name: 'preview', prerelease: 'alpha', tags: []},
|
||||||
];
|
];
|
||||||
const getBranches = proxyquire('../../lib/branches', {'./get-tags': () => branches, './expand': () => []});
|
const getBranches = proxyquire('../../lib/branches', {'./get-tags': () => branches, './expand': () => []});
|
||||||
const errors = [...(await t.throwsAsync(getBranches('repositoryUrl', {options: {branches}})))];
|
const errors = [...(await t.throwsAsync(getBranches('repositoryUrl', 'master', {options: {branches}})))];
|
||||||
|
|
||||||
t.is(errors[0].name, 'SemanticReleaseError');
|
t.is(errors[0].name, 'SemanticReleaseError');
|
||||||
t.is(errors[0].code, 'EMAINTENANCEBRANCH');
|
t.is(errors[0].code, 'EMAINTENANCEBRANCH');
|
||||||
@ -177,7 +222,7 @@ test('Throw a SemanticReleaseError if there is duplicate branches', async t => {
|
|||||||
];
|
];
|
||||||
const getBranches = proxyquire('../../lib/branches', {'./get-tags': () => branches, './expand': () => []});
|
const getBranches = proxyquire('../../lib/branches', {'./get-tags': () => branches, './expand': () => []});
|
||||||
|
|
||||||
const errors = [...(await t.throwsAsync(getBranches('repositoryUrl', {options: {branches}})))];
|
const errors = [...(await t.throwsAsync(getBranches('repositoryUrl', 'master', {options: {branches}})))];
|
||||||
|
|
||||||
t.is(errors[0].name, 'SemanticReleaseError');
|
t.is(errors[0].name, 'SemanticReleaseError');
|
||||||
t.is(errors[0].code, 'EDUPLICATEBRANCHES');
|
t.is(errors[0].code, 'EDUPLICATEBRANCHES');
|
||||||
@ -192,7 +237,7 @@ test('Throw a SemanticReleaseError for each invalid branch name', async t => {
|
|||||||
];
|
];
|
||||||
const getBranches = proxyquire('../../lib/branches', {'./get-tags': () => branches, './expand': () => []});
|
const getBranches = proxyquire('../../lib/branches', {'./get-tags': () => branches, './expand': () => []});
|
||||||
|
|
||||||
const errors = [...(await t.throwsAsync(getBranches('repositoryUrl', {options: {branches}})))];
|
const errors = [...(await t.throwsAsync(getBranches('repositoryUrl', 'master', {options: {branches}})))];
|
||||||
|
|
||||||
t.is(errors[0].name, 'SemanticReleaseError');
|
t.is(errors[0].name, 'SemanticReleaseError');
|
||||||
t.is(errors[0].code, 'EINVALIDBRANCHNAME');
|
t.is(errors[0].code, 'EINVALIDBRANCHNAME');
|
||||||
|
@ -30,6 +30,7 @@ import {
|
|||||||
gitRemoteTagHead,
|
gitRemoteTagHead,
|
||||||
gitPush,
|
gitPush,
|
||||||
gitDetachedHead,
|
gitDetachedHead,
|
||||||
|
gitDetachedHeadFromBranch,
|
||||||
gitAddNote,
|
gitAddNote,
|
||||||
gitGetNote,
|
gitGetNote,
|
||||||
} from './helpers/git-utils';
|
} from './helpers/git-utils';
|
||||||
@ -63,7 +64,7 @@ test('Unshallow and fetch repository', async t => {
|
|||||||
// Verify the shallow clone contains only one commit
|
// Verify the shallow clone contains only one commit
|
||||||
t.is((await gitGetCommits(undefined, {cwd})).length, 1);
|
t.is((await gitGetCommits(undefined, {cwd})).length, 1);
|
||||||
|
|
||||||
await fetch(repositoryUrl, 'master', {cwd});
|
await fetch(repositoryUrl, 'master', 'master', {cwd});
|
||||||
|
|
||||||
// Verify the shallow clone contains all the commits
|
// Verify the shallow clone contains all the commits
|
||||||
t.is((await gitGetCommits(undefined, {cwd})).length, 2);
|
t.is((await gitGetCommits(undefined, {cwd})).length, 2);
|
||||||
@ -78,8 +79,8 @@ test('Do not throw error when unshallow a complete repository', async t => {
|
|||||||
await gitCommits(['Second'], {cwd});
|
await gitCommits(['Second'], {cwd});
|
||||||
await gitPush(repositoryUrl, 'second-branch', {cwd});
|
await gitPush(repositoryUrl, 'second-branch', {cwd});
|
||||||
|
|
||||||
await t.notThrowsAsync(fetch(repositoryUrl, 'master', {cwd}));
|
await t.notThrowsAsync(fetch(repositoryUrl, 'master', 'master', {cwd}));
|
||||||
await t.notThrowsAsync(fetch(repositoryUrl, 'second-branch', {cwd}));
|
await t.notThrowsAsync(fetch(repositoryUrl, 'second-branch', 'master', {cwd}));
|
||||||
});
|
});
|
||||||
|
|
||||||
test('Fetch all tags on a detached head repository', async t => {
|
test('Fetch all tags on a detached head repository', async t => {
|
||||||
@ -94,11 +95,36 @@ test('Fetch all tags on a detached head repository', async t => {
|
|||||||
await gitPush(repositoryUrl, 'master', {cwd});
|
await gitPush(repositoryUrl, 'master', {cwd});
|
||||||
cwd = await gitDetachedHead(repositoryUrl, commit.hash);
|
cwd = await gitDetachedHead(repositoryUrl, commit.hash);
|
||||||
|
|
||||||
await fetch(repositoryUrl, 'master', {cwd});
|
await fetch(repositoryUrl, 'master', 'master', {cwd});
|
||||||
|
|
||||||
t.deepEqual((await getTags('master', {cwd})).sort(), ['v1.0.0', 'v1.0.1', 'v1.1.0'].sort());
|
t.deepEqual((await getTags('master', {cwd})).sort(), ['v1.0.0', 'v1.0.1', 'v1.1.0'].sort());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('Fetch all tags on a repository with a detached head from branch', async t => {
|
||||||
|
let {cwd, repositoryUrl} = await gitRepo();
|
||||||
|
|
||||||
|
await gitCommits(['First'], {cwd});
|
||||||
|
await gitTagVersion('v1.0.0', undefined, {cwd});
|
||||||
|
await gitCommits(['Second'], {cwd});
|
||||||
|
await gitTagVersion('v1.0.1', undefined, {cwd});
|
||||||
|
const [commit] = await gitCommits(['Third'], {cwd});
|
||||||
|
await gitTagVersion('v1.1.0', undefined, {cwd});
|
||||||
|
await gitPush(repositoryUrl, 'master', {cwd});
|
||||||
|
await gitCheckout('other-branch', true, {cwd});
|
||||||
|
await gitPush(repositoryUrl, 'other-branch', {cwd});
|
||||||
|
await gitCheckout('master', false, {cwd});
|
||||||
|
await gitCommits(['Fourth'], {cwd});
|
||||||
|
await gitTagVersion('v2.0.0', undefined, {cwd});
|
||||||
|
await gitPush(repositoryUrl, 'master', {cwd});
|
||||||
|
cwd = await gitDetachedHeadFromBranch(repositoryUrl, 'other-branch', commit.hash);
|
||||||
|
|
||||||
|
await fetch(repositoryUrl, 'master', 'other-branch', {cwd});
|
||||||
|
await fetch(repositoryUrl, 'other-branch', 'other-branch', {cwd});
|
||||||
|
|
||||||
|
t.deepEqual((await getTags('other-branch', {cwd})).sort(), ['v1.0.0', 'v1.0.1', 'v1.1.0'].sort());
|
||||||
|
t.deepEqual((await getTags('master', {cwd})).sort(), ['v1.0.0', 'v1.0.1', 'v1.1.0', 'v2.0.0'].sort());
|
||||||
|
});
|
||||||
|
|
||||||
test('Verify if the commit `sha` is in the direct history of the current branch', async t => {
|
test('Verify if the commit `sha` is in the direct history of the current branch', async t => {
|
||||||
// Create a git repository, set the current working directory at the root of the repo
|
// Create a git repository, set the current working directory at the root of the repo
|
||||||
const {cwd} = await gitRepo();
|
const {cwd} = await gitRepo();
|
||||||
|
@ -166,6 +166,17 @@ export async function gitDetachedHead(repositoryUrl, head) {
|
|||||||
return cwd;
|
return cwd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function gitDetachedHeadFromBranch(repositoryUrl, branch, head) {
|
||||||
|
const cwd = tempy.directory();
|
||||||
|
|
||||||
|
await execa('git', ['init'], {cwd});
|
||||||
|
await execa('git', ['remote', 'add', 'origin', repositoryUrl], {cwd});
|
||||||
|
await execa('git', ['fetch', '--force', repositoryUrl, `${branch}:remotes/origin/${branch}`], {cwd});
|
||||||
|
await execa('git', ['reset', '--hard', head], {cwd});
|
||||||
|
await execa('git', ['checkout', '-q', '-B', branch], {cwd});
|
||||||
|
return cwd;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a new Git configuration.
|
* Add a new Git configuration.
|
||||||
*
|
*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user