Skip to content

Commit b8a353f

Browse files
committed
Fixes misleading 'upgrade your Git' message for virtual repositories (#5056)
- Filters local-only views (worktrees, stashes) from the grouped SCM view when virtual folders are present - Re-evaluates grouped view availability when repositories change - Gates all worktrees welcome content with !gitlens:hasVirtualFolders - Adds 'Worktrees are not available for virtual repositories' message
1 parent 98cae32 commit b8a353f

5 files changed

Lines changed: 60 additions & 22 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
1616

1717
### Fixed
1818

19+
- Fixes the _Worktrees_ view showing a misleading 'upgrade your Git' message when opening a virtual GitHub repository ([#5056](https://github.com/gitkraken/vscode-gitlens/issues/5056))
1920
- Fixes provider id mismatch for cloud-connected self-hosted integrations ([#5031](https://github.com/gitkraken/vscode-gitlens/issues/5031))
2021
- Fixes an issue where the _Launchpad_ would fail to show any pull requests when one integration provider had an authentication failure — now shows partial results with an error indicator ([#4492](https://github.com/gitkraken/vscode-gitlens/issues/4492))
2122

contributions.json

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19632,43 +19632,47 @@
1963219632
},
1963319633
{
1963419634
"contents": "Unlock this feature for privately hosted repos with [GitLens Pro](https://help.gitkraken.com/gitlens/gitlens-community-vs-gitlens-pro/).",
19635-
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && gitlens:plus:state != 6"
19635+
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && !gitlens:hasVirtualFolders && gitlens:plus:state != 6"
1963619636
},
1963719637
{
1963819638
"contents": "[Create Worktree...](command:gitlens.views.createWorktree)",
19639-
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && !gitlens:plus:required && !gitlens:feature:unsupported:git:worktrees"
19639+
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && !gitlens:hasVirtualFolders && !gitlens:plus:required && !gitlens:feature:unsupported:git:worktrees"
1964019640
},
1964119641
{
1964219642
"contents": "[Resend Verification Email](command:gitlens.plus.resendVerification?%7B%22source%22%3A%22worktrees%22%7D)\n\nYou must verify your email before you can continue or [recheck Status](command:gitlens.plus.validate?%7B%22source%22%3A%22worktrees%22%7D).",
19643-
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && gitlens:plus:state == -1"
19643+
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && !gitlens:hasVirtualFolders && gitlens:plus:state == -1"
1964419644
},
1964519645
{
1964619646
"contents": "[Try GitLens Pro](command:gitlens.plus.signUp?%7B%22source%22%3A%22worktrees%22%7D)\n\nGet 14 days of GitLens Pro for free — no credit card required. Or [sign in](command:gitlens.plus.login?%7B%22source%22%3A%22worktrees%22%7D).",
19647-
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && gitlens:plus:required && gitlens:plus:state == 0"
19647+
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && !gitlens:hasVirtualFolders && gitlens:plus:required && gitlens:plus:state == 0"
1964819648
},
1964919649
{
1965019650
"contents": "[Upgrade to Pro](command:gitlens.plus.upgrade?%7B%22source%22%3A%22worktrees%22%7D)",
19651-
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && gitlens:plus:required && gitlens:plus:state == 4"
19651+
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && !gitlens:hasVirtualFolders && gitlens:plus:required && gitlens:plus:state == 4"
1965219652
},
1965319653
{
1965419654
"contents": "Limited-time sale on GitLens Pro.",
19655-
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && gitlens:plus:required && gitlens:plus:state == 4 && gitlens:promo && gitlens:promo != pro50"
19655+
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && !gitlens:hasVirtualFolders && gitlens:plus:required && gitlens:plus:state == 4 && gitlens:promo && gitlens:promo != pro50"
1965619656
},
1965719657
{
1965819658
"contents": "Save up to 50% on GitLens Pro.",
19659-
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && gitlens:plus:required && gitlens:plus:state == 4 && gitlens:promo == pro50"
19659+
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && !gitlens:hasVirtualFolders && gitlens:plus:required && gitlens:plus:state == 4 && gitlens:promo == pro50"
1966019660
},
1966119661
{
1966219662
"contents": "Your Pro trial has ended. Please upgrade for full access to Worktrees and other Pro features.",
19663-
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && gitlens:plus:required && gitlens:plus:state == 4"
19663+
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && !gitlens:hasVirtualFolders && gitlens:plus:required && gitlens:plus:state == 4"
1966419664
},
1966519665
{
1966619666
"contents": "[Continue](command:gitlens.plus.reactivateProTrial?%7B%22source%22%3A%22worktrees%22%7D)\n\nReactivate your Pro trial and experience Worktrees and all the new Pro features — free for another 14 days!",
19667-
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && gitlens:plus:required && gitlens:plus:state == 5"
19667+
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && !gitlens:hasVirtualFolders && gitlens:plus:required && gitlens:plus:state == 5"
19668+
},
19669+
{
19670+
"contents": "Worktrees are not available for virtual repositories.",
19671+
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && gitlens:hasVirtualFolders"
1966819672
},
1966919673
{
1967019674
"contents": "⚠ Worktrees are not supported by your version of Git. Please upgrade to a more recent version.",
19671-
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && !gitlens:plus:required && gitlens:feature:unsupported:git:worktrees"
19675+
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && !gitlens:hasVirtualFolders && !gitlens:plus:required && gitlens:feature:unsupported:git:worktrees"
1967219676
}
1967319677
]
1967419678
},
@@ -19810,9 +19814,13 @@
1981019814
"contents": "[Continue](command:gitlens.plus.reactivateProTrial?%7B%22source%22%3A%22worktrees%22%7D)\n\nReactivate your Pro trial and experience Worktrees and all the new Pro features — free for another 14 days!",
1981119815
"when": "gitlens:plus:required && gitlens:plus:state == 5"
1981219816
},
19817+
{
19818+
"contents": "Worktrees are not available for virtual repositories.",
19819+
"when": "gitlens:hasVirtualFolders"
19820+
},
1981319821
{
1981419822
"contents": "⚠ Worktrees are not supported by your version of Git. Please upgrade to a more recent version.",
19815-
"when": "!gitlens:plus:required && gitlens:feature:unsupported:git:worktrees"
19823+
"when": "!gitlens:hasVirtualFolders && !gitlens:plus:required && gitlens:feature:unsupported:git:worktrees"
1981619824
}
1981719825
]
1981819826
}

package.json

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26907,52 +26907,57 @@
2690726907
{
2690826908
"view": "gitlens.views.scm.grouped",
2690926909
"contents": "Unlock this feature for privately hosted repos with [GitLens Pro](https://help.gitkraken.com/gitlens/gitlens-community-vs-gitlens-pro/).",
26910-
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && gitlens:plus:state != 6"
26910+
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && !gitlens:hasVirtualFolders && gitlens:plus:state != 6"
2691126911
},
2691226912
{
2691326913
"view": "gitlens.views.scm.grouped",
2691426914
"contents": "[Create Worktree...](command:gitlens.views.createWorktree)",
26915-
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && !gitlens:plus:required && !gitlens:feature:unsupported:git:worktrees"
26915+
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && !gitlens:hasVirtualFolders && !gitlens:plus:required && !gitlens:feature:unsupported:git:worktrees"
2691626916
},
2691726917
{
2691826918
"view": "gitlens.views.scm.grouped",
2691926919
"contents": "[Resend Verification Email](command:gitlens.plus.resendVerification?%7B%22source%22%3A%22worktrees%22%7D)\n\nYou must verify your email before you can continue or [recheck Status](command:gitlens.plus.validate?%7B%22source%22%3A%22worktrees%22%7D).",
26920-
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && gitlens:plus:state == -1"
26920+
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && !gitlens:hasVirtualFolders && gitlens:plus:state == -1"
2692126921
},
2692226922
{
2692326923
"view": "gitlens.views.scm.grouped",
2692426924
"contents": "[Try GitLens Pro](command:gitlens.plus.signUp?%7B%22source%22%3A%22worktrees%22%7D)\n\nGet 14 days of GitLens Pro for free — no credit card required. Or [sign in](command:gitlens.plus.login?%7B%22source%22%3A%22worktrees%22%7D).",
26925-
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && gitlens:plus:required && gitlens:plus:state == 0"
26925+
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && !gitlens:hasVirtualFolders && gitlens:plus:required && gitlens:plus:state == 0"
2692626926
},
2692726927
{
2692826928
"view": "gitlens.views.scm.grouped",
2692926929
"contents": "[Upgrade to Pro](command:gitlens.plus.upgrade?%7B%22source%22%3A%22worktrees%22%7D)",
26930-
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && gitlens:plus:required && gitlens:plus:state == 4"
26930+
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && !gitlens:hasVirtualFolders && gitlens:plus:required && gitlens:plus:state == 4"
2693126931
},
2693226932
{
2693326933
"view": "gitlens.views.scm.grouped",
2693426934
"contents": "Limited-time sale on GitLens Pro.",
26935-
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && gitlens:plus:required && gitlens:plus:state == 4 && gitlens:promo && gitlens:promo != pro50"
26935+
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && !gitlens:hasVirtualFolders && gitlens:plus:required && gitlens:plus:state == 4 && gitlens:promo && gitlens:promo != pro50"
2693626936
},
2693726937
{
2693826938
"view": "gitlens.views.scm.grouped",
2693926939
"contents": "Save up to 50% on GitLens Pro.",
26940-
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && gitlens:plus:required && gitlens:plus:state == 4 && gitlens:promo == pro50"
26940+
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && !gitlens:hasVirtualFolders && gitlens:plus:required && gitlens:plus:state == 4 && gitlens:promo == pro50"
2694126941
},
2694226942
{
2694326943
"view": "gitlens.views.scm.grouped",
2694426944
"contents": "Your Pro trial has ended. Please upgrade for full access to Worktrees and other Pro features.",
26945-
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && gitlens:plus:required && gitlens:plus:state == 4"
26945+
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && !gitlens:hasVirtualFolders && gitlens:plus:required && gitlens:plus:state == 4"
2694626946
},
2694726947
{
2694826948
"view": "gitlens.views.scm.grouped",
2694926949
"contents": "[Continue](command:gitlens.plus.reactivateProTrial?%7B%22source%22%3A%22worktrees%22%7D)\n\nReactivate your Pro trial and experience Worktrees and all the new Pro features — free for another 14 days!",
26950-
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && gitlens:plus:required && gitlens:plus:state == 5"
26950+
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && !gitlens:hasVirtualFolders && gitlens:plus:required && gitlens:plus:state == 5"
26951+
},
26952+
{
26953+
"view": "gitlens.views.scm.grouped",
26954+
"contents": "Worktrees are not available for virtual repositories.",
26955+
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && gitlens:hasVirtualFolders"
2695126956
},
2695226957
{
2695326958
"view": "gitlens.views.scm.grouped",
2695426959
"contents": "⚠ Worktrees are not supported by your version of Git. Please upgrade to a more recent version.",
26955-
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && !gitlens:plus:required && gitlens:feature:unsupported:git:worktrees"
26960+
"when": "!gitlens:views:scm:grouped:loading && gitlens:views:scm:grouped:view == worktrees && !gitlens:hasVirtualFolders && !gitlens:plus:required && gitlens:feature:unsupported:git:worktrees"
2695626961
},
2695726962
{
2695826963
"view": "gitlens.views.searchAndCompare",
@@ -27037,10 +27042,15 @@
2703727042
"contents": "[Continue](command:gitlens.plus.reactivateProTrial?%7B%22source%22%3A%22worktrees%22%7D)\n\nReactivate your Pro trial and experience Worktrees and all the new Pro features — free for another 14 days!",
2703827043
"when": "gitlens:plus:required && gitlens:plus:state == 5"
2703927044
},
27045+
{
27046+
"view": "gitlens.views.worktrees",
27047+
"contents": "Worktrees are not available for virtual repositories.",
27048+
"when": "gitlens:hasVirtualFolders"
27049+
},
2704027050
{
2704127051
"view": "gitlens.views.worktrees",
2704227052
"contents": "⚠ Worktrees are not supported by your version of Git. Please upgrade to a more recent version.",
27043-
"when": "!gitlens:plus:required && gitlens:feature:unsupported:git:worktrees"
27053+
"when": "!gitlens:hasVirtualFolders && !gitlens:plus:required && gitlens:feature:unsupported:git:worktrees"
2704427054
}
2704527055
],
2704627056
"views": {

src/constants.views.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ export type GroupableTreeViewTypes = Extract<
4343
>;
4444
export type GroupableTreeViewIds<T extends GroupableTreeViewTypes = GroupableTreeViewTypes> = TreeViewIds<T>;
4545

46+
/** Grouped views that require a local repository and are unavailable for virtual repositories */
47+
export const localOnlyGroupedViews: ReadonlySet<GroupableTreeViewTypes> = new Set(['worktrees', 'stashes']);
48+
4649
export type WebviewPanelTypes = 'composer' | 'graph' | 'patchDetails' | 'settings' | 'timeline';
4750
export type WebviewPanelIds = `gitlens.${WebviewPanelTypes}`;
4851

src/views/views.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { ConfigurationChangeEvent, MessageItem } from 'vscode';
22
import { Disposable, env, ExtensionMode, window } from 'vscode';
33
import type { GroupableTreeViewTypes, TreeViewTypes } from '../constants.views.js';
4+
import { localOnlyGroupedViews } from '../constants.views.js';
45
import type { Container } from '../container.js';
56
import type { GitContributor } from '../git/models/contributor.js';
67
import type {
@@ -101,6 +102,7 @@ export class Views implements Disposable {
101102
return this._scmGroupedViews;
102103
}
103104

105+
private _hasVirtualFolders: boolean | undefined;
104106
private _welcomeDismissed = false;
105107

106108
constructor(
@@ -109,6 +111,7 @@ export class Views implements Disposable {
109111
) {
110112
this._disposable = Disposable.from(
111113
configuration.onDidChange(this.onConfigurationChanged, this),
114+
container.git.onDidChangeRepositories(this.onRepositoriesChanged, this),
112115
new ViewCommands(container),
113116
...this.registerViews(),
114117
...this.registerWebviewViews(webviews),
@@ -185,6 +188,14 @@ export class Views implements Disposable {
185188
}
186189
}
187190

191+
private onRepositoriesChanged(): void {
192+
const hasVirtualFolders = getContext('gitlens:hasVirtualFolders');
193+
if (this._hasVirtualFolders !== hasVirtualFolders) {
194+
this._hasVirtualFolders = hasVirtualFolders;
195+
this.updateScmGroupedViewsRegistration();
196+
}
197+
}
198+
188199
private registerCommands(): Disposable[] {
189200
return [
190201
registerCommand('gitlens.views.branches.attach', () => this.toggleScmViewGrouping('branches', true)),
@@ -589,6 +600,11 @@ export class Views implements Disposable {
589600
void setContext('gitlens:views:scm:grouped:welcome', !this._welcomeDismissed);
590601

591602
this._scmGroupedViews = getScmGroupedViewsFromConfig();
603+
if (getContext('gitlens:hasVirtualFolders')) {
604+
for (const view of localOnlyGroupedViews) {
605+
this._scmGroupedViews.delete(view);
606+
}
607+
}
592608

593609
if (this._scmGroupedViews.size) {
594610
if (this._welcomeDismissed || bypassWelcomeView) {

0 commit comments

Comments
 (0)