--- a/mercurial/helptext/internals/dirstate-v2.txt Wed Oct 13 15:58:14 2021 +0200
+++ b/mercurial/helptext/internals/dirstate-v2.txt Tue Oct 19 18:18:05 2021 +0200
@@ -379,8 +379,8 @@
P1_TRACKED = 1 << 1
P2_INFO = 1 << 2
HAS_MODE_AND_SIZE = 1 << 3
- HAS_FILE_MTIME = 1 << 4
- HAS_DIRECTORY_MTIME = 1 << 5
+ HAS_MTIME = 1 << 4
+ DIRECTORY = 1 << 5
MODE_EXEC_PERM = 1 << 6
MODE_IS_SYMLINK = 1 << 7
EXPECTED_STATE_IS_MODIFIED = 1 << 8
@@ -477,37 +477,45 @@
If this is unset the expected size, permission, and file type are unknown.
The `size` field is unused (set to zero).
-`HAS_FILE_MTIME`
- Must be unset for untracked nodes.
- If this and `HAS_DIRECTORY_MTIME` are both unset,
- the `mtime` field is unused (set to zero).
- If this is set, `mtime` is the expected modification time.
+`HAS_MTIME`
+ The nodes contains a "valid" last modification time in the `mtime` field.
+
-`HAS_DIRECTORY_MTIME`
- Must be unset for file tracked anywhere.
- If this and `HAS_DIRECTORY_MTIME` are both unset,
- the `mtime` field is unused (set to zero).
- If this is set, at some point,
- this path in the working directory was observed:
-
- - To be a directory
- - With the modification time given in `mtime`
- - That time was already strictly in the past when observed,
- meaning that later changes cannot happen in the same clock tick
- and must cause a different modification time
- (unless the system clock jumps back and we get unlucky,
- which is not impossible but deemed unlikely enough).
- - All direct children of this directory
- (as returned by `std::fs::read_dir`)
- either have a corresponding dirstate node,
- or are ignored by ignore patterns whose hash is in tree metadata.
+ It means the `mtime` was already strictly in the past when observed,
+ meaning that later changes cannot happen in the same clock tick
+ and must cause a different modification time
+ (unless the system clock jumps back and we get unlucky,
+ which is not impossible but deemed unlikely enough).
This means that if `std::fs::symlink_metadata` later reports
the same modification time
and ignored patterns haven’t changed,
- a run of status that is not listing ignored files
- can skip calling `std::fs::read_dir` again for this directory,
+ we can assume the node to be unchanged on disk.
+
+ The `mtime` field can then be used to skip more expensive lookup when
+ checking the status of "tracked" nodes.
+
+ It can also be set for node where `DIRECTORY` is set.
+ See `DIRECTORY` documentation for details.
+
+`DIRECTORY`
+ When set, this entry will match a directory that exists or existed on the
+ file system.
+
+ * When `HAS_MTIME` is set a directory has been seen on the file system and
+ `mtime` matches its last modificiation time. However, `HAS_MTIME` not being set
+ does not indicate the lack of directory on the file system.
+
+ * When not tracked anywhere, this node does not represent an ignored or
+ unknown file on disk.
+
+ If `HAS_MTIME` is set
+ and `mtime` matches the last modification time of the directory on disk,
+ the directory is unchanged
+ and we can skip calling `std::fs::read_dir` again for this directory,
and iterate child dirstate nodes instead.
+ (as long as `ALL_UNKNOWN_RECORDED` and `ALL_IGNORED_RECORDED` are taken
+ into account)
`MODE_EXEC_PERM`
Must be unset if `HAS_MODE_AND_SIZE` is unset.
@@ -525,7 +533,7 @@
Must be unset for untracked nodes.
For:
- a file tracked anywhere
- - that has expected metadata (`HAS_MODE_AND_SIZE` and `HAS_FILE_MTIME`)
+ - that has expected metadata (`HAS_MODE_AND_SIZE` and `HAS_MTIME`)
- if that metadata matches
metadata found in the working directory with `stat`
This bit indicates the status of the file.
@@ -541,7 +549,7 @@
`ALL_UNKNOWN_RECORDED`
If set, all "unknown" children existing on disk (at the time of the last
status) have been recorded and the `mtime` associated with
- `HAS_DIRECTORY_MTIME` can be used for optimization even when "unknown" file
+ `DIRECTORY` can be used for optimization even when "unknown" file
are listed.
Note that the amount recorded "unknown" children can still be zero if None
@@ -554,7 +562,7 @@
`ALL_IGNORED_RECORDED`
If set, all "ignored" children existing on disk (at the time of the last
status) have been recorded and the `mtime` associated with
- `HAS_DIRECTORY_MTIME` can be used for optimization even when "ignored" file
+ `DIRECTORY` can be used for optimization even when "ignored" file
are listed.
Note that the amount recorded "ignored" children can still be zero if None