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