Mercurial > hg
comparison rust/hg-core/src/dirstate_tree/on_disk.rs @ 48260:269ff8978086
dirstate: store mtimes with nanosecond precision in memory
Keep integer seconds since the Unix epoch,
together with integer nanoseconds in the `0 <= n < 1e9` range.
For now, nanoseconds are still always zero.
This commit is about data structure changes.
Differential Revision: https://phab.mercurial-scm.org/D11684
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Mon, 18 Oct 2021 11:23:07 +0200 |
parents | b874e8d81a98 |
children | 9205d9be8b41 |
comparison
equal
deleted
inserted
replaced
48259:84f6b0c41b90 | 48260:269ff8978086 |
---|---|
315 | 315 |
316 pub(super) fn node_data( | 316 pub(super) fn node_data( |
317 &self, | 317 &self, |
318 ) -> Result<dirstate_map::NodeData, DirstateV2ParseError> { | 318 ) -> Result<dirstate_map::NodeData, DirstateV2ParseError> { |
319 if self.has_entry() { | 319 if self.has_entry() { |
320 Ok(dirstate_map::NodeData::Entry(self.assume_entry())) | 320 Ok(dirstate_map::NodeData::Entry(self.assume_entry()?)) |
321 } else if let Some(mtime) = self.cached_directory_mtime()? { | 321 } else if let Some(mtime) = self.cached_directory_mtime()? { |
322 Ok(dirstate_map::NodeData::CachedDirectory { mtime }) | 322 Ok(dirstate_map::NodeData::CachedDirectory { mtime }) |
323 } else { | 323 } else { |
324 Ok(dirstate_map::NodeData::None) | 324 Ok(dirstate_map::NodeData::None) |
325 } | 325 } |
355 0o644 | 355 0o644 |
356 }; | 356 }; |
357 file_type | permisions | 357 file_type | permisions |
358 } | 358 } |
359 | 359 |
360 fn assume_entry(&self) -> DirstateEntry { | 360 fn assume_entry(&self) -> Result<DirstateEntry, DirstateV2ParseError> { |
361 // TODO: convert through raw bits instead? | 361 // TODO: convert through raw bits instead? |
362 let wdir_tracked = self.flags().contains(Flags::WDIR_TRACKED); | 362 let wdir_tracked = self.flags().contains(Flags::WDIR_TRACKED); |
363 let p1_tracked = self.flags().contains(Flags::P1_TRACKED); | 363 let p1_tracked = self.flags().contains(Flags::P1_TRACKED); |
364 let p2_info = self.flags().contains(Flags::P2_INFO); | 364 let p2_info = self.flags().contains(Flags::P2_INFO); |
365 let mode_size = if self.flags().contains(Flags::HAS_MODE_AND_SIZE) | 365 let mode_size = if self.flags().contains(Flags::HAS_MODE_AND_SIZE) |
370 None | 370 None |
371 }; | 371 }; |
372 let mtime = if self.flags().contains(Flags::HAS_FILE_MTIME) | 372 let mtime = if self.flags().contains(Flags::HAS_FILE_MTIME) |
373 && !self.flags().contains(Flags::EXPECTED_STATE_IS_MODIFIED) | 373 && !self.flags().contains(Flags::EXPECTED_STATE_IS_MODIFIED) |
374 { | 374 { |
375 Some(self.mtime.truncated_seconds.into()) | 375 // TODO: replace this by `self.mtime.try_into()?` to use |
376 // sub-second precision from the file. | |
377 // We don’t do this yet because other parts of the code | |
378 // always set it to zero. | |
379 let mtime = TruncatedTimestamp::from_already_truncated( | |
380 self.mtime.truncated_seconds.get(), | |
381 0, | |
382 )?; | |
383 Some(mtime) | |
376 } else { | 384 } else { |
377 None | 385 None |
378 }; | 386 }; |
379 DirstateEntry::from_v2_data( | 387 Ok(DirstateEntry::from_v2_data( |
380 wdir_tracked, | 388 wdir_tracked, |
381 p1_tracked, | 389 p1_tracked, |
382 p2_info, | 390 p2_info, |
383 mode_size, | 391 mode_size, |
384 mtime, | 392 mtime, |
385 None, | 393 None, |
386 None, | 394 None, |
387 ) | 395 )) |
388 } | 396 } |
389 | 397 |
390 pub(super) fn entry( | 398 pub(super) fn entry( |
391 &self, | 399 &self, |
392 ) -> Result<Option<DirstateEntry>, DirstateV2ParseError> { | 400 ) -> Result<Option<DirstateEntry>, DirstateV2ParseError> { |
393 if self.has_entry() { | 401 if self.has_entry() { |
394 Ok(Some(self.assume_entry())) | 402 Ok(Some(self.assume_entry()?)) |
395 } else { | 403 } else { |
396 Ok(None) | 404 Ok(None) |
397 } | 405 } |
398 } | 406 } |
399 | 407 |
448 } else { | 456 } else { |
449 0.into() | 457 0.into() |
450 }; | 458 }; |
451 let mtime = if let Some(m) = mtime_opt { | 459 let mtime = if let Some(m) = mtime_opt { |
452 flags.insert(Flags::HAS_FILE_MTIME); | 460 flags.insert(Flags::HAS_FILE_MTIME); |
453 PackedTruncatedTimestamp { | 461 m.into() |
454 truncated_seconds: m.into(), | |
455 nanoseconds: 0.into(), | |
456 } | |
457 } else { | 462 } else { |
458 PackedTruncatedTimestamp::null() | 463 PackedTruncatedTimestamp::null() |
459 }; | 464 }; |
460 if let Some(f_exec) = fallback_exec { | 465 if let Some(f_exec) = fallback_exec { |
461 flags.insert(Flags::HAS_FALLBACK_EXEC); | 466 flags.insert(Flags::HAS_FALLBACK_EXEC); |