2021-11-24 15:10:58 +00:00
|
|
|
import * as glob from '@actions/glob';
|
2022-07-25 13:02:06 +00:00
|
|
|
import * as io from '@actions/io';
|
2021-11-24 15:10:58 +00:00
|
|
|
import * as path from 'path';
|
|
|
|
import * as exec from '@actions/exec';
|
2022-07-25 13:02:06 +00:00
|
|
|
import * as core from '@actions/core';
|
2021-11-24 15:10:58 +00:00
|
|
|
|
|
|
|
import CacheDistributor from './cache-distributor';
|
2022-07-25 13:02:06 +00:00
|
|
|
import {logWarning} from '../utils';
|
2021-11-24 15:10:58 +00:00
|
|
|
|
|
|
|
class PoetryCache extends CacheDistributor {
|
|
|
|
constructor(
|
|
|
|
private pythonVersion: string,
|
Use correct Poetry config when collecting Poetry projects (#447)
* Use correct Poetry config when collecting Poetry projects
When collecting Poetry projects for caching, a '**/poetry.lock' glob is
used. However, in order to process the Poetry configuration, the
"poetry" command is run from the repo's root directory; this causes
Poetry to return an invalid configuration when there is a Poetry project
inside an inner directory.
Instead of running a single Poetry command, glob for the same pattern,
and run a Poetry command for every discovered project.
* Fix typo: saveSatetSpy -> saveStateSpy
* poetry: Support same virtualenv appearing in multiple projects
* Add nested Poetry projects test
* poetry: Set up environment for each project individually
* tests/cache-restore: Do not look for dependency files outside `data`
When the default dependency path is used for cache distributors, they
are looking for the dependency file in the project's root (including the
source code), which leads to tests taking a significant amount of time,
especially on Windows runners. We thus hit sporadic test failures.
Change the test cases such that dependency files are always searched for
inside of `__tests__/data`, ignoring the rest of the project.
* poetry: Simplify `virtualenvs.in-project` boolean check
* README: Explain that poetry might create multiple caches
* poetry: Run `poetry env use` only after cache is loaded
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.
* poetry: Bump cache primary key
2023-01-03 16:13:00 +00:00
|
|
|
protected patterns: string = '**/poetry.lock',
|
|
|
|
protected poetryProjects: Set<string> = new Set<string>()
|
2021-11-24 15:10:58 +00:00
|
|
|
) {
|
|
|
|
super('poetry', patterns);
|
|
|
|
}
|
|
|
|
|
|
|
|
protected async getCacheGlobalDirectories() {
|
Use correct Poetry config when collecting Poetry projects (#447)
* Use correct Poetry config when collecting Poetry projects
When collecting Poetry projects for caching, a '**/poetry.lock' glob is
used. However, in order to process the Poetry configuration, the
"poetry" command is run from the repo's root directory; this causes
Poetry to return an invalid configuration when there is a Poetry project
inside an inner directory.
Instead of running a single Poetry command, glob for the same pattern,
and run a Poetry command for every discovered project.
* Fix typo: saveSatetSpy -> saveStateSpy
* poetry: Support same virtualenv appearing in multiple projects
* Add nested Poetry projects test
* poetry: Set up environment for each project individually
* tests/cache-restore: Do not look for dependency files outside `data`
When the default dependency path is used for cache distributors, they
are looking for the dependency file in the project's root (including the
source code), which leads to tests taking a significant amount of time,
especially on Windows runners. We thus hit sporadic test failures.
Change the test cases such that dependency files are always searched for
inside of `__tests__/data`, ignoring the rest of the project.
* poetry: Simplify `virtualenvs.in-project` boolean check
* README: Explain that poetry might create multiple caches
* poetry: Run `poetry env use` only after cache is loaded
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.
* poetry: Bump cache primary key
2023-01-03 16:13:00 +00:00
|
|
|
// Same virtualenvs path may appear for different projects, hence we use a Set
|
|
|
|
const paths = new Set<string>();
|
|
|
|
const globber = await glob.create(this.patterns);
|
2021-11-24 15:10:58 +00:00
|
|
|
|
Use correct Poetry config when collecting Poetry projects (#447)
* Use correct Poetry config when collecting Poetry projects
When collecting Poetry projects for caching, a '**/poetry.lock' glob is
used. However, in order to process the Poetry configuration, the
"poetry" command is run from the repo's root directory; this causes
Poetry to return an invalid configuration when there is a Poetry project
inside an inner directory.
Instead of running a single Poetry command, glob for the same pattern,
and run a Poetry command for every discovered project.
* Fix typo: saveSatetSpy -> saveStateSpy
* poetry: Support same virtualenv appearing in multiple projects
* Add nested Poetry projects test
* poetry: Set up environment for each project individually
* tests/cache-restore: Do not look for dependency files outside `data`
When the default dependency path is used for cache distributors, they
are looking for the dependency file in the project's root (including the
source code), which leads to tests taking a significant amount of time,
especially on Windows runners. We thus hit sporadic test failures.
Change the test cases such that dependency files are always searched for
inside of `__tests__/data`, ignoring the rest of the project.
* poetry: Simplify `virtualenvs.in-project` boolean check
* README: Explain that poetry might create multiple caches
* poetry: Run `poetry env use` only after cache is loaded
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.
* poetry: Bump cache primary key
2023-01-03 16:13:00 +00:00
|
|
|
for await (const file of globber.globGenerator()) {
|
|
|
|
const basedir = path.dirname(file);
|
|
|
|
core.debug(`Processing Poetry project at ${basedir}`);
|
|
|
|
this.poetryProjects.add(basedir);
|
2021-11-24 15:10:58 +00:00
|
|
|
|
Use correct Poetry config when collecting Poetry projects (#447)
* Use correct Poetry config when collecting Poetry projects
When collecting Poetry projects for caching, a '**/poetry.lock' glob is
used. However, in order to process the Poetry configuration, the
"poetry" command is run from the repo's root directory; this causes
Poetry to return an invalid configuration when there is a Poetry project
inside an inner directory.
Instead of running a single Poetry command, glob for the same pattern,
and run a Poetry command for every discovered project.
* Fix typo: saveSatetSpy -> saveStateSpy
* poetry: Support same virtualenv appearing in multiple projects
* Add nested Poetry projects test
* poetry: Set up environment for each project individually
* tests/cache-restore: Do not look for dependency files outside `data`
When the default dependency path is used for cache distributors, they
are looking for the dependency file in the project's root (including the
source code), which leads to tests taking a significant amount of time,
especially on Windows runners. We thus hit sporadic test failures.
Change the test cases such that dependency files are always searched for
inside of `__tests__/data`, ignoring the rest of the project.
* poetry: Simplify `virtualenvs.in-project` boolean check
* README: Explain that poetry might create multiple caches
* poetry: Run `poetry env use` only after cache is loaded
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.
* poetry: Bump cache primary key
2023-01-03 16:13:00 +00:00
|
|
|
const poetryConfig = await this.getPoetryConfiguration(basedir);
|
2022-07-25 13:02:06 +00:00
|
|
|
|
Use correct Poetry config when collecting Poetry projects (#447)
* Use correct Poetry config when collecting Poetry projects
When collecting Poetry projects for caching, a '**/poetry.lock' glob is
used. However, in order to process the Poetry configuration, the
"poetry" command is run from the repo's root directory; this causes
Poetry to return an invalid configuration when there is a Poetry project
inside an inner directory.
Instead of running a single Poetry command, glob for the same pattern,
and run a Poetry command for every discovered project.
* Fix typo: saveSatetSpy -> saveStateSpy
* poetry: Support same virtualenv appearing in multiple projects
* Add nested Poetry projects test
* poetry: Set up environment for each project individually
* tests/cache-restore: Do not look for dependency files outside `data`
When the default dependency path is used for cache distributors, they
are looking for the dependency file in the project's root (including the
source code), which leads to tests taking a significant amount of time,
especially on Windows runners. We thus hit sporadic test failures.
Change the test cases such that dependency files are always searched for
inside of `__tests__/data`, ignoring the rest of the project.
* poetry: Simplify `virtualenvs.in-project` boolean check
* README: Explain that poetry might create multiple caches
* poetry: Run `poetry env use` only after cache is loaded
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.
* poetry: Bump cache primary key
2023-01-03 16:13:00 +00:00
|
|
|
const cacheDir = poetryConfig['cache-dir'];
|
|
|
|
const virtualenvsPath = poetryConfig['virtualenvs.path'].replace(
|
|
|
|
'{cache-dir}',
|
|
|
|
cacheDir
|
2022-07-25 13:02:06 +00:00
|
|
|
);
|
|
|
|
|
Use correct Poetry config when collecting Poetry projects (#447)
* Use correct Poetry config when collecting Poetry projects
When collecting Poetry projects for caching, a '**/poetry.lock' glob is
used. However, in order to process the Poetry configuration, the
"poetry" command is run from the repo's root directory; this causes
Poetry to return an invalid configuration when there is a Poetry project
inside an inner directory.
Instead of running a single Poetry command, glob for the same pattern,
and run a Poetry command for every discovered project.
* Fix typo: saveSatetSpy -> saveStateSpy
* poetry: Support same virtualenv appearing in multiple projects
* Add nested Poetry projects test
* poetry: Set up environment for each project individually
* tests/cache-restore: Do not look for dependency files outside `data`
When the default dependency path is used for cache distributors, they
are looking for the dependency file in the project's root (including the
source code), which leads to tests taking a significant amount of time,
especially on Windows runners. We thus hit sporadic test failures.
Change the test cases such that dependency files are always searched for
inside of `__tests__/data`, ignoring the rest of the project.
* poetry: Simplify `virtualenvs.in-project` boolean check
* README: Explain that poetry might create multiple caches
* poetry: Run `poetry env use` only after cache is loaded
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.
* poetry: Bump cache primary key
2023-01-03 16:13:00 +00:00
|
|
|
paths.add(virtualenvsPath);
|
|
|
|
|
|
|
|
if (poetryConfig['virtualenvs.in-project']) {
|
|
|
|
paths.add(path.join(basedir, '.venv'));
|
2022-07-25 13:02:06 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Use correct Poetry config when collecting Poetry projects (#447)
* Use correct Poetry config when collecting Poetry projects
When collecting Poetry projects for caching, a '**/poetry.lock' glob is
used. However, in order to process the Poetry configuration, the
"poetry" command is run from the repo's root directory; this causes
Poetry to return an invalid configuration when there is a Poetry project
inside an inner directory.
Instead of running a single Poetry command, glob for the same pattern,
and run a Poetry command for every discovered project.
* Fix typo: saveSatetSpy -> saveStateSpy
* poetry: Support same virtualenv appearing in multiple projects
* Add nested Poetry projects test
* poetry: Set up environment for each project individually
* tests/cache-restore: Do not look for dependency files outside `data`
When the default dependency path is used for cache distributors, they
are looking for the dependency file in the project's root (including the
source code), which leads to tests taking a significant amount of time,
especially on Windows runners. We thus hit sporadic test failures.
Change the test cases such that dependency files are always searched for
inside of `__tests__/data`, ignoring the rest of the project.
* poetry: Simplify `virtualenvs.in-project` boolean check
* README: Explain that poetry might create multiple caches
* poetry: Run `poetry env use` only after cache is loaded
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.
* poetry: Bump cache primary key
2023-01-03 16:13:00 +00:00
|
|
|
return [...paths];
|
2021-11-24 15:10:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
protected async computeKeys() {
|
|
|
|
const hash = await glob.hashFiles(this.patterns);
|
Use correct Poetry config when collecting Poetry projects (#447)
* Use correct Poetry config when collecting Poetry projects
When collecting Poetry projects for caching, a '**/poetry.lock' glob is
used. However, in order to process the Poetry configuration, the
"poetry" command is run from the repo's root directory; this causes
Poetry to return an invalid configuration when there is a Poetry project
inside an inner directory.
Instead of running a single Poetry command, glob for the same pattern,
and run a Poetry command for every discovered project.
* Fix typo: saveSatetSpy -> saveStateSpy
* poetry: Support same virtualenv appearing in multiple projects
* Add nested Poetry projects test
* poetry: Set up environment for each project individually
* tests/cache-restore: Do not look for dependency files outside `data`
When the default dependency path is used for cache distributors, they
are looking for the dependency file in the project's root (including the
source code), which leads to tests taking a significant amount of time,
especially on Windows runners. We thus hit sporadic test failures.
Change the test cases such that dependency files are always searched for
inside of `__tests__/data`, ignoring the rest of the project.
* poetry: Simplify `virtualenvs.in-project` boolean check
* README: Explain that poetry might create multiple caches
* poetry: Run `poetry env use` only after cache is loaded
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.
* poetry: Bump cache primary key
2023-01-03 16:13:00 +00:00
|
|
|
// "v2" is here to invalidate old caches of this cache distributor, which were created broken:
|
2024-08-07 20:12:32 +00:00
|
|
|
const primaryKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${process.arch}-python-${this.pythonVersion}-${this.packageManager}-v2-${hash}`;
|
2021-11-24 15:10:58 +00:00
|
|
|
const restoreKey = undefined;
|
|
|
|
return {
|
|
|
|
primaryKey,
|
|
|
|
restoreKey
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
Use correct Poetry config when collecting Poetry projects (#447)
* Use correct Poetry config when collecting Poetry projects
When collecting Poetry projects for caching, a '**/poetry.lock' glob is
used. However, in order to process the Poetry configuration, the
"poetry" command is run from the repo's root directory; this causes
Poetry to return an invalid configuration when there is a Poetry project
inside an inner directory.
Instead of running a single Poetry command, glob for the same pattern,
and run a Poetry command for every discovered project.
* Fix typo: saveSatetSpy -> saveStateSpy
* poetry: Support same virtualenv appearing in multiple projects
* Add nested Poetry projects test
* poetry: Set up environment for each project individually
* tests/cache-restore: Do not look for dependency files outside `data`
When the default dependency path is used for cache distributors, they
are looking for the dependency file in the project's root (including the
source code), which leads to tests taking a significant amount of time,
especially on Windows runners. We thus hit sporadic test failures.
Change the test cases such that dependency files are always searched for
inside of `__tests__/data`, ignoring the rest of the project.
* poetry: Simplify `virtualenvs.in-project` boolean check
* README: Explain that poetry might create multiple caches
* poetry: Run `poetry env use` only after cache is loaded
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.
* poetry: Bump cache primary key
2023-01-03 16:13:00 +00:00
|
|
|
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',
|
|
|
|
['config', '--list'],
|
|
|
|
{cwd: basedir}
|
|
|
|
);
|
2021-11-24 15:10:58 +00:00
|
|
|
|
|
|
|
if (exitCode && stderr) {
|
|
|
|
throw new Error(
|
2022-02-18 17:31:04 +00:00
|
|
|
'Could not get cache folder path for poetry package manager'
|
2021-11-24 15:10:58 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2022-03-30 21:41:41 +00:00
|
|
|
const lines = stdout.trim().split('\n');
|
2021-11-24 15:10:58 +00:00
|
|
|
|
2021-11-27 17:17:01 +00:00
|
|
|
const config: any = {};
|
2021-11-24 15:10:58 +00:00
|
|
|
|
|
|
|
for (let line of lines) {
|
2022-05-31 13:48:54 +00:00
|
|
|
line = line.replace(/#.*$/gm, '');
|
2021-11-24 15:10:58 +00:00
|
|
|
|
|
|
|
const [key, value] = line.split('=').map(part => part.trim());
|
|
|
|
|
2021-11-27 17:17:01 +00:00
|
|
|
config[key] = JSON.parse(value);
|
2021-11-24 15:10:58 +00:00
|
|
|
}
|
|
|
|
|
2021-11-27 17:17:01 +00:00
|
|
|
return config as {
|
|
|
|
'cache-dir': string;
|
|
|
|
'virtualenvs.in-project': boolean;
|
|
|
|
'virtualenvs.path': string;
|
|
|
|
};
|
2021-11-24 15:10:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export default PoetryCache;
|