提交 cd9315af 编写于 作者: T Tomas Vik

Merge branch 'use-constants-for-commands' into 'main'

refactor: use contants for commands instead of string literals

See merge request gitlab-org/gitlab-vscode-extension!136
import { USER_COMMANDS } from './command_names';
import * as packageJson from '../package.json';
describe('user commands', () => {
it('should match exactly commands defined in package.json', () => {
const packageJsonCommands = packageJson.contributes.commands.map(c => c.command);
const constantCommands = Object.values(USER_COMMANDS);
expect(packageJsonCommands.sort()).toEqual(constantCommands.sort());
});
});
/*
Commands that can be triggered from the command palette.
These commands must be exactly the same as the contributed commands in package.json.
*/
export const USER_COMMANDS = {
SET_TOKEN: 'gl.setToken',
REMOVE_TOKEN: 'gl.removeToken',
SHOW_ISSUES_ASSIGNED_TO_ME: 'gl.showIssuesAssignedToMe',
SHOW_MERGE_REQUESTS_ASSIGNED_TO_ME: 'gl.showMergeRequestsAssignedToMe',
OPEN_ACTIVE_FILE: 'gl.openActiveFile',
COPY_LINK_TO_ACTIVE_FILE: 'gl.copyLinkToActiveFile',
OPEN_CURRENT_MERGE_REQUEST: 'gl.openCurrentMergeRequest',
OPEN_CREATE_NEW_ISSUE: 'gl.openCreateNewIssue',
OPEN_CREATE_NEW_MR: 'gl.openCreateNewMR',
OPEN_PROJECT_PAGE: 'gl.openProjectPage',
OPEN_CURRENT_PIPELINE: 'gl.openCurrentPipeline',
PIPELINE_ACTIONS: 'gl.pipelineActions',
ISSUE_SEARCH: 'gl.issueSearch',
MERGE_REQUEST_SEARCH: 'gl.mergeRequestSearch',
PROJECT_ADVANCED_SEARCH: 'gl.projectAdvancedSearch',
COMPARE_CURRENT_BRANCH: 'gl.compareCurrentBranch',
CREATE_SNIPPET: 'gl.createSnippet',
INSERT_SNIPPET: 'gl.insertSnippet',
VALIDATE_CI_CONFIG: 'gl.validateCIConfig',
SHOW_OUTPUT: 'gl.showOutput',
REFRESH_SIDEBAR: 'gl.refreshSidebar',
};
/*
User can't trigger these commands directly. We use them from within the code.
*/
export const PROGRAMMATIC_COMMANDS = {
SHOW_RICH_CONTENT: 'gl.showRichContent',
NO_IMAGE_REVIEW: 'gl.noImageReview',
};
export const VS_COMMANDS = {
DIFF: 'vscode.diff',
OPEN: 'vscode.open',
};
import { PROGRAMMATIC_COMMANDS } from '../../command_names';
import { diffFile, issuable, mrVersion, project } from '../../test_utils/entities';
import { ChangedFileItem } from './changed_file_item';
......@@ -8,7 +9,7 @@ describe('ChangedFileItem', () => {
extension => {
const changedImageFile = { ...diffFile, new_path: `file${extension}` };
const item = new ChangedFileItem(issuable, mrVersion, changedImageFile, project);
expect(item.command?.command).toBe('gl.noImageReview');
expect(item.command?.command).toBe(PROGRAMMATIC_COMMANDS.NO_IMAGE_REVIEW);
},
);
});
......
import { TreeItem, Uri } from 'vscode';
import { posix as path } from 'path';
import { toReviewUri } from '../../review/review_uri';
import { PROGRAMMATIC_COMMANDS, VS_COMMANDS } from '../../command_names';
const getChangeTypeIndicator = (diff: RestDiffFile): string => {
if (diff.new_file) return '[added] ';
......@@ -45,7 +46,7 @@ export class ChangedFileItem extends TreeItem {
if (looksLikeImage(file.old_path) || looksLikeImage(file.new_path)) {
this.command = {
title: 'Images are not supported',
command: 'gl.noImageReview',
command: PROGRAMMATIC_COMMANDS.NO_IMAGE_REVIEW,
};
return;
}
......@@ -70,7 +71,7 @@ export class ChangedFileItem extends TreeItem {
this.command = {
title: 'Show changes',
command: 'vscode.diff',
command: VS_COMMANDS.DIFF,
arguments: [baseFileUri, headFileUri, `${path.basename(file.new_path)} (!${mr.iid})`],
};
}
......
import { TreeItem, Uri } from 'vscode';
import { VS_COMMANDS } from '../../command_names';
export class ExternalUrlItem extends TreeItem {
constructor(label: string, url: string) {
super(label);
this.command = {
title: 'Open URL',
command: 'vscode.open',
command: VS_COMMANDS.OPEN,
arguments: [Uri.parse(url)],
};
}
......
import { TreeItem } from 'vscode';
import { PROGRAMMATIC_COMMANDS } from '../../command_names';
export class IssueItem extends TreeItem {
issue: RestIssuable;
......@@ -10,7 +11,7 @@ export class IssueItem extends TreeItem {
this.issue = issue;
this.project = project;
this.command = {
command: 'gl.showRichContent',
command: PROGRAMMATIC_COMMANDS.SHOW_RICH_CONTENT,
arguments: [this.issue, this.project.uri],
title: 'Show Issue',
};
......
import { TreeItem, TreeItemCollapsibleState, ThemeIcon } from 'vscode';
import { PROGRAMMATIC_COMMANDS } from '../../command_names';
import { GitLabNewService } from '../../gitlab/gitlab_new_service';
import { createGitService } from '../../git_service_factory';
import { ChangedFileItem } from './changed_file_item';
......@@ -18,7 +19,7 @@ export class MrItem extends TreeItem {
const description = new TreeItem('Description');
description.iconPath = new ThemeIcon('note');
description.command = {
command: 'gl.showRichContent',
command: PROGRAMMATIC_COMMANDS.SHOW_RICH_CONTENT,
arguments: [this.mr, this.project.uri],
title: 'Show MR',
};
......
import { TreeItem, Uri } from 'vscode';
import * as vscode from 'vscode';
import { VS_COMMANDS } from '../../command_names';
export class VulnerabilityItem extends TreeItem {
constructor(v: RestVulnerability) {
......@@ -9,7 +10,7 @@ export class VulnerabilityItem extends TreeItem {
: Uri.parse(v.web_url);
this.command = {
title: 'Open Vulnerability',
command: 'vscode.open',
command: VS_COMMANDS.OPEN,
arguments: [arg],
};
}
......
......@@ -16,6 +16,7 @@ const { initializeLogging, handleError } = require('./log');
const checkDeprecatedCertificateSettings = require('./check_deprecated_certificate_settings');
const { ApiContentProvider } = require('./review/api_content_provider');
const { REVIEW_URI_SCHEME } = require('./constants');
const { USER_COMMANDS, PROGRAMMATIC_COMMANDS } = require('./command_names');
vscode.gitLabWorkflow = {
sidebarDataProviders: [],
......@@ -45,29 +46,29 @@ const registerSidebarTreeDataProviders = () => {
const registerCommands = (context, outputChannel) => {
const commands = {
'gl.showIssuesAssignedToMe': openers.showIssues,
'gl.showMergeRequestsAssignedToMe': openers.showMergeRequests,
'gl.setToken': tokenInput.showInput,
'gl.removeToken': tokenInput.removeTokenPicker,
'gl.openActiveFile': openers.openActiveFile,
'gl.copyLinkToActiveFile': openers.copyLinkToActiveFile,
'gl.openCurrentMergeRequest': openers.openCurrentMergeRequest,
'gl.openCreateNewIssue': openers.openCreateNewIssue,
'gl.openCreateNewMR': openers.openCreateNewMr,
'gl.openProjectPage': openers.openProjectPage,
'gl.openCurrentPipeline': openers.openCurrentPipeline,
'gl.pipelineActions': pipelineActionsPicker.showPicker,
'gl.issueSearch': searchInput.showIssueSearchInput,
'gl.mergeRequestSearch': searchInput.showMergeRequestSearchInput,
'gl.projectAdvancedSearch': searchInput.showProjectAdvancedSearchInput,
'gl.compareCurrentBranch': openers.compareCurrentBranch,
'gl.createSnippet': createSnippet,
'gl.insertSnippet': insertSnippet,
'gl.validateCIConfig': ciConfigValidator.validate,
'gl.refreshSidebar': sidebar.refresh,
'gl.showRichContent': webviewController.create,
'gl.showOutput': () => outputChannel.show(),
'gl.noImageReview': () =>
[USER_COMMANDS.SHOW_ISSUES_ASSIGNED_TO_ME]: openers.showIssues,
[USER_COMMANDS.SHOW_MERGE_REQUESTS_ASSIGNED_TO_ME]: openers.showMergeRequests,
[USER_COMMANDS.SET_TOKEN]: tokenInput.showInput,
[USER_COMMANDS.REMOVE_TOKEN]: tokenInput.removeTokenPicker,
[USER_COMMANDS.OPEN_ACTIVE_FILE]: openers.openActiveFile,
[USER_COMMANDS.COPY_LINK_TO_ACTIVE_FILE]: openers.copyLinkToActiveFile,
[USER_COMMANDS.OPEN_CURRENT_MERGE_REQUEST]: openers.openCurrentMergeRequest,
[USER_COMMANDS.OPEN_CREATE_NEW_ISSUE]: openers.openCreateNewIssue,
[USER_COMMANDS.OPEN_CREATE_NEW_MR]: openers.openCreateNewMr,
[USER_COMMANDS.OPEN_PROJECT_PAGE]: openers.openProjectPage,
[USER_COMMANDS.OPEN_CURRENT_PIPELINE]: openers.openCurrentPipeline,
[USER_COMMANDS.PIPELINE_ACTIONS]: pipelineActionsPicker.showPicker,
[USER_COMMANDS.ISSUE_SEARCH]: searchInput.showIssueSearchInput,
[USER_COMMANDS.MERGE_REQUEST_SEARCH]: searchInput.showMergeRequestSearchInput,
[USER_COMMANDS.PROJECT_ADVANCED_SEARCH]: searchInput.showProjectAdvancedSearchInput,
[USER_COMMANDS.COMPARE_CURRENT_BRANCH]: openers.compareCurrentBranch,
[USER_COMMANDS.CREATE_SNIPPET]: createSnippet,
[USER_COMMANDS.INSERT_SNIPPET]: insertSnippet,
[USER_COMMANDS.VALIDATE_CI_CONFIG]: ciConfigValidator.validate,
[USER_COMMANDS.REFRESH_SIDEBAR]: sidebar.refresh,
[PROGRAMMATIC_COMMANDS.SHOW_RICH_CONTENT]: webviewController.create,
[USER_COMMANDS.SHOW_OUTPUT]: () => outputChannel.show(),
[PROGRAMMATIC_COMMANDS.NO_IMAGE_REVIEW]: () =>
vscode.window.showInformationMessage("GitLab MR review doesn't support images yet."),
};
......
import * as vscode from 'vscode';
import { USER_COMMANDS } from './command_names';
import { IDetailedError } from './errors/common';
function isDetailedError(object: any): object is IDetailedError {
......@@ -22,6 +23,6 @@ export const handleError = async (e: Error | IDetailedError): Promise<void> => {
logError(e);
const choice = await vscode.window.showErrorMessage(e.message, 'Show logs');
if (choice === 'Show logs') {
await vscode.commands.executeCommand('gl.showOutput');
await vscode.commands.executeCommand(USER_COMMANDS.SHOW_OUTPUT);
}
};
......@@ -3,8 +3,9 @@ const gitLabService = require('./gitlab_service');
const { getCurrentWorkspaceFolderOrSelectOne } = require('./services/workspace_service');
const { createGitService } = require('./git_service_factory');
const { handleError } = require('./log');
const { VS_COMMANDS } = require('./command_names');
const openUrl = url => vscode.commands.executeCommand('vscode.open', vscode.Uri.parse(url));
const openUrl = url => vscode.commands.executeCommand(VS_COMMANDS.OPEN, vscode.Uri.parse(url));
/**
* Fetches user and project before opening a link.
......
......@@ -4,6 +4,7 @@ const gitLabService = require('./gitlab_service');
const { getCurrentWorkspaceFolder } = require('./services/workspace_service');
const { UserFriendlyError } = require('./errors/user_friendly_error');
const { handleError, logError } = require('./log');
const { USER_COMMANDS } = require('./command_names');
let context = null;
let pipelineStatusBarItem = null;
......@@ -116,7 +117,7 @@ async function refreshPipeline() {
const initPipelineStatus = async () => {
pipelineStatusBarItem = createStatusBarItem(
'$(info) GitLab: Fetching pipeline...',
'gl.pipelineActions',
USER_COMMANDS.PIPELINE_ACTIONS,
);
pipelinesStatusTimer = setInterval(() => {
......
......@@ -3,6 +3,7 @@ const { GITLAB_COM_URL } = require('./constants');
const openers = require('./openers');
const statusBar = require('./status_bar');
const { tokenService } = require('./services/token_service');
const { USER_COMMANDS } = require('./command_names');
let context = null;
let active = false;
......@@ -37,7 +38,7 @@ const askForToken = () => {
const { action } = item;
if (action === 'set') {
vscode.commands.executeCommand('gl.setToken');
vscode.commands.executeCommand(USER_COMMANDS.SET_TOKEN);
} else {
openers.openUrl('https://gitlab.com/gitlab-org/gitlab-vscode-extension#setup');
}
......
......@@ -7,6 +7,7 @@ const pipelinesResponse = require('./fixtures/rest/pipelines.json');
const pipelineResponse = require('./fixtures/rest/pipeline.json');
const { getServer, createJsonEndpoint } = require('./test_infrastructure/mock_server');
const { GITLAB_URL } = require('./test_infrastructure/constants');
const { USER_COMMANDS } = require('../../src/command_names');
describe('GitLab status bar', () => {
let server;
......@@ -54,6 +55,6 @@ describe('GitLab status bar', () => {
assert.strictEqual(pipelineItem.text, '$(check) GitLab: Pipeline passed');
assert.strictEqual(pipelineItem.show.called, true);
assert.strictEqual(pipelineItem.hide.called, false);
assert.strictEqual(pipelineItem.command, 'gl.pipelineActions');
assert.strictEqual(pipelineItem.command, USER_COMMANDS.PIPELINE_ACTIONS);
});
});
......@@ -15,6 +15,7 @@ const {
} = require('./test_infrastructure/mock_server');
const { GITLAB_URL } = require('./test_infrastructure/constants');
const { ApiContentProvider } = require('../../src/review/api_content_provider');
const { PROGRAMMATIC_COMMANDS } = require('../../src/command_names');
describe('GitLab tree view', () => {
let server;
......@@ -195,7 +196,7 @@ describe('GitLab tree view', () => {
it('should not show diff for images', () => {
const item = getItem('/Screenshot.png');
assert.strictEqual(item.command.command, 'gl.noImageReview');
assert.strictEqual(item.command.command, PROGRAMMATIC_COMMANDS.NO_IMAGE_REVIEW);
});
describe('Api content provider', () => {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册