Show More
@@ -527,9 +527,14 b' fn hash_mangle(src: &[u8], sha: &[u8]) -' | |||||
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); | |
@@ -547,35 +552,17 b' fn hash_mangle(src: &[u8], sha: &[u8]) -' | |||||
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 | } |
General Comments 0
You need to be logged in to leave comments.
Login now