Skip to content

Commit 873c51a

Browse files
committed
feat(vcs): prevent passing the host sshUrl for the repository beyond the git initialization stage
1 parent 9d52a53 commit 873c51a

File tree

4 files changed

+105
-132
lines changed

4 files changed

+105
-132
lines changed

src/scaffolder.js

+2-4
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {scaffold as scaffoldReadme} from '@form8ion/readme';
66
import {info} from '@travi/cli-messages';
77

88
import {prompt as promptForLanguageDetails, scaffold as scaffoldLanguage} from './language/index.js';
9-
import {initialize as scaffoldGit, scaffold as liftGit} from './vcs/git/git.js';
9+
import {scaffold as scaffoldGit} from './vcs/git/git.js';
1010
import {scaffold as scaffoldLicense} from './license/index.js';
1111
import scaffoldDependencyUpdater from './dependency-updater/scaffolder.js';
1212
import {promptForBaseDetails} from './prompts/questions.js';
@@ -45,8 +45,6 @@ export async function scaffold(options) {
4545
{projectRoot, vcs: vcsResults.vcs}
4646
);
4747

48-
const gitResults = gitRepo && await liftGit({projectRoot, vcs: vcsResults.vcs});
49-
5048
const {[questionNames.PROJECT_LANGUAGE]: projectLanguage} = await promptForLanguageDetails(languages, decisions);
5149

5250
const language = await scaffoldLanguage(
@@ -60,7 +58,7 @@ export async function scaffold(options) {
6058
language,
6159
dependencyUpdaterResults,
6260
contributing,
63-
gitResults
61+
vcsResults
6462
].filter(Boolean));
6563

