diff --git a/extensions/git/package.json b/extensions/git/package.json index 65d4faf08a1..e59670ac0c1 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -951,6 +951,15 @@ "dark": "#6c6cc4", "highContrast": "#6c6cc4" } + }, + { + "id": "gitDecoration.submoduleResourceForeground", + "description": "%colors.submodule%", + "defaults": { + "light": "#1258a7", + "dark": "#8db9e2", + "highContrast": "#8db9e2" + } } ] }, diff --git a/extensions/git/package.nls.json b/extensions/git/package.nls.json index 542740ef483..179c430eb4b 100644 --- a/extensions/git/package.nls.json +++ b/extensions/git/package.nls.json @@ -68,5 +68,6 @@ "colors.deleted": "Color for deleted resources.", "colors.untracked": "Color for untracked resources.", "colors.ignored": "Color for ignored resources.", - "colors.conflict": "Color for resources with conflicts." + "colors.conflict": "Color for resources with conflicts.", + "colors.submodule": "Color for submodule resources." } \ No newline at end of file diff --git a/extensions/git/src/decorationProvider.ts b/extensions/git/src/decorationProvider.ts index fc068efd8c4..20b523aa953 100644 --- a/extensions/git/src/decorationProvider.ts +++ b/extensions/git/src/decorationProvider.ts @@ -6,10 +6,12 @@ 'use strict'; import { window, workspace, Uri, Disposable, Event, EventEmitter, DecorationData, DecorationProvider, ThemeColor } from 'vscode'; +import * as path from 'path'; import { Repository, GitResourceGroup, Status } from './repository'; import { Model } from './model'; import { debounce } from './decorators'; import { filterEvent } from './util'; +import { Submodule } from './git'; class GitIgnoreDecorationProvider implements DecorationProvider { @@ -65,6 +67,14 @@ class GitIgnoreDecorationProvider implements DecorationProvider { class GitDecorationProvider implements DecorationProvider { + private static SubmoduleDecorationData = { + source: 'git.resource', + title: 'Submodule', + abbreviation: 'S', + color: new ThemeColor('gitDecoration.submoduleResourceForeground'), + priority: 1 + }; + private readonly _onDidChangeDecorations = new EventEmitter(); readonly onDidChangeDecorations: Event = this._onDidChangeDecorations.event; @@ -83,6 +93,7 @@ class GitDecorationProvider implements DecorationProvider { this.collectDecorationData(this.repository.indexGroup, newDecorations); this.collectDecorationData(this.repository.workingTreeGroup, newDecorations); this.collectDecorationData(this.repository.mergeGroup, newDecorations); + this.collectSubmoduleDecorationData(newDecorations); const uris = new Set([...this.decorations.keys()].concat([...newDecorations.keys()])); this.decorations = newDecorations; @@ -101,6 +112,12 @@ class GitDecorationProvider implements DecorationProvider { }); } + private collectSubmoduleDecorationData(bucket: Map): void { + for (const submodule of this.repository.submodules) { + bucket.set(Uri.file(path.join(this.repository.root, submodule.path)).toString(), GitDecorationProvider.SubmoduleDecorationData); + } + } + provideDecoration(uri: Uri): DecorationData | undefined { return this.decorations.get(uri.toString()); }