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

Merge branch '389-fix-create-snippet' into 'main'

fix: remove the broken code related to creating user snippets

See merge request gitlab-org/gitlab-vscode-extension!265
const vscode = require('vscode');
const openers = require('../openers');
const gitLabService = require('../gitlab_service');
const gitlabProjectInput = require('../gitlab_project_input');
const { gitExtensionWrapper } = require('../git/git_extension_wrapper');
const { logError } = require('../log');
import * as vscode from 'vscode';
import * as openers from '../openers';
import * as gitLabService from '../gitlab_service';
import { gitExtensionWrapper } from '../git/git_extension_wrapper';
import { GitLabProject } from '../gitlab/gitlab_project';
const visibilityOptions = [
{
......@@ -31,7 +30,13 @@ const contextOptions = [
},
];
async function uploadSnippet(project, editor, visibility, context, repositoryRoot) {
async function uploadSnippet(
project: GitLabProject,
editor: vscode.TextEditor,
visibility: string,
context: string,
repositoryRoot: string,
) {
let content = '';
const fileName = editor.document.fileName.split('/').reverse()[0];
......@@ -47,69 +52,41 @@ async function uploadSnippet(project, editor, visibility, context, repositoryRoo
}
const data = {
id: project.restId,
title: fileName,
file_name: fileName,
visibility,
content,
};
data.content = content;
if (project) {
data.id = project.restId;
}
const snippet = await gitLabService.createSnippet(repositoryRoot, data);
openers.openUrl(snippet.web_url);
await openers.openUrl(snippet.web_url);
}
async function createSnippet() {
export async function createSnippet() {
const editor = vscode.window.activeTextEditor;
let repositoryRoot = null;
let project = null;
if (editor) {
const repository = gitExtensionWrapper.getActiveRepository();
repositoryRoot = repository && repository.rootFsPath;
try {
project = repository && (await repository.getProject());
} catch (e) {
logError(e);
}
// FIXME: the empty `uri` representing user's snippets is not correctly handled
if (!project) {
repositoryRoot = await gitlabProjectInput.show(
[
{
label: "User's Snippets",
uri: '',
},
],
"Select a Gitlab Project or use the User's Snippets",
);
try {
const selectedRepository = gitExtensionWrapper.getRepository(repositoryRoot);
project = selectedRepository && (await selectedRepository.getProject());
} catch (e) {
logError(e);
}
}
if (!editor) {
vscode.window.showInformationMessage('GitLab Workflow: No open file.');
return;
}
const repository = await gitExtensionWrapper.getActiveRepositoryOrSelectOne();
if (!repository) return;
const project = await repository.getProject();
if (!project) {
vscode.window.showInformationMessage(
'GitLab Workflow: Repository does not contain GitLab project.',
);
return;
}
const visibility = await vscode.window.showQuickPick(visibilityOptions);
const visibility = await vscode.window.showQuickPick(visibilityOptions);
if (!visibility) return;
if (visibility) {
const context = await vscode.window.showQuickPick(contextOptions);
const context = await vscode.window.showQuickPick(contextOptions);
if (!context) return;
if (context) {
uploadSnippet(project, editor, visibility.type, context.type, repositoryRoot);
}
}
} else {
vscode.window.showInformationMessage('GitLab Workflow: No open file.');
}
await uploadSnippet(project, editor, visibility.type, context.type, repository.rootFsPath);
}
module.exports = {
createSnippet,
};
const vscode = require('vscode');
const gitLabService = require('./gitlab_service');
async function showPicker(additionalEntries = [], placeHolder = 'Select a Gitlab Project') {
const repositoryRootOptions = await gitLabService.getAllGitlabProjects();
additionalEntries.forEach(additionalEntry => {
repositoryRootOptions.push(additionalEntry);
});
if (repositoryRootOptions.length === 0) {
return null;
}
if (repositoryRootOptions.length === 1) {
return repositoryRootOptions[0];
}
const repositoryRoot = await vscode.window.showQuickPick(repositoryRootOptions, {
placeHolder,
});
if (repositoryRoot) {
return repositoryRoot.uri;
}
return null;
}
exports.show = showPicker;
......@@ -475,22 +475,13 @@ export async function fetchMRIssues(mrId: number, repositoryRoot: string): Promi
}
// TODO specify the correct interface when we convert `create_snippet.js`
export async function createSnippet(repositoryRoot: string, data: { id: string }) {
let snippet;
let path = '/snippets';
if (data.id) {
path = `/projects/${data.id}/snippets`;
}
export async function createSnippet(repositoryRoot: string, data: { id: number }) {
try {
const { response } = await fetch(repositoryRoot, path, 'POST', data);
snippet = response;
const { response } = await fetch(repositoryRoot, `/projects/${data.id}/snippets`, 'POST', data);
return response;
} catch (e) {
handleError(new UserFriendlyError('Failed to create your snippet.', e));
throw new UserFriendlyError('Failed to create your snippet.', e);
}
return snippet;
}
export async function validateCIConfig(repositoryRoot: string, content: string): Promise<boolean> {
......
const sinon = require('sinon');
const vscode = require('vscode');
const { createSnippet } = require('../../src/commands/create_snippet');
const { tokenService } = require('../../src/services/token_service');
const { getServer, createPostEndpoint } = require('./test_infrastructure/mock_server');
const { GITLAB_URL } = require('./test_infrastructure/constants');
const {
createAndOpenFile,
closeAndDeleteFile,
simulateQuickPickChoice,
getRepositoryRoot,
} = require('./test_infrastructure/helpers');
describe('Create snippet', async () => {
let server;
let testFileUri;
const sandbox = sinon.createSandbox();
const snippetUrl = `${GITLAB_URL}/gitlab-org/gitlab/snippets/1`;
before(async () => {
server = getServer([
createPostEndpoint('/projects/278964/snippets', {
web_url: snippetUrl,
}),
]);
await tokenService.setToken(GITLAB_URL, 'abcd-secret');
});
beforeEach(async () => {
server.resetHandlers();
testFileUri = vscode.Uri.parse(`${getRepositoryRoot()}/newfile.js`);
await createAndOpenFile(testFileUri);
});
afterEach(async () => {
sandbox.restore();
await closeAndDeleteFile(testFileUri);
});
after(async () => {
server.close();
await tokenService.setToken(GITLAB_URL, undefined);
});
it('creates snippet form the file', async () => {
simulateQuickPickChoice(sandbox, 0);
const expectation = sandbox
.mock(vscode.commands)
.expects('executeCommand')
.once()
.withArgs('vscode.open', vscode.Uri.parse(snippetUrl));
await createSnippet();
expectation.verify();
});
});
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册