List all stash views, sorted by creation time (newest first).
(&self, repo: &Repository)
| 282 | |
| 283 | /// List all stash views, sorted by creation time (newest first). |
| 284 | fn list_stashes(&self, repo: &Repository) -> CliResult<Vec<StashEntry>> { |
| 285 | let views = repo.list_views().map_err(CliError::Repository)?; |
| 286 | |
| 287 | let mut stashes: Vec<StashEntry> = views |
| 288 | .into_iter() |
| 289 | .filter(|name| name.starts_with(STASH_PREFIX)) |
| 290 | .filter_map(|name| { |
| 291 | // Parse stash metadata from view info |
| 292 | let _info = repo.get_view_info(&name).ok()?; |
| 293 | |
| 294 | // Extract source view and message from view name or metadata |
| 295 | // Format: stash/auto_{timestamp} or stash/{source}_{timestamp}_{message} |
| 296 | let parts: Vec<&str> = name |
| 297 | .trim_start_matches(STASH_PREFIX) |
| 298 | .splitn(3, '_') |
| 299 | .collect(); |
| 300 | |
| 301 | let (source_view, message, timestamp) = if parts.len() >= 2 { |
| 302 | let ts: i64 = parts.get(1).and_then(|s| s.parse().ok()).unwrap_or(0); |
| 303 | let src = if parts[0] == "auto" { |
| 304 | "unknown".to_string() |
| 305 | } else { |
| 306 | parts[0].to_string() |
| 307 | }; |
| 308 | let msg = parts |
| 309 | .get(2) |
| 310 | .map(|s| s.to_string()) |
| 311 | .unwrap_or_else(|| DEFAULT_STASH_MESSAGE.to_string()); |
| 312 | (src, msg, ts) |
| 313 | } else { |
| 314 | ("unknown".to_string(), DEFAULT_STASH_MESSAGE.to_string(), 0) |
| 315 | }; |
| 316 | |
| 317 | let created_at = |
| 318 | DateTime::from_timestamp_millis(timestamp).unwrap_or_else(Utc::now); |
| 319 | |
| 320 | Some(StashEntry { |
| 321 | index: 0, // Will be set after sorting |
| 322 | view_name: name, |
| 323 | source_view, |
| 324 | message, |
| 325 | created_at, |
| 326 | }) |
| 327 | }) |
| 328 | .collect(); |
| 329 | |
| 330 | // Sort by creation time, newest first |
| 331 | stashes.sort_by_key(|s| std::cmp::Reverse(s.created_at)); |
| 332 | |
| 333 | // Assign indices after sorting |
| 334 | for (i, stash) in stashes.iter_mut().enumerate() { |
| 335 | stash.index = i; |
| 336 | } |
| 337 | |
| 338 | Ok(stashes) |
| 339 | } |
| 340 | |
| 341 | /// Parse a stash reference (e.g., "stash@{0}", "0", or view name). |
no test coverage detected