mercurial/helptext/internals/dirstate-v2.txt
author Simon Sapin <simon.sapin@octobus.net>
Thu, 14 Oct 2021 16:06:31 +0200
changeset 48231 0524c1359bfc
parent 48219 308d9c245337
child 48232 f7fd629ffb98
permissions -rw-r--r--
dirstate-v2: Extend node flags to 16 bits Only 7 out of 8 available bits are used right now. Reserve some more. Future versions of Mercurial may assign meaning to some of these bits, with the limitation that then-older versions will always reset those bits to unset when writing nodes. (A new node is written for any mutation in its subtree, leaving the bytes of the old node unreachable until the data file is rewritten entirely.) Differential Revision: https://phab.mercurial-scm.org/D11661
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
48166
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
     1
The *dirstate* is what Mercurial uses internally to track
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
     2
the state of files in the working directory,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
     3
such as set by commands like `hg add` and `hg rm`.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
     4
It also contains some cached data that help make `hg status` faster.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
     5
The name refers both to `.hg/dirstate` on the filesystem
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
     6
and the corresponding data structure in memory while a Mercurial process
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
     7
is running.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
     8
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
     9
The original file format, retroactively dubbed `dirstate-v1`,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    10
is described at https://www.mercurial-scm.org/wiki/DirState.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    11
It is made of a flat sequence of unordered variable-size entries,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    12
so accessing any information in it requires parsing all of it.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    13
Similarly, saving changes requires rewriting the entire file.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    14
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    15
The newer `dirsate-v2` file format is designed to fix these limitations
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    16
and make `hg status` faster.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    17
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    18
User guide
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    19
==========
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    20
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    21
Compatibility
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    22
-------------
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    23
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    24
The file format is experimental and may still change.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    25
Different versions of Mercurial may not be compatible with each other
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    26
when working on a local repository that uses this format.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    27
When using an incompatible version with the experimental format,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    28
anything can happen including data corruption.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    29
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    30
Since the dirstate is entirely local and not relevant to the wire protocol,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    31
`dirstate-v2` does not affect compatibility with remote Mercurial versions.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    32
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    33
When `share-safe` is enabled, different repositories sharing the same store
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    34
can use different dirstate formats.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    35
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    36
Enabling `dirsate-v2` for new local repositories
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    37
------------------------------------------------
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    38
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    39
When creating a new local repository such as with `hg init` or `hg clone`,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    40
the `exp-dirstate-v2` boolean in the `format` configuration section
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    41
controls whether to use this file format.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    42
This is disabled by default as of this writing.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    43
To enable it for a single repository, run for example::
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    44
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    45
    $ hg init my-project --config format.exp-dirstate-v2=1
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    46
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    47
Checking the format of an existing local repsitory
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    48
--------------------------------------------------
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    49
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    50
The `debugformat` commands prints information about
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    51
which of multiple optional formats are used in the current repository,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    52
including `dirstate-v2`::
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    53
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    54
    $ hg debugformat
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    55
    format-variant     repo
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    56
    fncache:            yes
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    57
    dirstate-v2:        yes
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    58
    […]
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    59
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    60
Upgrading or downgrading an existing local repository
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    61
-----------------------------------------------------
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    62
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    63
The `debugupgrade` command does various upgrades or downgrades
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    64
on a local repository
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    65
based on the current Mercurial version and on configuration.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    66
The same `format.exp-dirstate-v2` configuration is used again.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    67
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    68
Example to upgrade::
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    69
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    70
    $ hg debugupgrade --config format.exp-dirstate-v2=1
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    71
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    72
Example to downgrade to `dirstate-v1`::
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    73
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    74
    $ hg debugupgrade --config format.exp-dirstate-v2=0
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    75
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    76
Both of this commands do nothing but print a list of proposed changes,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    77
which may include changes unrelated to the dirstate.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    78
Those other changes are controlled by their own configuration keys.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    79
Add `--run` to a command to actually apply the proposed changes.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    80
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    81
Backups of `.hg/requires` and `.hg/dirstate` are created
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    82
in a `.hg/upgradebackup.*` directory.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    83
If something goes wrong, restoring those files should undo the change.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    84
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    85
Note that upgrading affects compatibility with older versions of Mercurial
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    86
as noted above.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    87
This can be relevant when a repository’s files are on a USB drive
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    88
or some other removable media, or shared over the network, etc.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    89
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    90
Internal filesystem representation
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    91
==================================
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    92
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    93
Requirements file
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    94
-----------------
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    95
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    96
The `.hg/requires` file indicates which of various optional file formats
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    97
are used by a given repository.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    98
Mercurial aborts when seeing a requirement it does not know about,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    99
which avoids older version accidentally messing up a respository
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   100
that uses a format that was introduced later.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   101
For versions that do support a format, the presence or absence of
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   102
the corresponding requirement indicates whether to use that format.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   103
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   104
When the file contains a `exp-dirstate-v2` line,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   105
the `dirstate-v2` format is used.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   106
With no such line `dirstate-v1` is used.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   107
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   108
High level description
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   109
----------------------
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   110
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   111
Whereas `dirstate-v1` uses a single `.hg/disrtate` file,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   112
in `dirstate-v2` that file is a "docket" file
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   113
that only contains some metadata
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   114
and points to separate data file named `.hg/dirstate.{ID}`,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   115
where `{ID}` is a random identifier.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   116
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   117
This separation allows making data files append-only
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   118
and therefore safer to memory-map.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   119
Creating a new data file (occasionally to clean up unused data)
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   120
can be done with a different ID
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   121
without disrupting another Mercurial process
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   122
that could still be using the previous data file.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   123
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   124
Both files have a format designed to reduce the need for parsing,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   125
by using fixed-size binary components as much as possible.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   126
For data that is not fixed-size,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   127
references to other parts of a file can be made by storing "pseudo-pointers":
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   128
integers counted in bytes from the start of a file.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   129
For read-only access no data structure is needed,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   130
only a bytes buffer (possibly memory-mapped directly from the filesystem)
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   131
with specific parts read on demand.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   132
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   133
The data file contains "nodes" organized in a tree.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   134
Each node represents a file or directory inside the working directory
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   135
or its parent changeset.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   136
This tree has the same structure as the filesystem,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   137
so a node representing a directory has child nodes representing
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   138
the files and subdirectories contained directly in that directory.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   139
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   140
The docket file format
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   141
----------------------
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   142
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   143
This is implemented in `rust/hg-core/src/dirstate_tree/on_disk.rs`
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   144
and `mercurial/dirstateutils/docket.py`.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   145
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   146
Components of the docket file are found at fixed offsets,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   147
counted in bytes from the start of the file:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   148
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   149
* Offset 0:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   150
  The 12-bytes marker string "dirstate-v2\n" ending with a newline character.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   151
  This makes it easier to tell a dirstate-v2 file from a dirstate-v1 file,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   152
  although it is not strictly necessary
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   153
  since `.hg/requires` determines which format to use.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   154
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   155
* Offset 12:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   156
  The changeset node ID on the first parent of the working directory,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   157
  as up to 32 binary bytes.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   158
  If a node ID is shorter (20 bytes for SHA-1),
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   159
  it is start-aligned and the rest of the bytes are set to zero.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   160
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   161
* Offset 44:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   162
  The changeset node ID on the second parent of the working directory,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   163
  or all zeros if there isn’t one.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   164
  Also 32 binary bytes.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   165
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   166
* Offset 76:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   167
  Tree metadata on 44 bytes, described below.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   168
  Its separation in this documentation from the rest of the docket
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   169
  reflects a detail of the current implementation.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   170
  Since tree metadata is also made of fields at fixed offsets, those could
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   171
  be inlined here by adding 76 bytes to each offset.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   172
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   173
* Offset 120:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   174
  The used size of the data file, as a 32-bit big-endian integer.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   175
  The actual size of the data file may be larger
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   176
  (if another Mercurial processis in appending to it
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   177
  but has not updated the docket yet).
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   178
  That extra data must be ignored.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   179
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   180
* Offset 124:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   181
  The length of the data file identifier, as a 8-bit integer.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   182
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   183
* Offset 125:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   184
  The data file identifier.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   185
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   186
* Any additional data is current ignored, and dropped when updating the file.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   187
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   188
Tree metadata in the docket file
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   189
--------------------------------
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   190
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   191
Tree metadata is similarly made of components at fixed offsets.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   192
These offsets are counted in bytes from the start of tree metadata,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   193
which is 76 bytes after the start of the docket file.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   194
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   195
This metadata can be thought of as the singular root of the tree
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   196
formed by nodes in the data file.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   197
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   198
* Offset 0:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   199
  Pseudo-pointer to the start of root nodes,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   200
  counted in bytes from the start of the data file,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   201
  as a 32-bit big-endian integer.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   202
  These nodes describe files and directories found directly
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   203
  at the root of the working directory.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   204
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   205
* Offset 4:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   206
  Number of root nodes, as a 32-bit big-endian integer.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   207
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   208
* Offset 8:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   209
  Total number of nodes in the entire tree that "have a dirstate entry",
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   210
  as a 32-bit big-endian integer.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   211
  Those nodes represent files that would be present at all in `dirstate-v1`.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   212
  This is typically less than the total number of nodes.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   213
  This counter is used to implement `len(dirstatemap)`.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   214
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   215
* Offset 12:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   216
  Number of nodes in the entire tree that have a copy source,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   217
  as a 32-bit big-endian integer.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   218
  At the next commit, these files are recorded
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   219
  as having been copied or moved/renamed from that source.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   220
  (A move is recorded as a copy and separate removal of the source.)
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   221
  This counter is used to implement `len(dirstatemap.copymap)`.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   222
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   223
* Offset 16:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   224
  An estimation of how many bytes of the data file
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   225
  (within its used size) are unused, as a 32-bit big-endian integer.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   226
  When appending to an existing data file,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   227
  some existing nodes or paths can be unreachable from the new root
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   228
  but they still take up space.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   229
  This counter is used to decide when to write a new data file from scratch
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   230
  instead of appending to an existing one,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   231
  in order to get rid of that unreachable data
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   232
  and avoid unbounded file size growth.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   233
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   234
* Offset 20:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   235
  These four bytes are currently ignored
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   236
  and reset to zero when updating a docket file.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   237
  This is an attempt at forward compatibility:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   238
  future Mercurial versions could use this as a bit field
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   239
  to indicate that a dirstate has additional data or constraints.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   240
  Finding a dirstate file with the relevant bit unset indicates that
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   241
  it was written by a then-older version
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   242
  which is not aware of that future change.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   243
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   244
* Offset 24:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   245
  Either 20 zero bytes, or a SHA-1 hash as 20 binary bytes.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   246
  When present, the hash is of ignore patterns
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   247
  that were used for some previous run of the `status` algorithm.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   248
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   249
* (Offset 44: end of tree metadata)
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   250
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   251
Optional hash of ignore patterns
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   252
--------------------------------
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   253
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   254
The implementation of `status` at `rust/hg-core/src/dirstate_tree/status.rs`
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   255
has been optimized such that its run time is dominated by calls
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   256
to `stat` for reading the filesystem metadata of a file or directory,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   257
and to `readdir` for listing the contents of a directory.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   258
In some cases the algorithm can skip calls to `readdir`
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   259
(saving significant time)
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   260
because the dirstate already contains enough of the relevant information
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   261
to build the correct `status` results.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   262
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   263
The default configuration of `hg status` is to list unknown files
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   264
but not ignored files.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   265
In this case, it matters for the `readdir`-skipping optimization
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   266
if a given file used to be ignored but became unknown
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   267
because `.hgignore` changed.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   268
To detect the possibility of such a change,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   269
the tree metadata contains an optional hash of all ignore patterns.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   270
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   271
We define:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   272
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   273
* "Root" ignore files as:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   274
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   275
  - `.hgignore` at the root of the repository if it exists
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   276
  - And all files from `ui.ignore.*` config.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   277
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   278
  This set of files is sorted by the string representation of their path.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   279
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   280
* The "expanded contents" of an ignore files is the byte string made
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   281
  by the concatenation of its contents followed by the "expanded contents"
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   282
  of other files included with `include:` or `subinclude:` directives,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   283
  in inclusion order. This definition is recursive, as included files can
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   284
  themselves include more files.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   285
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   286
This hash is defined as the SHA-1 of the concatenation (in sorted
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   287
order) of the "expanded contents" of each "root" ignore file.
48183
eb8092f9304f dirstate-v2: Use "byte sequence" in docs
Simon Sapin <simon.sapin@octobus.net>
parents: 48166
diff changeset
   288
