Skip to content

Commit 573fb62

Browse files
[cherry-pick] Multifile Diff Editor - fix error on initial reveal (#313023)
Co-authored-by: vs-code-engineering[bot] <vs-code-engineering[bot]@users.noreply.github.com>
1 parent 757e7d3 commit 573fb62

2 files changed

Lines changed: 11 additions & 8 deletions

File tree

src/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorViewModel.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { Disposable, DisposableStore, toDisposable } from '../../../../base/common/lifecycle.js';
7-
import { IObservable, ITransaction, ObservablePromise, ObservableResolvedPromise, constObservable, derived, derivedObservableWithWritableCache, mapObservableArrayCached, observableFromValueWithChangeEvent, observableValue, transaction } from '../../../../base/common/observable.js';
7+
import { IObservable, ITransaction, ObservablePromise, ObservableResolvedPromise, constObservable, derived, derivedObservableWithWritableCache, mapObservableArrayCached, observableFromValueWithChangeEvent, observableValue, transaction, waitForState } from '../../../../base/common/observable.js';
88
import { timeout } from '../../../../base/common/async.js';
99
import { URI } from '../../../../base/common/uri.js';
1010
import { ContextKeyValue } from '../../../../platform/contextkey/common/contextkey.js';
@@ -28,6 +28,7 @@ export class MultiDiffEditorViewModel extends Disposable {
2828
});
2929

3030
public readonly isLoading;
31+
private readonly _waitForNewDiffs: IObservable<ObservablePromise<readonly RefCounted<DocumentDiffItemViewModel>[]>>;
3132

3233
public readonly items: IObservable<readonly DocumentDiffItemViewModel[]>;
3334

@@ -36,10 +37,12 @@ export class MultiDiffEditorViewModel extends Disposable {
3637
(reader, lastValue) => this.focusedDiffItem.read(reader) ?? (lastValue && this.items.read(reader).indexOf(lastValue) !== -1) ? lastValue : undefined
3738
);
3839

39-
public async waitForDiffs(): Promise<void> {
40-
for (const d of this.items.get()) {
41-
await d.diffEditorViewModel.waitForDiff();
40+
public async waitForDiffOr1s(): Promise<void> {
41+
if (this._documents.get() === 'loading') {
42+
await waitForState(this._documents, documents => documents !== 'loading');
4243
}
44+
45+
await this._waitForNewDiffs.get().promise;
4346
}
4447

4548
public collapseAll(): void {
@@ -75,7 +78,7 @@ export class MultiDiffEditorViewModel extends Disposable {
7578
(d, store) => store.add(RefCounted.create(this._instantiationService.createInstance(DocumentDiffItemViewModel, d, this)))
7679
).recomputeInitiallyAndOnChange(this._store);
7780

78-
const waitForNewDiffs: IObservable<ObservablePromise<readonly RefCounted<DocumentDiffItemViewModel>[]>> = derived(this, reader => {
81+
this._waitForNewDiffs = derived(this, reader => {
7982
const next = allItems.read(reader);
8083
const unresolved = next.filter(i => !i.object.waitForInitialDiffOr1s.promiseResult.read(undefined));
8184
if (unresolved.length === 0) {
@@ -86,7 +89,7 @@ export class MultiDiffEditorViewModel extends Disposable {
8689
);
8790
});
8891

89-
const resolved = new ObservableResolvedPromise(waitForNewDiffs, [] as readonly RefCounted<DocumentDiffItemViewModel>[], this._store);
92+
const resolved = new ObservableResolvedPromise(this._waitForNewDiffs, [] as readonly RefCounted<DocumentDiffItemViewModel>[], this._store);
9093

9194
this.items = derived(this, reader => {
9295
const resolvedItems = resolved.lastResolved.read(reader);

src/vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditorInput.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ export class MultiDiffEditorInput extends EditorInput implements ILanguageSuppor
9898
this._register(model);
9999
const vm = new MultiDiffEditorViewModel(model, this._instantiationService);
100100
this._register(vm);
101-
await raceTimeout(vm.waitForDiffs(), 1000);
101+
await raceTimeout(vm.waitForDiffOr1s(), 1000);
102102
return vm;
103103
});
104104
this._resolvedSource = new ObservableLazyPromise(async () => {
@@ -276,7 +276,7 @@ export class MultiDiffEditorInput extends EditorInput implements ILanguageSuppor
276276
return this;
277277
}
278278

279-
override revert(group: GroupIdentifier, options?: IRevertOptions): Promise<void> {
279+
override revert(group: GroupIdentifier, options?: IRevertOptions): Promise<void> {
280280
return this.doSaveOrRevert('revert', group, options);
281281
}
282282

0 commit comments

Comments
 (0)