Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Project command improvements #548

Merged
merged 5 commits into from
Sep 13, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 30 additions & 8 deletions packages/cli/commands/project/upload.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
const chalk = require('chalk');
const fs = require('fs');
const path = require('path');
const archiver = require('archiver');
const tmp = require('tmp');
const Spinnies = require('spinnies');
const {
addAccountOptions,
addConfigOptions,
Expand All @@ -18,18 +24,14 @@ const {
} = require('@hubspot/cli-lib/errorHandlers');
const { logger } = require('@hubspot/cli-lib/logger');
const { uploadProject } = require('@hubspot/cli-lib/api/dfs');
const { validateAccount } = require('../../lib/validation');
const fs = require('fs');
const { shouldIgnoreFile } = require('@hubspot/cli-lib/ignoreRules');
const { getCwd } = require('@hubspot/cli-lib/path');
const path = require('path');
const archiver = require('archiver');
const tmp = require('tmp');
const { validateAccount } = require('../../lib/validation');
const {
getProjectConfig,
validateProjectConfig,
pollBuildStatus,
} = require('../../lib/projects');
const { shouldIgnoreFile } = require('@hubspot/cli-lib/ignoreRules');

const loadAndValidateOptions = async options => {
setLogLevel(options);
Expand All @@ -47,11 +49,24 @@ exports.command = 'upload [path]';
exports.describe = false;

const uploadProjectFiles = async (accountId, projectName, filePath) => {
logger.log(`Uploading project '${projectName}'...`);
const spinnies = new Spinnies();

spinnies.add('upload', {
text: `Uploading ${chalk.bold(projectName)} project files to ${chalk.bold(
accountId
)}`,
});

try {
const upload = await uploadProject(accountId, projectName, filePath);

logger.log(
spinnies.succeed('upload', {
text: `Uploaded ${chalk.bold(projectName)} project files to ${chalk.bold(
accountId
)}`,
});

logger.debug(
`Project "${projectName}" uploaded and build #${upload.buildId} created`
);
await pollBuildStatus(accountId, projectName, upload.buildId);
Expand All @@ -61,6 +76,13 @@ const uploadProjectFiles = async (accountId, projectName, filePath) => {
`Project '${projectName}' does not exist. Try running 'hs project init' first.`
);
}

spinnies.fail('upload', {
text: `Failed to upload ${chalk.bold(
projectName
)} project files to ${chalk.bold(accountId)}`,
});

logApiErrorInstance(err, {
context: new ApiErrorContext({
accountId,
Expand Down
46 changes: 38 additions & 8 deletions packages/cli/lib/projects.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,23 @@ const getOrCreateProjectConfig = async projectPath => {
const { name, srcDir } = await prompt([
{
name: 'name',
message: 'name',
message: 'Please enter a project name:',
validate: input => {
if (!input) {
return 'A project name is required';
}
return true;
},
},
{
name: 'srcDir',
message: 'srcDir',
message: 'Which directory contains your project files?',
validate: input => {
if (!input) {
return 'A source directory is required';
}
return true;
},
},
]);
writeProjectConfig(path.join(projectPath, 'hsproject.json'), {
Expand All @@ -88,6 +100,13 @@ const validateProjectConfig = projectConfig => {
);
process.exit(1);
}

if (!fs.existsSync(projectConfig.srcDir)) {
logger.error(
`Project source directory '${projectConfig.srcDir}' does not exist.`
);
process.exit(1);
}
};

const getProjectDetailUrl = (projectName, accountId) => {
Expand Down Expand Up @@ -131,10 +150,15 @@ const pollBuildStatus = async (accountId, name, buildId) => {
const buildStatus = await getBuildStatus(accountId, name, buildId);
const spinnies = new Spinnies();

logger.log(`Building project '${name}'...`);
logger.log();
logger.log(`Building ${chalk.bold(name)}`);
logger.log();
logger.log(`Found ${buildStatus.subbuildStatuses.length} deployables ...`);
logger.log();

for (let subBuild of buildStatus.subbuildStatuses) {
spinnies.add(subBuild.buildName, {
text: `'${subBuild.buildName}' ${
text: `${chalk.bold(subBuild.buildName)} #${buildId} ${
PROJECT_BUILD_STATUS_TEXT[PROJECT_BUILD_STATUS.ENQUEUED]
}`,
});
Expand All @@ -149,7 +173,7 @@ const pollBuildStatus = async (accountId, name, buildId) => {

if (Object.keys(spinnies.spinners).length) {
subbuildStatuses.forEach(subBuild => {
const updatedText = `'${subBuild.buildName}' ${
const updatedText = `${chalk.bold(subBuild.buildName)} #${buildId} ${
PROJECT_BUILD_STATUS_TEXT[subBuild.status]
}`;

Expand Down Expand Up @@ -178,16 +202,22 @@ const pollBuildStatus = async (accountId, name, buildId) => {

if (status === PROJECT_BUILD_STATUS.SUCCESS) {
logger.success(
`Your project '${name}' ${PROJECT_BUILD_STATUS_TEXT[status]}.`
`Your project ${chalk.bold(name)} ${
PROJECT_BUILD_STATUS_TEXT[status]
}.`
);
} else if (status === PROJECT_BUILD_STATUS.FAILURE) {
logger.error(
`Your project '${name}' ${PROJECT_BUILD_STATUS_TEXT[status]}.`
`Your project ${chalk.bold(name)} ${
PROJECT_BUILD_STATUS_TEXT[status]
}.`
);
subbuildStatuses.forEach(subBuild => {
if (subBuild.status === PROJECT_BUILD_STATUS.FAILURE) {
logger.error(
`${subBuild.buildName} failed to build. ${subBuild.errorMessage}.`
`${chalk.bold(subBuild.buildName)} failed to build. ${
subBuild.errorMessage
}.`
);
}
});
Expand Down