mirror of
https://github.com/openai/codex.git
synced 2026-04-28 10:21:06 +03:00
4.2 KiB
4.2 KiB
DOs
-
Bold the keyword: prefer callsite timeouts.
// Option A: pass a budget into the collector use std::time::Duration; use tokio::time::timeout; let cwd = sess.as_ref().unwrap().cwd.clone(); let overall = Duration::from_millis(500); let per_call = overall / 2; let git_info = timeout(overall, collect_git_info_with_timeout(&cwd, per_call)) .await .ok() // timeout elapsed .flatten(); // Option<GitInfo> -
Bold the keyword: tailor budgets to context.
// Latency-sensitive handshake (short) let git_budget = Duration::from_millis(400); // Less latency-sensitive rollout (longer) let git_budget = Duration::from_secs(2); -
Bold the keyword: run independent work concurrently with time bounds.
use tokio::time::{timeout, Duration}; let (git_info, (history_log_id, history_entry_count)) = tokio::join!( async { timeout(Duration::from_millis(400), collect_git_info_with_timeout(&cwd, Duration::from_millis(200))) .await .ok() .flatten() }, async { timeout(Duration::from_millis(400), message_history::history_metadata(&config)) .await .unwrap_or(Ok((0, 0))) // choose a safe fallback for handshake .unwrap_or((0, 0)) } ); -
Bold the keyword: surface branch via SessionConfiguredEvent (avoid sync in TUI).
// In TUI, consume event.git_info rather than calling blocking helpers let branch_suffix = event.git_info.as_ref() .and_then(|g| g.branch.as_ref()) .map(|b| format!(" ({b})")) .unwrap_or_default(); let path_and_branch = if branch_suffix.is_empty() { format!(" {cwd_str}") } else { format!(" {cwd_str}{branch_suffix}") }; -
Bold the keyword: use Stylize helpers and format! interpolation.
use ratatui::style::Stylize; use ratatui::{text::Line, text::Span}; let line = Line::from(vec![ ">_ ".dim(), "You are using OpenAI Codex in".bold(), format!(" {path_and_branch}").dim(), ]); -
Bold the keyword: split internal budgets when a helper issues multiple commands.
// Inside collector: divide overall budget across internal git calls pub async fn collect_git_info_with_timeout( cwd: &std::path::Path, per_call_timeout: std::time::Duration, ) -> Option<GitInfo> { let branch = timeout(per_call_timeout, run_git("rev-parse", &["--abbrev-ref", "HEAD"], cwd)) .await.ok()??; let root = timeout(per_call_timeout, run_git("rev-parse", &["--show-toplevel"], cwd)) .await.ok()??; Some(GitInfo { branch: Some(branch), root: Some(root) }) }
DON'Ts
-
Bold the keyword: don’t bake a single global timeout for every context.
// Avoid: one-size-fits-all constant used everywhere const GIT_COMMAND_TIMEOUT: std::time::Duration = std::time::Duration::from_millis(400); // … later … let git_info = collect_git_info(&cwd).await; // no callsite control -
Bold the keyword: don’t block the UI with sync Git queries.
// Avoid in TUI render path: let branch_suffix = codex_core::git_info::collect_git_info_blocking(&config.cwd) .ok() .and_then(|g| g.branch) .map(|b| format!(" ({b})")) .unwrap_or_default(); -
Bold the keyword: don’t run long operations sequentially without bounds.
// Avoid: sequential awaits with no timeouts (slows handshake) let git_info = collect_git_info(&cwd).await; let (history_log_id, history_entry_count) = message_history::history_metadata(&config).await; -
Bold the keyword: don’t rely solely on internal per-command timeouts.
// Avoid: helper hides timing; callsite can’t adjust async fn collect_git_info(cwd: &Path) -> Option<GitInfo> { // internally picks arbitrary timeouts; callers can’t tune per context run_git_command_with_timeout(...).await.ok()?; run_git_command_with_timeout(...).await.ok()?; // … } -
Bold the keyword: don’t leave placeholder or stray comments in diffs.
// Avoid: // // (remove empty or placeholder comment lines before merging)