rust/hg-core/src/operations/cat.rs
changeset 45804 6991f3014311
parent 45541 522ec3dc44b9
child 45806 7252f5237352
equal deleted inserted replaced
45803:84eb4c833c41 45804:6991f3014311
    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)