Skip to content

Commit 1793963

Browse files
committed
Merge branch 'koesie10/selected-copy' into koesie10/export-results-sorting-filtering
2 parents 95e073b + e023037 commit 1793963

File tree

22 files changed

+603
-365
lines changed

22 files changed

+603
-365
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
1+
import { Disposable } from '../pure/disposable-object';
12
import { AppEventEmitter } from './events';
23

34
export interface App {
45
createEventEmitter<T>(): AppEventEmitter<T>;
6+
mode: AppMode;
7+
subscriptions: Disposable[];
58
extensionPath: string;
69
globalStoragePath: string;
710
workspaceStoragePath?: string;
811
}
12+
13+
export enum AppMode {
14+
Production = 1,
15+
Development = 2,
16+
Test = 3,
17+
}

extensions/ql-vscode/src/common/vscode/vscode-app.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as vscode from 'vscode';
2-
import { App } from '../app';
2+
import { Disposable } from '../../pure/disposable-object';
3+
import { App, AppMode } from '../app';
34
import { AppEventEmitter } from '../events';
45
import { VSCodeAppEventEmitter } from './events';
56

@@ -21,6 +22,21 @@ export class ExtensionApp implements App {
2122
return this.extensionContext.storageUri?.fsPath;
2223
}
2324

25+
public get subscriptions(): Disposable[] {
26+
return this.extensionContext.subscriptions;
27+
}
28+
29+
public get mode(): AppMode {
30+
switch (this.extensionContext.extensionMode) {
31+
case vscode.ExtensionMode.Development:
32+
return AppMode.Development;
33+
case vscode.ExtensionMode.Test:
34+
return AppMode.Test;
35+
default:
36+
return AppMode.Production;
37+
}
38+
}
39+
2440
public createEventEmitter<T>(): AppEventEmitter<T> {
2541
return new VSCodeAppEventEmitter<T>();
2642
}

extensions/ql-vscode/src/databases/db-config-store.ts

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,12 @@ import { DisposableObject } from '../pure/disposable-object';
66
import { DbConfigValidator } from './db-config-validator';
77
import { ValueResult } from '../common/value-result';
88
import { App } from '../common/app';
9+
import { AppEvent, AppEventEmitter } from '../common/events';
910

