Skip to content

Commit c30cf27

Browse files
committed
export root Classes/Routines from explorer
some summary of export, number of exported, list of failed
1 parent df28898 commit c30cf27

File tree

4 files changed

+51
-10
lines changed

4 files changed

+51
-10
lines changed

commands/export.ts

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { ClassNode } from '../explorer/models/classesNode';
88
import { RoutineNode } from '../explorer/models/routineNode';
99
import { config } from '../extension';
1010
import Bottleneck from 'bottleneck';
11+
import { RootNode } from '../explorer/models/rootNode';
1112

1213
const filesFilter = (file: any) => {
1314
if (file.cat === 'CSP' || file.name.startsWith('%') || file.name.startsWith('INFORMATION.')) {
@@ -33,9 +34,9 @@ const getFileName = (folder: string, name: string, split: boolean, addCategory:
3334
return [folder, cat, name].filter(notNull).join(path.sep);
3435
};
3536

36-
export async function exportFile(workspaceFolder: string, name: string, fileName: string): Promise<any> {
37+
export async function exportFile(workspaceFolder: string, name: string, fileName: string): Promise<void> {
3738
if (!config('conn', workspaceFolder).active) {
38-
return;
39+
return Promise.reject('Connection not active');
3940
}
4041
const api = new AtelierAPI();
4142
api.setConnection(workspaceFolder);
@@ -77,7 +78,7 @@ export async function exportFile(workspaceFolder: string, name: string, fileName
7778
}
7879
});
7980

80-
promise
81+
return promise
8182
.then((res: any) => {
8283
let joinedContent = (content || []).join('\n').toString('utf8');
8384
let isSkipped = '';
@@ -107,6 +108,7 @@ export async function exportFile(workspaceFolder: string, name: string, fileName
107108
})
108109
.catch(error => {
109110
log('ERROR: ' + error);
111+
throw error;
110112
});
111113
}
112114

@@ -131,10 +133,26 @@ export async function exportList(files: string[], workspaceFolder: string): Prom
131133
return results;
132134
}
133135
return Promise.all(
134-
files.map(file => {
135-
exportFile(workspaceFolder, file, getFileName(root, file, atelier, addCategory));
136-
})
137-
);
136+
files.map(file =>
137+
exportFile(workspaceFolder, file, getFileName(root, file, atelier, addCategory))
138+
.then(() => ({
139+
file,
140+
result: true,
141+
error: ''
142+
}))
143+
.catch(error => ({
144+
file,
145+
result: false,
146+
error
147+
}))
148+
)
149+
).then(files => {
150+
outputChannel.appendLine(`Exported items: ${files.filter(el => el.result).length}`);
151+
const failed = files.filter(el => !el.result).map(el => `${el.file} - ${el.error}`);
152+
if (files.find(el => !el.result)) {
153+
outputChannel.appendLine(`Items failed to export: \n${failed.join('\n')}`);
154+
}
155+
});
138156
}
139157

140158
export async function exportAll(workspaceFolder?: string): Promise<any> {
@@ -161,10 +179,20 @@ export async function exportAll(workspaceFolder?: string): Promise<any> {
161179
});
162180
}
163181

164-
export async function exportExplorerItem(node: PackageNode | ClassNode | RoutineNode): Promise<any> {
182+
export async function exportExplorerItem(node: RootNode | PackageNode | ClassNode | RoutineNode): Promise<any> {
165183
if (!config('conn', node.workspaceFolder).active) {
166184
return;
167185
}
168-
const items = node instanceof PackageNode ? node.getClasses() : [node.fullName];
169-
return exportList(items, node.workspaceFolder);
186+
const workspaceFolder = node.workspaceFolder;
187+
const nodes = node instanceof RootNode ? node.getChildren(node) : Promise.resolve([node]);
188+
return nodes
189+
.then(nodes =>
190+
nodes.reduce(
191+
(list, subNode) => list.concat(subNode instanceof PackageNode ? subNode.getClasses() : [subNode.fullName]),
192+
[]
193+
)
194+
)
195+
.then(items => {
196+
return exportList(items, workspaceFolder);
197+
});
170198
}

explorer/models/nodeBase.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import * as vscode from 'vscode';
22

33
export class NodeBase {
44
readonly label: string;
5+
public readonly fullName: string;
56

67
protected constructor(label: string) {
78
this.label = label;

explorer/models/rootNode.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ export class RootNode extends NodeBase {
1616
super(label);
1717
}
1818

19+
get workspaceFolder(): string {
20+
return this._workspaceFolder;
21+
}
22+
1923
getTreeItem(): vscode.TreeItem {
2024
return {
2125
label: this.label,

package.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,14 @@
123123
}
124124
],
125125
"view/item/context": [
126+
{
127+
"command": "vscode-objectscript.explorer.export",
128+
"when": "view == ObjectScriptExplorer && viewItem == classesRootNode"
129+
},
130+
{
131+
"command": "vscode-objectscript.explorer.export",
132+
"when": "view == ObjectScriptExplorer && viewItem == routinesRootNode"
133+
},
126134
{
127135
"command": "vscode-objectscript.explorer.export",
128136
"when": "view == ObjectScriptExplorer && viewItem == packageNode"

0 commit comments

Comments
 (0)