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!(