Skip to content

Commit 61a3f00

Browse files
authored
extension explodes and kicks back out to GITHUB: LOGIN when non github repos are in working directory (specifically codeberg) (#7547)
Fixes #6945
1 parent 5fa3ccc commit 61a3f00

File tree

2 files changed

+40
-10
lines changed

2 files changed

+40
-10
lines changed

src/github/folderRepositoryManager.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ const CACHED_TEMPLATE_BODY = 'templateBody';
178178
export class FolderRepositoryManager extends Disposable {
179179
static ID = 'FolderRepositoryManager';
180180

181+
private _state: ReposManagerState = ReposManagerState.Initializing;
181182
private _activePullRequest?: PullRequestModel;
182183
private _activeIssue?: IssueModel;
183184
private _githubRepositories: GitHubRepository[];
@@ -468,6 +469,17 @@ export class FolderRepositoryManager extends Disposable {
468469
return isAuthenticated;
469470
}
470471

472+
get state(): ReposManagerState {
473+
return this._state;
474+
}
475+
476+
private set state(state: ReposManagerState) {
477+
if (state !== this._state) {
478+
this._state = state;
479+
this._onDidLoadRepositories.fire(state);
480+
}
481+
}
482+
471483
private async doUpdateRepositories(silent: boolean): Promise<boolean> {
472484
if (this._git.state === 'uninitialized') {
473485
Logger.appendLine('Cannot updates repositories as git is uninitialized', this.id);
@@ -480,7 +492,7 @@ export class FolderRepositoryManager extends Disposable {
480492
if (this.credentialStore.isAnyAuthenticated() && (activeRemotes.length === 0)) {
481493
const areAllNeverGitHub = (await this.computeAllUnknownRemotes()).every(remote => GitHubManager.isNeverGitHub(vscode.Uri.parse(remote.normalizedHost).authority));
482494
if (areAllNeverGitHub) {
483-
this._onDidLoadRepositories.fire(ReposManagerState.RepositoriesLoaded);
495+
this.state = ReposManagerState.RepositoriesLoaded;
484496
return true;
485497
}
486498
}
@@ -562,9 +574,9 @@ export class FolderRepositoryManager extends Disposable {
562574

563575
this.getAssignableUsers(repositoriesAdded.length > 0);
564576
if (isAuthenticated && activeRemotes.length) {
565-
this._onDidLoadRepositories.fire(ReposManagerState.RepositoriesLoaded);
577+
this.state = ReposManagerState.RepositoriesLoaded;
566578
} else if (!isAuthenticated) {
567-
this._onDidLoadRepositories.fire(ReposManagerState.NeedsAuthentication);
579+
this.state = ReposManagerState.NeedsAuthentication;
568580
}
569581
if (!silent) {
570582
this._onDidChangeRepositories.fire({ added: repositoriesAdded.length > 0 });

src/github/repositoriesManager.ts

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,8 @@ export class RepositoriesManager extends Disposable {
8282

8383
private registerFolderListeners(folderManager: FolderRepositoryManager) {
8484
const disposables = [
85-
folderManager.onDidLoadRepositories(state => {
86-
this.state = state;
85+
folderManager.onDidLoadRepositories(() => {
86+
this.updateState();
8787
this._onDidLoadAnyRepositories.fire();
8888
}),
8989
folderManager.onDidChangeActivePullRequest(() => this.updateActiveReviewCount()),
@@ -192,11 +192,29 @@ export class RepositoriesManager extends Disposable {
192192
return this._state;
193193
}
194194

195-
set state(state: ReposManagerState) {
196-
const stateChange = state !== this._state;
197-
this._state = state;
195+
private updateState(state?: ReposManagerState) {
196+
let maxState = ReposManagerState.Initializing;
197+
if (state) {
198+
maxState = state;
199+
} else {
200+
// Get the most advanced state from all folder managers
201+
const stateValue = (testState: ReposManagerState) => {
202+
switch (testState) {
203+
case ReposManagerState.Initializing: return 0;
204+
case ReposManagerState.NeedsAuthentication: return 1;
205+
case ReposManagerState.RepositoriesLoaded: return 2;
206+
}
207+
};
208+
for (const folderManager of this._folderManagers) {
209+
if (stateValue(folderManager.state) > stateValue(maxState)) {
210+
maxState = folderManager.state;
211+
}
212+
}
213+
}
214+
const stateChange = maxState !== this._state;
215+
this._state = maxState;
198216
if (stateChange) {
199-
vscode.commands.executeCommand('setContext', ReposManagerStateContext, state);
217+
vscode.commands.executeCommand('setContext', ReposManagerStateContext, maxState);
200218
this._onDidChangeState.fire();
201219
}
202220
}
@@ -207,7 +225,7 @@ export class RepositoriesManager extends Disposable {
207225

208226
async clearCredentialCache(): Promise<void> {
209227
await this._credentialStore.reset();
210-
this.state = ReposManagerState.Initializing;
228+
this.updateState(ReposManagerState.Initializing);
211229
}
212230

213231
async authenticate(enterprise?: boolean): Promise<boolean> {

0 commit comments

Comments
 (0)