6664
await lift({

src/scaffolder.test.js

+4-14
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {afterEach, beforeEach, describe, expect, it, vi} from 'vitest';
88
import any from '@travi/any';
99
import {when} from 'jest-when';
1010

11-
import {scaffold as liftGit, initialize as scaffoldGit} from './vcs/git/git.js';
11+
import {scaffold as scaffoldGit} from './vcs/git/git.js';
1212
import * as licenseScaffolder from './license/scaffolder.js';
1313
import scaffoldLanguage from './language/scaffolder.js';
1414
import * as languagePrompt from './language/prompt.js';
@@ -50,7 +50,8 @@ describe('project scaffolder', () => {
5050
const vcsHosts = any.simpleObject();
5151
const documentation = any.simpleObject();
5252
const vcs = any.simpleObject();
53-
const vcsResults = {...any.simpleObject(), vcs};
53+
const gitNextSteps = any.listOf(any.simpleObject);
54+
const vcsResults = {...any.simpleObject(), vcs, nextSteps: gitNextSteps};
5455
const tags = any.listOf(any.word);
5556
const visibility = any.word();
5657
const vcsIgnore = any.simpleObject();
@@ -74,7 +75,6 @@ describe('project scaffolder', () => {
7475
const copyright = {year, holder};
7576
const gitRepoShouldBeInitialized = true;
7677
const dependencyUpdaters = any.simpleObject();
77-
const gitNextSteps = any.listOf(any.simpleObject);
7878
const dependencyUpdaterNextSteps = any.listOf(any.simpleObject);
7979
const dependencyUpdaterContributionBadges = any.simpleObject();
8080
const dependencyUpdaterResults = {
@@ -89,7 +89,6 @@ describe('project scaffolder', () => {
8989
tags
9090
};
9191
const licenseResults = {badges: {consumer: {license: licenseBadge}}};
92-
const gitResults = {nextSteps: gitNextSteps};
9392
const contributingResults = any.simpleObject();
9493
when(optionsValidator.validate)
9594
.calledWith(options)
@@ -111,7 +110,6 @@ describe('project scaffolder', () => {
111110
when(scaffoldGit)
112111
.calledWith(gitRepoShouldBeInitialized, projectPath, projectName, description, vcsHosts, visibility, decisions)
113112
.mockResolvedValue(vcsResults);
114-
liftGit.mockResolvedValue(gitResults);
115113
when(licenseScaffolder.default)
116114
.calledWith({projectRoot: projectPath, license, copyright})
117115
.mockResolvedValue(licenseResults);
@@ -123,7 +121,6 @@ describe('project scaffolder', () => {
123121

124122
await scaffold(options);
125123

126-
expect(liftGit).toHaveBeenCalledWith({projectRoot: projectPath, vcs});
127124
expect(scaffoldReadme).toHaveBeenCalledWith({projectName, projectRoot: projectPath, description});
128125
expect(dependencyUpdaterScaffolder.default).toHaveBeenCalledWith(
129126
dependencyUpdaters,
@@ -139,7 +136,7 @@ describe('project scaffolder', () => {
139136
languageResults,
140137
dependencyUpdaterResults,
141138
contributingResults,
142-
gitResults
139+
vcsResults
143140
]),
144141
enhancers: {...dependencyUpdaters, ...vcsHosts}
145142
});
@@ -216,7 +213,6 @@ describe('project scaffolder', () => {
216213

217214
await scaffold(options);
218215

219-
expect(liftGit).toHaveBeenCalledWith({projectRoot: projectPath, vcs});
220216
expect(scaffoldReadme).toHaveBeenCalledWith({projectName, projectRoot: projectPath, description});
221217
});
222218

@@ -229,12 +225,10 @@ describe('project scaffolder', () => {
229225

230226
await scaffold(options);
231227

232-
expect(liftGit).not.toHaveBeenCalled();
233228
expect(dependencyUpdaterScaffolder.default).not.toHaveBeenCalled();
234229
});
235230

236231
it('should scaffold the details of the chosen language plugin', async () => {
237-
const gitNextSteps = any.listOf(any.simpleObject);
238232
const languageConsumerBadges = any.simpleObject();
239233
const languageContributionBadges = any.simpleObject();
240234
const languageStatusBadges = any.simpleObject();
@@ -254,12 +248,10 @@ describe('project scaffolder', () => {
254248
nextSteps: languageNextSteps,
255249
tags
256250
};
257-
const gitResults = {nextSteps: gitNextSteps};
258251
when(optionsValidator.validate)
259252
.calledWith(options)
260253
.mockReturnValue({decisions, plugins: {languages, vcsHosts}});
261254
scaffoldGit.mockResolvedValue(vcsResults);
262-
liftGit.mockResolvedValue(gitResults);
263255
prompts.promptForBaseDetails.mockResolvedValue({
264256
[coreQuestionNames.PROJECT_NAME]: projectName,
265257
[coreQuestionNames.VISIBILITY]: visibility,
@@ -285,7 +277,6 @@ describe('project scaffolder', () => {
285277

286278
await scaffold(options);
287279

288-
expect(liftGit).toHaveBeenCalledWith({projectRoot: projectPath, vcs});
289280
expect(scaffoldReadme).toHaveBeenCalledWith({projectName, projectRoot: projectPath, description});
290281
expect(execaPipe).toHaveBeenCalledWith(process.stdout);
291282
expect(resultsReporter.reportResults).toHaveBeenCalledWith({nextSteps: [...languageNextSteps, ...gitNextSteps]});
@@ -313,7 +304,6 @@ describe('project scaffolder', () => {
313304

314305
await scaffold(options);
315306

316-
expect(liftGit).toHaveBeenCalledWith({projectRoot: projectPath, vcs});
317307
expect(scaffoldReadme).toHaveBeenCalledWith({projectName, projectRoot: projectPath, description});
318308
expect(execa).not.toHaveBeenCalled();
319309
});

src/vcs/git/git.js

+14-15
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ async function getExistingRemotes(git) {
1919
}
2020
}
2121

22-
async function defineRemoteOrigin(projectRoot, vcs) {
22+
async function defineRemoteOrigin(projectRoot, sshUrl) {
2323
const git = simpleGit({baseDir: projectRoot});
2424
const existingRemotes = await getExistingRemotes(git);
2525

@@ -29,10 +29,10 @@ async function defineRemoteOrigin(projectRoot, vcs) {
2929
return {nextSteps: []};
3030
}
3131

32-
if (vcs.sshUrl) {
33-
info(`Setting remote origin to ${vcs.sshUrl}`, {level: 'secondary'});
32+
if (sshUrl) {
33+
info(`Setting remote origin to ${sshUrl}`, {level: 'secondary'});
3434

35-
await git.addRemote('origin', vcs.sshUrl);
35+
await git.addRemote('origin', sshUrl);
3636

3737
// info('Setting the local `master` branch to track `origin/master`');
3838
//
@@ -49,7 +49,7 @@ async function defineRemoteOrigin(projectRoot, vcs) {
4949
return {nextSteps: []};
5050
}
5151

52-
export async function initialize(
52+
export async function scaffold(
5353
gitRepoShouldBeInitialized,
5454
projectRoot,
5555
projectName,
@@ -66,31 +66,30 @@ export async function initialize(
6666
const remoteOrigin = await git.remote(['get-url', 'origin']);
6767
const {user, project, type} = hostedGitInfo.fromUrl(remoteOrigin);
6868

69-
return {owner: user, name: project, host: type};
69+
return {vcs: {owner: user, name: project, host: type}};
7070
}
7171

7272
const [answers] = await Promise.all([
7373
promptForVcsHostDetails(vcsHosts, visibility, decisions),
7474
scaffoldGit({projectRoot})
7575
]);
7676

77-
return scaffoldVcsHost(vcsHosts, {
77+
const {vcs: {host, owner, name, sshUrl}} = await scaffoldVcsHost(vcsHosts, {
7878
chosenHost: answers[questionNames.REPO_HOST].toLowerCase(),
7979
owner: answers[questionNames.REPO_OWNER],
8080
projectName,
8181
projectRoot,
8282
description,
8383
visibility
8484
});
85-
}
86-
87-
return {};
88-
}
8985

90-
export async function scaffold({projectRoot, vcs}) {
91-
info('Finishing Git Configuration');
86+
const remoteOriginResults = await defineRemoteOrigin(projectRoot, sshUrl);
9287

93-
const remoteOriginResults = await defineRemoteOrigin(projectRoot, vcs);
88+
return {
89+
vcs: {host, owner, name},
90+
nextSteps: [{summary: 'Commit scaffolded files'}, ...remoteOriginResults.nextSteps]
91+
};
92+
}
9493

95-
return {nextSteps: [{summary: 'Commit scaffolded files'}, ...remoteOriginResults.nextSteps]};
94+
return {};
9695
}

0 commit comments

Comments
 (0)