Skip to content

Commit

Permalink
poetry: Run poetry env use only after cache is loaded
Browse files Browse the repository at this point in the history
The virtualenv cache might contain invalid entries, such as virtualenvs
built in previous, buggy versions of this action.  The `poetry env use`
command will recreate virtualenvs in case they are invalid, but it has
to be run only *after* the cache is loaded.

Refactor `CacheDistributor` a bit such that the validation (and possible
recreation) of virtualenvs happens only after the cache is loaded.
  • Loading branch information
oranav committed Dec 9, 2022
1 parent bc3992e commit a957cf8
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 20 deletions.
3 changes: 3 additions & 0 deletions src/cache-distributions/cache-distributor.ts
Expand Up @@ -19,6 +19,7 @@ abstract class CacheDistributor {
primaryKey: string;
restoreKey: string[] | undefined;
}>;
protected async handleLoadedCache() {}

public async restoreCache() {
const {primaryKey, restoreKey} = await this.computeKeys();
Expand All @@ -41,6 +42,8 @@ abstract class CacheDistributor {
restoreKey
);

await this.handleLoadedCache();

this.handleMatchResult(matchedKey, primaryKey);
}

Expand Down
50 changes: 30 additions & 20 deletions src/cache-distributions/poetry-cache.ts
Expand Up @@ -10,7 +10,8 @@ import {logWarning} from '../utils';
class PoetryCache extends CacheDistributor {
constructor(
private pythonVersion: string,
protected patterns: string = '**/poetry.lock'
protected patterns: string = '**/poetry.lock',
protected poetryProjects: Set<string> = new Set<string>()
) {
super('poetry', patterns);
}
Expand All @@ -20,16 +21,10 @@ class PoetryCache extends CacheDistributor {
const paths = new Set<string>();
const globber = await glob.create(this.patterns);

const pythonLocation = await io.which('python');
if (pythonLocation) {
core.debug(`pythonLocation is ${pythonLocation}`);
} else {
logWarning('python binaries were not found in PATH');
}

for await (const file of globber.globGenerator()) {
const basedir = path.dirname(file);
core.debug(`Processing Poetry project at ${basedir}`);
this.poetryProjects.add(basedir);

const poetryConfig = await this.getPoetryConfiguration(basedir);

Expand All @@ -44,18 +39,6 @@ class PoetryCache extends CacheDistributor {
if (poetryConfig['virtualenvs.in-project']) {
paths.add(path.join(basedir, '.venv'));
}

if (pythonLocation) {
const {exitCode, stderr} = await exec.getExecOutput(
'poetry',
['env', 'use', pythonLocation],
{ignoreReturnCode: true, cwd: basedir}
);

if (exitCode) {
logWarning(stderr);
}
}
}

return [...paths];
Expand All @@ -71,6 +54,33 @@ class PoetryCache extends CacheDistributor {
};
}

protected async handleLoadedCache() {
await super.handleLoadedCache();

// After the cache is loaded -- make sure virtualenvs use the correct Python version (the one that we have just installed).
// This will handle invalid caches, recreating virtualenvs if necessary.

const pythonLocation = await io.which('python');
if (pythonLocation) {
core.debug(`pythonLocation is ${pythonLocation}`);
} else {
logWarning('python binaries were not found in PATH');
return;
}

for (const poetryProject of this.poetryProjects) {
const {exitCode, stderr} = await exec.getExecOutput(
'poetry',
['env', 'use', pythonLocation],
{ignoreReturnCode: true, cwd: poetryProject}
);

if (exitCode) {
logWarning(stderr);
}
}
}

private async getPoetryConfiguration(basedir: string) {
const {stdout, stderr, exitCode} = await exec.getExecOutput(
'poetry',
Expand Down

0 comments on commit a957cf8

Please sign in to comment.