(Note that computing this does not require actually concatenating
eb8092f9304f dirstate-v2: Use "byte sequence" in docs
Simon Sapin <simon.sapin@octobus.net>
parents: 48166
diff changeset
   289
into a single contiguous byte sequence.
eb8092f9304f dirstate-v2: Use "byte sequence" in docs
Simon Sapin <simon.sapin@octobus.net>
parents: 48166
diff changeset
   290
Instead a SHA-1 hasher object can be created
eb8092f9304f dirstate-v2: Use "byte sequence" in docs
Simon Sapin <simon.sapin@octobus.net>
parents: 48166
diff changeset
   291
and fed separate chunks one by one.)
48166
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   292
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   293
The data file format
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   294
--------------------
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   295
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   296
This is implemented in `rust/hg-core/src/dirstate_tree/on_disk.rs`
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   297
and `mercurial/dirstateutils/v2.py`.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   298
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   299
The data file contains two types of data: paths and nodes.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   300
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   301
Paths and nodes can be organized in any order in the file, except that sibling
48183
eb8092f9304f dirstate-v2: Use "byte sequence" in docs
Simon Sapin <simon.sapin@octobus.net>
parents: 48166
diff changeset
   302
nodes must be next to each other and sorted by their path.
eb8092f9304f dirstate-v2: Use "byte sequence" in docs
Simon Sapin <simon.sapin@octobus.net>
parents: 48166
diff changeset
   303
