Skip to content

Commit

Permalink
Fix handling multiple folders in workspace and debugging in Linux
Browse files Browse the repository at this point in the history
  • Loading branch information
denis-shienkov committed Jan 7, 2023
1 parent fe27d6d commit d7d0920
Show file tree
Hide file tree
Showing 11 changed files with 420 additions and 220 deletions.
2 changes: 2 additions & 0 deletions i18n/rus/src/qbsbuildconfigurationmanager.i18n.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
{
"qbs.buildconfigurationmanager.nofspath.message": "Невозможно получить файл конфигураций сборки т.к. путь к нему не установлен в настройках расширения Qbs.",
"qbs.buildconfigurationmanager.noworkspace.message": "Невозможно получить файл конфигураций сборки т.к. нет ни одной открытой папки в рабочей области.",
"qbs.buildconfigurationmanager.scan.select.description": "Сканировать доступные конфигурации сборки",
"qbs.buildconfigurationmanager.scan.select.label": "[Сканировать конфигурации сборки]"
}
13 changes: 7 additions & 6 deletions i18n/rus/src/qbsbuildsystem.i18n.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,26 @@
"qbs.buildsystem.build.progress.failed.title": "Сборка проекта завершена с ошибками",
"qbs.buildsystem.build.progress.title": "Сборка проекта",
"qbs.buildsystem.build.started.message": "Сборка проекта...",
"qbs.buildsystem.compile.completed.message": "Сборка файла успешно завершена, затраченное время {0}",
"qbs.buildsystem.compile.failed.message": "Сборка файла завершена с ошибками, затраченное время {0}",
"qbs.buildsystem.compile.progress.completed.title": "Сборка файла успешно завершена",
"qbs.buildsystem.compile.progress.failed.title": "Сборка файла завершена с ошибками",
"qbs.buildsystem.compile.progress.title": "Сборка файла",
"qbs.buildsystem.compile.started.message": "Сборка файла...",
"qbs.buildsystem.clean.completed.message": "Очистка проекта успешно завершена, затраченное время {0}",
"qbs.buildsystem.clean.failed.message": "Очистка проекта завершена с ошибками, затраченное время {0}",
"qbs.buildsystem.clean.progress.completed.title": "Очистка проекта успешно завершена",
"qbs.buildsystem.clean.progress.failed.title": "Очистка проекта завершена с ошибками",
"qbs.buildsystem.clean.progress.title": "Очистка проекта",
"qbs.buildsystem.clean.started.message": "Очистка проекта...",
"qbs.buildsystem.compile.completed.message": "Сборка файла успешно завершена, затраченное время {0}",
"qbs.buildsystem.compile.failed.message": "Сборка файла завершена с ошибками, затраченное время {0}",
"qbs.buildsystem.compile.progress.completed.title": "Сборка файла успешно завершена",
"qbs.buildsystem.compile.progress.failed.title": "Сборка файла завершена с ошибками",
"qbs.buildsystem.compile.progress.title": "Сборка файла",
"qbs.buildsystem.compile.started.message": "Сборка файла...",
"qbs.buildsystem.install.completed.message": "Установка проекта успешно завершена, затраченное время {0}",
"qbs.buildsystem.install.failed.message": "Установка проекта завершена с ошибками, затраченное время {0}",
"qbs.buildsystem.install.progress.completed.title": "Установка проекта успешно завершена",
"qbs.buildsystem.install.progress.failed.title": "Установка проекта завершена с ошибками",
"qbs.buildsystem.install.progress.title": "Установка проекта",
"qbs.buildsystem.install.started.message": "Установка проекта...",
"qbs.buildsystem.noproject.message": "Не удалось запустить операцию т.к. проектне выбран.",
"qbs.buildsystem.nosourceroot.message": "невозможно получить путь к корневой директории исходников т.к. нет ни одной открытой папки в рабочей области.",
"qbs.buildsystem.resolve.completed.message": "Сканирование проекта успешно завершено, затраченное время {0}",
"qbs.buildsystem.resolve.failed.message": "Сканирование проекта завершено с ошибками, затраченное время {0}",
"qbs.buildsystem.resolve.progress.completed.title": "Сканирование проекта успешно завершено",
Expand Down
2 changes: 2 additions & 0 deletions i18n/rus/src/qbslaunchconfigurationmanager.i18n.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
{
"qbs.launchconfigurationmanager.auto.description": "Сыбрать автоматическую конфигурацию запуска",
"qbs.launchconfigurationmanager.auto.placeholder": "Авто",
"qbs.launchconfigurationmanager.nofspath.message": "Невозможно получить файл конфигураций запуска т.к. путь к нему не установлен в настройках расширения Qbs.",
"qbs.launchconfigurationmanager.noworkspace.message": "Невозможно получить файл конфигураций запуска т.к. нет ни одной открытой папки в рабочей области.",
"qbs.launchconfigurationmanager.scan.select.description": "Сканировать доступные конфигурации запуска",
"qbs.launchconfigurationmanager.scan.select.label": "[Сканировать конфигурации запуска]",
"qbs.launchconfigurationmanager.select.description": "Тип \"{0}\", запрос \"{1}\""
Expand Down
4 changes: 1 addition & 3 deletions src/protocol/qbsprotocolresolverequest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@ export class QbsProtocolResolveRequest extends QbsProtocolRequest {
dryRun: boolean,
errorHandlingMode: QbsProtocolErrorHandlingMode,
forceProbeExecution: boolean,
logLevel: QbsProtocolLogLevel,
settingsDirectory: string) {
logLevel: QbsProtocolLogLevel) {
super();
this.setBuildRoot(buildRoot);
this.setDataMode(QbsProtocolDataMode.OnlyChanged);
Expand All @@ -24,7 +23,6 @@ export class QbsProtocolResolveRequest extends QbsProtocolRequest {
this.setLogLevel(logLevel);
this.setModuleProperties(QbsProtocolModuleProperties.Exported);
this.setOverrideBuildGraphData(true);
this.setSettingsDirectory(settingsDirectory);
this.setType(QbsProtocolRequestType.Resolve);
}
}
88 changes: 63 additions & 25 deletions src/qbsbuildconfigurationmanager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { ensureFileCreated } from './qbsutils';
import { QbsBuildConfigurationData } from './datatypes/qbsbuildconfigurationdata';
import { QbsBuildConfigurationKey } from './datatypes/qbsbuildconfigurationkey';
import { QbsCommandKey } from './datatypes/qbscommandkey';
import { QbsProjectManager } from './qbsprojectmanager';
import { QbsSettings } from './qbssettings';

const localize = nls.config({ messageFormat: nls.MessageFormat.file })();
Expand All @@ -19,6 +20,7 @@ export class QbsBuildConfigurationManager implements vscode.Disposable {
private configurationSelected: vscode.EventEmitter<QbsBuildConfigurationData>
= new vscode.EventEmitter<QbsBuildConfigurationData>();
private fsBuildConfigurationsWatcher?: chokidar.FSWatcher
private disposable?: vscode.Disposable;

readonly onUpdated: vscode.Event<void> = this.updated.event;
readonly onConfigurationSelected: vscode.Event<QbsBuildConfigurationData>
Expand All @@ -30,35 +32,26 @@ export class QbsBuildConfigurationManager implements vscode.Disposable {

public constructor(context: vscode.ExtensionContext) {
QbsBuildConfigurationManager.instance = this;

// Create default build configurations file if this file not exists yet.
QbsBuildConfigurationManager.ensureConfigurationsCreated();

// Register the commands related to the profile manager.
this.registerCommandsHandlers(context);
this.subscribeSettingsChanges();
}

public dispose(): void { this.fsBuildConfigurationsWatcher?.close(); }
public dispose(): void { this.stop(); }

public getConfigurations(): QbsBuildConfigurationData[] { return this.configurations; }

public findConfiguration(configurationName?: string): QbsBuildConfigurationData | undefined {
return this.getConfigurations().find(configuration => configuration.name === configurationName);
}

private registerCommandsHandlers(context: vscode.ExtensionContext): void {
context.subscriptions.push(vscode.commands.registerCommand(QbsCommandKey.ScanBuildConfigurations,
async () => { await this.scanConfigurations(); }));
context.subscriptions.push(vscode.commands.registerCommand(QbsCommandKey.SelectBuildConfiguration,
async () => { await this.selectConfiguration(); }));
context.subscriptions.push(vscode.commands.registerCommand(QbsCommandKey.EditBuildConfigurations,
async () => { await this.editConfigurations(); }));
}

private subscribeSettingsChanges(): void {
public async start(): Promise<void> {
console.log('Starting build configuration manager');
const subscribeBuildConfigurationsChanged = async () => {
const fsPath = QbsSettings.substituteFsPath(QbsSettings.getBuildConfigurationsFilePath());
const fsProjectPath = QbsProjectManager.getInstance().getProject()?.getFsPath();
if (!fsProjectPath)
return;
const fsPath = QbsBuildConfigurationManager.getFullBuildConfigurationsFilePath(fsProjectPath);
if (!fsPath)
return;
console.log('Build configurations file name changed to: ' + fsPath);
this.fsBuildConfigurationsWatcher = chokidar.watch(fsPath, { ignoreInitial: true });
this.fsBuildConfigurationsWatcher.on('change', () => {
Expand All @@ -67,14 +60,37 @@ export class QbsBuildConfigurationManager implements vscode.Disposable {
});
}

QbsSettings.observeSetting(QbsSettings.SettingKey.BuildConfigurationsFilePath,
this.disposable?.dispose();
this.disposable = QbsSettings.observeSetting(QbsSettings.SettingKey.BuildConfigurationsFilePath,
async () => subscribeBuildConfigurationsChanged());
subscribeBuildConfigurationsChanged();
await subscribeBuildConfigurationsChanged();
}

public async stop(): Promise<void> {
console.log('Stopping build configuration manager');
await this.fsBuildConfigurationsWatcher?.close();
await this.disposable?.dispose();
}

public async restart(): Promise<void> {
await this.stop();
await this.start();
}

private registerCommandsHandlers(context: vscode.ExtensionContext): void {
context.subscriptions.push(vscode.commands.registerCommand(QbsCommandKey.ScanBuildConfigurations,
async () => { await this.scanConfigurations(); }));
context.subscriptions.push(vscode.commands.registerCommand(QbsCommandKey.SelectBuildConfiguration,
async () => { await this.selectConfiguration(); }));
context.subscriptions.push(vscode.commands.registerCommand(QbsCommandKey.EditBuildConfigurations,
async () => { await QbsBuildConfigurationManager.editConfigurations(); }));
}

private async scanConfigurations(): Promise<void> {
const fsPath = QbsBuildConfigurationManager.ensureConfigurationsCreated();
if (!fsPath)
return;
return new Promise<QbsBuildConfigurationData[]>((resolve) => {
const fsPath = QbsBuildConfigurationManager.ensureConfigurationsCreated();
console.log('Start reading build configurations from: ' + fsPath);
fs.readFile(fsPath, (error, data) => {
if (error) {
Expand Down Expand Up @@ -126,16 +142,22 @@ export class QbsBuildConfigurationManager implements vscode.Disposable {
this.configurationSelected.fire(chosen.configuration);
}

private async editConfigurations(): Promise<void> {
private static async editConfigurations(): Promise<void> {
// Create if not exists yet, and then show the `qbs-configurations.json` file.
const fsPath = QbsBuildConfigurationManager.ensureConfigurationsCreated();
if (!fsPath)
return;
const doc = await vscode.workspace.openTextDocument(vscode.Uri.file(fsPath));
await vscode.window.showTextDocument(doc);
}

private static ensureConfigurationsCreated(): string {
let fsPath = QbsSettings.getBuildConfigurationsFilePath()
fsPath = QbsSettings.substituteFsPath(fsPath);
private static ensureConfigurationsCreated(): string | undefined {
const fsProjectPath = QbsProjectManager.getInstance().getProject()?.getFsPath();
if (!fsProjectPath)
return;
const fsPath = this.getFullBuildConfigurationsFilePath(fsProjectPath);
if (!fsPath)
return;
ensureFileCreated(fsPath, QbsBuildConfigurationManager.writeDefaultConfigurations);
return fsPath;
}
Expand Down Expand Up @@ -173,4 +195,20 @@ export class QbsBuildConfigurationManager implements vscode.Disposable {
ws.write(JSON.stringify(QbsBuildConfigurationManager.getDefaultConfigurations(), null, 4));
return true;
}

private static getFullBuildConfigurationsFilePath(fsProjectPath: string): string | undefined {
const sourceRoot = QbsSettings.getSourceRootDirectory(fsProjectPath);
if (!sourceRoot) {
vscode.window.showWarningMessage(localize('qbs.buildconfigurationmanager.noworkspace.message',
'Unable get the build configurations file because no any workspace folder is open.'));
return;
}
const result = QbsSettings.getBuildConfigurationsFilePath();
if (!result) {
vscode.window.showWarningMessage(localize('qbs.buildconfigurationmanager.nofspath.message',
'Unable to get the build configurations file because its path is not set in Qbs extension settings.'));
return;
}
return QbsSettings.substituteSourceRoot(result, sourceRoot);
}
}
Loading

0 comments on commit d7d0920

Please sign in to comment.