diffwatch 1.0.5 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -23,14 +23,14 @@ function main() {
23
23
  const args = process.argv.slice(2);
24
24
  let repoPath = process.cwd();
25
25
  const showHelp = () => {
26
- console.log(`
27
- Usage: diffwatch [path] [options]
28
-
29
- Arguments:
30
- path Path to the git repository (default: current directory)
31
-
32
- Options:
33
- -h, --help Show help information
26
+ console.log(`
27
+ Usage: diffwatch [path] [options]
28
+
29
+ Arguments:
30
+ path Path to the git repository (default: current directory)
31
+
32
+ Options:
33
+ -h, --help Show help information
34
34
  `);
35
35
  process.exit(0);
36
36
  };
@@ -76,8 +76,8 @@ Options:
76
76
  top: 0,
77
77
  left: 0,
78
78
  width: '30%',
79
- height: '100%',
80
- label: ' Files (0) ',
79
+ height: '99%',
80
+ label: 'Files (0)',
81
81
  keys: true,
82
82
  vi: true,
83
83
  mouse: true,
@@ -97,7 +97,7 @@ Options:
97
97
  top: 0,
98
98
  left: '30%',
99
99
  width: '70%',
100
- height: '100%',
100
+ height: '99%',
101
101
  label: ' Diff () ',
102
102
  keys: true,
103
103
  vi: true,
@@ -133,9 +133,38 @@ Options:
133
133
  inputOnFocus: true,
134
134
  style: { fg: 'white', bg: 'black' },
135
135
  });
136
+ // Confirmation dialog for revert
137
+ const confirmDialog = blessed.box({
138
+ top: 'center',
139
+ left: 'center',
140
+ width: '38%',
141
+ label: ' Confirm Revert ',
142
+ height: 3,
143
+ content: 'Press ENTER key to confirm revert or ESC to cancel.',
144
+ border: { type: 'line' },
145
+ style: {
146
+ fg: 'yellow',
147
+ bg: 'black',
148
+ border: { fg: 'yellow' }
149
+ },
150
+ hidden: true,
151
+ });
152
+ // Footer box to show shortcuts - aligned with the panes
153
+ const footer = blessed.box({
154
+ bottom: 0,
155
+ left: 0,
156
+ width: '100%',
157
+ height: 1,
158
+ align: 'center',
159
+ content: chalk_1.default.green('←→') + ' Switch |' + chalk_1.default.green(' ⏎') + ' Open | ' + chalk_1.default.green('S') + ' Search | ' + chalk_1.default.green('R') + ' Revert | ' + chalk_1.default.green('Q') + ' Quit ',
160
+ });
161
+ // Adjust footer to align with the panes
162
+ // Note: We'll adjust this after screen initialization
136
163
  screen.append(fileList);
137
164
  screen.append(diffView);
138
165
  screen.append(searchBox);
166
+ screen.append(confirmDialog);
167
+ screen.append(footer);
139
168
  const updateBorders = () => {
140
169
  fileList.style.border.fg = screen.focused === fileList ? 'yellow' : 'white';
141
170
  diffView.style.border.fg = screen.focused === diffView ? 'yellow' : 'white';
@@ -281,7 +310,7 @@ Options:
281
310
  return `${color}${f.path}{/}`;
282
311
  });
283
312
  fileList.setItems(items);
284
- const labelTitle = currentSearchTerm ? ` Files (${files.length}) - Searching: "${currentSearchTerm}" ` : ` Files (${files.length}) `;
313
+ const labelTitle = currentSearchTerm ? `Files (${files.length}) - Searching: "${currentSearchTerm}"` : `Files (${files.length})`;
285
314
  fileList.setLabel(labelTitle);
286
315
  if (items.length > 0) {
287
316
  // Restore selection by path if possible
@@ -295,6 +324,8 @@ Options:
295
324
  yield updateDiff();
296
325
  }
297
326
  else {
327
+ // Clear the file list when there are no files
328
+ fileList.clearItems();
298
329
  diffView.setContent(currentSearchTerm ? `No files match "${currentSearchTerm}".` : 'No changes detected.');
299
330
  diffView.setLabel(' Diff () ');
300
331
  }
@@ -321,6 +352,12 @@ Options:
321
352
  screen.render();
322
353
  fileList.focus();
323
354
  }
355
+ else if (!confirmDialog.hidden) {
356
+ // Close the confirmation dialog if it's open
357
+ confirmDialog.hide();
358
+ fileList.focus();
359
+ screen.render();
360
+ }
324
361
  else {
325
362
  screen.destroy();
326
363
  process.exit(0);
@@ -369,6 +406,43 @@ Options:
369
406
  openInEditor(selectedFile.path);
370
407
  }
371
408
  });
409
+ // Handle revert key press
410
+ screen.key(['r'], () => __awaiter(this, void 0, void 0, function* () {
411
+ const selectedIndex = fileList.selected;
412
+ const selectedFile = currentFiles[selectedIndex];
413
+ if (selectedFile) {
414
+ confirmDialog.setContent(`Press SPACE key to confirm revert or ESC to cancel.`);
415
+ confirmDialog.show();
416
+ confirmDialog.focus();
417
+ screen.render();
418
+ }
419
+ }));
420
+ // Handle confirmation dialog response with SPACE key
421
+ confirmDialog.key(['space'], () => __awaiter(this, void 0, void 0, function* () {
422
+ confirmDialog.hide();
423
+ const selectedIndex = fileList.selected;
424
+ const selectedFile = currentFiles[selectedIndex];
425
+ if (selectedFile) {
426
+ try {
427
+ yield gitHandler.revertFile(selectedFile.path);
428
+ console.log(chalk_1.default.green(`File ${selectedFile.path} reverted successfully.`));
429
+ // Refresh the file list after reverting
430
+ yield updateFileList();
431
+ }
432
+ catch (error) {
433
+ const errorMessage = error instanceof Error ? error.message : String(error);
434
+ console.error(chalk_1.default.red(`Error reverting file: ${errorMessage}`));
435
+ }
436
+ }
437
+ fileList.focus();
438
+ screen.render();
439
+ }));
440
+ // Handle cancellation with ESC key
441
+ confirmDialog.key(['escape', 'q'], () => {
442
+ confirmDialog.hide();
443
+ fileList.focus();
444
+ screen.render();
445
+ });
372
446
  setInterval(() => __awaiter(this, void 0, void 0, function* () {
373
447
  yield updateFileList();
374
448
  }), 5000);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -11,4 +11,5 @@ export declare class GitHandler {
11
11
  searchFiles(term: string): Promise<FileStatus[]>;
12
12
  getDiff(filePath: string): Promise<string>;
13
13
  getFileContent(filePath: string): Promise<string>;
14
+ revertFile(filePath: string): Promise<void>;
14
15
  }
package/dist/utils/git.js CHANGED
@@ -32,24 +32,35 @@ class GitHandler {
32
32
  getStatus() {
33
33
  return __awaiter(this, void 0, void 0, function* () {
34
34
  const status = yield this.git.status();
35
- const files = [];
35
+ const uniqueFiles = new Map();
36
+ // Process each status category and add to map (which prevents duplicates)
36
37
  status.modified.forEach(path => {
37
- files.push({ path, status: 'modified' });
38
+ uniqueFiles.set(path, { path, status: 'modified' });
38
39
  });
39
40
  status.deleted.forEach(path => {
40
- files.push({ path, status: 'deleted' });
41
+ // Only add if not already in the map
42
+ if (!uniqueFiles.has(path)) {
43
+ uniqueFiles.set(path, { path, status: 'deleted' });
44
+ }
41
45
  });
42
46
  status.created.forEach(path => {
43
- files.push({ path, status: 'added' });
47
+ // Only add if not already in the map
48
+ if (!uniqueFiles.has(path)) {
49
+ uniqueFiles.set(path, { path, status: 'added' });
50
+ }
44
51
  });
45
52
  status.not_added.forEach(path => {
46
- files.push({ path, status: 'unstaged' });
53
+ // Only add if not already in the map
54
+ if (!uniqueFiles.has(path)) {
55
+ uniqueFiles.set(path, { path, status: 'unstaged' });
56
+ }
47
57
  });
48
58
  status.renamed.forEach(r => {
49
- files.push({ path: r.to, status: 'added' });
59
+ // Only add if not already in the map
60
+ if (!uniqueFiles.has(r.to)) {
61
+ uniqueFiles.set(r.to, { path: r.to, status: 'added' });
62
+ }
50
63
  });
51
- const uniqueFiles = new Map();
52
- files.forEach(f => uniqueFiles.set(f.path, f));
53
64
  // Add last modified time for sorting
54
65
  const fileArray = Array.from(uniqueFiles.values());
55
66
  yield Promise.all(fileArray.map((f) => __awaiter(this, void 0, void 0, function* () {
@@ -158,6 +169,17 @@ class GitHandler {
158
169
  }
159
170
  });
160
171
  }
172
+ revertFile(filePath) {
173
+ return __awaiter(this, void 0, void 0, function* () {
174
+ try {
175
+ // Restore the specific file to HEAD version
176
+ yield this.git.raw(['restore', filePath]);
177
+ }
178
+ catch (error) {
179
+ throw new Error(`Could not revert file: ${error}`);
180
+ }
181
+ });
182
+ }
161
183
  }
162
184
  exports.GitHandler = GitHandler;
163
185
  //# sourceMappingURL=git.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "diffwatch",
3
- "version": "1.0.5",
3
+ "version": "1.0.8",
4
4
  "description": "An app for watching git repository file changes.",
5
5
  "author": "Sarfraz Ahmed <sarfraznawaz2005@gmail.com>",
6
6
  "main": "dist/index.js",
package/src/index.ts CHANGED
@@ -1,403 +1,481 @@
1
- #!/usr/bin/env node
2
- const blessed = require('neo-neo-blessed');
3
- import chalk from 'chalk';
4
- import { spawn } from 'child_process';
5
- import { GitHandler, FileStatus } from './utils/git';
6
- import { formatDiffWithDiff2Html } from './utils/diff-formatter';
7
-
8
- async function main() {
9
- const args = process.argv.slice(2);
10
- let repoPath = process.cwd();
11
-
12
- const showHelp = () => {
13
- console.log(`
14
- Usage: diffwatch [path] [options]
15
-
16
- Arguments:
17
- path Path to the git repository (default: current directory)
18
-
19
- Options:
20
- -h, --help Show help information
21
- `);
22
- process.exit(0);
23
- };
24
-
25
- const positionalArgs = [];
26
- for (let i = 0; i < args.length; i++) {
27
- if (args[i] === '-h' || args[i] === '--help') {
28
- showHelp();
29
- } else if (args[i].startsWith('-')) {
30
- // Ignore unknown flags or handle them if needed
31
- } else {
32
- positionalArgs.push(args[i]);
33
- }
34
- }
35
-
36
- if (positionalArgs.length > 0) {
37
- repoPath = positionalArgs[0];
38
- }
39
-
40
- try {
41
- process.chdir(repoPath);
42
- } catch (err) {
43
- console.error(`Error: Could not change directory to ${repoPath}`);
44
- process.exit(1);
45
- }
46
-
47
- const gitHandler = new GitHandler(repoPath);
48
-
49
- if (!(await gitHandler.isRepo())) {
50
- console.log(chalk.red(`Error: ${repoPath} is not a git repository.`));
51
- process.exit(1);
52
- }
53
-
54
- // Force xterm-256color to encourage better mouse support on Windows terminals
55
- if (process.platform === 'win32' && !process.env.TERM) {
56
- process.env.TERM = 'xterm-256color';
57
- }
58
-
59
- const screen = blessed.screen({
60
- smartCSR: true,
61
- title: 'diffwatch',
62
- mouse: true,
63
- });
64
-
65
- // Explicitly enable mouse tracking
66
- screen.program.enableMouse();
67
-
68
- const fileList = blessed.list({
69
- top: 0,
70
- left: 0,
71
- width: '30%',
72
- height: '100%',
73
- label: ' Files (0) ',
74
- keys: true,
75
- vi: true,
76
- mouse: true,
77
- tags: true,
78
- scrollbar: {
79
- ch: ' ',
80
- track: { bg: 'white' },
81
- style: { bg: 'blue' },
82
- },
83
- style: {
84
- selected: { fg: 'black', bg: 'white' },
85
- border: { fg: 'white' },
86
- },
87
- border: { type: 'line' },
88
- });
89
-
90
- const diffView = blessed.scrollabletext({
91
- top: 0,
92
- left: '30%',
93
- width: '70%',
94
- height: '100%',
95
- label: ' Diff () ',
96
- keys: true,
97
- vi: true,
98
- mouse: true,
99
- scrollbar: {
100
- ch: ' ',
101
- track: { bg: 'white' },
102
- style: { bg: 'blue' },
103
- },
104
- style: {
105
- border: { fg: 'white' },
106
- },
107
- border: { type: 'line' },
108
- tags: false,
109
- });
110
-
111
- const searchBox = blessed.box({
112
- top: 'center',
113
- left: 'center',
114
- width: '50%',
115
- height: 3,
116
- label: ' Search ',
117
- border: { type: 'line' },
118
- style: { border: { fg: 'yellow' } },
119
- hidden: true,
120
- });
121
-
122
- const searchInput = blessed.textbox({
123
- parent: searchBox,
124
- top: 0,
125
- left: 0,
126
- width: '100%-2',
127
- height: 1,
128
- keys: true,
129
- inputOnFocus: true,
130
- style: { fg: 'white', bg: 'black' },
131
- });
132
-
133
- screen.append(fileList);
134
- screen.append(diffView);
135
- screen.append(searchBox);
136
-
137
- const updateBorders = () => {
138
- fileList.style.border.fg = screen.focused === fileList ? 'yellow' : 'white';
139
- diffView.style.border.fg = screen.focused === diffView ? 'yellow' : 'white';
140
- screen.render();
141
- };
142
-
143
- let currentFiles: FileStatus[] = [];
144
- let lastSelectedPath: string | null = null;
145
- let diffUpdateTimeout: NodeJS.Timeout | null = null;
146
- let currentSearchTerm: string = '';
147
-
148
- const scheduleDiffUpdate = () => {
149
- if (diffUpdateTimeout) clearTimeout(diffUpdateTimeout);
150
- diffUpdateTimeout = setTimeout(async () => {
151
- await updateDiff();
152
- }, 150); // 150ms debounce
153
- };
154
-
155
- const handleScroll = (direction: 'up' | 'down') => {
156
- if (screen.focused === fileList) {
157
- if (direction === 'up') {
158
- fileList.up(1);
159
- } else {
160
- fileList.down(1);
161
- }
162
- scheduleDiffUpdate();
163
- screen.render();
164
- } else if (screen.focused === diffView) {
165
- const scrollAmount = direction === 'up' ? -2 : 2;
166
- diffView.scroll(scrollAmount);
167
- screen.render();
168
- }
169
- };
170
-
171
- // Remove default wheel listeners to enforce "scroll focused only" behavior
172
- fileList.removeAllListeners('wheeldown');
173
- fileList.removeAllListeners('wheelup');
174
- diffView.removeAllListeners('wheeldown');
175
- diffView.removeAllListeners('wheelup');
176
-
177
- // Attach custom scroll handlers to widgets (captures wheel even if hovering specific widget)
178
- // We use widget-level listeners now that screen.mouse is true.
179
- // We attach to both to ensure the event is caught regardless of where the mouse is.
180
- // The handleScroll function will then decide WHAT to scroll based on focus.
181
-
182
- fileList.on('wheeldown', () => handleScroll('down'));
183
- fileList.on('wheelup', () => handleScroll('up'));
184
-
185
- diffView.on('wheeldown', () => handleScroll('down'));
186
- diffView.on('wheelup', () => handleScroll('up'));
187
-
188
- // Also listen on screen for events that might miss the widgets (margins, borders)
189
- screen.on('wheeldown', () => handleScroll('down'));
190
- screen.on('wheelup', () => handleScroll('up'));
191
-
192
- const openInEditor = (filePath: string) => {
193
- try {
194
- if (process.platform === 'win32') {
195
- // On Windows, use 'start' to open with default program
196
- spawn('cmd', ['/c', 'start', '', filePath], { stdio: 'ignore', detached: true }).unref();
197
- } else {
198
- // On Unix-like systems, try EDITOR, fallback to xdg-open
199
- const editor = process.env.EDITOR || process.env.VISUAL || 'xdg-open';
200
- spawn(editor, [filePath], { stdio: 'ignore', detached: true }).unref();
201
- }
202
- } catch (error) {
203
- console.error(`Failed to open ${filePath}: ${error}`);
204
- }
205
- };
206
-
207
- const updateDiff = async () => {
208
- const selectedIndex = fileList.selected;
209
- const selectedFile = currentFiles[selectedIndex];
210
- if (selectedFile) {
211
- let content = '';
212
- let label = ` Diff (${selectedFile.path}) `;
213
-
214
- if (selectedFile.status !== 'unchanged' && selectedFile.status !== 'deleted') {
215
- const diff = await gitHandler.getDiff(selectedFile.path);
216
- content = formatDiffWithDiff2Html(diff, currentSearchTerm);
217
- }
218
-
219
- if (!content && selectedFile.status !== 'deleted') {
220
- content = await gitHandler.getFileContent(selectedFile.path);
221
- // Highlight search term in full content
222
- if (currentSearchTerm) {
223
- const regex = new RegExp(`(${currentSearchTerm.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')})`, 'gi');
224
- content = content.replace(regex, `\x1b[43m\x1b[30m$1\x1b[0m`);
225
- }
226
- label = ` File (${selectedFile.path}) `;
227
- } else if (!content && selectedFile.status === 'deleted') {
228
- content = chalk.red('File was deleted.');
229
- label = ` Diff (${selectedFile.path}) `;
230
- }
231
-
232
- const currentContent = diffView.content;
233
- const currentLabel = diffView.label;
234
-
235
- // Only update if content or label changed to reduce flickering
236
- if (content !== currentContent || label !== currentLabel) {
237
- const savedScroll = diffView.scrollTop;
238
- const isNewFile = selectedFile.path !== lastSelectedPath;
239
-
240
- diffView.setContent(content);
241
- diffView.setLabel(label);
242
-
243
- if (isNewFile) {
244
- diffView.scrollTo(0);
245
- } else {
246
- diffView.scrollTop = savedScroll;
247
- }
248
- }
249
- lastSelectedPath = selectedFile.path;
250
- } else {
251
- const newContent = 'Select a file to view diff.';
252
- const newLabel = ' Diff () ';
253
- if (diffView.content !== newContent || diffView.label !== newLabel) {
254
- diffView.setContent(newContent);
255
- diffView.setLabel(newLabel);
256
- diffView.scrollTo(0);
257
- }
258
- lastSelectedPath = null;
259
- }
260
- screen.render();
261
- };
262
-
263
- const updateFileList = async () => {
264
- // Preserve selected file path and scroll positions
265
- const selectedPath = currentFiles[fileList.selected]?.path;
266
- const diffScroll = diffView.scrollTop;
267
-
268
- let files: FileStatus[];
269
-
270
- if (currentSearchTerm) {
271
- files = await gitHandler.searchFiles(currentSearchTerm);
272
- } else {
273
- files = await gitHandler.getStatus();
274
- }
275
-
276
- currentFiles = files;
277
-
278
- const items = files.map(f => {
279
- let color = '{white-fg}';
280
- if (f.status === 'added') color = '{green-fg}';
281
- else if (f.status === 'deleted') color = '{red-fg}';
282
- else if (f.status === 'modified') color = '{blue-fg}';
283
- else if (f.status === 'unstaged') color = '{white-fg}';
284
- else if (f.status === 'unchanged') color = '{grey-fg}';
285
-
286
- return `${color}${f.path}{/}`;
287
- });
288
-
289
- fileList.setItems(items);
290
-
291
- const labelTitle = currentSearchTerm ? ` Files (${files.length}) - Searching: "${currentSearchTerm}" ` : ` Files (${files.length}) `;
292
- fileList.setLabel(labelTitle);
293
-
294
- if (items.length > 0) {
295
- // Restore selection by path if possible
296
- const newSelectedIndex = selectedPath ? currentFiles.findIndex(f => f.path === selectedPath) : -1;
297
- fileList.select(newSelectedIndex >= 0 ? newSelectedIndex : 0);
298
- // Cancel any pending diff update and update immediately
299
- if (diffUpdateTimeout) {
300
- clearTimeout(diffUpdateTimeout);
301
- diffUpdateTimeout = null;
302
- }
303
- await updateDiff();
304
- } else {
305
- diffView.setContent(currentSearchTerm ? `No files match "${currentSearchTerm}".` : 'No changes detected.');
306
- diffView.setLabel(' Diff () ');
307
- }
308
-
309
- // Restore scroll positions if reasonably possible (reset if list changed drastically)
310
- // Actually, if we filter, the scroll position might be invalid.
311
- // Ideally we keep it 0 if it was 0 or just let the select() call handle scrolling to the item.
312
- // The previous implementation blindly restored scrollTop.
313
- // If the list shrunk, select() should have brought it into view.
314
- // We only explicitly restore if items.length > 0
315
- // But setting scroll to previous value might be wrong if the list is now shorter.
316
- // Safe to only restore diffView scroll as it depends on content, fileList is handled by select.
317
-
318
- diffView.scrollTop = diffScroll;
319
-
320
- screen.render();
321
- };
322
-
323
- fileList.on('select item', () => {
324
- scheduleDiffUpdate();
325
- });
326
-
327
- fileList.key(['up', 'down'], () => {
328
- scheduleDiffUpdate();
329
- });
330
-
331
- screen.key(['escape', 'q', 'C-c'], () => {
332
- if (!searchBox.hidden) {
333
- searchBox.hide();
334
- screen.render();
335
- fileList.focus();
336
- } else {
337
- screen.destroy();
338
- process.exit(0);
339
- }
340
- });
341
-
342
- screen.key(['s'], () => {
343
- searchBox.show();
344
- searchBox.setFront();
345
- searchInput.setValue(currentSearchTerm);
346
- searchInput.focus();
347
- screen.render();
348
- });
349
-
350
- searchInput.on('submit', async (value: string) => {
351
- currentSearchTerm = (value || '').trim();
352
- searchBox.hide();
353
- fileList.focus();
354
- // Force immediate update
355
- await updateFileList();
356
- });
357
-
358
- searchInput.on('cancel', () => {
359
- searchBox.hide();
360
- fileList.focus();
361
- screen.render();
362
- });
363
-
364
- screen.key(['tab'], () => {
365
- if (screen.focused === fileList) {
366
- diffView.focus();
367
- } else {
368
- fileList.focus();
369
- }
370
- updateBorders();
371
- });
372
-
373
- screen.key(['left'], () => {
374
- fileList.focus();
375
- updateBorders();
376
- });
377
-
378
- screen.key(['right'], () => {
379
- diffView.focus();
380
- updateBorders();
381
- });
382
-
383
- screen.key(['enter'], () => {
384
- const selectedIndex = fileList.selected;
385
- const selectedFile = currentFiles[selectedIndex];
386
- if (selectedFile) {
387
- openInEditor(selectedFile.path);
388
- }
389
- });
390
-
391
- setInterval(async () => {
392
- await updateFileList();
393
- }, 5000);
394
-
395
- await updateFileList();
396
- fileList.focus();
397
- updateBorders();
398
- }
399
-
400
- main().catch(err => {
401
- console.error(err);
402
- process.exit(1);
403
- });
1
+ #!/usr/bin/env node
2
+ const blessed = require('neo-neo-blessed');
3
+ import chalk from 'chalk';
4
+ import { spawn } from 'child_process';
5
+ import { GitHandler, FileStatus } from './utils/git';
6
+ import { formatDiffWithDiff2Html } from './utils/diff-formatter';
7
+
8
+ async function main() {
9
+ const args = process.argv.slice(2);
10
+ let repoPath = process.cwd();
11
+
12
+ const showHelp = () => {
13
+ console.log(`
14
+ Usage: diffwatch [path] [options]
15
+
16
+ Arguments:
17
+ path Path to the git repository (default: current directory)
18
+
19
+ Options:
20
+ -h, --help Show help information
21
+ `);
22
+ process.exit(0);
23
+ };
24
+
25
+ const positionalArgs = [];
26
+ for (let i = 0; i < args.length; i++) {
27
+ if (args[i] === '-h' || args[i] === '--help') {
28
+ showHelp();
29
+ } else if (args[i].startsWith('-')) {
30
+ // Ignore unknown flags or handle them if needed
31
+ } else {
32
+ positionalArgs.push(args[i]);
33
+ }
34
+ }
35
+
36
+ if (positionalArgs.length > 0) {
37
+ repoPath = positionalArgs[0];
38
+ }
39
+
40
+ try {
41
+ process.chdir(repoPath);
42
+ } catch (err) {
43
+ console.error(`Error: Could not change directory to ${repoPath}`);
44
+ process.exit(1);
45
+ }
46
+
47
+ const gitHandler = new GitHandler(repoPath);
48
+
49
+ if (!(await gitHandler.isRepo())) {
50
+ console.log(chalk.red(`Error: ${repoPath} is not a git repository.`));
51
+ process.exit(1);
52
+ }
53
+
54
+ // Force xterm-256color to encourage better mouse support on Windows terminals
55
+ if (process.platform === 'win32' && !process.env.TERM) {
56
+ process.env.TERM = 'xterm-256color';
57
+ }
58
+
59
+ const screen = blessed.screen({
60
+ smartCSR: true,
61
+ title: 'diffwatch',
62
+ mouse: true,
63
+ });
64
+
65
+ // Explicitly enable mouse tracking
66
+ screen.program.enableMouse();
67
+
68
+ const fileList = blessed.list({
69
+ top: 0,
70
+ left: 0,
71
+ width: '30%',
72
+ height: '99%',
73
+ label: 'Files (0)',
74
+ keys: true,
75
+ vi: true,
76
+ mouse: true,
77
+ tags: true,
78
+ scrollbar: {
79
+ ch: ' ',
80
+ track: { bg: 'white' },
81
+ style: { bg: 'blue' },
82
+ },
83
+ style: {
84
+ selected: { fg: 'black', bg: 'white' },
85
+ border: { fg: 'white' },
86
+ },
87
+ border: { type: 'line' },
88
+ });
89
+
90
+ const diffView = blessed.scrollabletext({
91
+ top: 0,
92
+ left: '30%',
93
+ width: '70%',
94
+ height: '99%',
95
+ label: ' Diff () ',
96
+ keys: true,
97
+ vi: true,
98
+ mouse: true,
99
+ scrollbar: {
100
+ ch: ' ',
101
+ track: { bg: 'white' },
102
+ style: { bg: 'blue' },
103
+ },
104
+ style: {
105
+ border: { fg: 'white' },
106
+ },
107
+ border: { type: 'line' },
108
+ tags: false,
109
+ });
110
+
111
+ const searchBox = blessed.box({
112
+ top: 'center',
113
+ left: 'center',
114
+ width: '50%',
115
+ height: 3,
116
+ label: ' Search ',
117
+ border: { type: 'line' },
118
+ style: { border: { fg: 'yellow' } },
119
+ hidden: true,
120
+ });
121
+
122
+ const searchInput = blessed.textbox({
123
+ parent: searchBox,
124
+ top: 0,
125
+ left: 0,
126
+ width: '100%-2',
127
+ height: 1,
128
+ keys: true,
129
+ inputOnFocus: true,
130
+ style: { fg: 'white', bg: 'black' },
131
+ });
132
+
133
+ // Confirmation dialog for revert
134
+ const confirmDialog = blessed.box({
135
+ top: 'center',
136
+ left: 'center',
137
+ width: '38%',
138
+ label: ' Confirm Revert ',
139
+ height: 3,
140
+ content: 'Press ENTER key to confirm revert or ESC to cancel.',
141
+ border: { type: 'line' },
142
+ style: {
143
+ fg: 'yellow',
144
+ bg: 'black',
145
+ border: { fg: 'yellow' }
146
+ },
147
+ hidden: true,
148
+ });
149
+
150
+ // Footer box to show shortcuts - aligned with the panes
151
+ const footer = blessed.box({
152
+ bottom: 0,
153
+ left: 0,
154
+ width: '100%',
155
+ height: 1,
156
+ align: 'center',
157
+ content: chalk.green('←→') + ' Switch |' + chalk.green(' ⏎') + ' Open | ' + chalk.green('S') + ' Search | ' + chalk.green('R') + ' Revert | ' + chalk.green('Q') + ' Quit ',
158
+ });
159
+
160
+ // Adjust footer to align with the panes
161
+ // Note: We'll adjust this after screen initialization
162
+
163
+ screen.append(fileList);
164
+ screen.append(diffView);
165
+ screen.append(searchBox);
166
+ screen.append(confirmDialog);
167
+ screen.append(footer);
168
+
169
+ const updateBorders = () => {
170
+ fileList.style.border.fg = screen.focused === fileList ? 'yellow' : 'white';
171
+ diffView.style.border.fg = screen.focused === diffView ? 'yellow' : 'white';
172
+ screen.render();
173
+ };
174
+
175
+ let currentFiles: FileStatus[] = [];
176
+ let lastSelectedPath: string | null = null;
177
+ let diffUpdateTimeout: NodeJS.Timeout | null = null;
178
+ let currentSearchTerm: string = '';
179
+
180
+ const scheduleDiffUpdate = () => {
181
+ if (diffUpdateTimeout) clearTimeout(diffUpdateTimeout);
182
+ diffUpdateTimeout = setTimeout(async () => {
183
+ await updateDiff();
184
+ }, 150); // 150ms debounce
185
+ };
186
+
187
+ const handleScroll = (direction: 'up' | 'down') => {
188
+ if (screen.focused === fileList) {
189
+ if (direction === 'up') {
190
+ fileList.up(1);
191
+ } else {
192
+ fileList.down(1);
193
+ }
194
+ scheduleDiffUpdate();
195
+ screen.render();
196
+ } else if (screen.focused === diffView) {
197
+ const scrollAmount = direction === 'up' ? -2 : 2;
198
+ diffView.scroll(scrollAmount);
199
+ screen.render();
200
+ }
201
+ };
202
+
203
+ // Remove default wheel listeners to enforce "scroll focused only" behavior
204
+ fileList.removeAllListeners('wheeldown');
205
+ fileList.removeAllListeners('wheelup');
206
+ diffView.removeAllListeners('wheeldown');
207
+ diffView.removeAllListeners('wheelup');
208
+
209
+ // Attach custom scroll handlers to widgets (captures wheel even if hovering specific widget)
210
+ // We use widget-level listeners now that screen.mouse is true.
211
+ // We attach to both to ensure the event is caught regardless of where the mouse is.
212
+ // The handleScroll function will then decide WHAT to scroll based on focus.
213
+
214
+ fileList.on('wheeldown', () => handleScroll('down'));
215
+ fileList.on('wheelup', () => handleScroll('up'));
216
+
217
+ diffView.on('wheeldown', () => handleScroll('down'));
218
+ diffView.on('wheelup', () => handleScroll('up'));
219
+
220
+ // Also listen on screen for events that might miss the widgets (margins, borders)
221
+ screen.on('wheeldown', () => handleScroll('down'));
222
+ screen.on('wheelup', () => handleScroll('up'));
223
+
224
+ const openInEditor = (filePath: string) => {
225
+ try {
226
+ if (process.platform === 'win32') {
227
+ // On Windows, use 'start' to open with default program
228
+ spawn('cmd', ['/c', 'start', '', filePath], { stdio: 'ignore', detached: true }).unref();
229
+ } else {
230
+ // On Unix-like systems, try EDITOR, fallback to xdg-open
231
+ const editor = process.env.EDITOR || process.env.VISUAL || 'xdg-open';
232
+ spawn(editor, [filePath], { stdio: 'ignore', detached: true }).unref();
233
+ }
234
+ } catch (error) {
235
+ console.error(`Failed to open ${filePath}: ${error}`);
236
+ }
237
+ };
238
+
239
+ const updateDiff = async () => {
240
+ const selectedIndex = fileList.selected;
241
+ const selectedFile = currentFiles[selectedIndex];
242
+ if (selectedFile) {
243
+ let content = '';
244
+ let label = ` Diff (${selectedFile.path}) `;
245
+
246
+ if (selectedFile.status !== 'unchanged' && selectedFile.status !== 'deleted') {
247
+ const diff = await gitHandler.getDiff(selectedFile.path);
248
+ content = formatDiffWithDiff2Html(diff, currentSearchTerm);
249
+ }
250
+
251
+ if (!content && selectedFile.status !== 'deleted') {
252
+ content = await gitHandler.getFileContent(selectedFile.path);
253
+ // Highlight search term in full content
254
+ if (currentSearchTerm) {
255
+ const regex = new RegExp(`(${currentSearchTerm.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')})`, 'gi');
256
+ content = content.replace(regex, `\x1b[43m\x1b[30m$1\x1b[0m`);
257
+ }
258
+ label = ` File (${selectedFile.path}) `;
259
+ } else if (!content && selectedFile.status === 'deleted') {
260
+ content = chalk.red('File was deleted.');
261
+ label = ` Diff (${selectedFile.path}) `;
262
+ }
263
+
264
+ const currentContent = diffView.content;
265
+ const currentLabel = diffView.label;
266
+
267
+ // Only update if content or label changed to reduce flickering
268
+ if (content !== currentContent || label !== currentLabel) {
269
+ const savedScroll = diffView.scrollTop;
270
+ const isNewFile = selectedFile.path !== lastSelectedPath;
271
+
272
+ diffView.setContent(content);
273
+ diffView.setLabel(label);
274
+
275
+ if (isNewFile) {
276
+ diffView.scrollTo(0);
277
+ } else {
278
+ diffView.scrollTop = savedScroll;
279
+ }
280
+ }
281
+ lastSelectedPath = selectedFile.path;
282
+ } else {
283
+ const newContent = 'Select a file to view diff.';
284
+ const newLabel = ' Diff () ';
285
+ if (diffView.content !== newContent || diffView.label !== newLabel) {
286
+ diffView.setContent(newContent);
287
+ diffView.setLabel(newLabel);
288
+ diffView.scrollTo(0);
289
+ }
290
+ lastSelectedPath = null;
291
+ }
292
+ screen.render();
293
+ };
294
+
295
+ const updateFileList = async () => {
296
+ // Preserve selected file path and scroll positions
297
+ const selectedPath = currentFiles[fileList.selected]?.path;
298
+ const diffScroll = diffView.scrollTop;
299
+
300
+ let files: FileStatus[];
301
+
302
+ if (currentSearchTerm) {
303
+ files = await gitHandler.searchFiles(currentSearchTerm);
304
+ } else {
305
+ files = await gitHandler.getStatus();
306
+ }
307
+
308
+ currentFiles = files;
309
+
310
+ const items = files.map(f => {
311
+ let color = '{white-fg}';
312
+ if (f.status === 'added') color = '{green-fg}';
313
+ else if (f.status === 'deleted') color = '{red-fg}';
314
+ else if (f.status === 'modified') color = '{blue-fg}';
315
+ else if (f.status === 'unstaged') color = '{white-fg}';
316
+ else if (f.status === 'unchanged') color = '{grey-fg}';
317
+
318
+ return `${color}${f.path}{/}`;
319
+ });
320
+
321
+ fileList.setItems(items);
322
+
323
+ const labelTitle = currentSearchTerm ? `Files (${files.length}) - Searching: "${currentSearchTerm}"` : `Files (${files.length})`;
324
+ fileList.setLabel(labelTitle);
325
+
326
+ if (items.length > 0) {
327
+ // Restore selection by path if possible
328
+ const newSelectedIndex = selectedPath ? currentFiles.findIndex(f => f.path === selectedPath) : -1;
329
+ fileList.select(newSelectedIndex >= 0 ? newSelectedIndex : 0);
330
+ // Cancel any pending diff update and update immediately
331
+ if (diffUpdateTimeout) {
332
+ clearTimeout(diffUpdateTimeout);
333
+ diffUpdateTimeout = null;
334
+ }
335
+ await updateDiff();
336
+ } else {
337
+ // Clear the file list when there are no files
338
+ fileList.clearItems();
339
+ diffView.setContent(currentSearchTerm ? `No files match "${currentSearchTerm}".` : 'No changes detected.');
340
+ diffView.setLabel(' Diff () ');
341
+ }
342
+
343
+ // Restore scroll positions if reasonably possible (reset if list changed drastically)
344
+ // Actually, if we filter, the scroll position might be invalid.
345
+ // Ideally we keep it 0 if it was 0 or just let the select() call handle scrolling to the item.
346
+ // The previous implementation blindly restored scrollTop.
347
+ // If the list shrunk, select() should have brought it into view.
348
+ // We only explicitly restore if items.length > 0
349
+ // But setting scroll to previous value might be wrong if the list is now shorter.
350
+ // Safe to only restore diffView scroll as it depends on content, fileList is handled by select.
351
+
352
+ diffView.scrollTop = diffScroll;
353
+
354
+ screen.render();
355
+ };
356
+
357
+ fileList.on('select item', () => {
358
+ scheduleDiffUpdate();
359
+ });
360
+
361
+ fileList.key(['up', 'down'], () => {
362
+ scheduleDiffUpdate();
363
+ });
364
+
365
+ screen.key(['escape', 'q', 'C-c'], () => {
366
+ if (!searchBox.hidden) {
367
+ searchBox.hide();
368
+ screen.render();
369
+ fileList.focus();
370
+ } else if (!confirmDialog.hidden) {
371
+ // Close the confirmation dialog if it's open
372
+ confirmDialog.hide();
373
+ fileList.focus();
374
+ screen.render();
375
+ } else {
376
+ screen.destroy();
377
+ process.exit(0);
378
+ }
379
+ });
380
+
381
+ screen.key(['s'], () => {
382
+ searchBox.show();
383
+ searchBox.setFront();
384
+ searchInput.setValue(currentSearchTerm);
385
+ searchInput.focus();
386
+ screen.render();
387
+ });
388
+
389
+ searchInput.on('submit', async (value: string) => {
390
+ currentSearchTerm = (value || '').trim();
391
+ searchBox.hide();
392
+ fileList.focus();
393
+ // Force immediate update
394
+ await updateFileList();
395
+ });
396
+
397
+ searchInput.on('cancel', () => {
398
+ searchBox.hide();
399
+ fileList.focus();
400
+ screen.render();
401
+ });
402
+
403
+ screen.key(['tab'], () => {
404
+ if (screen.focused === fileList) {
405
+ diffView.focus();
406
+ } else {
407
+ fileList.focus();
408
+ }
409
+ updateBorders();
410
+ });
411
+
412
+ screen.key(['left'], () => {
413
+ fileList.focus();
414
+ updateBorders();
415
+ });
416
+
417
+ screen.key(['right'], () => {
418
+ diffView.focus();
419
+ updateBorders();
420
+ });
421
+
422
+ screen.key(['enter'], () => {
423
+ const selectedIndex = fileList.selected;
424
+ const selectedFile = currentFiles[selectedIndex];
425
+ if (selectedFile) {
426
+ openInEditor(selectedFile.path);
427
+ }
428
+ });
429
+
430
+ // Handle revert key press
431
+ screen.key(['r'], async () => {
432
+ const selectedIndex = fileList.selected;
433
+ const selectedFile = currentFiles[selectedIndex];
434
+ if (selectedFile) {
435
+ confirmDialog.setContent(`Press SPACE key to confirm revert or ESC to cancel.`);
436
+ confirmDialog.show();
437
+ confirmDialog.focus();
438
+ screen.render();
439
+ }
440
+ });
441
+
442
+ // Handle confirmation dialog response with SPACE key
443
+ confirmDialog.key(['space'], async () => {
444
+ confirmDialog.hide();
445
+ const selectedIndex = fileList.selected;
446
+ const selectedFile = currentFiles[selectedIndex];
447
+ if (selectedFile) {
448
+ try {
449
+ await gitHandler.revertFile(selectedFile.path);
450
+ console.log(chalk.green(`File ${selectedFile.path} reverted successfully.`));
451
+ // Refresh the file list after reverting
452
+ await updateFileList();
453
+ } catch (error) {
454
+ const errorMessage = error instanceof Error ? error.message : String(error);
455
+ console.error(chalk.red(`Error reverting file: ${errorMessage}`));
456
+ }
457
+ }
458
+ fileList.focus();
459
+ screen.render();
460
+ });
461
+
462
+ // Handle cancellation with ESC key
463
+ confirmDialog.key(['escape', 'q'], () => {
464
+ confirmDialog.hide();
465
+ fileList.focus();
466
+ screen.render();
467
+ });
468
+
469
+ setInterval(async () => {
470
+ await updateFileList();
471
+ }, 5000);
472
+
473
+ await updateFileList();
474
+ fileList.focus();
475
+ updateBorders();
476
+ }
477
+
478
+ main().catch(err => {
479
+ console.error(err);
480
+ process.exit(1);
481
+ });
package/src/utils/git.ts CHANGED
@@ -24,31 +24,41 @@ export class GitHandler {
24
24
 
25
25
  async getStatus(): Promise<FileStatus[]> {
26
26
  const status: StatusResult = await this.git.status();
27
- const files: FileStatus[] = [];
27
+ const uniqueFiles = new Map<string, FileStatus>();
28
28
 
29
+ // Process each status category and add to map (which prevents duplicates)
29
30
  status.modified.forEach(path => {
30
- files.push({ path, status: 'modified' });
31
+ uniqueFiles.set(path, { path, status: 'modified' });
31
32
  });
32
33
 
33
34
  status.deleted.forEach(path => {
34
- files.push({ path, status: 'deleted' });
35
+ // Only add if not already in the map
36
+ if (!uniqueFiles.has(path)) {
37
+ uniqueFiles.set(path, { path, status: 'deleted' });
38
+ }
35
39
  });
36
40
 
37
41
  status.created.forEach(path => {
38
- files.push({ path, status: 'added' });
42
+ // Only add if not already in the map
43
+ if (!uniqueFiles.has(path)) {
44
+ uniqueFiles.set(path, { path, status: 'added' });
45
+ }
39
46
  });
40
47
 
41
48
  status.not_added.forEach(path => {
42
- files.push({ path, status: 'unstaged' });
49
+ // Only add if not already in the map
50
+ if (!uniqueFiles.has(path)) {
51
+ uniqueFiles.set(path, { path, status: 'unstaged' });
52
+ }
43
53
  });
44
54
 
45
55
  status.renamed.forEach(r => {
46
- files.push({ path: r.to, status: 'added' });
56
+ // Only add if not already in the map
57
+ if (!uniqueFiles.has(r.to)) {
58
+ uniqueFiles.set(r.to, { path: r.to, status: 'added' });
59
+ }
47
60
  });
48
61
 
49
- const uniqueFiles = new Map<string, FileStatus>();
50
- files.forEach(f => uniqueFiles.set(f.path, f));
51
-
52
62
  // Add last modified time for sorting
53
63
  const fileArray = Array.from(uniqueFiles.values());
54
64
  await Promise.all(fileArray.map(async (f) => {
@@ -154,4 +164,13 @@ export class GitHandler {
154
164
  return `Error reading file: ${error}`;
155
165
  }
156
166
  }
167
+
168
+ async revertFile(filePath: string): Promise<void> {
169
+ try {
170
+ // Restore the specific file to HEAD version
171
+ await this.git.raw(['restore', filePath]);
172
+ } catch (error) {
173
+ throw new Error(`Could not revert file: ${error}`);
174
+ }
175
+ }
157
176
  }