Skip to content

Commit 16ae179

Browse files
read initial .bazelproject file and display selected modules
1 parent d462a2a commit 16ae179

File tree

6 files changed

+137
-25
lines changed

6 files changed

+137
-25
lines changed

html/editor.html

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,21 @@
99

1010
<body>
1111
<div>
12+
<label for="workspaceLocation">Project WORKSPACE location</label>
1213
<input type="text" id="workspaceLocation" name="workspaceLocation" style="width: 50%; height: 1.5em;">
1314
<button id="browseWorkspace" name="browseWorkspace" onclick="onBrowseHandler('browseWorkspace')"
1415
style="height: 1.5em;">Browse...</button>
1516
</div>
1617

18+
<!--
19+
<div>
20+
<label for="targetLocation">Target folder</label>
21+
<input type="text" id="targetLocation" name="targetLocation" style="width: 50%; height: 1.5em;">
22+
<button id="browseTarget" name="browseTarget" onclick="onBrowseHandler('browseTarget')"
23+
style="height: 1.5em;">Browse...</button>
24+
</div>
25+
-->
26+
1727
<button id="loadModulesBtn" onclick="loadModules()" style="height: 1.5em;">Load modules</button>
1828
<button id="importProjectBtn" onclick="importProject()" style="height: 1.5em;" disabled>Start import</button>
1929

