1
1
pub mod init {
2
2
#![ allow( unused) ]
3
3
4
- use crate :: file:: decode;
5
- use crate :: { File , State } ;
6
- use memmap2:: Mmap ;
7
4
use std:: path:: { Path , PathBuf } ;
8
5
6
+ use memmap2:: Mmap ;
7
+
8
+ use crate :: { extension, file:: header, File , State } ;
9
+
9
10
mod error {
10
- use crate :: file:: decode;
11
11
use quick_error:: quick_error;
12
12
13
+ use crate :: file:: header;
14
+
13
15
quick_error ! {
14
16
#[ derive( Debug ) ]
15
17
pub enum Error {
@@ -18,7 +20,7 @@ pub mod init {
18
20
source( err)
19
21
from( )
20
22
}
21
- DecodeHeader ( err: decode :: header :: Error ) {
23
+ DecodeHeader ( err: header :: decode :: Error ) {
22
24
display( "The header could not be understood" )
23
25
source( err)
24
26
from( )
@@ -39,8 +41,8 @@ pub mod init {
39
41
( data, filetime:: FileTime :: from_last_modification_time ( & file. metadata ( ) ?) )
40
42
} ;
41
43
42
- let ( version, num_entries, post_header_data) = decode :: header ( & data, object_hash) ?;
43
- let start_of_extensions = decode :: extension :: end_of_index_entry ( & data, object_hash) ;
44
+ let ( version, num_entries, post_header_data) = header :: decode ( & data, object_hash) ?;
45
+ let start_of_extensions = extension :: EndOfIndexEntry :: from_bytes ( & data, object_hash) ;
44
46
45
47
Ok ( File {
46
48
state : State { timestamp : mtime } ,
@@ -50,78 +52,40 @@ pub mod init {
50
52
}
51
53
}
52
54
53
- pub mod decode {
54
- use crate :: Version ;
55
-
56
- fn extension ( data : & [ u8 ] ) -> ( [ u8 ; 4 ] , u32 , & [ u8 ] ) {
57
- let ( signature, data) = data. split_at ( 4 ) ;
58
- let ( size, data) = data. split_at ( 4 ) ;
59
- ( signature. try_into ( ) . unwrap ( ) , read_u32 ( size) , data)
60
- }
61
-
62
- pub ( crate ) mod extension {
63
- use crate :: extension:: EndOfIndexEntry ;
64
- use crate :: file:: decode;
65
- use crate :: file:: decode:: read_u32;
66
-
67
- pub fn end_of_index_entry ( data : & [ u8 ] , object_hash : git_hash:: Kind ) -> Option < EndOfIndexEntry > {
68
- let hash_len = object_hash. len_in_bytes ( ) ;
69
- if data. len ( ) < EndOfIndexEntry :: SIZE_WITH_HEADER + hash_len {
70
- return None ;
71
- }
72
-
73
- let start_of_eoie = data. len ( ) - EndOfIndexEntry :: SIZE_WITH_HEADER - hash_len;
74
- let data = & data[ start_of_eoie..] [ ..hash_len] ;
55
+ pub mod header {
56
+ pub ( crate ) const SIZE : usize = 4 /*signature*/ + 4 /*version*/ + 4 /* num entries */ ;
75
57
76
- let ( signature, ext_size, data) = decode:: extension ( data) ;
77
- if & signature != EndOfIndexEntry :: SIGNATURE || ext_size as usize != EndOfIndexEntry :: SIZE {
78
- return None ;
79
- }
80
-
81
- let ( offset, hash) = data. split_at ( 4 ) ;
82
- let offset = read_u32 ( offset) as usize ;
83
- if offset < decode:: header:: SIZE {
84
- return None ;
85
- }
86
- todo ! ( "eoie" )
87
- }
88
- }
58
+ pub mod decode {
59
+ use quick_error:: quick_error;
89
60
90
- pub mod header {
91
- pub ( crate ) const SIZE : usize = 4 /*signature*/ + 4 /*version*/ + 4 /* num entries */ ;
92
-
93
- mod error {
94
- use quick_error:: quick_error;
95
-
96
- quick_error ! {
97
- #[ derive( Debug ) ]
98
- pub enum Error {
99
- Corrupt ( message: & ' static str ) {
100
- display( "{}" , message)
101
- }
102
- UnsupportedVersion ( version: u32 ) {
103
- display( "Index version {} is not supported" , version)
104
- }
61
+ quick_error ! {
62
+ #[ derive( Debug ) ]
63
+ pub enum Error {
64
+ Corrupt ( message: & ' static str ) {
65
+ display( "{}" , message)
66
+ }
67
+ UnsupportedVersion ( version: u32 ) {
68
+ display( "Index version {} is not supported" , version)
105
69
}
106
70
}
107
71
}
108
- pub use error:: Error ;
109
72
}
73
+ use crate :: { util:: read_u32, Version } ;
110
74
111
- pub ( crate ) fn header (
75
+ pub ( crate ) fn decode (
112
76
data : & [ u8 ] ,
113
77
object_hash : git_hash:: Kind ,
114
- ) -> Result < ( crate :: Version , u32 , & [ u8 ] ) , header :: Error > {
78
+ ) -> Result < ( crate :: Version , u32 , & [ u8 ] ) , decode :: Error > {
115
79
if data. len ( ) < ( 3 * 4 ) + object_hash. len_in_bytes ( ) {
116
- return Err ( header :: Error :: Corrupt (
80
+ return Err ( decode :: Error :: Corrupt (
117
81
"File is too small even for header with zero entries and smallest hash" ,
118
82
) ) ;
119
83
}
120
84
121
85
const SIGNATURE : & [ u8 ] = b"DIRC" ;
122
86
let ( signature, data) = data. split_at ( 4 ) ;
123
87
if signature != SIGNATURE {
124
- return Err ( header :: Error :: Corrupt (
88
+ return Err ( decode :: Error :: Corrupt (
125
89
"Signature mismatch - this doesn't claim to be a header file" ,
126
90
) ) ;
127
91
}
@@ -131,16 +95,11 @@ pub mod decode {
131
95
2 => Version :: V2 ,
132
96
3 => Version :: V3 ,
133
97
4 => Version :: V4 ,
134
- unknown => return Err ( header :: Error :: UnsupportedVersion ( unknown) ) ,
98
+ unknown => return Err ( decode :: Error :: UnsupportedVersion ( unknown) ) ,
135
99
} ;
136
100
let ( entries, data) = data. split_at ( 4 ) ;
137
101
let entries = read_u32 ( entries) ;
138
102
139
103
Ok ( ( version, entries, data) )
140
104
}
141
-
142
- #[ inline]
143
- fn read_u32 ( b : & [ u8 ] ) -> u32 {
144
- u32:: from_be_bytes ( b. try_into ( ) . unwrap ( ) )
145
- }
146
105
}
0 commit comments