Contiguity lets the parent refer to them all
eb8092f9304f dirstate-v2: Use "byte sequence" in docs
Simon Sapin <simon.sapin@octobus.net>
parents: 48166
diff changeset
   304
by their count and a single pseudo-pointer,
eb8092f9304f dirstate-v2: Use "byte sequence" in docs
Simon Sapin <simon.sapin@octobus.net>
parents: 48166
diff changeset
   305
instead of storing one pseudo-pointer per child node.
eb8092f9304f dirstate-v2: Use "byte sequence" in docs
Simon Sapin <simon.sapin@octobus.net>
parents: 48166
diff changeset
   306
Sorting allows using binary seach to find a child node with a given name
eb8092f9304f dirstate-v2: Use "byte sequence" in docs
Simon Sapin <simon.sapin@octobus.net>
parents: 48166
diff changeset
   307
in `O(log(n))` byte sequence comparisons.
48166
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   308
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   309
The current implemention writes paths and child node before a given node
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   310
for ease of figuring out the value of pseudo-pointers by the time the are to be
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   311
written, but this is not an obligation and readers must not rely on it.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   312
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   313
A path is stored as a byte string anywhere in the file, without delimiter.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   314
It is refered to by one or more node by a pseudo-pointer to its start, and its
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   315
length in bytes. Since there is no delimiter,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   316
when a path is a substring of another the same bytes could be reused,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   317
although the implementation does not exploit this as of this writing.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   318
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   319
A node is stored on 43 bytes with components at fixed offsets. Paths and
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   320
child nodes relevant to a node are stored externally and referenced though
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   321
pseudo-pointers.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   322
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   323
All integers are stored in big-endian. All pseudo-pointers are 32-bit integers
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   324
counting bytes from the start of the data file. Path lengths and positions
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   325
are 16-bit integers, also counted in bytes.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   326
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   327
Node components are:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   328
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   329
* Offset 0:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   330
  Pseudo-pointer to the full path of this node,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   331
  from the working directory root.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   332
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   333
* Offset 4:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   334
  Length of the full path.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   335
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   336
* Offset 6:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   337
  Position of the last `/` path separator within the full path,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   338
  in bytes from the start of the full path,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   339
  or zero if there isn’t one.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   340
  The part of the full path after this position is the "base name".
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   341
  Since sibling nodes have the same parent, only their base name vary
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   342
  and needs to be considered when doing binary search to find a given path.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   343
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   344
* Offset 8:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   345
  Pseudo-pointer to the "copy source" path for this node,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   346
  or zero if there is no copy source.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   347
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   348
* Offset 12:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   349
  Length of the copy source path, or zero if there isn’t one.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   350
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   351
* Offset 14:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   352
  Pseudo-pointer to the start of child nodes.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   353
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   354
* Offset 18:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   355
  Number of child nodes, as a 32-bit integer.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   356
  They occupy 43 times this number of bytes
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   357
  (not counting space for paths, and further descendants).
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   358
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   359
* Offset 22:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   360
  Number as a 32-bit integer of descendant nodes in this subtree,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   361
  not including this node itself,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   362
  that "have a dirstate entry".
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   363
  Those nodes represent files that would be present at all in `dirstate-v1`.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   364
  This is typically less than the total number of descendants.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   365
  This counter is used to implement `has_dir`.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   366
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   367
* Offset 26:
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   368
  Number as a 32-bit integer of descendant nodes in this subtree,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   369
  not including this node itself,
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   370
  that represent files tracked in the working directory.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   371
  (For example, `hg rm` makes a file untracked.)
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   372
  This counter is used to implement `has_tracked_dir`.
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   373
48188
77fc340acad7 dirstate-v2: Document flags/mode/size/mtime fields of tree nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 48183
diff changeset
   374
