Skip to content

Commit 0c8844a

Browse files
committed
Clear cache request
1 parent 07ee45e commit 0c8844a

8 files changed

Lines changed: 50 additions & 22 deletions

File tree

crates/pet-core/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ pub struct Configuration {
3333
/// These are different from search_paths, as these are specific directories where environments are expected.
3434
/// environment_directories on the other hand can be any directory such as a workspace folder, where envs might never exist.
3535
pub environment_directories: Option<Vec<PathBuf>>,
36+
/// Directory to cache the Python environment details.
37+
pub cache_directory: Option<PathBuf>,
3638
}
3739

3840
pub trait Locator: Send + Sync {

crates/pet-poetry/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
use env_variables::EnvVariables;
55
use environment_locations::list_environments;
6+
use log::trace;
67
use manager::PoetryManager;
78
use pet_core::{
89
env::PythonEnv,
@@ -69,6 +70,7 @@ impl Poetry {
6970
self.poetry_executable.lock().unwrap().clone(),
7071
&self.env_vars,
7172
);
73+
trace!("Poetry Manager {:?}", manager);
7274
let mut result = LocatorResult {
7375
managers: vec![],
7476
environments: vec![],

crates/pet-pyenv/src/lib.rs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,13 @@
44
use std::{
55
fs,
66
path::PathBuf,
7-
sync::{
8-
atomic::{AtomicBool, Ordering},
9-
Arc, Mutex,
10-
},
7+
sync::{Arc, Mutex},
118
thread,
129
};
1310

1411
use env_variables::EnvVariables;
1512
use environments::{get_generic_python_environment, get_virtual_env_environment};
13+
use log::trace;
1614
use manager::PyEnvInfo;
1715
use pet_conda::{utils::is_conda_env, CondaLocator};
1816
use pet_core::{
@@ -33,7 +31,6 @@ mod manager;
3331
pub struct PyEnv {
3432
pub env_vars: EnvVariables,
3533
pub conda_locator: Arc<dyn CondaLocator>,
36-
found_pyenv: AtomicBool,
3734
manager: Arc<Mutex<Option<EnvManager>>>,
3835
versions_dir: Arc<Mutex<Option<PathBuf>>>,
3936
}
@@ -44,24 +41,22 @@ impl PyEnv {
4441
conda_locator: Arc<dyn CondaLocator>,
4542
) -> impl Locator {
4643
PyEnv {
47-
found_pyenv: AtomicBool::new(false),
4844
env_vars: EnvVariables::from(environment),
4945
conda_locator,
5046
manager: Arc::new(Mutex::new(None)),
5147
versions_dir: Arc::new(Mutex::new(None)),
5248
}
5349
}
5450
fn clear(&self) {
55-
self.found_pyenv
56-
.store(false, std::sync::atomic::Ordering::Relaxed);
5751
self.manager.lock().unwrap().take();
5852
self.versions_dir.lock().unwrap().take();
5953
}
6054
fn get_manager_versions_dir(&self) -> (Option<EnvManager>, Option<PathBuf>) {
6155
let mut managers = self.manager.lock().unwrap();
6256
let mut versions = self.versions_dir.lock().unwrap();
63-
if !self.found_pyenv.load(Ordering::Relaxed) && (managers.is_none() || versions.is_none()) {
57+
if managers.is_none() || versions.is_none() {
6458
let pyenv_info = PyEnvInfo::from(&self.env_vars);
59+
trace!("PyEnv Info {:?}", pyenv_info);
6560
if let Some(ref exe) = pyenv_info.exe {
6661
let version = pyenv_info.version.clone();
6762
let manager = EnvManager::new(exe.clone(), EnvManagerType::Pyenv, version);
@@ -74,9 +69,7 @@ impl PyEnv {
7469
} else {
7570
versions.take();
7671
}
77-
self.found_pyenv.store(true, Ordering::Relaxed);
7872
}
79-
8073
(managers.clone(), versions.clone())
8174
}
8275
}
@@ -164,6 +157,8 @@ impl Locator for PyEnv {
164157
}
165158
}
166159
});
160+
} else {
161+
trace!("PyEnv versions directory not found");
167162
}
168163
}
169164
}

