Skip to content

Commit 82abb9e

Browse files
committed
differentiate between tracked & untracked in staging
1 parent 003177e commit 82abb9e

3 files changed

Lines changed: 86 additions & 20 deletions

File tree

extensions/git/package.json

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,15 @@
109109
"dark": "resources/icons/dark/stage.svg"
110110
}
111111
},
112+
{
113+
"command": "git.stageAllTracked",
114+
"title": "%command.stageAllTracked%",
115+
"category": "Git",
116+
"icon": {
117+
"light": "resources/icons/light/stage.svg",
118+
"dark": "resources/icons/dark/stage.svg"
119+
}
120+
},
112121
{
113122
"command": "git.stageAllUntracked",
114123
"title": "%command.stageAllUntracked%",
@@ -187,6 +196,15 @@
187196
"dark": "resources/icons/dark/clean.svg"
188197
}
189198
},
199+
{
200+
"command": "git.cleanAllTracked",
201+
"title": "%command.cleanAllTracked%",
202+
"category": "Git",
203+
"icon": {
204+
"light": "resources/icons/light/clean.svg",
205+
"dark": "resources/icons/dark/clean.svg"
206+
}
207+
},
190208
{
191209
"command": "git.cleanAllUntracked",
192210
"title": "%command.cleanAllUntracked%",
@@ -468,6 +486,10 @@
468486
"command": "git.stageAll",
469487
"when": "config.git.enabled && gitOpenRepositoryCount != 0"
470488
},
489+
{
490+
"command": "git.stageAllTracked",
491+
"when": "config.git.enabled && gitOpenRepositoryCount != 0"
492+
},
471493
{
472494
"command": "git.stageAllUntracked",
473495
"when": "config.git.enabled && gitOpenRepositoryCount != 0"
@@ -885,22 +907,42 @@
885907
},
886908
{
887909
"command": "git.cleanAll",
888-
"when": "scmProvider == git && scmResourceGroup == workingTree",
910+
"when": "scmProvider == git && scmResourceGroup == workingTree && config.git.handleUntracked == withchanges",
889911
"group": "1_modification"
890912
},
891913
{
892914
"command": "git.stageAll",
893-
"when": "scmProvider == git && scmResourceGroup == workingTree",
915+
"when": "scmProvider == git && scmResourceGroup == workingTree && config.git.handleUntracked == withchanges",
894916
"group": "1_modification"
895917
},
896918
{
897919
"command": "git.cleanAll",
898-
"when": "scmProvider == git && scmResourceGroup == workingTree",
920+
"when": "scmProvider == git && scmResourceGroup == workingTree && config.git.handleUntracked == withchanges",
899921
"group": "inline"
900922
},
901923
{
902924
"command": "git.stageAll",
903-
"when": "scmProvider == git && scmResourceGroup == workingTree",
925+
"when": "scmProvider == git && scmResourceGroup == workingTree && config.git.handleUntracked == withchanges",
926+
"group": "inline"
927+
},
928+
{
929+
"command": "git.cleanAllTracked",
930+
"when": "scmProvider == git && scmResourceGroup == workingTree && config.git.handleUntracked != withchanges",
931+
"group": "1_modification"
932+
},
933+
{
934+
"command": "git.stageAllTracked",
935+
"when": "scmProvider == git && scmResourceGroup == workingTree && config.git.handleUntracked != withchanges",
936+
"group": "1_modification"
937+
},
938+
{
939+
"command": "git.cleanAllTracked",
940+
"when": "scmProvider == git && scmResourceGroup == workingTree && config.git.handleUntracked != withchanges",
941+
"group": "inline"
942+
},
943+
{
944+
"command": "git.stageAllTracked",
945+
"when": "scmProvider == git && scmResourceGroup == workingTree && config.git.handleUntracked != withchanges",
904946
"group": "inline"
905947
},
906948
{

extensions/git/package.nls.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"command.openHEADFile": "Open File (HEAD)",
1212
"command.stage": "Stage Changes",
1313
"command.stageAll": "Stage All Changes",
14+
"command.stageAllTracked": "Stage All Tracked Changes",
1415
"command.stageAllUntracked": "Stage All Untracked Changes",
1516
"command.stageSelectedRanges": "Stage Selected Ranges",
1617
"command.revertSelectedRanges": "Revert Selected Ranges",
@@ -21,6 +22,7 @@
2122
"command.unstageSelectedRanges": "Unstage Selected Ranges",
2223
"command.clean": "Discard Changes",
2324
"command.cleanAll": "Discard All Changes",
25+
"command.cleanAllTracked": "Discard All Tracked Changes",
2426
"command.cleanAllUntracked": "Discard All Untracked Changes",
2527
"command.commit": "Commit",
2628
"command.commitStaged": "Commit Staged",

extensions/git/src/commands.ts

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -954,6 +954,15 @@ export class CommandCenter {
954954
}
955955
}
956956