* Offset 30:
48231
0524c1359bfc dirstate-v2: Extend node flags to 16 bits
Simon Sapin <simon.sapin@octobus.net>
parents: 48219
diff changeset
   375
  A `flags` fields  that packs some boolean values as bits of a 16-bit integer.
48188
77fc340acad7 dirstate-v2: Document flags/mode/size/mtime fields of tree nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 48183
diff changeset
   376
  Starting from least-significant, bit masks are::
77fc340acad7 dirstate-v2: Document flags/mode/size/mtime fields of tree nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 48183
diff changeset
   377
77fc340acad7 dirstate-v2: Document flags/mode/size/mtime fields of tree nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 48183
diff changeset
   378
    WDIR_TRACKED = 1 << 0
77fc340acad7 dirstate-v2: Document flags/mode/size/mtime fields of tree nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 48183
diff changeset
   379
    P1_TRACKED = 1 << 1
77fc340acad7 dirstate-v2: Document flags/mode/size/mtime fields of tree nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 48183
diff changeset
   380
    P2_INFO = 1 << 2
77fc340acad7 dirstate-v2: Document flags/mode/size/mtime fields of tree nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 48183
diff changeset
   381
    HAS_MODE_AND_SIZE = 1 << 3
77fc340acad7 dirstate-v2: Document flags/mode/size/mtime fields of tree nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 48183
diff changeset
   382
    HAS_MTIME = 1 << 4
