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