957+
@command('git.stageAllTracked', { repository: true })
958+
async stageAllTracked(repository: Repository): Promise<void> {
959+
const resources = repository.workingTreeGroup.resourceStates
960+
.filter(r => r.type !== Status.UNTRACKED && r.type !== Status.IGNORED);
961+
const uris = resources.map(r => r.resourceUri);
962+
963+
await repository.add(uris);
964+
}
965+
957966
@command('git.stageAllUntracked', { repository: true })
958967
async stageAllUntracked(repository: Repository): Promise<void> {
959968
const resources = [...repository.workingTreeGroup.resourceStates, ...repository.untrackedGroup.resourceStates]
@@ -1207,26 +1216,11 @@ export class CommandCenter {
12071216
const untrackedResources = resources.filter(r => r.type === Status.UNTRACKED || r.type === Status.IGNORED);
12081217

12091218
if (untrackedResources.length === 0) {
1210-
const message = resources.length === 1
1211-
? localize('confirm discard all single', "Are you sure you want to discard changes in {0}?", path.basename(resources[0].resourceUri.fsPath))
1212-
: localize('confirm discard all', "Are you sure you want to discard ALL changes in {0} files?\nThis is IRREVERSIBLE!\nYour current working set will be FOREVER LOST.", resources.length);
1213-
const yes = resources.length === 1
1214-
? localize('discardAll multiple', "Discard 1 File")
1215-
: localize('discardAll', "Discard All {0} Files", resources.length);
1216-
const pick = await window.showWarningMessage(message, { modal: true }, yes);
1217-
1218-
if (pick !== yes) {
1219-
return;
1220-
}
1221-
1222-
await repository.clean(resources.map(r => r.resourceUri));
1223-
1219+
await this._cleanTrackedChanges(repository, resources);
12241220
} else if (resources.length === 1) {
12251221
await this._cleanUntrackedChange(repository, resources[0]);
1226-
12271222
} else if (trackedResources.length === 0) {
12281223
await this._cleanUntrackedChanges(repository, resources);
1229-
12301224
} else { // resources.length > 1 && untrackedResources.length > 0 && trackedResources.length > 0
12311225
const untrackedMessage = untrackedResources.length === 1
12321226
? localize('there are untracked files single', "The following untracked file will be DELETED FROM DISK if discarded: {0}.", path.basename(untrackedResources[0].resourceUri.fsPath))
@@ -1251,6 +1245,18 @@ export class CommandCenter {
12511245
}
12521246
}
12531247

1248+
@command('git.cleanAllTracked', { repository: true })
1249+
async cleanAllTracked(repository: Repository): Promise<void> {
1250+
const resources = repository.workingTreeGroup.resourceStates
1251+
.filter(r => r.type !== Status.UNTRACKED && r.type !== Status.IGNORED);
1252+
1253+
if (resources.length === 0) {
1254+
return;
1255+
}
1256+
1257+
await this._cleanTrackedChanges(repository, resources);
1258+
}
1259+
12541260
@command('git.cleanAllUntracked', { repository: true })
12551261
async cleanAllUntracked(repository: Repository): Promise<void> {
12561262
const resources = [...repository.workingTreeGroup.resourceStates, ...repository.untrackedGroup.resourceStates]
@@ -1267,6 +1273,22 @@ export class CommandCenter {
12671273
}
12681274
}
12691275

1276+
private async _cleanTrackedChanges(repository: Repository, resources: Resource[]): Promise<void> {
1277+
const message = resources.length === 1
1278+
? localize('confirm discard all single', "Are you sure you want to discard changes in {0}?", path.basename(resources[0].resourceUri.fsPath))
1279+
: localize('confirm discard all', "Are you sure you want to discard ALL changes in {0} files?\nThis is IRREVERSIBLE!\nYour current working set will be FOREVER LOST.", resources.length);
1280+
const yes = resources.length === 1
1281+
? localize('discardAll multiple', "Discard 1 File")
1282+
: localize('discardAll', "Discard All {0} Files", resources.length);
1283+
const pick = await window.showWarningMessage(message, { modal: true }, yes);
1284+
1285+
if (pick !== yes) {
1286+
return;
1287+
}
1288+
1289+
await repository.clean(resources.map(r => r.resourceUri));
1290+
}
1291+
12701292
private async _cleanUntrackedChange(repository: Repository, resource: Resource): Promise<void> {
12711293
const message = localize('confirm delete', "Are you sure you want to DELETE {0}?\nThis is IRREVERSIBLE!\nThis file will be FOREVER LOST.", path.basename(resource.resourceUri.fsPath));
12721294
const yes = localize('delete file', "Delete file");

0 commit comments

Comments
 (0)