48195
4d5a13253d34 dirstate-v2: Replace the 32-bit `mode` field with two bits
Simon Sapin <simon.sapin@octobus.net>
parents: 48193
diff changeset
   383
    MODE_EXEC_PERM = 1 << 5
48219
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   384
    MODE_IS_SYMLINK = 1 << 6
48188
77fc340acad7 dirstate-v2: Document flags/mode/size/mtime fields of tree nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 48183
diff changeset
   385
48219
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   386
  The meaning of each bit is described below.
48188
77fc340acad7 dirstate-v2: Document flags/mode/size/mtime fields of tree nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 48183
diff changeset
   387
48231
0524c1359bfc dirstate-v2: Extend node flags to 16 bits
Simon Sapin <simon.sapin@octobus.net>
parents: 48219
diff changeset
   388
  Other bits are unset.
0524c1359bfc dirstate-v2: Extend node flags to 16 bits
Simon Sapin <simon.sapin@octobus.net>
parents: 48219
diff changeset
   389
  They may be assigned meaning if the future,
0524c1359bfc dirstate-v2: Extend node flags to 16 bits
Simon Sapin <simon.sapin@octobus.net>
parents: 48219
diff changeset
   390
  with the limitation that Mercurial versions that pre-date such meaning
0524c1359bfc dirstate-v2: Extend node flags to 16 bits
Simon Sapin <simon.sapin@octobus.net>
parents: 48219
diff changeset
   391
  will always reset those bits to unset when writing nodes.
