Skip to content

Commit

Permalink
Add a task provider, currently providing a sync task
Browse files Browse the repository at this point in the history
  • Loading branch information
wolfgangmm committed Oct 16, 2019
1 parent d2f1b86 commit 470e052
Show file tree
Hide file tree
Showing 12 changed files with 5,963 additions and 415 deletions.
41 changes: 11 additions & 30 deletions client/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 23 additions & 4 deletions client/src/extension.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { ExistTaskProvider } from './task-provider';
import * as path from 'path';
import {
workspace as Workspace, window as Window, ExtensionContext, TextDocument, OutputChannel, WorkspaceFolder, Uri
workspace as Workspace, window as Window, ExtensionContext, TextDocument, OutputChannel,
WorkspaceFolder, Uri, Disposable, tasks
} from 'vscode';

import {
Expand Down Expand Up @@ -42,9 +44,13 @@ function getOuterMostWorkspaceFolder(folder: WorkspaceFolder): WorkspaceFolder {
}
return folder;
}
let workspaceFolder;
let taskProvider: Disposable | undefined;
let syncScript;

export function activate(context: ExtensionContext) {

let syncScript = context.asAbsolutePath(path.join('sync', 'out', 'sync.js'));
let module = context.asAbsolutePath(path.join('server', 'out', 'server.js'));
let outputChannel: OutputChannel = Window.createOutputChannel('eXistdb Language Server');

Expand Down Expand Up @@ -95,16 +101,18 @@ export function activate(context: ExtensionContext) {
diagnosticCollectionName: 'existdb',
workspaceFolder: folder,
outputChannel: outputChannel,
// synchronize: {
// fileEvents: Workspace.createFileSystemWatcher(`${folder.uri.fsPath}/**/*`)
// }
initializationOptions: {
workspaceFolder: folder.uri.toString()
}
};
let client = new LanguageClient('existdb-langserver', 'eXist Language Server', serverOptions, clientOptions);
client.start();
clients.set(folder.uri.toString(), client);
}
}

initTasks(syncScript);

Workspace.onDidOpenTextDocument(didOpenTextDocument);
Workspace.textDocuments.forEach(didOpenTextDocument);
Workspace.onDidChangeWorkspaceFolders((event) => {
Expand All @@ -118,7 +126,18 @@ export function activate(context: ExtensionContext) {
});
}

function initTasks(syncScript: string) {
let workspaceFolders = Workspace.workspaceFolders;
if (!Array.isArray(workspaceFolders) || workspaceFolders.length == 0) {
return;
}
taskProvider = tasks.registerTaskProvider('existdb-sync', new ExistTaskProvider(workspaceFolders, syncScript));
}

export function deactivate(): Thenable<void> {
if (taskProvider) {
taskProvider.dispose();
}
let promises: Thenable<void>[] = [];
if (defaultClient) {
promises.push(defaultClient.stop());
Expand Down
87 changes: 87 additions & 0 deletions client/src/task-provider.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
import { WorkspaceFolder, TaskProvider, Task, TaskDefinition, ShellExecution, TaskScope } from "vscode";
import * as path from 'path';
import * as fs from 'fs';

/**
* A task provider for eXist package directories, currently providing a task
* to automatically sync directory content to a database collection.
*
* The task provider will only return tasks for directories containing a ´.existdb.json`
* configuration file.
*
* @author Wolfgang Meier
*/
export class ExistTaskProvider implements TaskProvider {

private workspaceFolders: WorkspaceFolder[];
private syncScript: string;
private taskPromise: Thenable<Task[]> | undefined = undefined;

constructor(workspaceFolders: WorkspaceFolder[], syncScript: string) {
this.workspaceFolders = workspaceFolders;
this.syncScript = syncScript;
}

public provideTasks(): Thenable<Task[]> | undefined {
if (!this.taskPromise) {
this.taskPromise = this.getTasks();
}
return this.taskPromise;
}

public resolveTask(_task: Task): Task | undefined {
return undefined;
}

private async getTasks(): Promise<Task[]> {
let result: Task[] = [];
for (let folder of this.workspaceFolders) {
const config = path.join(folder.uri.fsPath, '.existdb.json');
if (!fs.existsSync(config)) {
return result;
}
const configData = fs.readFileSync(config, 'utf8');
const json = JSON.parse(configData);
const sync = json.sync;
if (!sync) {
return result;
}

const serverDef = sync.server;
if (!serverDef) {
return result;
}
const server = json.servers[serverDef];
if (!server) {
return result;
}
const collection = sync.root;
const user = sync.user || server.user;
const password = sync.password || server.password;
const kind: ExistTaskDefinition = {
type: 'sync',
server: server.server,
user: user,
password: password,
root: collection,
dir: folder.uri.fsPath,
ignore: sync.ignore
};
let command = `node ${this.syncScript} -s ${server.server} -u ${user} -p ${password} `;
command += `-c ${collection} ${folder.uri.fsPath} -i ${sync.ignore.map(p => `"${p}"`).join(' ')}`;
const task = new Task(kind, TaskScope.Workspace, `sync-${folder.name}`, 'existdb', new ShellExecution(command));
result.push(task);
}
return result;
}
}

interface ExistTaskDefinition extends TaskDefinition {
server: string;
user: string;
password: string;
root: string;
dir: string;
ignore: string[];
}

Loading

0 comments on commit 470e052

Please sign in to comment.