diff --git a/src/action.rs b/src/action.rs index 05d6095..d2c5f2e 100644 --- a/src/action.rs +++ b/src/action.rs @@ -136,6 +136,32 @@ impl Action { .collect() } + pub fn get_codeql_dir(&self) -> Result { + let paths = vec![ + // Local CodeQL directory in the working directory + self.working_directory()?.join(".codeql"), + // Runner temp directory + PathBuf::from(std::env::var("RUNNER_TEMP").unwrap_or_else(|_| "/tmp".to_string())) + .join(".codeql"), + ]; + + for path in paths { + if !path.exists() { + log::debug!("Creating CodeQL directory at `{}`", path.display()); + if std::fs::create_dir_all(&path).is_ok() { + return Ok(path); + } else { + log::warn!("Failed to create CodeQL directory at `{}`", path.display()); + } + } else { + log::debug!("CodeQL directory already exists at `{}`", path.display()); + return Ok(path); + } + } + + Err(anyhow::anyhow!("Failed to create CodeQL directory",)) + } + pub fn validate_languages(&self, codeql_languages: &Vec) -> Result<()> { for lang in self.languages() { let mut supported = false; diff --git a/src/main.rs b/src/main.rs index 173cfc0..5f39768 100644 --- a/src/main.rs +++ b/src/main.rs @@ -23,8 +23,10 @@ async fn main() -> Result<()> { let cwd = action .working_directory() .context("Failed to get working directory")?; - let databases = cwd.join(".codeql"); - let sarif_output = databases.join("results"); + let codeql_dir = action.get_codeql_dir()?; + + let databases = codeql_dir.join("databases"); + let sarif_output = codeql_dir.join("results"); group!("Setting up CodeQL");