@@ -33,22 +43,28 @@
3343
setLocation("workspaceLocation", message);
3444
break;
3545
}
46+
case 'settarget': {
47+
setLocation("targetLocation", message);
48+
break;
49+
}
3650
case 'listModules': {
3751
const modules = message.data;
3852
if (modules != null) {
3953
if (modules.length > 0) {
4054
document.getElementById('importProjectBtn').disabled = false;
4155
}
4256
for (i = 0; i < modules.length; i++) {
43-
const moduleName = modules[i];
57+
const moduleName = modules[i].name;
4458
const moduleId = moduleListDivId + moduleName;
4559
const divSection = document.getElementById(moduleListDivId);
4660
const cbNode = document.createElement('input');
4761
cbNode.type = 'checkbox';
4862
cbNode.name = moduleId;
4963
cbNode.value = moduleName;
5064
cbNode.id = moduleId;
51-
cbNode.setAttribute('type', 'checkbox');
65+
if (modules[i].selected) {
66+
cbNode.checked = true;
67+
}
5268

5369
const labelNode = document.createElement('label');
5470
labelNode.htmlFor = moduleId;
@@ -81,6 +97,7 @@
8197

8298
function importProject() {
8399
const sourceLocation = document.getElementById("workspaceLocation").value;
100+
// const targetLocation = document.getElementById("targetLocation").value;
84101
let modules = [];
85102
const divNode = document.getElementById(moduleListDivId);
86103
const divModuleNodes = divNode.getElementsByTagName('input');
@@ -93,6 +110,7 @@
93110
vscode.postMessage({
94111
command: 'importProject',
95112
source: sourceLocation,
113+
// target: targetLocation,
96114
modules: modules
97115
})
98116
}

src/bazelmodule.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
export class BazelModule {
2+
private name: string;
3+
private selected: boolean;
4+
constructor(name: string, selected: boolean) {
5+
this.name = name;
6+
this.selected = selected;
7+
}
8+
9+
getModule(): string {
10+
return this.name;
11+
}
12+
13+
getSelected(): boolean {
14+
return this.selected;
15+
}
16+
}
Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import * as vscode from 'vscode';
22
import * as path from 'path';
33
import * as fs from 'fs';
4+
import * as bazelmodule from './bazelmodule';
5+
import * as projectparser from './bazelprojectparser';
46

5-
export class BazelStructure {
7+
8+
export class BazelProject {
69
sourceWorkspace: string;
710
sourceFolder: string;
811
targetFolder: string;
@@ -16,17 +19,29 @@ export class BazelStructure {
1619

1720
openProject(modules: string[]) {
1821
this.buildBazelProject(modules);
19-
this.openFolder();
22+
// this.makeTargetFolder();
23+
// this.buildSymlinks(modules);
24+
// this.openFolder(this.targetFolder);
25+
this.openFolder(this.sourceFolder);
2026
}
2127

22-
lookupModules(): string[] {
23-
let modules: string[] = [];
28+
lookupModules(): bazelmodule.BazelModule[] {
29+
const parser: projectparser.BazelProjectParser = new projectparser.BazelProjectParser();
30+
parser.readBazelProject(this.sourceFolder);
31+
const selectedModules: string[] = parser.getModules();
32+
let modules: bazelmodule.BazelModule[] = [];
2433
if (fs.existsSync(this.sourceFolder)) {
2534
const files: string[] = fs.readdirSync(this.sourceFolder, { withFileTypes: true }).//
2635
filter(file => ((!file.name.startsWith('.')) && file.isDirectory())).//
2736
map(file => file.name);
2837
files.forEach(file => {
29-
modules.push(file);
38+
const selected = selectedModules.find((name) => name === file);
39+
let exist: boolean = false;
40+
if (selected) {
41+
exist = true;
42+
}
43+
const module: bazelmodule.BazelModule = new bazelmodule.BazelModule(file, exist);
44+
modules.push(module);
3045
});
3146
}
3247
return modules;
@@ -36,39 +51,38 @@ export class BazelStructure {
3651
const bazelprojectFile = path.join(this.sourceFolder, '.bazelproject');
3752
if (modules && modules.length > 0) {
3853
if (fs.existsSync(bazelprojectFile)) {
39-
fs.truncateSync(bazelprojectFile);
54+
fs.renameSync(bazelprojectFile, bazelprojectFile + '.' + Date.now());
4055
}
4156
let fileContent = 'directories:\n';
42-
modules.forEach((moduleName) => { fileContent = fileContent + ' ' + moduleName + '\n' });
57+
modules.forEach((moduleName) => { fileContent = fileContent + ' ' + moduleName + '\n'; });
4358
fs.writeFileSync(bazelprojectFile, fileContent);
4459
} else if (fs.existsSync(bazelprojectFile)) {
4560
fs.unlinkSync(bazelprojectFile);
4661
}
4762
}
4863

49-
private openFolder() {
50-
const uri: vscode.Uri = vscode.Uri.file(this.sourceFolder);
64+
private openFolder(folder: string) {
65+
const uri: vscode.Uri = vscode.Uri.file(folder);
5166
vscode.commands.executeCommand('vscode.openFolder', uri);
5267
}
5368

5469
private makeTargetFolder() {
5570
const targetPath = path.resolve(this.targetFolder);
5671
if (!fs.existsSync(targetPath)) {
57-
fs.vmkdirSync(targetPath);
72+
fs.mkdirSync(targetPath);
5873
}
5974
}
6075

61-
private buildSymlinks() {
62-
const modules: string[] = this.lookupModules();
76+
private buildSymlinks(modules: string[]) {
6377
if (modules && modules.length > 0) {
6478
modules.forEach((sourceModule) => {
6579
const moduleName: string = path.basename(sourceModule);
6680
const targetModulePath = path.join(this.targetFolder, moduleName);
6781
const sourceModulePath = path.join(this.sourceFolder, moduleName);
6882
fs.symlinkSync(sourceModulePath, targetModulePath);
6983
});
70-
const targetWorkspaceFile = path.join(this.targetFolder, 'WORKSPACE');
71-
fs.symlinkSync(this.sourceWorkspace, targetWorkspaceFile);
84+
// const targetWorkspaceFile = path.join(this.targetFolder, 'WORKSPACE');
85+
// fs.symlinkSync(this.sourceWorkspace, targetWorkspaceFile);
7286
}
7387
}
7488
}

src/bazelprojectparser.ts

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import * as fs from 'fs';
2+
import * as path from 'path';
3+
4+
export class BazelProjectParser {
5+
private directories: string[];
6+
private targets: string[];
7+
8+
constructor() {
9+
this.directories = [];
10+
this.targets = [];
11+
}
12+
13+
getModules(): string[] {
14+
return this.getDirectories();
15+
}
16+
17+
getDirectories(): string[] {
18+
return this.directories;
19+
}
20+
21+
getTargets(): string[] {
22+
return this.targets;
23+
}
24+
25+
readBazelProject(folder: string) {
26+
const DIRECTORIES_SECTION: string = "directories:";
27+
const TARGETS_SECTION: string = "targets:";
28+
29+
const bazelProjectFile: string = path.join(folder, '.bazelproject');
30+
if (fs.existsSync(bazelProjectFile)) {
31+
const content: string = fs.readFileSync(bazelProjectFile, { encoding: 'UTF-8', flag: 'r' });
32+
const lines = content.split(/\r?\n/);
33+
const filteredLines = lines.filter( //
34+
(line) => line && line.trim().length > 0 && (!line.trim().startsWith('#')) //
35+
);
36+
const option = lines.shift();
37+
let isDirectories: boolean = false;
38+
39+
filteredLines.forEach((line) => {
40+
line = line.trim();
41+
if (DIRECTORIES_SECTION === line) {
42+
isDirectories = true;
43+
} else if (TARGETS_SECTION === line) {
44+
isDirectories = false;
45+
} else {
46+
if (isDirectories) {
47+
this.directories.push(line);
48+
} else {
49+
this.targets.push(line);
50+
}
51+
}
52+
});
53+
}
54+
}
55+
}

src/editor.ts

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import * as vscode from 'vscode';
22
import * as path from 'path';
33
import * as fs from 'fs';
4-
import * as bazelImporter from './bazel';
4+
import * as bazelproject from './bazelproject';
5+
import * as bazelmodule from './bazelmodule';
6+
57

68
export function handleMessages(extCtx: vscode.ExtensionContext, webPanel: vscode.WebviewPanel, message: any) {
79
switch (message.command) {
8-
case 'loadModuleList':
9-
return;
1010
case 'importProject': {
1111
console.log('importProject');
12-
const bi: bazelImporter.BazelStructure = new bazelImporter.BazelStructure(message.source, message.target);
12+
const bi: bazelproject.BazelProject = new bazelproject.BazelProject(message.source, message.target);
1313
bi.openProject(message.modules);
1414
return;
1515
}
@@ -22,9 +22,18 @@ export function handleMessages(extCtx: vscode.ExtensionContext, webPanel: vscode
2222
'openLabel': 'Select'
2323
}).then((fileUri) => postLocation(fileUri, webPanel, 'setworkspace'));
2424
return;
25+
case 'browseTarget':
26+
vscode.window.showOpenDialog({
27+
'title': 'Select target folder',
28+
'canSelectFolders': true,
29+
'canSelectFiles': false,
30+
'canSelectMany': false,
31+
'openLabel': 'Select'
32+
}).then((fileUri) => postLocation(fileUri, webPanel, 'settarget'));
33+
return;
2534
case 'loadModules': {
26-
const bi: bazelImporter.BazelStructure = new bazelImporter.BazelStructure(message.source, message.target);
27-
const modules: string[] = bi.lookupModules();
35+
const bi: bazelproject.BazelProject = new bazelproject.BazelProject(message.source, message.target);
36+
const modules: bazelmodule.BazelModule[] = bi.lookupModules();
2837
webPanel.webview.postMessage({
2938
command: 'listModules',
3039
data: modules

src/extension.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as vscode from 'vscode';
2-
import * as piEditor from './editor';
2+
import * as pieditor from './editor';
33

44
export function activate(context: vscode.ExtensionContext) {
55

@@ -39,11 +39,11 @@ export function activate(context: vscode.ExtensionContext) {
3939
retainContextWhenHidden: true
4040
}
4141
);
42-
panel.webview.html = piEditor.getWebviewContent(context);
42+
panel.webview.html = pieditor.getWebviewContent(context);
4343

4444
// Handle messages from the webview
4545
panel.webview.onDidReceiveMessage(
46-
message => piEditor.handleMessages(context, panel, message),
46+
message => pieditor.handleMessages(context, panel, message),
4747
undefined,
4848
context.subscriptions
4949
);

0 commit comments

Comments
 (0)