equal
deleted
inserted
replaced
13 use crate::revlog::path_encode::path_encode; |
13 use crate::revlog::path_encode::path_encode; |
14 use crate::revlog::revlog::Revlog; |
14 use crate::revlog::revlog::Revlog; |
15 use crate::revlog::revlog::RevlogError; |
15 use crate::revlog::revlog::RevlogError; |
16 use crate::revlog::Revision; |
16 use crate::revlog::Revision; |
17 use crate::utils::hg_path::HgPathBuf; |
17 use crate::utils::hg_path::HgPathBuf; |
|
18 |
|
19 const METADATA_DELIMITER: [u8; 2] = [b'\x01', b'\n']; |
18 |
20 |
19 /// Kind of error encountered by `CatRev` |
21 /// Kind of error encountered by `CatRev` |
20 #[derive(Debug)] |
22 #[derive(Debug)] |
21 pub enum CatRevErrorKind { |
23 pub enum CatRevErrorKind { |
22 /// Error when reading a `revlog` file. |
24 /// Error when reading a `revlog` file. |
130 let file_log = Revlog::open(&revlog_index_path)?; |
132 let file_log = Revlog::open(&revlog_index_path)?; |
131 let file_node = hex::decode(&node_bytes) |
133 let file_node = hex::decode(&node_bytes) |
132 .map_err(|_| CatRevErrorKind::CorruptedRevlog)?; |
134 .map_err(|_| CatRevErrorKind::CorruptedRevlog)?; |
133 let file_rev = file_log.get_node_rev(&file_node)?; |
135 let file_rev = file_log.get_node_rev(&file_node)?; |
134 let data = file_log.get_rev_data(file_rev)?; |
136 let data = file_log.get_rev_data(file_rev)?; |
135 bytes.extend(data); |
137 if data.starts_with(&METADATA_DELIMITER) { |
|
138 let end_delimiter_position = data |
|
139 [METADATA_DELIMITER.len()..] |
|
140 .windows(METADATA_DELIMITER.len()) |
|
141 .position(|bytes| bytes == METADATA_DELIMITER); |
|
142 if let Some(position) = end_delimiter_position { |
|
143 let offset = METADATA_DELIMITER.len() * 2; |
|
144 bytes.extend(data[position + offset..].iter()); |
|
145 } |
|
146 } else { |
|
147 bytes.extend(data); |
|
148 } |
136 } |
149 } |
137 } |
150 } |
138 } |
151 } |
139 |
152 |
140 Ok(bytes) |
153 Ok(bytes) |