From 316590e3fe37402ba8c08f6acd3c2ea227f9f851 Mon Sep 17 00:00:00 2001
From: Eric Amodio <eamodio@gmail.com>
Date: Fri, 8 Jan 2021 03:36:47 -0500
Subject: [PATCH] Fixes refresh issue when going from none to some

---
 CHANGELOG.md                  |  1 +
 src/views/branchesView.ts     |  3 +++
 src/views/contributorsView.ts |  3 +++
 src/views/nodes/viewNode.ts   | 10 +++++-----
 src/views/remotesView.ts      |  3 +++
 src/views/stashesView.ts      |  3 +++
 src/views/tagsView.ts         |  3 +++
 7 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index e765306..7e985ba 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -25,6 +25,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
 
 - Fixes [#1308](https://github.com/eamodio/vscode-gitlens/issues/1308) - Escape quotes for PRs titles
 - Fixes [#1309](https://github.com/eamodio/vscode-gitlens/issues/1309) - "Fetch" not working on remote branches
+- Fixes an issue where many views wouldn't refresh properly when going from no items to some items
 
 ## [11.1.3] - 2021-01-05
 
diff --git a/src/views/branchesView.ts b/src/views/branchesView.ts
index 2b18c49..0c2e91a 100644
--- a/src/views/branchesView.ts
+++ b/src/views/branchesView.ts
@@ -88,6 +88,9 @@ export class BranchesViewNode extends ViewNode<BranchesView> {
 			const branches = await child.repo.getBranches({ filter: b => !b.remote });
 			if (branches.length === 0) {
 				this.view.message = 'No branches could be found.';
+				this.view.title = 'Branches';
+
+				void child.ensureSubscription();
 
 				return [];
 			}
diff --git a/src/views/contributorsView.ts b/src/views/contributorsView.ts
index 03e4828..409c34f 100644
--- a/src/views/contributorsView.ts
+++ b/src/views/contributorsView.ts
@@ -67,6 +67,9 @@ export class ContributorsViewNode extends ViewNode<ContributorsView> {
 			const contributors = await child.repo.getContributors();
 			if (contributors.length === 0) {
 				this.view.message = 'No contributors could be found.';
+				this.view.title = 'Contributors';
+
+				void child.ensureSubscription();
 
 				return [];
 			}
diff --git a/src/views/nodes/viewNode.ts b/src/views/nodes/viewNode.ts
index af2581e..ac08200 100644
--- a/src/views/nodes/viewNode.ts
+++ b/src/views/nodes/viewNode.ts
@@ -176,7 +176,7 @@ export abstract class SubscribeableViewNode<TView extends View = View> extends V
 	protected disposable: Disposable;
 	protected subscription: Promise<Disposable | undefined> | undefined;
 
-	private _loaded: boolean = false;
+	protected loaded: boolean = false;
 
 	constructor(uri: GitUri, view: TView, parent?: ViewNode) {
 		super(uri, view, parent);
@@ -192,14 +192,14 @@ export abstract class SubscribeableViewNode<TView extends View = View> extends V
 
 		const getTreeItem = this.getTreeItem;
 		this.getTreeItem = function (this: SubscribeableViewNode<TView>) {
-			this._loaded = true;
+			this.loaded = true;
 			void this.ensureSubscription();
 			return getTreeItem.apply(this);
 		};
 
 		const getChildren = this.getChildren;
 		this.getChildren = function (this: SubscribeableViewNode<TView>) {
-			this._loaded = true;
+			this.loaded = true;
 			void this.ensureSubscription();
 			return getChildren.apply(this);
 		};
@@ -217,7 +217,7 @@ export abstract class SubscribeableViewNode<TView extends View = View> extends V
 	@gate()
 	@debug()
 	async triggerChange(reset: boolean = false, force: boolean = false): Promise<void> {
-		if (!this._loaded) return;
+		if (!this.loaded) return;
 
 		await super.triggerChange(reset, force);
 	}
@@ -423,7 +423,7 @@ export abstract class RepositoryFolderNode<
 		}
 
 		if (this.changed(e)) {
-			void this.triggerChange(true);
+			void (this.loaded ? this : this.parent ?? this).triggerChange(true);
 		}
 	}
 }
diff --git a/src/views/remotesView.ts b/src/views/remotesView.ts
index 4cd678c..2bf9bb4 100644
--- a/src/views/remotesView.ts
+++ b/src/views/remotesView.ts
@@ -83,6 +83,9 @@ export class RemotesViewNode extends ViewNode<RemotesView> {
 			const remotes = await child.repo.getRemotes();
 			if (remotes.length === 0) {
 				this.view.message = 'No remotes could be found.';
+				this.view.title = 'Remotes';
+
+				void child.ensureSubscription();
 
 				return [];
 			}
diff --git a/src/views/stashesView.ts b/src/views/stashesView.ts
index aec3323..5109e5a 100644
--- a/src/views/stashesView.ts
+++ b/src/views/stashesView.ts
@@ -65,6 +65,9 @@ export class StashesViewNode extends ViewNode<StashesView> {
 			const stash = await child.repo.getStash();
 			if (stash == null) {
 				this.view.message = 'No stashes could be found.';
+				this.view.title = 'Stashes';
+
+				void child.ensureSubscription();
 
 				return [];
 			}
diff --git a/src/views/tagsView.ts b/src/views/tagsView.ts
index ad9ce73..c8c902e 100644
--- a/src/views/tagsView.ts
+++ b/src/views/tagsView.ts
@@ -66,6 +66,9 @@ export class TagsViewNode extends ViewNode<TagsView> {
 			const tags = await child.repo.getTags();
 			if (tags.length === 0) {
 				this.view.message = 'No tags could be found.';
+				this.view.title = 'Tags';
+
+				void child.ensureSubscription();
 
 				return [];
 			}