Mercurial > public > mercurial-scm > hg
comparison rust/hg-core/src/revlog/path_encode.rs @ 50167:ee63c87a0cac
rhg: in path_encode, simplify a bit more
Use the slices for `basename` and `ext` instead of dealing with offsets.
author | Arseniy Alekseyev <aalekseyev@janestreet.com> |
---|---|
date | Fri, 17 Feb 2023 16:48:11 +0000 |
parents | 6ea3b1acb5de |
children | eb07591825fa |
comparison
equal
deleted
inserted
replaced
50166:6ea3b1acb5de | 50167:ee63c87a0cac |
---|---|
525 fn hash_mangle(src: &[u8], sha: &[u8]) -> Vec<u8> { | 525 fn hash_mangle(src: &[u8], sha: &[u8]) -> Vec<u8> { |
526 let dirprefixlen = 8; | 526 let dirprefixlen = 8; |
527 let maxshortdirslen = 68; | 527 let maxshortdirslen = 68; |
528 | 528 |
529 let last_slash = src.iter().rposition(|b| *b == b'/'); | 529 let last_slash = src.iter().rposition(|b| *b == b'/'); |
530 let last_dot: Option<usize> = { | 530 let basename_start = match last_slash { |
531 let s = last_slash.unwrap_or(0); | 531 Some(slash) => slash + 1, |
532 src[s..].iter().rposition(|b| *b == b'.').map(|i| i + s) | 532 None => 0, |
533 }; | |
534 let basename = &src[basename_start..]; | |
535 let ext = match basename.iter().rposition(|b| *b == b'.') { | |
536 None => &[], | |
537 Some(dot) => &basename[dot..], | |
533 }; | 538 }; |
534 | 539 |
535 let mut dest = Vec::with_capacity(MAXSTOREPATHLEN); | 540 let mut dest = Vec::with_capacity(MAXSTOREPATHLEN); |
536 dest.write_bytes(b"dh/"); | 541 dest.write_bytes(b"dh/"); |
537 | 542 |
545 } | 550 } |
546 dest.write_byte(b'/'); | 551 dest.write_byte(b'/'); |
547 } | 552 } |
548 } | 553 } |
549 | 554 |
550 let used = dest.len() + 40 + { | 555 let used = dest.len() + 40 + ext.len(); |
551 if let Some(l) = last_dot { | |
552 src.len() - l | |
553 } else { | |
554 0 | |
555 } | |
556 }; | |
557 | 556 |
558 if MAXSTOREPATHLEN > used { | 557 if MAXSTOREPATHLEN > used { |
559 let slop = MAXSTOREPATHLEN - used; | 558 let slop = MAXSTOREPATHLEN - used; |
560 let basenamelen = match last_slash { | 559 let len = std::cmp::min(basename.len(), slop); |
561 Some(l) => src.len() - l - 1, | 560 dest.write_bytes(&basename[..len]) |
562 None => src.len(), | |
563 }; | |
564 let basenamelen = std::cmp::min(basenamelen, slop); | |
565 if basenamelen > 0 { | |
566 let start = match last_slash { | |
567 Some(l) => l + 1, | |
568 None => 0, | |
569 }; | |
570 dest.write_bytes(&src[start..][..basenamelen]) | |
571 } | |
572 } | 561 } |
573 for c in sha { | 562 for c in sha { |
574 hexencode(&mut dest, *c); | 563 hexencode(&mut dest, *c); |
575 } | 564 } |
576 if let Some(l) = last_dot { | 565 dest.write_bytes(ext); |
577 dest.write_bytes(&src[l..]); | |
578 } | |
579 dest.shrink_to_fit(); | 566 dest.shrink_to_fit(); |
580 dest | 567 dest |
581 } | 568 } |
582 | 569 |
583 fn hash_encode(src: &[u8]) -> Vec<u8> { | 570 fn hash_encode(src: &[u8]) -> Vec<u8> { |