rust/hg-core/src/repo.rs
branchstable
changeset 49145 dd2503a63d33
parent 49000 dd6b67d5c256
child 49146 802e2c25dab8
equal deleted inserted replaced
49068:90e564882f07 49145:dd2503a63d33
   436         let parents = self.dirstate_parents()?;
   436         let parents = self.dirstate_parents()?;
   437         let packed_dirstate = if self.has_dirstate_v2() {
   437         let packed_dirstate = if self.has_dirstate_v2() {
   438             let uuid = self.dirstate_data_file_uuid.get_or_init(self)?;
   438             let uuid = self.dirstate_data_file_uuid.get_or_init(self)?;
   439             let mut uuid = uuid.as_ref();
   439             let mut uuid = uuid.as_ref();
   440             let can_append = uuid.is_some();
   440             let can_append = uuid.is_some();
   441             let (data, tree_metadata, append) = map.pack_v2(can_append)?;
   441             let (data, tree_metadata, append, old_data_size) =
       
   442                 map.pack_v2(can_append)?;
   442             if !append {
   443             if !append {
   443                 uuid = None
   444                 uuid = None
   444             }
   445             }
   445             let uuid = if let Some(uuid) = uuid {
   446             let uuid = if let Some(uuid) = uuid {
   446                 std::str::from_utf8(uuid)
   447                 std::str::from_utf8(uuid)
   462             let data_size = (|| {
   463             let data_size = (|| {
   463                 // TODO: loop and try another random ID if !append and this
   464                 // TODO: loop and try another random ID if !append and this
   464                 // returns `ErrorKind::AlreadyExists`? Collision chance of two
   465                 // returns `ErrorKind::AlreadyExists`? Collision chance of two
   465                 // random IDs is one in 2**32
   466                 // random IDs is one in 2**32
   466                 let mut file = options.open(&data_filename)?;
   467                 let mut file = options.open(&data_filename)?;
   467                 file.write_all(&data)?;
   468                 if data.is_empty() {
   468                 file.flush()?;
   469                     // If we're not appending anything, the data size is the
   469                 // TODO: use https://doc.rust-lang.org/std/io/trait.Seek.html#method.stream_position when we require Rust 1.51+
   470                     // same as in the previous docket. It is *not* the file
   470                 file.seek(SeekFrom::Current(0))
   471                     // length, since it could have garbage at the end.
       
   472                     // We don't have to worry about it when we do have data
       
   473                     // to append since we rewrite the root node in this case.
       
   474                     Ok(old_data_size as u64)
       
   475                 } else {
       
   476                     file.write_all(&data)?;
       
   477                     file.flush()?;
       
   478                     // TODO: use https://doc.rust-lang.org/std/io/trait.Seek.html#method.stream_position when we require Rust 1.51+
       
   479                     file.seek(SeekFrom::Current(0))
       
   480                 }
   471             })()
   481             })()
   472             .when_writing_file(&data_filename)?;
   482             .when_writing_file(&data_filename)?;
   473             DirstateDocket::serialize(
   483             DirstateDocket::serialize(
   474                 parents,
   484                 parents,
   475                 tree_metadata,
   485                 tree_metadata,