Fix upgrades path
Ensure that upgrades can be resolved even when the upgrades pack is not in the workspace. This is the situation when the core libraries are resolved from the package cache. This change works because `qlProgram.libraryPath` is the resolved search path for compiling the query. We are guaranteed that the appropriate core libraries are included in this query. Note that this change avoids using extra source folders from the workspace. Previously without using packages, we assume that all relevant query paths are already inside the workspace. With packaging, this is no longer the case. It is theoretically possible that there will be extra upgrade scripts that are not on the resolved search path, but are included in the workspace. This situation would have worked in the past.This is not a situation that we expect to happen in practice. And if this does happen, I believe this is an error and all upgrades should be added explicitly to the search path. An open question is if this will work with downgrade scripts. If it does not, then I don't think this change makes things any worse than before.
This commit is contained in:
@@ -437,12 +437,23 @@ async function compileNonDestructiveUpgrade(
|
||||
progress: ProgressCallback,
|
||||
token: CancellationToken,
|
||||
): Promise<string> {
|
||||
const searchPath = getOnDiskWorkspaceFolders();
|
||||
|
||||
if (!dbItem?.contents?.dbSchemeUri) {
|
||||
throw new Error('Database is invalid, and cannot be upgraded.');
|
||||
}
|
||||
const { scripts, matchesTarget } = await qs.cliServer.resolveUpgrades(dbItem.contents.dbSchemeUri.fsPath, searchPath, true, query.queryDbscheme);
|
||||
|
||||
// When packaging is used, dependencies may exist outside of the workspace and they are always on the resolved search path.
|
||||
// When packaging is not used, all dependencies are in the workspace.
|
||||
const upgradesPath = (await qs.cliServer.cliConstraints.supportsPackaging())
|
||||
? qlProgram.libraryPath
|
||||
: getOnDiskWorkspaceFolders();
|
||||
|
||||
const { scripts, matchesTarget } = await qs.cliServer.resolveUpgrades(
|
||||
dbItem.contents.dbSchemeUri.fsPath,
|
||||
upgradesPath,
|
||||
true,
|
||||
query.queryDbscheme
|
||||
);
|
||||
|
||||
if (!matchesTarget) {
|
||||
reportNoUpgradePath(qlProgram, query);
|
||||
|
||||
Reference in New Issue
Block a user