Mercurial > public > mercurial-scm > hg
annotate rust/hg-core/src/revlog/path_encode.rs @ 50159:96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Hopefully this makes the code easier to read and understand and
shorter overall.
It also lets us later tweak the type we use as a [Sink],
without having to change the encoding functions, including using
two different types for size measurement and for the actual
serialization.
author | Arseniy Alekseyev <aalekseyev@janestreet.com> |
---|---|
date | Thu, 16 Feb 2023 18:29:52 +0000 |
parents | 0d2ec486d95c |
children | 5ce53ff6133a |
rev | line source |
---|---|
47380
fad504cfc94b
rust: Use a maintained crate for SHA-1 hashing
Simon Sapin <simon.sapin@octobus.net>
parents:
45539
diff
changeset
|
1 use sha1::{Digest, Sha1}; |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
2 |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
3 #[derive(PartialEq, Debug)] |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
4 #[allow(non_camel_case_types)] |
49930
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47380
diff
changeset
|
5 #[allow(clippy::upper_case_acronyms)] |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
6 enum path_state { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
7 START, /* first byte of a path component */ |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
8 A, /* "AUX" */ |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
9 AU, |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
10 THIRD, /* third of a 3-byte sequence, e.g. "AUX", "NUL" */ |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
11 C, /* "CON" or "COMn" */ |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
12 CO, |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
13 COMLPT, /* "COM" or "LPT" */ |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
14 COMLPTn, |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
15 L, |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
16 LP, |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
17 N, |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
18 NU, |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
19 P, /* "PRN" */ |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
20 PR, |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
21 LDOT, /* leading '.' */ |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
22 DOT, /* '.' in a non-leading position */ |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
23 H, /* ".h" */ |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
24 HGDI, /* ".hg", ".d", or ".i" */ |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
25 SPACE, |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
26 DEFAULT, /* byte of a path component after the first */ |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
27 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
28 |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
29 /* state machine for dir-encoding */ |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
30 #[allow(non_camel_case_types)] |
49930
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47380
diff
changeset
|
31 #[allow(clippy::upper_case_acronyms)] |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
32 enum dir_state { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
33 DDOT, |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
34 DH, |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
35 DHGDI, |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
36 DDEFAULT, |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
37 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
38 |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
39 trait Sink { |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
40 fn write_byte(&mut self, c: u8); |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
41 fn write_bytes(&mut self, c: &[u8]); |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
42 } |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
43 |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
44 fn inset(bitset: &[u32; 8], c: u8) -> bool { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
45 bitset[(c as usize) >> 5] & (1 << (c & 31)) != 0 |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
46 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
47 |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
48 struct Dest<'a> { |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
49 dest: Option<&'a mut [u8]>, |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
50 pub len: usize, |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
51 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
52 |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
53 impl<'a> Dest<'a> { |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
54 pub fn create(buf: &'a mut [u8]) -> Dest<'a> { |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
55 Dest { |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
56 dest: Some(buf), |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
57 len: 0, |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
58 } |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
59 } |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
60 |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
61 pub fn create_measure() -> Dest<'a> { |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
62 Dest { dest: None, len: 0 } |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
63 } |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
64 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
65 |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
66 fn rewrap_option<'a, 'b: 'a>( |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
67 x: &'a mut Option<&'b mut [u8]>, |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
68 ) -> Option<&'a mut [u8]> { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
69 match x { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
70 None => None, |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
71 Some(y) => Some(y), |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
72 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
73 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
74 |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
75 impl<'a> Sink for Dest<'a> { |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
76 fn write_byte(&mut self, c: u8) { |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
77 if let Some(slice) = rewrap_option(&mut self.dest) { |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
78 slice[self.len] = c |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
79 } |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
80 self.len += 1 |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
81 } |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
82 |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
83 fn write_bytes(&mut self, src: &[u8]) { |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
84 if let Some(slice) = rewrap_option(&mut self.dest) { |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
85 slice[self.len..self.len + src.len()].copy_from_slice(src) |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
86 } |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
87 self.len += src.len(); |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
88 } |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
89 } |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
90 |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
91 fn hexencode(dest: &mut impl Sink, c: u8) { |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
92 let hexdigit = b"0123456789abcdef"; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
93 dest.write_byte(hexdigit[(c as usize) >> 4]); |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
94 dest.write_byte(hexdigit[(c as usize) & 15]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
95 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
96 |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
97 /* 3-byte escape: tilde followed by two hex digits */ |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
98 fn escape3(dest: &mut impl Sink, c: u8) { |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
99 dest.write_byte(b'~'); |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
100 hexencode(dest, c); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
101 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
102 |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
103 fn encode_dir(dest: &mut impl Sink, src: &[u8]) { |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
104 let mut state = dir_state::DDEFAULT; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
105 let mut i = 0; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
106 |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
107 while i < src.len() { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
108 match state { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
109 dir_state::DDOT => match src[i] { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
110 b'd' | b'i' => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
111 state = dir_state::DHGDI; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
112 dest.write_byte(src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
113 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
114 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
115 b'h' => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
116 state = dir_state::DH; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
117 dest.write_byte(src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
118 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
119 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
120 _ => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
121 state = dir_state::DDEFAULT; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
122 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
123 }, |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
124 dir_state::DH => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
125 if src[i] == b'g' { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
126 state = dir_state::DHGDI; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
127 dest.write_byte(src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
128 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
129 } else { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
130 state = dir_state::DDEFAULT; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
131 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
132 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
133 dir_state::DHGDI => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
134 if src[i] == b'/' { |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
135 dest.write_bytes(b".hg"); |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
136 dest.write_byte(src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
137 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
138 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
139 state = dir_state::DDEFAULT; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
140 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
141 dir_state::DDEFAULT => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
142 if src[i] == b'.' { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
143 state = dir_state::DDOT |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
144 } |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
145 dest.write_byte(src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
146 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
147 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
148 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
149 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
150 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
151 |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
152 fn _encode( |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
153 twobytes: &[u32; 8], |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
154 onebyte: &[u32; 8], |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
155 dest: &mut impl Sink, |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
156 src: &[u8], |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
157 encodedir: bool, |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
158 ) { |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
159 let mut state = path_state::START; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
160 let mut i = 0; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
161 let len = src.len(); |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
162 |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
163 while i < len { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
164 match state { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
165 path_state::START => match src[i] { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
166 b'/' => { |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
167 dest.write_byte(src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
168 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
169 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
170 b'.' => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
171 state = path_state::LDOT; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
172 escape3(dest, src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
173 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
174 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
175 b' ' => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
176 state = path_state::DEFAULT; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
177 escape3(dest, src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
178 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
179 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
180 b'a' => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
181 state = path_state::A; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
182 dest.write_byte(src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
183 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
184 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
185 b'c' => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
186 state = path_state::C; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
187 dest.write_byte(src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
188 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
189 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
190 b'l' => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
191 state = path_state::L; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
192 dest.write_byte(src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
193 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
194 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
195 b'n' => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
196 state = path_state::N; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
197 dest.write_byte(src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
198 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
199 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
200 b'p' => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
201 state = path_state::P; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
202 dest.write_byte(src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
203 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
204 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
205 _ => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
206 state = path_state::DEFAULT; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
207 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
208 }, |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
209 path_state::A => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
210 if src[i] == b'u' { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
211 state = path_state::AU; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
212 dest.write_byte(src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
213 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
214 } else { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
215 state = path_state::DEFAULT; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
216 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
217 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
218 path_state::AU => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
219 if src[i] == b'x' { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
220 state = path_state::THIRD; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
221 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
222 } else { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
223 state = path_state::DEFAULT; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
224 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
225 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
226 path_state::THIRD => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
227 state = path_state::DEFAULT; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
228 match src[i] { |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
229 b'.' | b'/' | b'\0' => escape3(dest, src[i - 1]), |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
230 _ => i -= 1, |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
231 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
232 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
233 path_state::C => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
234 if src[i] == b'o' { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
235 state = path_state::CO; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
236 dest.write_byte(src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
237 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
238 } else { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
239 state = path_state::DEFAULT; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
240 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
241 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
242 path_state::CO => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
243 if src[i] == b'm' { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
244 state = path_state::COMLPT; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
245 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
246 } else if src[i] == b'n' { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
247 state = path_state::THIRD; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
248 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
249 } else { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
250 state = path_state::DEFAULT; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
251 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
252 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
253 path_state::COMLPT => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
254 if src[i] >= b'1' && src[i] <= b'9' { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
255 state = path_state::COMLPTn; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
256 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
257 } else { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
258 state = path_state::DEFAULT; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
259 dest.write_byte(src[i - 1]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
260 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
261 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
262 path_state::COMLPTn => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
263 state = path_state::DEFAULT; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
264 match src[i] { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
265 b'.' | b'/' | b'\0' => { |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
266 escape3(dest, src[i - 2]); |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
267 dest.write_byte(src[i - 1]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
268 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
269 _ => { |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
270 dest.write_bytes(&src[i - 2..i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
271 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
272 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
273 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
274 path_state::L => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
275 if src[i] == b'p' { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
276 state = path_state::LP; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
277 dest.write_byte(src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
278 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
279 } else { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
280 state = path_state::DEFAULT; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
281 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
282 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
283 path_state::LP => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
284 if src[i] == b't' { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
285 state = path_state::COMLPT; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
286 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
287 } else { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
288 state = path_state::DEFAULT; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
289 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
290 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
291 path_state::N => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
292 if src[i] == b'u' { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
293 state = path_state::NU; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
294 dest.write_byte(src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
295 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
296 } else { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
297 state = path_state::DEFAULT; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
298 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
299 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
300 path_state::NU => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
301 if src[i] == b'l' { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
302 state = path_state::THIRD; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
303 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
304 } else { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
305 state = path_state::DEFAULT; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
306 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
307 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
308 path_state::P => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
309 if src[i] == b'r' { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
310 state = path_state::PR; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
311 dest.write_byte(src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
312 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
313 } else { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
314 state = path_state::DEFAULT; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
315 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
316 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
317 path_state::PR => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
318 if src[i] == b'n' { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
319 state = path_state::THIRD; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
320 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
321 } else { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
322 state = path_state::DEFAULT; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
323 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
324 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
325 path_state::LDOT => match src[i] { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
326 b'd' | b'i' => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
327 state = path_state::HGDI; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
328 dest.write_byte(src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
329 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
330 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
331 b'h' => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
332 state = path_state::H; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
333 dest.write_byte(src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
334 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
335 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
336 _ => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
337 state = path_state::DEFAULT; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
338 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
339 }, |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
340 path_state::DOT => match src[i] { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
341 b'/' | b'\0' => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
342 state = path_state::START; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
343 dest.write_bytes(b"~2e"); |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
344 dest.write_byte(src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
345 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
346 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
347 b'd' | b'i' => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
348 state = path_state::HGDI; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
349 dest.write_byte(b'.'); |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
350 dest.write_byte(src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
351 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
352 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
353 b'h' => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
354 state = path_state::H; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
355 dest.write_bytes(b".h"); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
356 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
357 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
358 _ => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
359 state = path_state::DEFAULT; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
360 dest.write_byte(b'.'); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
361 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
362 }, |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
363 path_state::H => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
364 if src[i] == b'g' { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
365 state = path_state::HGDI; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
366 dest.write_byte(src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
367 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
368 } else { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
369 state = path_state::DEFAULT; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
370 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
371 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
372 path_state::HGDI => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
373 if src[i] == b'/' { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
374 state = path_state::START; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
375 if encodedir { |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
376 dest.write_bytes(b".hg"); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
377 } |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
378 dest.write_byte(src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
379 i += 1 |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
380 } else { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
381 state = path_state::DEFAULT; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
382 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
383 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
384 path_state::SPACE => match src[i] { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
385 b'/' | b'\0' => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
386 state = path_state::START; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
387 dest.write_bytes(b"~20"); |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
388 dest.write_byte(src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
389 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
390 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
391 _ => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
392 state = path_state::DEFAULT; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
393 dest.write_byte(b' '); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
394 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
395 }, |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
396 path_state::DEFAULT => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
397 while i != len && inset(onebyte, src[i]) { |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
398 dest.write_byte(src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
399 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
400 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
401 if i == len { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
402 break; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
403 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
404 match src[i] { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
405 b'.' => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
406 state = path_state::DOT; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
407 i += 1 |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
408 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
409 b' ' => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
410 state = path_state::SPACE; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
411 i += 1 |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
412 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
413 b'/' => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
414 state = path_state::START; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
415 dest.write_byte(b'/'); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
416 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
417 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
418 _ => { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
419 if inset(onebyte, src[i]) { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
420 loop { |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
421 dest.write_byte(src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
422 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
423 if !(i < len && inset(onebyte, src[i])) { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
424 break; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
425 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
426 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
427 } else if inset(twobytes, src[i]) { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
428 let c = src[i]; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
429 i += 1; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
430 dest.write_byte(b'_'); |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
431 dest.write_byte(if c == b'_' { |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
432 b'_' |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
433 } else { |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
434 c + 32 |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
435 }); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
436 } else { |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
437 escape3(dest, src[i]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
438 i += 1; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
439 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
440 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
441 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
442 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
443 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
444 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
445 match state { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
446 path_state::START => (), |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
447 path_state::A => (), |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
448 path_state::AU => (), |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
449 path_state::THIRD => escape3(dest, src[i - 1]), |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
450 path_state::C => (), |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
451 path_state::CO => (), |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
452 path_state::COMLPT => dest.write_byte(src[i - 1]), |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
453 path_state::COMLPTn => { |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
454 escape3(dest, src[i - 2]); |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
455 dest.write_byte(src[i - 1]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
456 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
457 path_state::L => (), |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
458 path_state::LP => (), |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
459 path_state::N => (), |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
460 path_state::NU => (), |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
461 path_state::P => (), |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
462 path_state::PR => (), |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
463 path_state::LDOT => (), |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
464 path_state::DOT => { |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
465 dest.write_bytes(b"~2e"); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
466 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
467 path_state::H => (), |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
468 path_state::HGDI => (), |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
469 path_state::SPACE => { |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
470 dest.write_bytes(b"~20"); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
471 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
472 path_state::DEFAULT => (), |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
473 } |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
474 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
475 |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
476 fn basic_encode(dest: &mut impl Sink, src: &[u8]) { |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
477 let twobytes: [u32; 8] = [0, 0, 0x87ff_fffe, 0, 0, 0, 0, 0]; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
478 let onebyte: [u32; 8] = |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
479 [1, 0x2bff_3bfa, 0x6800_0001, 0x2fff_ffff, 0, 0, 0, 0]; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
480 _encode(&twobytes, &onebyte, dest, src, true) |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
481 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
482 |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
483 const MAXSTOREPATHLEN: usize = 120; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
484 |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
485 fn lower_encode(dest: &mut impl Sink, src: &[u8]) { |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
486 let onebyte: [u32; 8] = |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
487 [1, 0x2bff_fbfb, 0xe800_0001, 0x2fff_ffff, 0, 0, 0, 0]; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
488 let lower: [u32; 8] = [0, 0, 0x07ff_fffe, 0, 0, 0, 0, 0]; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
489 for c in src { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
490 if inset(&onebyte, *c) { |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
491 dest.write_byte(*c) |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
492 } else if inset(&lower, *c) { |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
493 dest.write_byte(*c + 32) |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
494 } else { |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
495 escape3(dest, *c) |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
496 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
497 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
498 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
499 |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
500 fn aux_encode(dest: &mut impl Sink, src: &[u8]) { |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
501 let twobytes = [0; 8]; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
502 let onebyte: [u32; 8] = [!0, 0xffff_3ffe, !0, !0, !0, !0, !0, !0]; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
503 _encode(&twobytes, &onebyte, dest, src, false) |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
504 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
505 |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
506 fn hash_mangle(src: &[u8], sha: &[u8]) -> Vec<u8> { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
507 let dirprefixlen = 8; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
508 let maxshortdirslen = 68; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
509 |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
510 let last_slash = src.iter().rposition(|b| *b == b'/'); |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
511 let last_dot: Option<usize> = { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
512 let s = last_slash.unwrap_or(0); |
49930
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47380
diff
changeset
|
513 src[s..].iter().rposition(|b| *b == b'.').map(|i| i + s) |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
514 }; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
515 |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
516 let mut dest_vec = vec![0; MAXSTOREPATHLEN]; |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
517 let mut dest = Dest::create(&mut dest_vec); |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
518 dest.write_bytes(b"dh/"); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
519 |
50096
06659dea51b0
rhg: fix a bug in path_encode
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50095
diff
changeset
|
520 if let Some(last_slash) = last_slash { |
06659dea51b0
rhg: fix a bug in path_encode
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50095
diff
changeset
|
521 for slice in src[..last_slash].split(|b| *b == b'/') { |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
522 let slice = &slice[..std::cmp::min(slice.len(), dirprefixlen)]; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
523 if dest.len + slice.len() > maxshortdirslen + 3 { |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
524 break; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
525 } else { |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
526 dest.write_bytes(slice); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
527 } |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
528 dest.write_byte(b'/'); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
529 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
530 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
531 |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
532 let used = dest.len + 40 + { |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
533 if let Some(l) = last_dot { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
534 src.len() - l |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
535 } else { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
536 0 |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
537 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
538 }; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
539 |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
540 if MAXSTOREPATHLEN > used { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
541 let slop = MAXSTOREPATHLEN - used; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
542 let basenamelen = match last_slash { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
543 Some(l) => src.len() - l - 1, |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
544 None => src.len(), |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
545 }; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
546 let basenamelen = std::cmp::min(basenamelen, slop); |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
547 if basenamelen > 0 { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
548 let start = match last_slash { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
549 Some(l) => l + 1, |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
550 None => 0, |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
551 }; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
552 dest.write_bytes(&src[start..][..basenamelen]) |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
553 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
554 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
555 for c in sha { |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
556 hexencode(&mut dest, *c); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
557 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
558 if let Some(l) = last_dot { |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
559 dest.write_bytes(&src[l..]); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
560 } |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
561 let destlen = dest.len; |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
562 if destlen == dest_vec.len() { |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
563 dest_vec |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
564 } else { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
565 // sometimes the path are shorter than MAXSTOREPATHLEN |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
566 dest_vec[..destlen].to_vec() |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
567 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
568 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
569 |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
570 const MAXENCODE: usize = 4096 * 4; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
571 fn hash_encode(src: &[u8]) -> Vec<u8> { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
572 let dired = &mut [0; MAXENCODE]; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
573 let mut dired_dest = Dest::create(dired); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
574 let lowered = &mut [0; MAXENCODE]; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
575 let mut lowered_dest = Dest::create(lowered); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
576 let auxed = &mut [0; MAXENCODE]; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
577 let mut auxed_dest = Dest::create(auxed); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
578 let baselen = (src.len() - 5) * 3; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
579 if baselen >= MAXENCODE { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
580 panic!("path_encode::hash_encore: string too long: {}", baselen) |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
581 }; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
582 encode_dir(&mut dired_dest, src); |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
583 let dirlen = dired_dest.len; |
47380
fad504cfc94b
rust: Use a maintained crate for SHA-1 hashing
Simon Sapin <simon.sapin@octobus.net>
parents:
45539
diff
changeset
|
584 let sha = Sha1::digest(&dired[..dirlen]); |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
585 lower_encode(&mut lowered_dest, &dired[..dirlen][5..]); |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
586 let lowerlen = lowered_dest.len; |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
587 aux_encode(&mut auxed_dest, &lowered[..lowerlen]); |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
588 let auxlen = auxed_dest.len; |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
589 hash_mangle(&auxed[..auxlen], &sha) |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
590 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
591 |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
592 pub fn path_encode(path: &[u8]) -> Vec<u8> { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
593 let newlen = if path.len() <= MAXSTOREPATHLEN { |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
594 let mut measure = Dest::create_measure(); |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
595 basic_encode(&mut measure, path); |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
596 measure.len |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
597 } else { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
598 MAXSTOREPATHLEN + 1 |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
599 }; |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
600 if newlen <= MAXSTOREPATHLEN { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
601 if newlen == path.len() { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
602 path.to_vec() |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
603 } else { |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
604 let mut res = vec![0; newlen]; |
50159
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
605 let mut dest = Dest::create(&mut res); |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
606 basic_encode(&mut dest, path); |
96d31efd21f7
rhg: reduce verbosity in path_encode by using a trait for writing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50158
diff
changeset
|
607 assert!(dest.len == newlen); |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
608 res |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
609 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
610 } else { |
49930
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47380
diff
changeset
|
611 hash_encode(path) |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
612 } |
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
613 } |
50095
362fe34702d5
rhg: demonstrate a bug in path_encode
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49930
diff
changeset
|
614 |
362fe34702d5
rhg: demonstrate a bug in path_encode
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49930
diff
changeset
|
615 #[cfg(test)] |
362fe34702d5
rhg: demonstrate a bug in path_encode
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49930
diff
changeset
|
616 mod tests { |
362fe34702d5
rhg: demonstrate a bug in path_encode
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49930
diff
changeset
|
617 use super::*; |
362fe34702d5
rhg: demonstrate a bug in path_encode
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49930
diff
changeset
|
618 use crate::utils::hg_path::HgPathBuf; |
362fe34702d5
rhg: demonstrate a bug in path_encode
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49930
diff
changeset
|
619 |
362fe34702d5
rhg: demonstrate a bug in path_encode
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49930
diff
changeset
|
620 #[test] |
362fe34702d5
rhg: demonstrate a bug in path_encode
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49930
diff
changeset
|
621 fn test_long_filename_at_root() { |
362fe34702d5
rhg: demonstrate a bug in path_encode
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49930
diff
changeset
|
622 let input = b"data/ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJ.i"; |
362fe34702d5
rhg: demonstrate a bug in path_encode
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49930
diff
changeset
|
623 let expected = b"dh/abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij.i708243a2237a7afae259ea3545a72a2ef11c247b.i"; |
362fe34702d5
rhg: demonstrate a bug in path_encode
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49930
diff
changeset
|
624 let res = path_encode(input); |
362fe34702d5
rhg: demonstrate a bug in path_encode
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49930
diff
changeset
|
625 assert_eq!( |
362fe34702d5
rhg: demonstrate a bug in path_encode
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49930
diff
changeset
|
626 HgPathBuf::from_bytes(&res), |
362fe34702d5
rhg: demonstrate a bug in path_encode
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49930
diff
changeset
|
627 HgPathBuf::from_bytes(expected) |
362fe34702d5
rhg: demonstrate a bug in path_encode
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49930
diff
changeset
|
628 ); |
362fe34702d5
rhg: demonstrate a bug in path_encode
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49930
diff
changeset
|
629 } |
362fe34702d5
rhg: demonstrate a bug in path_encode
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
49930
diff
changeset
|
630 } |