Mercurial > public > mercurial-scm > hg
comparison rust/hg-core/src/revlog/path_encode.rs @ 50096:06659dea51b0
rhg: fix a bug in path_encode
This makes rhg able to access long paths at the root of the tree just fine.
author | Arseniy Alekseyev <aalekseyev@janestreet.com> |
---|---|
date | Thu, 16 Feb 2023 14:56:59 +0000 |
parents | 362fe34702d5 |
children | 0d2ec486d95c |
comparison
equal
deleted
inserted
replaced
50095:362fe34702d5 | 50096:06659dea51b0 |
---|---|
540 }; | 540 }; |
541 | 541 |
542 let mut dest = vec![0; MAXSTOREPATHLEN]; | 542 let mut dest = vec![0; MAXSTOREPATHLEN]; |
543 memcopy(Some(&mut dest), &mut destlen, b"dh/"); | 543 memcopy(Some(&mut dest), &mut destlen, b"dh/"); |
544 | 544 |
545 { | 545 if let Some(last_slash) = last_slash { |
546 let mut first = true; | 546 let mut first = true; |
547 for slice in | 547 for slice in src[..last_slash].split(|b| *b == b'/') { |
548 src[..last_slash.unwrap_or(src.len())].split(|b| *b == b'/') | |
549 { | |
550 let slice = &slice[..std::cmp::min(slice.len(), dirprefixlen)]; | 548 let slice = &slice[..std::cmp::min(slice.len(), dirprefixlen)]; |
551 if destlen + (slice.len() + if first { 0 } else { 1 }) | 549 if destlen + (slice.len() + if first { 0 } else { 1 }) |
552 > maxshortdirslen + 3 | 550 > maxshortdirslen + 3 |
553 { | 551 { |
554 break; | 552 break; |
647 #[cfg(test)] | 645 #[cfg(test)] |
648 mod tests { | 646 mod tests { |
649 use super::*; | 647 use super::*; |
650 use crate::utils::hg_path::HgPathBuf; | 648 use crate::utils::hg_path::HgPathBuf; |
651 | 649 |
652 // expected failure | |
653 #[test] | 650 #[test] |
654 #[should_panic] | |
655 fn test_long_filename_at_root() { | 651 fn test_long_filename_at_root() { |
656 let input = b"data/ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJ.i"; | 652 let input = b"data/ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJ.i"; |
657 let expected = b"dh/abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij.i708243a2237a7afae259ea3545a72a2ef11c247b.i"; | 653 let expected = b"dh/abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij.i708243a2237a7afae259ea3545a72a2ef11c247b.i"; |
658 let res = path_encode(input); | 654 let res = path_encode(input); |
659 assert_eq!( | 655 assert_eq!( |