Files
atom/packages/git-diff/lib/main.js
Ruby Allison Rose b079194478 Fix git diff subscriptions (#21968)
The startup script now uses a `Set` to manage `GitDiffView`s held in memory and destroy them when `deactivate` is called.
There are now four major subscription blocks. 
1. The outer subscriptions held by `activate`.
2. The per-editor subscriptions held within `activate`.
3. The per-editor repository event subscriptions held within each `GitDIffView` instance.
4. The per-editor modification event subscriptions held within each `GitDiffView` are only active when the editor content is bound to a valid git repository.

Teardowns of any editor or the module now result in `disposal` of the respective editor's subscriptions or all subscriptions authored within the module.

I removed some of `GitDiffView`'s unnecessary methods such as the `start`, `cancleUpdate`, `addDecoration` and `removeDecorations`;
The last two methods were combined into the body of `updateDiffs`.
`scheduleUpdate` now calls `requestAnimationFrame` instead of `setImmediate` because it's native, standard, and yields
to other more important browser processes. I know Atom Core implements setImmediate, but rAF seems to work just as fast if not faster.
The memory management of the editor markers and diffs have been joined using a WeakMap. When the diffs are destroyed,
so too are the editor markers.
Finally, I added the `destroy` method to handle the teardown of subscriptions and other destroyable objects contained within the `GitDiffViews` before object release.
2021-03-08 21:12:07 +03:00

53 lines
1.3 KiB
JavaScript

'use babel';
import { CompositeDisposable } from 'atom';
import GitDiffView from './git-diff-view';
import DiffListView from './diff-list-view';
let diffListView = null;
let diffViews = new Set();
let subscriptions = null;
export default {
activate(state) {
subscriptions = new CompositeDisposable();
subscriptions.add(
atom.workspace.observeTextEditors(editor => {
const editorElement = atom.views.getView(editor);
const diffView = new GitDiffView(editor, editorElement);
diffViews.add(diffView);
const listViewCommand = 'git-diff:toggle-diff-list';
const editorSubs = new CompositeDisposable(
atom.commands.add(editorElement, listViewCommand, () => {
if (diffListView == null) diffListView = new DiffListView();
diffListView.toggle();
}),
editor.onDidDestroy(() => {
diffView.destroy();
diffViews.delete(diffView);
editorSubs.dispose();
subscriptions.remove(editorSubs);
})
);
subscriptions.add(editorSubs);
})
);
},
deactivate() {
diffListView = null;
for (const diffView of diffViews) diffView.destroy();
diffViews.clear();
subscriptions.dispose();
subscriptions = null;
}
};