0524c1359bfc dirstate-v2: Extend node flags to 16 bits
Simon Sapin <simon.sapin@octobus.net>
parents: 48219
diff changeset
   392
  (A new node is written for any mutation in its subtree,
0524c1359bfc dirstate-v2: Extend node flags to 16 bits
Simon Sapin <simon.sapin@octobus.net>
parents: 48219
diff changeset
   393
  leaving the bytes of the old node unreachable
0524c1359bfc dirstate-v2: Extend node flags to 16 bits
Simon Sapin <simon.sapin@octobus.net>
parents: 48219
diff changeset
   394
  until the data file is rewritten entirely.)
0524c1359bfc dirstate-v2: Extend node flags to 16 bits
Simon Sapin <simon.sapin@octobus.net>
parents: 48219
diff changeset
   395
0524c1359bfc dirstate-v2: Extend node flags to 16 bits
Simon Sapin <simon.sapin@octobus.net>
parents: 48219
diff changeset
   396
* Offset 32:
48219
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   397
  A `size` field described below, as a 32-bit integer.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   398
  Unlike in dirstate-v1, negative values are not used.
48188
77fc340acad7 dirstate-v2: Document flags/mode/size/mtime fields of tree nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 48183
diff changeset
   399
48231
0524c1359bfc dirstate-v2: Extend node flags to 16 bits
Simon Sapin <simon.sapin@octobus.net>
parents: 48219
diff changeset
   400
* Offset 36:
48219
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   401
  The seconds component of an `mtime` field described below,
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   402
  as a 32-bit integer.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   403
  Unlike in dirstate-v1, negative values are not used.
48193
320de901896a dirstate-v2: Truncate directory mtimes to 31 bits of seconds
Simon Sapin <simon.sapin@octobus.net>
parents: 48191
diff changeset
   404
48231
0524c1359bfc dirstate-v2: Extend node flags to 16 bits
Simon Sapin <simon.sapin@octobus.net>
parents: 48219
diff changeset
   405
* Offset 40:
48219
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   406
  The nanoseconds component of an `mtime` field described below,
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   407
  as a 32-bit integer.
48188
77fc340acad7 dirstate-v2: Document flags/mode/size/mtime fields of tree nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 48183
diff changeset
   408
48231
0524c1359bfc dirstate-v2: Extend node flags to 16 bits
Simon Sapin <simon.sapin@octobus.net>
parents: 48219
diff changeset
   409
