@@ -18,7 +18,7 @@ use std::io::BufWriter;
18
18
use std:: io:: Read ;
19
19
use std:: io:: Write ;
20
20
21
- const VERSION : u32 = 2 ;
21
+ const VERSION : u32 = 3 ;
22
22
23
23
/// Files are identified by integers that are stable across n2 executions.
24
24
#[ derive( Debug , Clone , Copy , Serialize , Deserialize ) ]
@@ -80,13 +80,25 @@ impl Writer {
80
80
} )
81
81
}
82
82
83
+ fn read_entry ( reader : & mut BufReader < & mut File > ) -> bincode:: Result < Option < DbEntry > > {
84
+ let result = bincode:: deserialize_from ( reader) ;
85
+ if let Err ( boxed) = & result {
86
+ if let bincode:: ErrorKind :: Io ( err) = boxed. as_ref ( ) {
87
+ if err. kind ( ) == std:: io:: ErrorKind :: UnexpectedEof {
88
+ return Ok ( None ) ;
89
+ }
90
+ }
91
+ }
92
+ result. map ( Some )
93
+ }
94
+
83
95
fn open ( mut f : File , graph : & mut Graph , hashes : & mut Hashes ) -> anyhow:: Result < Self > {
84
96
let mut reader = BufReader :: with_capacity ( 1usize << 16 , & mut f) ;
85
97
read_signature ( & mut reader) ?;
86
98
let mut ids = IdMap :: default ( ) ;
87
99
88
- for entry in serde_cbor :: Deserializer :: from_reader ( & mut reader) . into_iter ( ) {
89
- match entry? {
100
+ while let Some ( entry) = Self :: read_entry ( & mut reader) ? {
101
+ match entry {
90
102
DbEntry :: File ( mut name) => {
91
103
let file_id = graph. file_id ( & mut name) ;
92
104
let db_id = ids. fileids . push ( file_id) ;
@@ -128,7 +140,7 @@ impl Writer {
128
140
let id = self . ids . fileids . push ( fileid) ;
129
141
self . ids . db_ids . insert ( fileid, id) ;
130
142
let entry = DbEntry :: File ( graph. file ( fileid) . name . to_owned ( ) ) ;
131
- serde_cbor :: ser :: to_writer ( & mut self . w , & entry) ?;
143
+ bincode :: serialize_into ( & mut self . w , & entry) ?;
132
144
id
133
145
}
134
146
} ;
@@ -148,7 +160,7 @@ impl Writer {
148
160
. map ( |& file_id| self . ensure_id ( graph, file_id) )
149
161
. collect :: < anyhow:: Result < Vec < _ > > > ( ) ?;
150
162
let entry = DbEntry :: Build { outs, deps, hash } ;
151
- serde_cbor :: ser :: to_writer ( & mut self . w , & entry) ?;
163
+ bincode :: serialize_into ( & mut self . w , & entry) ?;
152
164
self . w . flush ( ) ?;
153
165
Ok ( ( ) )
154
166
}
0 commit comments