(&self, ctx: &AppContext)
| 27 | #[async_trait] |
| 28 | impl Command for DockerBuildCommand { |
| 29 | async fn execute(&self, ctx: &AppContext) -> Result<(), Box<dyn Error>> { |
| 30 | let docker_client = Arc::new( |
| 31 | DefaultDockerClient::new(&ctx.tsk_config().container_engine) |
| 32 | .map_err(|e| -> Box<dyn Error> { e.into() })?, |
| 33 | ); |
| 34 | |
| 35 | // Handle proxy-only build |
| 36 | if self.proxy_only { |
| 37 | println!("Building tsk/proxy image..."); |
| 38 | use crate::docker::proxy_manager::ProxyManager; |
| 39 | let proxy_manager = ProxyManager::new( |
| 40 | docker_client, |
| 41 | ctx.tsk_env(), |
| 42 | ctx.tsk_config().container_engine.clone(), |
| 43 | None, |
| 44 | ); |
| 45 | proxy_manager |
| 46 | .build_proxy(self.no_cache, &TaskLogger::no_file()) |
| 47 | .await?; |
| 48 | println!("Successfully built Docker image: tsk/proxy"); |
| 49 | return Ok(()); |
| 50 | } |
| 51 | |
| 52 | // Get project root for Docker operations |
| 53 | let project_root = find_repository_root(std::path::Path::new(".")).ok(); |
| 54 | |
| 55 | // Auto-detect project if not provided |
| 56 | let project = match &self.project { |
| 57 | Some(p) => Some(p.clone()), |
| 58 | None => { |
| 59 | let repo_root = project_root |
| 60 | .clone() |
| 61 | .unwrap_or_else(|| std::path::PathBuf::from(".")); |
| 62 | |
| 63 | match crate::repository::detect_project_name(&repo_root).await { |
| 64 | Ok(detected) => Some(detected), |
| 65 | Err(e) => { |
| 66 | eprintln!("Warning: Failed to detect project name: {e}. Using default."); |
| 67 | Some("default".to_string()) |
| 68 | } |
| 69 | } |
| 70 | } |
| 71 | }; |
| 72 | |
| 73 | // Resolve config for inline layer overrides |
| 74 | let project_name = project.as_deref().unwrap_or("default"); |
| 75 | let tsk_config = ctx.tsk_config(); |
| 76 | let project_config = project_root |
| 77 | .as_deref() |
| 78 | .and_then(crate::context::tsk_config::load_project_config); |
| 79 | let resolved_config = tsk_config.resolve_config( |
| 80 | project_name, |
| 81 | project_config.as_ref(), |
| 82 | project_root.as_deref(), |
| 83 | ); |
| 84 | |
| 85 | // Resolve stack and agent using shared resolution logic |
| 86 | let repo_root = project_root |
nothing calls this directly
no test coverage detected