* (Offset 44: end of this node)
48219
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   410
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   411
The meaning of the boolean values packed in `flags` is:
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   412
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   413
`WDIR_TRACKED`
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   414
    Set if the working directory contains a tracked file at this node’s path.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   415
    This is typically set and unset by `hg add` and `hg rm`.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   416
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   417
`P1_TRACKED`
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   418
    Set if the working directory’s first parent changeset
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   419
    (whose node identifier is found in tree metadata)
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   420
    contains a tracked file at this node’s path.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   421
    This is a cache to reduce manifest lookups.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   422
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   423
`P2_INFO`
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   424
    Set if the file has been involved in some merge operation.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   425
    Either because it was actually merged,
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   426
    or because the version in the second parent p2 version was ahead,
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   427
    or because some rename moved it there.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   428
    In either case `hg status` will want it displayed as modified.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   429
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   430
Files that would be mentioned at all in the `dirstate-v1` file format
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   431
have a node with at least one of the above three bits set in `dirstate-v2`.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   432
Let’s call these files "tracked anywhere",
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   433
and "untracked" the nodes with all three of these bits unset.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   434
Untracked nodes are typically for directories:
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   435
they hold child nodes and form the tree structure.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   436
Additional untracked nodes may also exist.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   437
Although implementations should strive to clean up nodes
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   438
that are entirely unused, other untracked nodes may also exist.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   439
For example, a future version of Mercurial might in some cases
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   440
add nodes for untracked files or/and ignored files in the working directory
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   441
in order to optimize `hg status`
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   442
by enabling it to skip `readdir` in more cases.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   443
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   444
`HAS_MODE_AND_SIZE`
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   445
    Must be unset for untracked nodes.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   446
    For files tracked anywhere, if this is set:
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   447
    - The `size` field is the expected file size,
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   448
      in bytes truncated its lower to 31 bits,
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   449
      for the file to be clean.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   450
    - The expected execute permission for the file’s owner
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   451
      is given by `MODE_EXEC_PERM`
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   452
    - The expected file type is given by `MODE_IS_SIMLINK`:
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   453
      a symbolic link if set, or a normal file if unset.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   454
    If this is unset the expected size, permission, and file type are unknown.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   455
    The `size` field is unused (set to zero).
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   456
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   457
`HAS_MTIME`
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   458
    If unset, the `mtime` field is unused (set to zero).
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   459
    If set, it contains a timestamp represented as
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   460
    - the number of seconds since the Unix epoch,
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   461
      truncated to its lower 31 bits.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   462
    - and the number of nanoseconds since `mtime.seconds`,
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   463
      always stritctly less than one billion.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   464
      This may be zero if more precision is not available.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   465
      (This can happen because of limitations in any of Mercurial, Python,
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   466
      libc, the operating system, …)
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   467
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   468
    If set for a file tracked anywhere,
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   469
    `mtime` is the expected modification time for the file to be clean.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   470
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   471
    If set for an untracked node, at some point,
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   472
    this path in the working directory was observed:
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   473
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   474
    - To be a directory
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   475
    - With the modification time given in `mtime`
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   476
    - That time was already strictly in the past when observed,
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   477
      meaning that later changes cannot happen in the same clock tick
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   478
      and must cause a different modification time
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   479
      (unless the system clock jumps back and we get unlucky,
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   480
      which is not impossible but deemed unlikely enough).
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   481
    - All direct children of this directory
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   482
      (as returned by `std::fs::read_dir`)
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   483
      either have a corresponding dirstate node,
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   484
      or are ignored by ignore patterns whose hash is in tree metadata.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   485
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   486
    This means that if `std::fs::symlink_metadata` later reports
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   487
    the same modification time
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   488
    and ignored patterns haven’t changed,
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   489
    a run of status that is not listing ignored files
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   490
    can skip calling `std::fs::read_dir` again for this directory,
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   491
    and iterate child dirstate nodes instead.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   492
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   493
`MODE_EXEC_PERM`
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   494
    Must be unset if `HAS_MODE_AND_SIZE` is unset.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   495
    If `HAS_MODE_AND_SIZE` is set,
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   496
    this indicates whether the file’s own is expected
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   497
    to have execute permission.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   498
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   499
`MODE_IS_SYMLINK`
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   500
    Must be unset if `HAS_MODE_AND_SIZE` is unset.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   501
    If `HAS_MODE_AND_SIZE` is set,
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   502
    this indicates whether the file is expected to be a symlink
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   503
    as opposed to a normal file.