Skip to content

Commit 78d27b2

Browse files
1. Build workspace.code-workspace settings file to filter out selected modules
2. Open workspace.code-workspace file on project import
1 parent 16ae179 commit 78d27b2

File tree

5 files changed

+66
-23
lines changed

5 files changed

+66
-23
lines changed

html/editor.html

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
style="height: 1.5em;">Browse...</button>
1616
</div>
1717

18-
<!--
18+
<!--
1919
<div>
2020
<label for="targetLocation">Target folder</label>
2121
<input type="text" id="targetLocation" name="targetLocation" style="width: 50%; height: 1.5em;">
@@ -102,9 +102,11 @@
102102
const divNode = document.getElementById(moduleListDivId);
103103
const divModuleNodes = divNode.getElementsByTagName('input');
104104
for (i = 0; i < divModuleNodes.length; i++) {
105+
const moduleName = divModuleNodes[i].value;
105106
if (divModuleNodes[i].checked) {
106-
const moduleName = divModuleNodes[i].value;
107-
modules.push(moduleName);
107+
modules.push({ name: moduleName, selected: true });
108+
} else {
109+
modules.push({ name: moduleName, selected: false });
108110
}
109111
}
110112
vscode.postMessage({

src/bazelmodule.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,8 @@
11
export class BazelModule {
2-
private name: string;
3-
private selected: boolean;
2+
name: string;
3+
selected: boolean;
44
constructor(name: string, selected: boolean) {
55
this.name = name;
66
this.selected = selected;
77
}
8-
9-
getModule(): string {
10-
return this.name;
11-
}
12-
13-
getSelected(): boolean {
14-
return this.selected;
15-
}
168
}

src/bazelproject.ts

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@ import * as path from 'path';
33
import * as fs from 'fs';
44
import * as bazelmodule from './bazelmodule';
55
import * as projectparser from './bazelprojectparser';
6-
6+
import * as vscodeworkspace from './workspace';
77

88
export class BazelProject {
9+
private readonly codeWorkspaceExt: string = '.code-workspace';
10+
private readonly codeWorkspaceFile: string = 'workspace' + this.codeWorkspaceExt;
11+
912
sourceWorkspace: string;
1013
sourceFolder: string;
1114
targetFolder: string;
@@ -17,12 +20,14 @@ export class BazelProject {
1720

1821
}
1922

20-
openProject(modules: string[]) {
21-
this.buildBazelProject(modules);
23+
openProject(modules: bazelmodule.BazelModule[]) {
2224
// this.makeTargetFolder();
25+
// this.buildBazelProject(modules, this.targetFolder);
2326
// this.buildSymlinks(modules);
2427
// this.openFolder(this.targetFolder);
25-
this.openFolder(this.sourceFolder);
28+
this.buildBazelProject(modules, this.sourceFolder);
29+
this.buildCodeWorkspace(modules, this.sourceFolder);
30+
this.openFolder(path.join(this.sourceFolder, this.codeWorkspaceFile));
2631
}
2732

2833
lookupModules(): bazelmodule.BazelModule[] {
@@ -47,14 +52,27 @@ export class BazelProject {
4752
return modules;
4853
}
4954

50-
private buildBazelProject(modules: string[]) {
51-
const bazelprojectFile = path.join(this.sourceFolder, '.bazelproject');
55+
private buildCodeWorkspace(modules: bazelmodule.BazelModule[], folder: string) {
56+
const codeWorkspaceFile: vscodeworkspace.VsCodeWorkspace = new vscodeworkspace.VsCodeWorkspace(modules);
57+
const vscodeWorkspace = path.join(folder, this.codeWorkspaceFile);
58+
const content: string = JSON.stringify(codeWorkspaceFile, null, 2);
59+
60+
fs.writeFileSync(vscodeWorkspace, content);
61+
}
62+
63+
private buildBazelProject(modules: bazelmodule.BazelModule[], folder: string) {
64+
const bazelprojectFile = path.join(folder, '.bazelproject');
5265
if (modules && modules.length > 0) {
5366
if (fs.existsSync(bazelprojectFile)) {
5467
fs.renameSync(bazelprojectFile, bazelprojectFile + '.' + Date.now());
5568
}
5669
let fileContent = 'directories:\n';
57-
modules.forEach((moduleName) => { fileContent = fileContent + ' ' + moduleName + '\n'; });
70+
modules.//
71+
filter((module) => true === module.selected).//
72+
forEach((module) => {
73+
const name: string = module.name;
74+
fileContent = fileContent + ' ' + name + '\n';
75+
});
5876
fs.writeFileSync(bazelprojectFile, fileContent);
5977
} else if (fs.existsSync(bazelprojectFile)) {
6078
fs.unlinkSync(bazelprojectFile);
@@ -81,8 +99,8 @@ export class BazelProject {
8199
const sourceModulePath = path.join(this.sourceFolder, moduleName);
82100
fs.symlinkSync(sourceModulePath, targetModulePath);
83101
});
84-
// const targetWorkspaceFile = path.join(this.targetFolder, 'WORKSPACE');
85-
// fs.symlinkSync(this.sourceWorkspace, targetWorkspaceFile);
102+
const targetWorkspaceFile = path.join(this.targetFolder, 'WORKSPACE');
103+
fs.symlinkSync(this.sourceWorkspace, targetWorkspaceFile);
86104
}
87105
}
88106
}

src/editor.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import * as bazelmodule from './bazelmodule';
88
export function handleMessages(extCtx: vscode.ExtensionContext, webPanel: vscode.WebviewPanel, message: any) {
99
switch (message.command) {
1010
case 'importProject': {
11-
console.log('importProject');
1211
const bi: bazelproject.BazelProject = new bazelproject.BazelProject(message.source, message.target);
1312
bi.openProject(message.modules);
1413
return;

src/workspace.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import * as bazelmodule from './bazelmodule';
2+
3+
export class VsCodeWorkspace {
4+
private readonly filesExclude: string = 'files.exclude';
5+
private readonly currentFolder: string = '.';
6+
7+
folders: VsCodePath[];
8+
settings: any;
9+
constructor(modules: bazelmodule.BazelModule[]) {
10+
this.folders = [];
11+
this.folders.push({ path: this.currentFolder });
12+
this.settings = {};
13+
this.settings[this.filesExclude] = this.buildExcludes(modules);
14+
}
15+
16+
private buildExcludes(modules: bazelmodule.BazelModule[]): {} {
17+
let exclude: any = {};
18+
if (modules) {
19+
modules.//
20+
filter((module) => false === module.selected).//
21+
forEach((module) => {
22+
exclude[module.name] = true;
23+
});
24+
}
25+
return exclude;
26+
}
27+
}
28+
29+
class VsCodePath {
30+
constructor(public path: string) {
31+
}
32+
}

0 commit comments

Comments
 (0)