extension.js 5.5 KB
Newer Older
1
const vscode = require('vscode');
F
Fatih Acet 已提交
2
const openers = require('./openers');
3
const tokenInput = require('./token_input');
T
Tomas Vik 已提交
4 5
const { tokenService } = require('./services/token_service');
const tokenServiceWrapper = require('./token_service_wrapper');
6
const { extensionState } = require('./extension_state');
F
Fatih Acet 已提交
7
const pipelineActionsPicker = require('./pipeline_actions_picker');
F
Fatih Acet 已提交
8
const searchInput = require('./search_input');
9 10
const { createSnippet } = require('./commands/create_snippet');
const { insertSnippet } = require('./commands/insert_snippet');
F
Fatih Acet 已提交
11
const sidebar = require('./sidebar');
F
Fatih Acet 已提交
12
const ciConfigValidator = require('./ci_config_validator');
13
const { webviewController } = require('./webview_controller');
F
Fatih Acet 已提交
14
const IssuableDataProvider = require('./data_providers/issuable').DataProvider;
F
Fatih Acet 已提交
15
const CurrentBranchDataProvider = require('./data_providers/current_branch').DataProvider;
16
const { initializeLogging, handleError } = require('./log');
17
const { GitContentProvider } = require('./review/git_content_provider');
18
const { REVIEW_URI_SCHEME } = require('./constants');
19
const { USER_COMMANDS, PROGRAMMATIC_COMMANDS } = require('./command_names');
20
const { CiCompletionProvider } = require('./completion/ci_completion_provider');
21
const { gitExtensionWrapper } = require('./git/git_extension_wrapper');
22 23 24 25 26
const {
  toggleResolved,
  deleteComment,
  editComment: startEdit,
  cancelEdit,
27
  submitEdit,
T
Tomas Vik 已提交
28
  createComment,
29
} = require('./commands/mr_discussion_commands');
30
const { fileDecorationProvider } = require('./review/file_decoration_provider');
31
const { checkVersion } = require('./utils/check_version');
32

F
Fatih Acet 已提交
33 34
vscode.gitLabWorkflow = {
  sidebarDataProviders: [],
35 36
};

37
const wrapWithCatch = command => async (...args) => {
38
  try {
39
    await command(...args);
40
  } catch (e) {
41
    handleError(e);
42
  }
F
Fatih Acet 已提交
43
};
F
Fatih Acet 已提交
44

F
Fatih Acet 已提交
45
const registerSidebarTreeDataProviders = () => {
46
  const issuableDataProvider = new IssuableDataProvider();
47

F
Fatih Acet 已提交
48 49
  const currentBranchDataProvider = new CurrentBranchDataProvider();

F
Fatih Acet 已提交
50 51 52
  const register = (name, provider) => {
    vscode.window.registerTreeDataProvider(name, provider);
    vscode.gitLabWorkflow.sidebarDataProviders.push(provider);
53
  };
F
Fatih Acet 已提交
54

55
  register('issuesAndMrs', issuableDataProvider);
F
Fatih Acet 已提交
56
  register('currentBranchInfo', currentBranchDataProvider);
57 58
};

59
const registerCommands = (context, outputChannel) => {
60
  const commands = {
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
    [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,
81
    [PROGRAMMATIC_COMMANDS.SHOW_RICH_CONTENT]: webviewController.open.bind(webviewController),
82
    [USER_COMMANDS.SHOW_OUTPUT]: () => outputChannel.show(),
83 84
    [USER_COMMANDS.RESOLVE_THREAD]: toggleResolved,
    [USER_COMMANDS.UNRESOLVE_THREAD]: toggleResolved,
85
    [USER_COMMANDS.DELETE_COMMENT]: deleteComment,
86 87
    [USER_COMMANDS.START_EDITING_COMMENT]: startEdit,
    [USER_COMMANDS.CANCEL_EDITING_COMMENT]: cancelEdit,
88
    [USER_COMMANDS.SUBMIT_COMMENT_EDIT]: submitEdit,
T
Tomas Vik 已提交
89
    [USER_COMMANDS.CREATE_COMMENT]: createComment,
90
    [PROGRAMMATIC_COMMANDS.NO_IMAGE_REVIEW]: () =>
91
      vscode.window.showInformationMessage("GitLab MR review doesn't support images yet."),
92 93 94
  };

  Object.keys(commands).forEach(cmd => {
95
    context.subscriptions.push(vscode.commands.registerCommand(cmd, wrapWithCatch(commands[cmd])));
96 97 98 99
  });

  registerSidebarTreeDataProviders();
};
100

101 102
const registerCiCompletion = context => {
  const subscription = vscode.languages.registerCompletionItemProvider(
103
    { pattern: '**/.gitlab-ci*.{yml,yaml}' },
104 105 106 107 108 109 110
    new CiCompletionProvider(),
    '$',
  );

  context.subscriptions.push(subscription);
};

111 112 113
/**
 * @param {vscode.ExtensionContext} context
 */
114 115
const activate = context => {
  const outputChannel = vscode.window.createOutputChannel('GitLab Workflow');
116
  initializeLogging(line => outputChannel.appendLine(line));
117
  vscode.workspace.registerTextDocumentContentProvider(REVIEW_URI_SCHEME, new GitContentProvider());
118
  registerCommands(context, outputChannel);
119 120
  const isDev = process.env.NODE_ENV === 'development';
  webviewController.init(context, isDev);
121
  tokenService.init(context);
T
Tomas Vik 已提交
122
  tokenServiceWrapper.init(context);
123
  extensionState.init(tokenService);
124
  registerCiCompletion(context);
125
  gitExtensionWrapper.init();
126
  context.subscriptions.push(gitExtensionWrapper);
127
  vscode.window.registerFileDecorationProvider(fileDecorationProvider);
128 129

  checkVersion(gitExtensionWrapper, context);
F
Fatih Acet 已提交
130 131
};

132
exports.activate = activate;