Skip to content

Commit f75329c

Browse files
committed
fix(stash): improve error message specificity in stash parsing
- Include expected and actual parts count in validation error message - Add validation for empty remainder part containing branch and message - Add comprehensive test coverage for parsing edge cases - Change from generic "Invalid format" to specific "expected 4 parts, got X"
1 parent 947e601 commit f75329c

File tree

1 file changed

+54
-3
lines changed

1 file changed

+54
-3
lines changed

src/commands/stash.rs

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -491,9 +491,10 @@ fn parse_stash_line(index: usize, line: &str) -> Result<Stash> {
491491
let parts: Vec<&str> = line.splitn(4, ' ').collect();
492492

493493
if parts.len() < 4 {
494-
return Err(GitError::CommandFailed(
495-
"Invalid stash list format".to_string(),
496-
));
494+
return Err(GitError::CommandFailed(format!(
495+
"Invalid stash list format: expected 4 parts, got {}",
496+
parts.len()
497+
)));
497498
}
498499

499500
let hash = Hash::from(parts[1]);
@@ -503,6 +504,12 @@ fn parse_stash_line(index: usize, line: &str) -> Result<Stash> {
503504

504505
// Extract branch name and message from parts[3] (should be "On branch: message")
505506
let remainder = parts[3];
507+
if remainder.is_empty() {
508+
return Err(GitError::CommandFailed(
509+
"Invalid stash format: missing branch and message information".to_string(),
510+
));
511+
}
512+
506513
let (branch, message) = if let Some(colon_pos) = remainder.find(':') {
507514
let branch_part = &remainder[..colon_pos];
508515
let message_part = &remainder[colon_pos + 1..].trim();
@@ -795,4 +802,48 @@ mod tests {
795802
assert!(display_str.contains("stash@{0}"));
796803
assert!(display_str.contains("Test stash message"));
797804
}
805+
806+
#[test]
807+
fn test_parse_stash_line_invalid_format() {
808+
// Test with insufficient parts
809+
let invalid_line = "stash@{0} abc123"; // Only 2 parts instead of 4
810+
let result = parse_stash_line(0, invalid_line);
811+
812+
assert!(result.is_err());
813+
if let Err(GitError::CommandFailed(msg)) = result {
814+
assert!(msg.contains("Invalid stash list format"));
815+
assert!(msg.contains("expected 4 parts"));
816+
assert!(msg.contains("got 2"));
817+
} else {
818+
panic!("Expected CommandFailed error with specific message");
819+
}
820+
}
821+
822+
#[test]
823+
fn test_parse_stash_line_empty_remainder() {
824+
// Test with empty remainder part
825+
let invalid_line = "stash@{0} abc123 1234567890 "; // Empty 4th part
826+
let result = parse_stash_line(0, invalid_line);
827+
828+
assert!(result.is_err());
829+
if let Err(GitError::CommandFailed(msg)) = result {
830+
assert!(msg.contains("missing branch and message information"));
831+
} else {
832+
panic!("Expected CommandFailed error for empty remainder");
833+
}
834+
}
835+
836+
#[test]
837+
fn test_parse_stash_line_valid_format() {
838+
// Test with valid format
839+
let valid_line = "stash@{0} abc123def456 1234567890 On master: test message";
840+
let result = parse_stash_line(0, valid_line);
841+
842+
assert!(result.is_ok());
843+
let stash = result.unwrap();
844+
assert_eq!(stash.index, 0);
845+
assert_eq!(stash.hash.as_str(), "abc123def456");
846+
assert_eq!(stash.branch, "master");
847+
assert_eq!(stash.message, "test message");
848+
}
798849
}

0 commit comments

Comments
 (0)