Resolve the reference to a sequence number and entry.
(&self, repo: &Repository)
| 285 | |
| 286 | /// Resolve the reference to a sequence number and entry. |
| 287 | fn resolve_reference(&self, repo: &Repository) -> CliResult<(u64, HistoryEntry)> { |
| 288 | let change_ref = self.parse_reference(); |
| 289 | |
| 290 | // Get current view info |
| 291 | let stack_name = repo.current_view(); |
| 292 | let stack_info = repo |
| 293 | .get_view_info(stack_name) |
| 294 | .map_err(CliError::Repository)?; |
| 295 | |
| 296 | if stack_info.change_count == 0 { |
| 297 | return Err(CliError::Internal(anyhow::anyhow!( |
| 298 | "Cannot revise: view '{}' is empty", |
| 299 | stack_info.name |
| 300 | ))); |
| 301 | } |
| 302 | |
| 303 | // Resolve reference to sequence number |
| 304 | let sequence = match &change_ref { |
| 305 | ChangeRef::Last | ChangeRef::Relative(_) => change_ref |
| 306 | .resolve(stack_info.change_count) |
| 307 | .map_err(|e| CliError::Internal(anyhow::anyhow!("{}", e)))?, |
| 308 | ChangeRef::Hash(hash_str) => { |
| 309 | // Find the change by hash prefix |
| 310 | self.find_by_hash(repo, hash_str)? |
| 311 | } |
| 312 | }; |
| 313 | |
| 314 | // Get the history entry at that sequence using log |
| 315 | let history = repo |
| 316 | .log(HistoryOptions::default()) |
| 317 | .map_err(CliError::Repository)?; |
| 318 | |
| 319 | let entry = history |
| 320 | .into_iter() |
| 321 | .find(|e| e.sequence == sequence) |
| 322 | .ok_or_else(|| { |
| 323 | CliError::Internal(anyhow::anyhow!("Change at sequence {} not found", sequence)) |
| 324 | })?; |
| 325 | |
| 326 | Ok((sequence, entry)) |
| 327 | } |
| 328 | |
| 329 | /// Find a change by hash prefix. |
| 330 | fn find_by_hash(&self, repo: &Repository, hash_str: &str) -> CliResult<u64> { |
no test coverage detected