cascade_cli/config/
mod.rs1pub mod auth;
2pub mod settings;
3
4pub use auth::{AuthConfig, AuthManager};
5pub use settings::{BitbucketConfig, CascadeConfig, CascadeSettings, GitConfig, Settings};
6
7use crate::errors::{CascadeError, Result};
8use crate::git::GitRepository;
9use std::fs;
10use std::path::{Path, PathBuf};
11
12pub fn get_config_dir() -> Result<PathBuf> {
14 let home_dir =
15 dirs::home_dir().ok_or_else(|| CascadeError::config("Could not find home directory"))?;
16 let config_dir = home_dir.join(".cascade");
17
18 crate::utils::path_validation::validate_config_path(&config_dir, &home_dir)
20}
21
22pub fn get_repo_config_dir(repo_path: &Path) -> Result<PathBuf> {
26 let canonical_repo = repo_path.canonicalize().map_err(|e| {
28 CascadeError::config(format!("Invalid repository path '{repo_path:?}': {e}"))
29 })?;
30
31 if let Ok(repo) = git2::Repository::discover(repo_path) {
35 let commondir = repo.commondir().to_path_buf();
36 let commondir_clean = commondir.canonicalize().unwrap_or(commondir);
37 if let Some(main_root) = commondir_clean.parent() {
38 let main_canonical = main_root.canonicalize().unwrap_or(main_root.to_path_buf());
39 if main_canonical != canonical_repo {
40 let main_config_dir = main_canonical.join(".cascade");
42 return crate::utils::path_validation::validate_config_path(
43 &main_config_dir,
44 &main_canonical,
45 );
46 }
47 }
48 }
49
50 let config_dir = canonical_repo.join(".cascade");
52 crate::utils::path_validation::validate_config_path(&config_dir, &canonical_repo)
53}
54
55pub fn ensure_config_dir(config_dir: &Path) -> Result<()> {
57 if !config_dir.exists() {
58 fs::create_dir_all(config_dir)
59 .map_err(|e| CascadeError::config(format!("Failed to create config directory: {e}")))?;
60 }
61
62 let stacks_dir = config_dir.join("stacks");
64 if !stacks_dir.exists() {
65 fs::create_dir_all(&stacks_dir)
66 .map_err(|e| CascadeError::config(format!("Failed to create stacks directory: {e}")))?;
67 }
68
69 let cache_dir = config_dir.join("cache");
70 if !cache_dir.exists() {
71 fs::create_dir_all(&cache_dir)
72 .map_err(|e| CascadeError::config(format!("Failed to create cache directory: {e}")))?;
73 }
74
75 Ok(())
76}
77
78pub fn is_repo_initialized(repo_path: &Path) -> bool {
80 match get_repo_config_dir(repo_path) {
81 Ok(config_dir) => config_dir.exists() && config_dir.join("config.json").exists(),
82 Err(_) => false,
83 }
84}
85
86pub fn initialize_repo(repo_path: &Path, bitbucket_url: Option<String>) -> Result<()> {
88 let config_dir = get_repo_config_dir(repo_path)?;
89 ensure_config_dir(&config_dir)?;
90
91 let mut settings = Settings::default_for_repo(bitbucket_url);
93
94 if let Ok(git_repo) = GitRepository::open(repo_path) {
96 if let Ok(detected_branch) = git_repo.detect_main_branch() {
97 tracing::debug!("Detected default branch: {}", detected_branch);
98 settings.git.default_branch = detected_branch;
99 } else {
100 tracing::debug!(
101 "Could not detect default branch, using fallback: {}",
102 settings.git.default_branch
103 );
104 }
105 } else {
106 tracing::debug!(
107 "Could not open git repository, using fallback default branch: {}",
108 settings.git.default_branch
109 );
110 }
111
112 settings.save_to_file(&config_dir.join("config.json"))?;
113
114 tracing::debug!("Initialized Cascade repository at {}", repo_path.display());
115 Ok(())
116}