1011
export class DbConfigStore extends DisposableObject {
12+
public readonly onDidChangeConfig: AppEvent<void>;
13+
private readonly onDidChangeConfigEventEmitter: AppEventEmitter<void>;
14+
1115
private readonly configPath: string;
1216
private readonly configValidator: DbConfigValidator;
1317

@@ -25,6 +29,8 @@ export class DbConfigStore extends DisposableObject {
2529
this.configErrors = [];
2630
this.configWatcher = undefined;
2731
this.configValidator = new DbConfigValidator(app.extensionPath);
32+
this.onDidChangeConfigEventEmitter = app.createEventEmitter<void>();
33+
this.onDidChangeConfig = this.onDidChangeConfigEventEmitter.event;
2834
}
2935

3036
public async initialize(): Promise<void> {
@@ -85,6 +91,8 @@ export class DbConfigStore extends DisposableObject {
8591
}
8692

8793
this.config = this.configErrors.length === 0 ? newConfig : undefined;
94+
95+
this.onDidChangeConfigEventEmitter.fire();
8896
}
8997

9098
private watchConfig(): void {
@@ -95,15 +103,17 @@ export class DbConfigStore extends DisposableObject {
95103

96104
private createEmptyConfig(): DbConfig {
97105
return {
98-
remote: {
99-
repositoryLists: [],
100-
owners: [],
101-
repositories: [],
102-
},
103-
local: {
104-
lists: [],
105-
databases: [],
106-
},
106+
databases: {
107+
remote: {
108+
repositoryLists: [],
109+
owners: [],
110+
repositories: [],
111+
},
112+
local: {
113+
lists: [],
114+
databases: [],
115+
},
116+
}
107117
};
108118
}
109119
}

extensions/ql-vscode/src/databases/db-config.ts

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,25 @@
11
// Contains models for the data we want to store in the database config
22

33
export interface DbConfig {
4+
databases: DbConfigDatabases;
5+
selected?: SelectedDbItem;
6+
}
7+
8+
export interface DbConfigDatabases {
49
remote: RemoteDbConfig;
510
local: LocalDbConfig;
611
}
712

13+
export interface SelectedDbItem {
14+
kind: SelectedDbItemKind;
15+
value: string;
16+
}
17+
18+
export enum SelectedDbItemKind {
19+
ConfigDefined = 'configDefined',
20+
RemoteSystemDefinedList = 'remoteSystemDefinedList',
21+
}
22+
823
export interface RemoteDbConfig {
924
repositoryLists: RemoteRepositoryList[];
1025
owners: string[];
@@ -35,20 +50,26 @@ export interface LocalDatabase {
3550

3651
export function cloneDbConfig(config: DbConfig): DbConfig {
3752
return {
38-
remote: {
39-
repositoryLists: config.remote.repositoryLists.map((list) => ({
40-
name: list.name,
41-
repositories: [...list.repositories],
42-
})),
43-
owners: [...config.remote.owners],
44-
repositories: [...config.remote.repositories],
45-
},
46-
local: {
47-
lists: config.local.lists.map((list) => ({
48-
name: list.name,
49-
databases: list.databases.map((db) => ({ ...db })),
50-
})),
51-
databases: config.local.databases.map((db) => ({ ...db })),
53+
databases: {
54+
remote: {
55+
repositoryLists: config.databases.remote.repositoryLists.map((list) => ({
56+
name: list.name,
57+
repositories: [...list.repositories],
58+
})),
59+
owners: [...config.databases.remote.owners],
60+
repositories: [...config.databases.remote.repositories],
61+
},
62+
local: {
63+
lists: config.databases.local.lists.map((list) => ({
64+
name: list.name,
65+
databases: list.databases.map((db) => ({ ...db })),
66+
})),
67+
databases: config.databases.local.databases.map((db) => ({ ...db })),
68+
},
5269
},
70+
selected: config.selected ? {
71+
kind: config.selected.kind,
72+
value: config.selected.value,
73+
} : undefined
5374
};
5475
}

extensions/ql-vscode/src/databases/db-manager.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,24 @@
1+
import { App } from '../common/app';
2+
import { AppEvent, AppEventEmitter } from '../common/events';
13
import { ValueResult } from '../common/value-result';
24
import { DbConfigStore } from './db-config-store';
35
import { DbItem } from './db-item';
46
import { createLocalTree, createRemoteTree } from './db-tree-creator';
57

68
export class DbManager {
9+
public readonly onDbItemsChanged: AppEvent<void>;
10+
private readonly onDbItemsChangesEventEmitter: AppEventEmitter<void>;
11+
712
constructor(
13+
app: App,
814
private readonly dbConfigStore: DbConfigStore
915
) {
16+
this.onDbItemsChangesEventEmitter = app.createEventEmitter<void>();
17+
this.onDbItemsChanged = this.onDbItemsChangesEventEmitter.event;
18+
19+
this.dbConfigStore.onDidChangeConfig(() => {
20+
this.onDbItemsChangesEventEmitter.fire();
21+
});
1022
}
1123

1224
public getDbItems(): ValueResult<DbItem[]> {
Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import * as vscode from 'vscode';
2-
import { ExtensionApp } from '../common/vscode/vscode-app';
1+
import { App, AppMode } from '../common/app';
32
import { isCanary, isNewQueryRunExperienceEnabled } from '../config';
43
import { logger } from '../logging';
54
import { DisposableObject } from '../pure/disposable-object';
@@ -8,10 +7,8 @@ import { DbManager } from './db-manager';
87
import { DbPanel } from './ui/db-panel';
98

109
export class DbModule extends DisposableObject {
11-
public async initialize(
12-
extensionContext: vscode.ExtensionContext
13-
): Promise<void> {
14-
if (extensionContext.extensionMode !== vscode.ExtensionMode.Development ||
10+
public async initialize(app: App): Promise<void> {
11+
if (app.mode !== AppMode.Development ||
1512
!isCanary() ||
1613
!isNewQueryRunExperienceEnabled()) {
1714
// Currently, we only want to expose the new database panel when we
@@ -22,25 +19,20 @@ export class DbModule extends DisposableObject {
2219

2320
void logger.log('Initializing database module');
2421

25-
const app = new ExtensionApp(extensionContext);
26-
2722
const dbConfigStore = new DbConfigStore(app);
2823
await dbConfigStore.initialize();
2924

30-
const dbManager = new DbManager(dbConfigStore);
25+
const dbManager = new DbManager(app, dbConfigStore);
3126
const dbPanel = new DbPanel(dbManager);
3227
await dbPanel.initialize();
33-
extensionContext.subscriptions.push(dbPanel);
3428

3529
this.push(dbPanel);
3630
this.push(dbConfigStore);
3731
}
3832
}
3933

40-
export async function initializeDbModule(
41-
extensionContext: vscode.ExtensionContext
42-
): Promise<DbModule> {
34+
export async function initializeDbModule(app: App): Promise<DbModule> {
4335
const dbModule = new DbModule();
44-
await dbModule.initialize(extensionContext);
36+
await dbModule.initialize(app);
4537
return dbModule;
4638
}

extensions/ql-vscode/src/databases/db-tree-creator.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ export function createRemoteTree(dbConfig: DbConfig): RootRemoteDbItem {
1616
createSystemDefinedList(1000)
1717
];
1818

19-
const userDefinedRepoLists = dbConfig.remote.repositoryLists.map(createUserDefinedList);
20-
const owners = dbConfig.remote.owners.map(createOwnerItem);
21-
const repos = dbConfig.remote.repositories.map(createRepoItem);
19+
const userDefinedRepoLists = dbConfig.databases.remote.repositoryLists.map(createUserDefinedList);
20+
const owners = dbConfig.databases.remote.owners.map(createOwnerItem);
21+
const repos = dbConfig.databases.remote.repositories.map(createRepoItem);
2222

2323
return {
2424
kind: DbItemKind.RootRemote,

extensions/ql-vscode/src/databases/ui/db-tree-data-provider.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,29 @@
1-
import { ProviderResult, TreeDataProvider, TreeItem } from 'vscode';
1+
import { Event, EventEmitter, ProviderResult, TreeDataProvider, TreeItem } from 'vscode';
22
import { createDbTreeViewItemError, DbTreeViewItem } from './db-tree-view-item';
33
import { DbManager } from '../db-manager';
44
import { mapDbItemToTreeViewItem } from './db-item-mapper';
5+
import { DisposableObject } from '../../pure/disposable-object';
56

6-
export class DbTreeDataProvider implements TreeDataProvider<DbTreeViewItem> {
7+
export class DbTreeDataProvider extends DisposableObject implements TreeDataProvider<DbTreeViewItem> {
8+
9+
// This is an event to signal that there's been a change in the tree which
10+
// will case the view to refresh. It is part of the TreeDataProvider interface.
11+
public readonly onDidChangeTreeData: Event<DbTreeViewItem | undefined>;
12+
13+
private _onDidChangeTreeData = this.push(new EventEmitter<DbTreeViewItem | undefined>());
714
private dbTreeItems: DbTreeViewItem[];
815

916
public constructor(
1017
private readonly dbManager: DbManager
1118
) {
19+
super();
1220
this.dbTreeItems = this.createTree();
21+
this.onDidChangeTreeData = this._onDidChangeTreeData.event;
22+
23+
dbManager.onDbItemsChanged(() => {
24+
this.dbTreeItems = this.createTree();
25+
this._onDidChangeTreeData.fire(undefined);
26+
});
1327
}
1428

1529
/**

extensions/ql-vscode/src/extension.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ import { createVariantAnalysisContentProvider } from './remote-queries/variant-a
120120
import { VSCodeMockGitHubApiServer } from './mocks/vscode-mock-gh-api-server';
121121
import { VariantAnalysisResultsManager } from './remote-queries/variant-analysis-results-manager';
122122
import { initializeDbModule } from './databases/db-module';
123+
import { ExtensionApp } from './common/vscode/vscode-app';
123124
import { RepositoriesFilterSortStateWithIds } from './pure/variant-analysis-filter-sort';
124125

125126
/**
@@ -1267,7 +1268,8 @@ async function activateWithInstalledDistribution(
12671268
void logger.log('Reading query history');
12681269
await qhm.readQueryHistory();
12691270

1270-
const dbModule = await initializeDbModule(ctx);
1271+
const app = new ExtensionApp(ctx);
1272+
const dbModule = await initializeDbModule(app);
12711273
ctx.subscriptions.push(dbModule);
12721274

12731275
void logger.log('Successfully finished extension initialization.');

extensions/ql-vscode/src/mocks/mock-gh-api-server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export class MockGitHubApiServer extends DisposableObject {
3030
return;
3131
}
3232

33-
this.server.listen();
33+
this.server.listen({ onUnhandledRequest: 'bypass' });
3434
this._isListening = true;
3535
}
3636

0 commit comments

Comments
 (0)