@@ -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