From 4d59718515b30a96d2efbdaa970feda8ee88aa67 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Tue, 4 Jan 2022 22:20:12 -0600 Subject: [PATCH 1/6] Bump the vsce version to the latest --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index b71b6e43..fef1340a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,7 @@ "ts-loader": "^9.2.2", "typescript": "^4.3.2", "util": "^0.12.4", - "vsce": "^2.6.0", + "vsce": "^2.6.3", "vscode-test": "^1.6.1", "webpack": "^5.38.1", "webpack-cli": "^4.7.0" @@ -4813,9 +4813,9 @@ "dev": true }, "node_modules/vsce": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.6.0.tgz", - "integrity": "sha512-cF2+RdWq7+VztKWyxtKR74khPKUEqvipBnLu46aJyQmuLAusIzJbQB+Rq5AQx8T8T5dkAELfHh/AyJVxRi5huw==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.6.3.tgz", + "integrity": "sha512-PKfvAtG9rLT1evHiKOJpBHND1hUHOOf4lL7chZFp0KGu+Bpgcx3g3T5eq0d8Hmzd08zd3KJunsaA3iaNSmTU/A==", "dev": true, "dependencies": { "azure-devops-node-api": "^11.0.1", @@ -9121,9 +9121,9 @@ "dev": true }, "vsce": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.6.0.tgz", - "integrity": "sha512-cF2+RdWq7+VztKWyxtKR74khPKUEqvipBnLu46aJyQmuLAusIzJbQB+Rq5AQx8T8T5dkAELfHh/AyJVxRi5huw==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.6.3.tgz", + "integrity": "sha512-PKfvAtG9rLT1evHiKOJpBHND1hUHOOf4lL7chZFp0KGu+Bpgcx3g3T5eq0d8Hmzd08zd3KJunsaA3iaNSmTU/A==", "dev": true, "requires": { "azure-devops-node-api": "^11.0.1", diff --git a/package.json b/package.json index 59da751f..b56e6787 100644 --- a/package.json +++ b/package.json @@ -302,7 +302,7 @@ "ts-loader": "^9.2.2", "typescript": "^4.3.2", "util": "^0.12.4", - "vsce": "^2.6.0", + "vsce": "^2.6.3", "vscode-test": "^1.6.1", "webpack": "^5.38.1", "webpack-cli": "^4.7.0" From aaf81dc5f31a5c367333c1aaa81ad6f4d69abaf6 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Tue, 4 Jan 2022 23:15:30 -0600 Subject: [PATCH 2/6] Create a config file when they click to create one When there's no config file, don't just show a link to learn more. Offer to create a config file for them. --- src/classes/JobProvider.ts | 9 +++----- src/constants/index.ts | 4 +--- src/extension.ts | 41 +++++++++++++++++++++++++--------- src/utils/getConfigFilePath.ts | 12 +++++----- src/utils/getStarterConfig.ts | 25 +++++++++++++++++++++ 5 files changed, 66 insertions(+), 25 deletions(-) create mode 100644 src/utils/getStarterConfig.ts diff --git a/src/classes/JobProvider.ts b/src/classes/JobProvider.ts index f53fd7db..4ace0cf5 100644 --- a/src/classes/JobProvider.ts +++ b/src/classes/JobProvider.ts @@ -14,10 +14,10 @@ import isTrialExpired from '../utils/isTrialExpired'; import getDockerError from '../utils/getDockerError'; import prepareConfig from '../utils/prepareConfig'; import { + CREATE_CONFIG_FILE_COMMAND, ENTER_LICENSE_COMMAND, GET_LICENSE_COMMAND, JOB_TREE_VIEW_ID, - OPEN_LEARN_MORE_COMMAND, TRIAL_STARTED_TIMESTAMP, } from '../constants'; @@ -171,11 +171,8 @@ export default class JobProvider ]; case JobError.noConfigFilePathInWorkspace: return [ - new Warning('Error: No jobs found'), - new vscode.TreeItem( - 'Please add a .circleci/config.yml to this workspace' - ), - new Command('Learn more', OPEN_LEARN_MORE_COMMAND), + new Warning('Error: No .circleci/config.yml found'), + new Command('Create a config for me', CREATE_CONFIG_FILE_COMMAND), ]; case JobError.noConfigFilePathSelected: return [ diff --git a/src/constants/index.ts b/src/constants/index.ts index caefa395..e553141c 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -43,9 +43,7 @@ export const HOST_TMP_DIRECTORY = '/tmp/local-ci'; // Also hard-coded in node/un export const PROCESS_FILE_DIRECTORY = `${HOST_TMP_DIRECTORY}/process`; export const LOCAL_VOLUME_DIRECTORY = `${HOST_TMP_DIRECTORY}/volume`; export const RUN_JOB_COMMAND = 'local-ci.job.run'; -export const OPEN_LEARN_MORE_COMMAND = 'local-ci.open.learn-more.config'; -export const CONFIG_LEARN_MORE_URL = - 'https://circleci.com/docs/2.0/config-intro/'; +export const CREATE_CONFIG_FILE_COMMAND = 'local-ci.create.config'; export const CONTINUE_PIPELINE_STEP_NAME = 'Continue the pipeline'; export const SCHEDULE_INTERVIEW_URL = 'https://tidycal.com/localci/30-minute-meeting'; diff --git a/src/extension.ts b/src/extension.ts index 1cb44110..39564e8d 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,3 +1,4 @@ +import * as path from 'path'; import * as fs from 'fs'; import * as vscode from 'vscode'; import TelemetryReporter from 'vscode-extension-telemetry'; @@ -8,7 +9,7 @@ import JobProvider from './classes/JobProvider'; import LicenseProvider from './classes/LicenseProvider'; import { COMMITTED_IMAGE_NAMESPACE, - CONFIG_LEARN_MORE_URL, + CREATE_CONFIG_FILE_COMMAND, ENTER_LICENSE_COMMAND, EXIT_JOB_COMMAND, EXTENSION_ID, @@ -17,7 +18,6 @@ import { HELP_URL, HOST_TMP_DIRECTORY, JOB_TREE_VIEW_ID, - OPEN_LEARN_MORE_COMMAND, RUN_JOB_COMMAND, SELECTED_CONFIG_PATH, TELEMETRY_KEY, @@ -31,6 +31,7 @@ import getConfig from './utils/getConfig'; import getConfigFilePath from './utils/getConfigFilePath'; import getDebuggingTerminalName from './utils/getDebuggingTerminalName'; import getFinalTerminalName from './utils/getFinalTerminalName'; +import getStarterConfig from './utils/getStarterConfig'; import getRepoBasename from './utils/getRepoBasename'; import prepareConfig from './utils/prepareConfig'; import runJob from './utils/runJob'; @@ -125,7 +126,7 @@ export function activate(context: vscode.ExtensionContext): void { async () => { reporter.sendTelemetryEvent('selectRepo'); - const learnMoreText = 'Learn more'; + const createConfigText = 'Create a config for me'; const quickPick = vscode.window.createQuickPick(); const configFilePaths = await getAllConfigFilePaths(context); quickPick.title = 'Repo to run CI on'; @@ -135,15 +136,15 @@ export function activate(context: vscode.ExtensionContext): void { { label: 'No config file found', description: - 'Please add a .circleci/config.yml file so Local CI can run', + 'A .circleci/config.yml file is needed to run Local CI', }, { - label: learnMoreText, + label: createConfigText, }, ]; quickPick.onDidChangeSelection((selection) => { - if (selection.length && selection[0].label === learnMoreText) { - vscode.commands.executeCommand(OPEN_LEARN_MORE_COMMAND); + if (selection.length && selection[0].label === createConfigText) { + vscode.commands.executeCommand(CREATE_CONFIG_FILE_COMMAND); } if ( selection?.length && @@ -297,9 +298,29 @@ export function activate(context: vscode.ExtensionContext): void { licenseSuccessCallback ); }), - vscode.commands.registerCommand(OPEN_LEARN_MORE_COMMAND, () => { - reporter.sendTelemetryEvent('click.config.learnMore'); - vscode.env.openExternal(vscode.Uri.parse(CONFIG_LEARN_MORE_URL)); + vscode.commands.registerCommand(CREATE_CONFIG_FILE_COMMAND, async () => { + reporter.sendTelemetryEvent('createConfigFile'); + const folderUri = vscode.workspace.workspaceFolders?.length + ? vscode.workspace.workspaceFolders[0].uri + : null; + if (!folderUri) { + return; + } + + const configUri = folderUri.with({ + path: path.posix.join(folderUri.path, '.circleci', 'config.yml'), + }); + await vscode.workspace.fs.writeFile( + configUri, + Buffer.from(getStarterConfig(), 'utf8') + ); + vscode.window.showTextDocument(configUri); + + vscode.window.showInformationMessage( + `👆 Here's a starter config file that you can edit`, + { detail: 'Starter config file' } + ); + jobProvider.refresh(); }) ); diff --git a/src/utils/getConfigFilePath.ts b/src/utils/getConfigFilePath.ts index 436468f8..ddc64368 100644 --- a/src/utils/getConfigFilePath.ts +++ b/src/utils/getConfigFilePath.ts @@ -1,5 +1,5 @@ import * as vscode from 'vscode'; -import { OPEN_LEARN_MORE_COMMAND, SELECTED_CONFIG_PATH } from '../constants'; +import { CREATE_CONFIG_FILE_COMMAND, SELECTED_CONFIG_PATH } from '../constants'; import getAllConfigFilePaths from './getAllConfigFilePaths'; // Gets the path of the selected .circleci/config.yml to run the jobs on. @@ -19,16 +19,16 @@ export default async function getConfigFilePath( const allConfigFilePaths = await getAllConfigFilePaths(context); if (!allConfigFilePaths.length) { - const learnMoreText = 'Learn more'; + const createConfigText = 'Create a config for me'; vscode.window .showInformationMessage( - 'Please add a .circleci/config.yml file so Local CI can run it', + `Let's get you started with a .circleci/config.yml file so you can use Local CI`, { detail: 'There is no config file for Local CI to run' }, - learnMoreText + createConfigText ) .then((clicked) => { - if (clicked === learnMoreText) { - vscode.commands.executeCommand(OPEN_LEARN_MORE_COMMAND); + if (clicked === createConfigText) { + vscode.commands.executeCommand(CREATE_CONFIG_FILE_COMMAND); } }); diff --git a/src/utils/getStarterConfig.ts b/src/utils/getStarterConfig.ts new file mode 100644 index 00000000..ace63d95 --- /dev/null +++ b/src/utils/getStarterConfig.ts @@ -0,0 +1,25 @@ +export default function getStarterConfig(): string { + return `# https://circleci.com/docs/2.0/config-intro/ + +version: 2.1 +executors: + node: + docker: + - image: cimg/node:16.8.0-browsers + +jobs: + test: + executor: + name: node + steps: + - checkout + - run: echo "Running example step, please edit this file" + +workflows: + test-lint: + jobs: + - test: + filters: + tags: + only: /.*/\n`; +} From 7691c03f03886163d25a056fee3783b562e92a80 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Tue, 4 Jan 2022 23:18:53 -0600 Subject: [PATCH 3/6] Add an empty line for clarity --- src/extension.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/extension.ts b/src/extension.ts index 39564e8d..eb50b99c 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -303,6 +303,7 @@ export function activate(context: vscode.ExtensionContext): void { const folderUri = vscode.workspace.workspaceFolders?.length ? vscode.workspace.workspaceFolders[0].uri : null; + if (!folderUri) { return; } From 63c648f59cb56b239ff4aa1f118cac6c08696514 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Tue, 4 Jan 2022 23:29:52 -0600 Subject: [PATCH 4/6] Make an import statement alphabetical --- src/extension.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/extension.ts b/src/extension.ts index eb50b99c..30ab5826 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -31,8 +31,8 @@ import getConfig from './utils/getConfig'; import getConfigFilePath from './utils/getConfigFilePath'; import getDebuggingTerminalName from './utils/getDebuggingTerminalName'; import getFinalTerminalName from './utils/getFinalTerminalName'; -import getStarterConfig from './utils/getStarterConfig'; import getRepoBasename from './utils/getRepoBasename'; +import getStarterConfig from './utils/getStarterConfig'; import prepareConfig from './utils/prepareConfig'; import runJob from './utils/runJob'; import showLicenseInput from './utils/showLicenseInput'; From 02eee65caaf367ea4b4f2e9ab77002b15ca08b57 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Tue, 4 Jan 2022 23:41:18 -0600 Subject: [PATCH 5/6] Bump version to 1.4.2, add a CHANGELOG entry --- CHANGELOG.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e08ad966..13afd685 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log + +## 1.4.2 - 4 January 2022 + +### Added +- Optionally create a config file when none exists. [#69](https://github.com/getlocalci/local-ci/pull/69/) +- Bump `vsce` package to the latest version. [#68](https://github.com/getlocalci/local-ci/pull/68/) + ## 1.4.1 - 3 January 2022 ### Added diff --git a/package-lock.json b/package-lock.json index fef1340a..14c347c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "local-ci", - "version": "1.4.1", + "version": "1.4.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "local-ci", - "version": "1.4.1", + "version": "1.4.2", "hasInstallScript": true, "license": "GPL-2.0-or-later", "os": [ diff --git a/package.json b/package.json index b56e6787..7a1da0ef 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "local-ci", "displayName": "Local CI", "description": "Debug CircleCI® workflows locally, with Bash access during and after. Free preview, then paid.", - "version": "1.4.1", + "version": "1.4.2", "publisher": "LocalCI", "contributors": [ "Ryan Kienstra" From ed34866c070d54b07b32e0c2d5dd2a81b3451ac5 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Tue, 4 Jan 2022 23:43:23 -0600 Subject: [PATCH 6/6] Remove extra empty line --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13afd685..647b7da0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,5 @@ # Change Log - ## 1.4.2 - 4 January 2022 ### Added