From 8b0e3170876168369a99a34e231a635d15d395a0 Mon Sep 17 00:00:00 2001 From: Sephyi Date: Sun, 19 Apr 2026 19:04:30 +0200 Subject: [PATCH] refactor(services): replace byte indexing with strip_prefix Six diff-line processing sites used &line[1..] / &l[1..] to drop the leading '+' or '-', which is safe here because the guards limit those lines to ASCII prefixes, but strip_prefix expresses the intent directly and removes the implicit byte-boundary assumption. Sites updated: - context.rs detect_import_changes: collapse the dual +/- branch into a single strip_prefix chain that picks the action label in one pass. - context.rs detect_intents: swap the negated starts_with guard for a let-else over strip_prefix('+'), keeping the +++ header filter. - context.rs detect_metadata_breaking: rewrite the is_added/is_removed dispatch around strip_prefix, then derive is_removed from is_added. - splitter.rs diff_fingerprint: filter_map(strip_prefix) in the added/removed line builders. - safety.rs scan_full_diff_with_patterns: let-chain strip_prefix('+') alongside the existing !starts_with("+++") header guard. Behaviorally identical; zero new allocations. Verified with cargo fmt --check, cargo clippy --all-targets --all-features -D warnings (clean), and cargo test --all-targets (440 passed, 1 pre-existing porcelain timeout flake also present on clean origin/development). Closes audit entry F-011 from #3. --- src/services/context.rs | 37 +++++++++++++++++++++---------------- src/services/safety.rs | 5 +++-- src/services/splitter.rs | 8 ++++---- 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/src/services/context.rs b/src/services/context.rs index 8c59f91..24172ac 100644 --- a/src/services/context.rs +++ b/src/services/context.rs @@ -995,21 +995,20 @@ impl ContextBuilder { continue; } // Detect added/removed import lines - if (line.starts_with('+') && Self::is_import_line(&line[1..])) - || (line.starts_with('-') && Self::is_import_line(&line[1..])) - { - let action = if line.starts_with('+') { - "added" - } else { - "removed" - }; + let (action, content) = if let Some(rest) = line.strip_prefix('+') { + ("added", rest) + } else if let Some(rest) = line.strip_prefix('-') { + ("removed", rest) + } else { + continue; + }; + if Self::is_import_line(content) { let stem = file .path .file_stem() .and_then(|s| s.to_str()) .unwrap_or("?"); - let content = line[1..].trim(); - imports.push(format!("{}: {} {}", stem, action, content)); + imports.push(format!("{}: {} {}", stem, action, content.trim())); } } } @@ -1067,11 +1066,13 @@ impl ContextBuilder { let filename = file.path.file_name().and_then(|n| n.to_str()).unwrap_or(""); for line in file.diff.lines() { - if !line.starts_with('+') || line.starts_with("+++") { + if line.starts_with("+++") { continue; } + let Some(content) = line.strip_prefix('+') else { + continue; + }; total_added += 1; - let content = &line[1..]; let trimmed = content.trim(); // Error handling patterns @@ -1207,13 +1208,17 @@ impl ContextBuilder { let name = file.path.file_name().and_then(|n| n.to_str()).unwrap_or(""); for line in file.diff.lines() { - let is_removed = line.starts_with('-') && !line.starts_with("---"); - let is_added = line.starts_with('+') && !line.starts_with("+++"); - let content = if is_removed || is_added { - &line[1..] + if line.starts_with("+++") || line.starts_with("---") { + continue; + } + let (is_added, content) = if let Some(rest) = line.strip_prefix('+') { + (true, rest) + } else if let Some(rest) = line.strip_prefix('-') { + (false, rest) } else { continue; }; + let is_removed = !is_added; match name { "Cargo.toml" => { diff --git a/src/services/safety.rs b/src/services/safety.rs index a2f17b0..d9e4cff 100644 --- a/src/services/safety.rs +++ b/src/services/safety.rs @@ -314,8 +314,9 @@ pub fn scan_full_diff_with_patterns( } // Only check added lines - if line.starts_with('+') && !line.starts_with("+++") { - let content = &line[1..]; + if !line.starts_with("+++") + && let Some(content) = line.strip_prefix('+') + { for pat in patterns { if pat.regex.is_match(content) { found.push(SecretMatch { diff --git a/src/services/splitter.rs b/src/services/splitter.rs index 4f546e1..5a7f3c6 100644 --- a/src/services/splitter.rs +++ b/src/services/splitter.rs @@ -197,13 +197,13 @@ impl CommitSplitter { let mut indent_only_changes = 0usize; let added_lines: Vec<&str> = lines .iter() - .filter(|l| l.starts_with('+') && !l.starts_with("+++")) - .map(|l| &l[1..]) + .filter(|l| !l.starts_with("+++")) + .filter_map(|l| l.strip_prefix('+')) .collect(); let removed_lines: Vec<&str> = lines .iter() - .filter(|l| l.starts_with('-') && !l.starts_with("---")) - .map(|l| &l[1..]) + .filter(|l| !l.starts_with("---")) + .filter_map(|l| l.strip_prefix('-')) .collect(); for added_line in &added_lines {