Unified · Split
| @@ -39,29 +39,38 @@ pub mod index { · 38 unmodified lines | |||
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | pub fn at(path: &Path) -> Result<File, Error> { | 41 | pub fn at(path: &Path) -> Result<File, Error> { |
| 42 | let d = FileBuffer::open(path) | 42 | let data = FileBuffer::open(path) |
| 43 | .with_context(|_| format!("Could not map file at '{}'", path.display()))?; | 43 | .with_context(|_| format!("Could not map file at '{}'", path.display()))?; |
| 44 | let idx_len = d.len(); | 44 | let idx_len = data.len(); |
| 45 | if idx_len < V2_SIGNATURE.len() + FOOTER_LEN { | 45 | if idx_len < V2_SIGNATURE.len() + FOOTER_LEN { |
| 46 | bail!("Pack index is truncated and not even empty"); | 46 | bail!("Pack index is truncated and not even empty"); |
| 47 | } | 47 | } |
| 48 | let kind = if &d[..V2_SIGNATURE.len()] == V2_SIGNATURE { | 48 | let (kind, version) = { |
| 49 | Kind::V2 | 49 | let (kind, d) = { |
| 50 | } else { | 50 | let (sig, d) = data.split_at(V2_SIGNATURE.len()); |
| 51 | Kind::V1 | 51 | let kind = if sig == V2_SIGNATURE { |
| 52 | }; | 52 | Kind::V2 |
| 53 | let version = { | 53 | } else { |
| 54 | let mut v = 1; | 54 | Kind::V1 |
| 55 | if let &Kind::V2 = &kind { | 55 | }; |
| 56 | v = BigEndian::read_u32(&d[V2_SIGNATURE.len()..V2_SIGNATURE.len() + N32_SIZE]); | 56 | (kind, d) |
| 57 | if v != 2 { | 57 | }; |
| 58 | bail!("Unsupported index version: {}", v); | 58 | let (version, d) = { |
| 59 | let (mut v, mut d) = (1, d); | ||
| 60 | if let &Kind::V2 = &kind { | ||
| 61 | let (vd, dr) = d.split_at(N32_SIZE); | ||
| 62 | d = dr; | ||
| 63 | v = BigEndian::read_u32(vd); | ||
| 64 | if v != 2 { | ||
| 65 | bail!("Unsupported index version: {}", v); | ||
| 66 | } | ||
| 59 | } | 67 | } |
| 60 | } | 68 | (v, d) |
| 61 | v | 69 | }; |
| 70 | (kind, version) | ||
| 62 | }; | 71 | }; |
| 63 | Ok(File { | 72 | Ok(File { |
| 64 | _data: d, | 73 | _data: data, |
| 65 | kind, | 74 | kind, |
| 66 | len: 0, | 75 | len: 0, |
| 67 | version, | 76 | version, |