crates/pet-python-utils/src/fs_cache.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,9 @@ mod tests {
114114
fn test_hash_generation() {
115115
assert_eq!(
116116
generate_hash(&PathBuf::from(
117-
&"C:\\temp\\poetry-folders\\demo-project1".into(),
117+
"C:\\temp\\poetry-folders\\demo-project1".to_string(),
118118
)),
119-
"e72c82125e7281e2"
119+
"c3694bfb39d7065b"
120120
);
121121
}
122122
}

crates/pet/src/find.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,13 @@ pub fn find_and_report_envs(
7878
let summary = summary.clone();
7979
s.spawn(move || {
8080
let start = std::time::Instant::now();
81+
trace!("Searching using locator: {}", locator.get_name());
8182
locator.find(reporter);
83+
trace!(
84+
"Completed searching using locator: {} in {:?}",
85+
locator.get_name(),
86+
start.elapsed()
87+
);
8288
summary
8389
.lock()
8490
.unwrap()

crates/pet/src/jsonrpc.rs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ pub fn start_jsonrpc_server() {
7676
handlers.add_request_handler("resolve", handle_resolve);
7777
handlers.add_request_handler("find", handle_find);
7878
handlers.add_request_handler("condaInfo", handle_conda_telemetry);
79+
handlers.add_request_handler("clearCache", handle_clear_cache);
7980
start_server(&handlers)
8081
}
8182

@@ -106,7 +107,8 @@ pub fn handle_configure(context: Arc<Context>, id: u32, params: Value) {
106107
// We will not support changing the cache directories once set.
107108
// No point, supporting such a use case.
108109
if let Some(cache_directory) = configure_options.cache_directory {
109-
set_cache_directory(cache_directory)
110+
set_cache_directory(cache_directory.clone());
111+
cfg.cache_directory = Some(cache_directory);
110112
}
111113
trace!("Configuring locators: {:?}", cfg);
112114
drop(cfg);
@@ -370,3 +372,29 @@ pub fn handle_conda_telemetry(context: Arc<Context>, id: u32, _params: Value) {
370372
send_reply(id, info.into());
371373
});
372374
}
375+
376+
pub fn handle_clear_cache(context: Arc<Context>, id: u32, _params: Value) {
377+
thread::spawn(move || {
378+
if let Some(cache_directory) = context
379+
.configuration
380+
.read()
381+
.unwrap()
382+
.cache_directory
383+
.clone()
384+
{
385+
if let Err(e) = std::fs::remove_dir_all(&cache_directory) {
386+
error!("Failed to clear cache {:?}: {}", cache_directory, e);
387+
send_error(
388+
Some(id),
389+
-4,
390+
format!("Failed to clear cache {:?}: {}", cache_directory, e),
391+
);
392+
} else {
393+
info!("Cleared cache {:?}", cache_directory);
394+
send_reply(id, None::<()>);
395+
}
396+
} else {
397+
send_reply(id, None::<()>);
398+
}
399+
});
400+
}

crates/pet/tests/ci_poetry.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@
22
// Licensed under the MIT License.
33

44
use pet_poetry::Poetry;
5-
use pet_reporter::{
6-
cache::{self, CacheReporter},
7-
collect,
8-
};
5+
use pet_reporter::{cache::CacheReporter, collect};
96

107
mod common;
118

crates/pet/tests/ci_test.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,7 @@ use pet_core::{
1717
};
1818
use pet_env_var_path::get_search_paths_from_env_variables;
1919
use pet_poetry::Poetry;
20-
use pet_reporter::{
21-
cache::{self, CacheReporter},
22-
collect,
23-
};
20+
use pet_reporter::{cache::CacheReporter, collect};
2421
use regex::Regex;
2522
use serde::Deserialize;
2623

@@ -226,6 +223,7 @@ fn check_if_pyenv_virtualenv_exists() {
226223
let environment = EnvironmentApi::new();
227224
let conda_locator = Arc::new(Conda::from(&environment));
228225
let poetry_locator = Arc::new(Poetry::from(&environment));
226+
trace!("Checking for pyenv-virtualenv");
229227

230228
find_and_report_envs(
231229
&CacheReporter::new(reporter.clone()),

0 commit comments

Comments
 (0)