forked from contextpilot/ContextPilot
-
Notifications
You must be signed in to change notification settings - Fork 0
/
file_ctx.js
197 lines (167 loc) · 6.79 KB
/
file_ctx.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
const vscode = require('vscode');
const fs = require('fs');
const ignore = require('ignore'); // You may need to install ignore
const path = require('path');
function isGitDirectory(filePath) {
return filePath.includes('/.git') || filePath.includes('\\.git');
}
function scanFiles(dir, allFiles = []) {
const files = fs.readdirSync(dir);
files.forEach(file => {
const filePath = path.join(dir, file);
if (isGitDirectory(filePath)) {
// Skip any files or directories that are within .git folders
return;
}
if (fs.statSync(filePath).isDirectory()) {
scanFiles(filePath, allFiles);
} else {
allFiles.push(filePath);
}
});
return allFiles;
}
async function handleAddFileContext() {
const workspaceFolders = vscode.workspace.workspaceFolders;
if (!workspaceFolders) {
vscode.window.showErrorMessage("No open workspace.");
return;
}
const rootPath = workspaceFolders[0].uri.fsPath;
const gitignorePath = `${rootPath}/.gitignore`;
let ig = ignore();
try {
const gitignore = fs.readFileSync(gitignorePath, 'utf8');
ig.add(gitignore.split(/\r?\n/));
} catch (err) {
vscode.window.showInformationMessage(".gitignore not found. Scanning all files.");
}
let allFiles = scanFiles(rootPath);
try {
allFiles = allFiles.map(file => path.relative(rootPath, file));
const trackedFiles = allFiles.filter(file => !ig.ignores(file));
addToContextFile(rootPath, trackedFiles);
} catch (err) {
console.log('Error', err);
}
}
async function handleAddImgContext() {
const options = {
canSelectMany: false,
openLabel: 'Select Image File',
filters: {
'Image Files': ['png', 'jpg', 'jpeg', 'gif', 'bmp'],
'All Files': ['*']
}
};
const fileUri = await vscode.window.showOpenDialog(options);
if (fileUri && fileUri[0]) {
const selectedFile = fileUri[0].fsPath;
fs.readFile(selectedFile, 'base64', (err, data) => {
if (err) {
vscode.window.showErrorMessage('Failed to read the selected image file.');
console.error('Error reading image file:', err);
return;
}
const fileName = path.basename(selectedFile);
const base64Image = `data:image/${path.extname(fileName).slice(1)};base64,${data}`;
const currentContextRaw = vscode.workspace.getConfiguration().get('contextCode');
let currentContext = [];
if (currentContextRaw) {
try {
currentContext = JSON.parse(currentContextRaw);
} catch (err) {
console.error('Error parsing existing contextCode:', err);
currentContext = [];
}
}
const newContextObj = {
"context": base64Image,
"definition": "",
"fileName": fileName
};
currentContext.push(newContextObj);
vscode.workspace.getConfiguration().update('contextCode', JSON.stringify(currentContext), vscode.ConfigurationTarget.Global)
.then(() => {
vscode.window.showInformationMessage('Image content added to context');
}, err => {
console.error('Error updating contextCode with image content:', err);
vscode.window.showErrorMessage('Failed to add image content to context');
});
});
} else {
vscode.window.showWarningMessage('No image file selected');
}
}
// Implement handleAddDbContext to ask users to choose a JSON file and then read and parse the content
async function handleAddDbContext() {
const options = {
canSelectMany: false,
openLabel: 'Select JSON File',
filters: {
'JSON Files': ['json'],
'All Files': ['*']
}
};
const fileUri = await vscode.window.showOpenDialog(options);
if (fileUri && fileUri[0]) {
const selectedFile = fileUri[0].fsPath;
fs.readFile(selectedFile, 'utf8', (err, data) => {
if (err) {
vscode.window.showErrorMessage('Failed to read the selected JSON file.');
console.error('Error reading JSON file:', err);
return;
}
let dbDetails;
try {
dbDetails = JSON.parse(data);
// Validate required fields
if (!dbDetails.dbtype || !dbDetails.dbname || !dbDetails.user || !dbDetails.password || !dbDetails.host || !dbDetails.port) {
throw new Error('Missing required fields');
}
} catch (error) {
vscode.window.showErrorMessage('Invalid JSON or missing required fields');
console.error('Error parsing JSON file:', error);
return;
}
const currentContextRaw = vscode.workspace.getConfiguration().get('contextCode');
let currentContext = [];
if (currentContextRaw) {
try {
currentContext = JSON.parse(currentContextRaw);
} catch (err) {
console.error('Error parsing existing contextCode:', err);
currentContext = [];
}
}
// Create a new context object with database details
const newContextObj = {
"context": JSON.stringify(dbDetails, null, 2),
"definition": "DB_CONTEXT:"+dbDetails.dbname,
"fileName": `${dbDetails.host}:${dbDetails.port}` // Using host and port as fileName
};
// Add the new context object
currentContext.push(newContextObj);
// Update the contextCode with the new array
vscode.workspace.getConfiguration().update('contextCode', JSON.stringify(currentContext), vscode.ConfigurationTarget.Global)
.then(() => {
vscode.window.showInformationMessage('Database context added');
}, err => {
console.error('Error updating contextCode:', err);
vscode.window.showErrorMessage('Failed to add database context');
});
});
} else {
vscode.window.showWarningMessage('No JSON file selected');
}
}
function addToContextFile(rootPath, trackedFiles) {
const configPath = `${rootPath}/.ctx-pilot.cfg`;
fs.writeFileSync(configPath, JSON.stringify(trackedFiles, null, 2), { flag: 'w' });
vscode.window.showInformationMessage('File context added to .ctx-pilot.cfg');
}
module.exports = {
handleAddFileContext,
handleAddImgContext,
handleAddDbContext
};