Skip to content

Commit 4f9a706

Browse files
authored
Git - add command to close all unmodified editors (microsoft#205278)
* Git - add command to close all unmodified tabs * Fix compilation error
1 parent f396fe0 commit 4f9a706

File tree

3 files changed

+39
-1
lines changed

3 files changed

+39
-1
lines changed

extensions/git/package.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,12 @@
789789
"category": "Git",
790790
"enablement": "!operationInProgress"
791791
},
792+
{
793+
"command": "git.closeAllUnmodifiedEditors",
794+
"title": "%command.closeAllUnmodifiedEditors%",
795+
"category": "Git",
796+
"enablement": "!operationInProgress"
797+
},
792798
{
793799
"command": "git.api.getRepositories",
794800
"title": "%command.api.getRepositories%",

extensions/git/package.nls.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
"command.cleanAllTracked": "Discard All Tracked Changes",
3434
"command.cleanAllUntracked": "Discard All Untracked Changes",
3535
"command.closeAllDiffEditors": "Close All Diff Editors",
36+
"command.closeAllUnmodifiedEditors": "Close All Unmodified Editors",
3637
"command.commit": "Commit",
3738
"command.commitAmend": "Commit (Amend)",
3839
"command.commitSigned": "Commit (Signed Off)",

extensions/git/src/commands.ts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import * as os from 'os';
77
import * as path from 'path';
8-
import { Command, commands, Disposable, LineChange, MessageOptions, Position, ProgressLocation, QuickPickItem, Range, SourceControlResourceState, TextDocumentShowOptions, TextEditor, Uri, ViewColumn, window, workspace, WorkspaceEdit, WorkspaceFolder, TimelineItem, env, Selection, TextDocumentContentProvider, InputBoxValidationSeverity, TabInputText, TabInputTextMerge, QuickPickItemKind, TextDocument, LogOutputChannel, l10n, Memento, UIKind, QuickInputButton, ThemeIcon, SourceControlHistoryItem, SourceControl, InputBoxValidationMessage } from 'vscode';
8+
import { Command, commands, Disposable, LineChange, MessageOptions, Position, ProgressLocation, QuickPickItem, Range, SourceControlResourceState, TextDocumentShowOptions, TextEditor, Uri, ViewColumn, window, workspace, WorkspaceEdit, WorkspaceFolder, TimelineItem, env, Selection, TextDocumentContentProvider, InputBoxValidationSeverity, TabInputText, TabInputTextMerge, QuickPickItemKind, TextDocument, LogOutputChannel, l10n, Memento, UIKind, QuickInputButton, ThemeIcon, SourceControlHistoryItem, SourceControl, InputBoxValidationMessage, Tab, TabInputNotebook } from 'vscode';
99
import TelemetryReporter from '@vscode/extension-telemetry';
1010
import { uniqueNamesGenerator, adjectives, animals, colors, NumberDictionary } from '@joaomoreno/unique-names-generator';
1111
import { ForcePushMode, GitErrorCodes, Ref, RefType, Status, CommitOptions, RemoteSourcePublisher, Remote } from './api/git';
@@ -3994,6 +3994,37 @@ export class CommandCenter {
39943994
repository.closeDiffEditors(undefined, undefined, true);
39953995
}
39963996

3997+
@command('git.closeAllUnmodifiedEditors')
3998+
closeUnmodifiedEditors(): void {
3999+
const editorTabsToClose: Tab[] = [];
4000+
4001+
// Collect all modified files
4002+
const modifiedFiles: string[] = [];
4003+
for (const repository of this.model.repositories) {
4004+
modifiedFiles.push(...repository.indexGroup.resourceStates.map(r => r.resourceUri.fsPath));
4005+
modifiedFiles.push(...repository.workingTreeGroup.resourceStates.map(r => r.resourceUri.fsPath));
4006+
modifiedFiles.push(...repository.untrackedGroup.resourceStates.map(r => r.resourceUri.fsPath));
4007+
modifiedFiles.push(...repository.mergeGroup.resourceStates.map(r => r.resourceUri.fsPath));
4008+
}
4009+
4010+
// Collect all editor tabs that are not dirty and not modified
4011+
for (const tab of window.tabGroups.all.map(g => g.tabs).flat()) {
4012+
if (tab.isDirty) {
4013+
continue;
4014+
}
4015+
4016+
if (tab.input instanceof TabInputText || tab.input instanceof TabInputNotebook) {
4017+
const { uri } = tab.input;
4018+
if (!modifiedFiles.find(p => pathEquals(p, uri.fsPath))) {
4019+
editorTabsToClose.push(tab);
4020+
}
4021+
}
4022+
}
4023+
4024+
// Close editors
4025+
window.tabGroups.close(editorTabsToClose, true);
4026+
}
4027+
39974028
@command('git.openRepositoriesInParentFolders')
39984029
async openRepositoriesInParentFolders(): Promise<void> {
39994030
const parentRepositories: string[] = [];

0 commit comments

Comments
 (0)