mercurial/helptext/internals/dirstate-v2.txt
author Pierre-Yves David <pierre-yves.david@octobus.net>
Tue, 18 Jan 2022 00:19:04 +0100
changeset 48675 a3cf460a6b1b
parent 48321 6248607381f2
child 48360 f7086f6173f8
permissions -rw-r--r--
stream-clone: also filter the requirement we put in the bundle 2 We were wrongly putting irrelevant requirements in the bundle and the receiving side was getting confused, treating them as being missing while still putting them in the `requires` file. Leading do corrupted repositories. This changes fix stream-clone behavior regarding format when bundle-2 is involved, so we now also test this cases. Behavior with older version of Mercurial will be fine as they filter the requirements they get from the bundle on their side anyway. Differential Revision: https://phab.mercurial-scm.org/D12084
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
48178
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
48321
6248607381f2 internals: typo pass on the dirstate-v2 help file
Raphaël Gomès <rgomes@octobus.net>
parents: 48320
diff changeset
    15
The newer `dirstate-v2` file format is designed to fix these limitations
48178
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
48321
6248607381f2 internals: typo pass on the dirstate-v2 help file
Raphaël Gomès <rgomes@octobus.net>
parents: 48320
diff changeset
    36
Enabling `dirstate-v2` for new local repositories
48178
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`,
48319
5d69a0a23f5b internals: correct dirstate-v2 format variable in the documentation
Raphaël Gomès <rgomes@octobus.net>
parents: 48291
diff changeset
    40
the `exp-rc-dirstate-v2` boolean in the `format` configuration section
48178
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
48319
5d69a0a23f5b internals: correct dirstate-v2 format variable in the documentation
Raphaël Gomès <rgomes@octobus.net>
parents: 48291
diff changeset
    45
    $ hg init my-project --config format.exp-rc-dirstate-v2=1
48178
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
    46
48321
6248607381f2 internals: typo pass on the dirstate-v2 help file
Raphaël Gomès <rgomes@octobus.net>
parents: 48320
diff changeset
    47
Checking the format of an existing local repository
48178
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.
48319
5d69a0a23f5b internals: correct dirstate-v2 format variable in the documentation
Raphaël Gomès <rgomes@octobus.net>
parents: 48291
diff changeset
    66
The same `format.exp-rc-dirstate-v2` configuration is used again.
48178
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
48319
5d69a0a23f5b internals: correct dirstate-v2 format variable in the documentation
Raphaël Gomès <rgomes@octobus.net>
parents: 48291
diff changeset
    70
    $ hg debugupgrade --config format.exp-rc-dirstate-v2=1
48178
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
48319
5d69a0a23f5b internals: correct dirstate-v2 format variable in the documentation
Raphaël Gomès <rgomes@octobus.net>
parents: 48291
diff changeset
    74
    $ hg debugupgrade --config format.exp-rc-dirstate-v2=0
48178
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,
48321
6248607381f2 internals: typo pass on the dirstate-v2 help file
Raphaël Gomès <rgomes@octobus.net>
parents: 48320
diff changeset
    99
which avoids older version accidentally messing up a repository
48178
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
48320
f35529784079 dirstate-v2: fix confusion between requirement and format config variable
Raphaël Gomès <rgomes@octobus.net>
parents: 48319
diff changeset
   104
When the file contains a `dirstate-v2` line,
48178
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
48321
6248607381f2 internals: typo pass on the dirstate-v2 help file
Raphaël Gomès <rgomes@octobus.net>
parents: 48320
diff changeset
   111
Whereas `dirstate-v1` uses a single `.hg/dirstate` file,
48178
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
48321
6248607381f2 internals: typo pass on the dirstate-v2 help file
Raphaël Gomès <rgomes@octobus.net>
parents: 48320
diff changeset
   176
  (if another Mercurial process is appending to it
48178
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.
48195
eb8092f9304f dirstate-v2: Use "byte sequence" in docs
Simon Sapin <simon.sapin@octobus.net>
parents: 48178
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: 48178
diff changeset
   289
into a single contiguous byte sequence.
eb8092f9304f dirstate-v2: Use "byte sequence" in docs
Simon Sapin <simon.sapin@octobus.net>
parents: 48178
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: 48178
diff changeset
   291
and fed separate chunks one by one.)
48178
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
48195
eb8092f9304f dirstate-v2: Use "byte sequence" in docs
Simon Sapin <simon.sapin@octobus.net>
parents: 48178
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: 48178
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: 48178
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: 48178
diff changeset
   305
instead of storing one pseudo-pointer per child node.
48321
6248607381f2 internals: typo pass on the dirstate-v2 help file
Raphaël Gomès <rgomes@octobus.net>
parents: 48320
diff changeset
   306
Sorting allows using binary search to find a child node with a given name
48195
eb8092f9304f dirstate-v2: Use "byte sequence" in docs
Simon Sapin <simon.sapin@octobus.net>
parents: 48178
diff changeset
   307
in `O(log(n))` byte sequence comparisons.
48178
e8a576de703f dirstate-v2: Add internal documentation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
   308
48321
6248607381f2 internals: typo pass on the dirstate-v2 help file
Raphaël Gomès <rgomes@octobus.net>
parents: 48320
diff changeset
   309
The current implementation writes paths and child node before a given node
48178
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.
48321
6248607381f2 internals: typo pass on the dirstate-v2 help file
Raphaël Gomès <rgomes@octobus.net>
parents: 48320
diff changeset
   314
It is referred to by one or more node by a pseudo-pointer to its start, and its
48178
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
48200
77fc340acad7 dirstate-v2: Document flags/mode/size/mtime fields of tree nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   374
* Offset 30:
48243
0524c1359bfc dirstate-v2: Extend node flags to 16 bits
Simon Sapin <simon.sapin@octobus.net>
parents: 48231
diff changeset
   375
  A `flags` fields  that packs some boolean values as bits of a 16-bit integer.
48200
77fc340acad7 dirstate-v2: Document flags/mode/size/mtime fields of tree nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
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: 48195
diff changeset
   377
77fc340acad7 dirstate-v2: Document flags/mode/size/mtime fields of tree nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
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: 48195
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: 48195
diff changeset
   380
    P2_INFO = 1 << 2
48277
749946b6a641 dirstate-v2: reorder flag to group related one together
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48275
diff changeset
   381
    MODE_EXEC_PERM = 1 << 3
749946b6a641 dirstate-v2: reorder flag to group related one together
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48275
diff changeset
   382
    MODE_IS_SYMLINK = 1 << 4
749946b6a641 dirstate-v2: reorder flag to group related one together
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48275
diff changeset
   383
    HAS_FALLBACK_EXEC = 1 << 5
749946b6a641 dirstate-v2: reorder flag to group related one together
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48275
diff changeset
   384
    FALLBACK_EXEC = 1 << 6
749946b6a641 dirstate-v2: reorder flag to group related one together
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48275
diff changeset
   385
    HAS_FALLBACK_SYMLINK = 1 << 7
749946b6a641 dirstate-v2: reorder flag to group related one together
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48275
diff changeset
   386
    FALLBACK_SYMLINK = 1 << 8
749946b6a641 dirstate-v2: reorder flag to group related one together
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48275
diff changeset
   387
    EXPECTED_STATE_IS_MODIFIED = 1 << 9
749946b6a641 dirstate-v2: reorder flag to group related one together
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48275
diff changeset
   388
    HAS_MODE_AND_SIZE = 1 << 10
749946b6a641 dirstate-v2: reorder flag to group related one together
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48275
diff changeset
   389
    HAS_MTIME = 1 << 11
749946b6a641 dirstate-v2: reorder flag to group related one together
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48275
diff changeset
   390
    MTIME_SECOND_AMBIGUOUS = 1 << 12
749946b6a641 dirstate-v2: reorder flag to group related one together
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48275
diff changeset
   391
    DIRECTORY = 1 << 13
749946b6a641 dirstate-v2: reorder flag to group related one together
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48275
diff changeset
   392
    ALL_UNKNOWN_RECORDED = 1 << 14
749946b6a641 dirstate-v2: reorder flag to group related one together
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48275
diff changeset
   393
    ALL_IGNORED_RECORDED = 1 << 15
48200
77fc340acad7 dirstate-v2: Document flags/mode/size/mtime fields of tree nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   394
48231
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   395
  The meaning of each bit is described below.
48200
77fc340acad7 dirstate-v2: Document flags/mode/size/mtime fields of tree nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   396
48243
0524c1359bfc dirstate-v2: Extend node flags to 16 bits
Simon Sapin <simon.sapin@octobus.net>
parents: 48231
diff changeset
   397
  Other bits are unset.
0524c1359bfc dirstate-v2: Extend node flags to 16 bits
Simon Sapin <simon.sapin@octobus.net>
parents: 48231
diff changeset
   398
  They may be assigned meaning if the future,
0524c1359bfc dirstate-v2: Extend node flags to 16 bits
Simon Sapin <simon.sapin@octobus.net>
parents: 48231
diff changeset
   399
  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: 48231
diff changeset
   400
  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: 48231
diff changeset
   401
  (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: 48231
diff changeset
   402
  leaving the bytes of the old node unreachable
0524c1359bfc dirstate-v2: Extend node flags to 16 bits
Simon Sapin <simon.sapin@octobus.net>
parents: 48231
diff changeset
   403
  until the data file is rewritten entirely.)
0524c1359bfc dirstate-v2: Extend node flags to 16 bits
Simon Sapin <simon.sapin@octobus.net>
parents: 48231
diff changeset
   404
0524c1359bfc dirstate-v2: Extend node flags to 16 bits
Simon Sapin <simon.sapin@octobus.net>
parents: 48231
diff changeset
   405
* Offset 32:
48231
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   406
  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: 48207
diff changeset
   407
  Unlike in dirstate-v1, negative values are not used.
48200
77fc340acad7 dirstate-v2: Document flags/mode/size/mtime fields of tree nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   408
48243
0524c1359bfc dirstate-v2: Extend node flags to 16 bits
Simon Sapin <simon.sapin@octobus.net>
parents: 48231
diff changeset
   409
* Offset 36:
48231
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   410
  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: 48207
diff changeset
   411
  as a 32-bit integer.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   412
  Unlike in dirstate-v1, negative values are not used.
48244
f7fd629ffb98 dirstate-v2: Separate HAS_FILE_MTIME and HAS_DIRECTORY_MTIME flags
Simon Sapin <simon.sapin@octobus.net>
parents: 48243
diff changeset
   413
  When `mtime` is used, this is number of seconds since the Unix epoch
f7fd629ffb98 dirstate-v2: Separate HAS_FILE_MTIME and HAS_DIRECTORY_MTIME flags
Simon Sapin <simon.sapin@octobus.net>
parents: 48243
diff changeset
   414
  truncated to its lower 31 bits.
48205
320de901896a dirstate-v2: Truncate directory mtimes to 31 bits of seconds
Simon Sapin <simon.sapin@octobus.net>
parents: 48203
diff changeset
   415
48243
0524c1359bfc dirstate-v2: Extend node flags to 16 bits
Simon Sapin <simon.sapin@octobus.net>
parents: 48231
diff changeset
   416
* Offset 40:
48231
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   417
  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: 48207
diff changeset
   418
  as a 32-bit integer.
48244
f7fd629ffb98 dirstate-v2: Separate HAS_FILE_MTIME and HAS_DIRECTORY_MTIME flags
Simon Sapin <simon.sapin@octobus.net>
parents: 48243
diff changeset
   419
  When `mtime` is used,
f7fd629ffb98 dirstate-v2: Separate HAS_FILE_MTIME and HAS_DIRECTORY_MTIME flags
Simon Sapin <simon.sapin@octobus.net>
parents: 48243
diff changeset
   420
  this is the number of nanoseconds since `mtime.seconds`,
48321
6248607381f2 internals: typo pass on the dirstate-v2 help file
Raphaël Gomès <rgomes@octobus.net>
parents: 48320
diff changeset
   421
  always strictly less than one billion.
48244
f7fd629ffb98 dirstate-v2: Separate HAS_FILE_MTIME and HAS_DIRECTORY_MTIME flags
Simon Sapin <simon.sapin@octobus.net>
parents: 48243
diff changeset
   422
f7fd629ffb98 dirstate-v2: Separate HAS_FILE_MTIME and HAS_DIRECTORY_MTIME flags
Simon Sapin <simon.sapin@octobus.net>
parents: 48243
diff changeset
   423
  This may be zero if more precision is not available.
f7fd629ffb98 dirstate-v2: Separate HAS_FILE_MTIME and HAS_DIRECTORY_MTIME flags
Simon Sapin <simon.sapin@octobus.net>
parents: 48243
diff changeset
   424
  (This can happen because of limitations in any of Mercurial, Python,
f7fd629ffb98 dirstate-v2: Separate HAS_FILE_MTIME and HAS_DIRECTORY_MTIME flags
Simon Sapin <simon.sapin@octobus.net>
parents: 48243
diff changeset
   425
  libc, the operating system, …)
f7fd629ffb98 dirstate-v2: Separate HAS_FILE_MTIME and HAS_DIRECTORY_MTIME flags
Simon Sapin <simon.sapin@octobus.net>
parents: 48243
diff changeset
   426
f7fd629ffb98 dirstate-v2: Separate HAS_FILE_MTIME and HAS_DIRECTORY_MTIME flags
Simon Sapin <simon.sapin@octobus.net>
parents: 48243
diff changeset
   427
  When comparing two mtimes and either has this component set to zero,
f7fd629ffb98 dirstate-v2: Separate HAS_FILE_MTIME and HAS_DIRECTORY_MTIME flags
Simon Sapin <simon.sapin@octobus.net>
parents: 48243
diff changeset
   428
  the sub-second precision of both should be ignored.
f7fd629ffb98 dirstate-v2: Separate HAS_FILE_MTIME and HAS_DIRECTORY_MTIME flags
Simon Sapin <simon.sapin@octobus.net>
parents: 48243
diff changeset
   429
  False positives when checking mtime equality due to clock resolution
f7fd629ffb98 dirstate-v2: Separate HAS_FILE_MTIME and HAS_DIRECTORY_MTIME flags
Simon Sapin <simon.sapin@octobus.net>
parents: 48243
diff changeset
   430
  are always possible and the status algorithm needs to deal with them,
f7fd629ffb98 dirstate-v2: Separate HAS_FILE_MTIME and HAS_DIRECTORY_MTIME flags
Simon Sapin <simon.sapin@octobus.net>
parents: 48243
diff changeset
   431
  but having too many false negatives could be harmful too.
48200
77fc340acad7 dirstate-v2: Document flags/mode/size/mtime fields of tree nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 48195
diff changeset
   432
48243
0524c1359bfc dirstate-v2: Extend node flags to 16 bits
Simon Sapin <simon.sapin@octobus.net>
parents: 48231
diff changeset
   433
* (Offset 44: end of this node)
48231
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   434
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   435
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: 48207
diff changeset
   436
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   437
`WDIR_TRACKED`
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   438
    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: 48207
diff changeset
   439
    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: 48207
diff changeset
   440
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   441
`P1_TRACKED`
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   442
    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: 48207
diff changeset
   443
    (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: 48207
diff changeset
   444
    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: 48207
diff changeset
   445
    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: 48207
diff changeset
   446
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   447
`P2_INFO`
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   448
    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: 48207
diff changeset
   449
    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: 48207
diff changeset
   450
    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: 48207
diff changeset
   451
    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: 48207
diff changeset
   452
    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: 48207
diff changeset
   453
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   454
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: 48207
diff changeset
   455
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: 48207
diff changeset
   456
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: 48207
diff changeset
   457
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: 48207
diff changeset
   458
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: 48207
diff changeset
   459
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: 48207
diff changeset
   460
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: 48207
diff changeset
   461
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: 48207
diff changeset
   462
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: 48207
diff changeset
   463
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: 48207
diff changeset
   464
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: 48207
diff changeset
   465
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: 48207
diff changeset
   466
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: 48207
diff changeset
   467
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   468
`HAS_MODE_AND_SIZE`
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   469
    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: 48207
diff changeset
   470
    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: 48207
diff changeset
   471
    - The `size` field is the expected file size,
48261
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   472
      in bytes truncated its lower to 31 bits.
48231
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   473
    - 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: 48207
diff changeset
   474
      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: 48207
diff changeset
   475
    - 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: 48207
diff changeset
   476
      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: 48207
diff changeset
   477
    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: 48207
diff changeset
   478
    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: 48207
diff changeset
   479
48275
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   480
`HAS_MTIME`
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   481
    The nodes contains a "valid" last modification time in the `mtime` field.
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   482
48231
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   483
48275
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   484
    It means the `mtime` was already strictly in the past when observed,
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   485
    meaning that later changes cannot happen in the same clock tick
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   486
    and must cause a different modification time
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   487
    (unless the system clock jumps back and we get unlucky,
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   488
    which is not impossible but deemed unlikely enough).
48231
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   489
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   490
    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: 48207
diff changeset
   491
    the same modification time
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   492
    and ignored patterns haven’t changed,
48275
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   493
    we can assume the node to be unchanged on disk.
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   494
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   495
    The `mtime` field can then be used to skip more expensive lookup when
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   496
    checking the status of "tracked" nodes.
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   497
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   498
    It can also be set for node where `DIRECTORY` is set.
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   499
    See `DIRECTORY` documentation for details.
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   500
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   501
`DIRECTORY`
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   502
    When set, this entry will match a directory that exists or existed on the
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   503
    file system.
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   504
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   505
    * When `HAS_MTIME` is set a directory has been seen on the file system and
48321
6248607381f2 internals: typo pass on the dirstate-v2 help file
Raphaël Gomès <rgomes@octobus.net>
parents: 48320
diff changeset
   506
      `mtime` matches its last modification time. However, `HAS_MTIME` not
6248607381f2 internals: typo pass on the dirstate-v2 help file
Raphaël Gomès <rgomes@octobus.net>
parents: 48320
diff changeset
   507
      being set does not indicate the lack of directory on the file system.
48275
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   508
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   509
    * When not tracked anywhere, this node does not represent an ignored or
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   510
      unknown file on disk.
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   511
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   512
    If `HAS_MTIME` is set
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   513
    and `mtime` matches the last modification time of the directory on disk,
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   514
    the directory is unchanged
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   515
    and we can skip calling `std::fs::read_dir` again for this directory,
48231
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   516
    and iterate child dirstate nodes instead.
48275
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   517
    (as long as `ALL_UNKNOWN_RECORDED` and `ALL_IGNORED_RECORDED` are taken
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   518
    into account)
48231
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   519
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   520
`MODE_EXEC_PERM`
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   521
    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: 48207
diff changeset
   522
    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: 48207
diff changeset
   523
    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: 48207
diff changeset
   524
    to have execute permission.
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   525
48291
500260410bb8 dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48277
diff changeset
   526
    Beware that on system without fs support for this information, the value
500260410bb8 dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48277
diff changeset
   527
    stored in the dirstate might be wrong and should not be relied on.
500260410bb8 dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48277
diff changeset
   528
48231
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   529
`MODE_IS_SYMLINK`
308d9c245337 dirstate-v2: Add storage space for nanoseconds precision in file mtimes
Simon Sapin <simon.sapin@octobus.net>
parents: 48207
diff changeset
   530
    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: 48207
diff changeset
   531
    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: 48207
diff changeset
   532
    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: 48207
diff changeset
   533
    as opposed to a normal file.
48261
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   534
48291
500260410bb8 dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48277
diff changeset
   535
    Beware that on system without fs support for this information, the value
500260410bb8 dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48277
diff changeset
   536
    stored in the dirstate might be wrong and should not be relied on.
500260410bb8 dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48277
diff changeset
   537
48261
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   538
`EXPECTED_STATE_IS_MODIFIED`
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   539
    Must be unset for untracked nodes.
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   540
    For:
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   541
    - a file tracked anywhere
48275
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   542
    - that has expected metadata (`HAS_MODE_AND_SIZE` and `HAS_MTIME`)
48261
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   543
    - if that metadata matches
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   544
      metadata found in the working directory with `stat`
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   545
    This bit indicates the status of the file.
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   546
    If set, the status is modified. If unset, it is clean.
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   547
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   548
    In cases where `hg status` needs to read the contents of a file
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   549
    because metadata is ambiguous, this bit lets it record the result
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   550
    if the result is modified so that a future run of `hg status`
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   551
    does not need to do the same again.
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   552
    It is valid to never set this bit,
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   553
    and consider expected metadata ambiguous if it is set.
48262
dfc5a505ddc5 dirstate-v2: adds two flag to track the presence of some unrecorded files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   554
dfc5a505ddc5 dirstate-v2: adds two flag to track the presence of some unrecorded files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   555
`ALL_UNKNOWN_RECORDED`
dfc5a505ddc5 dirstate-v2: adds two flag to track the presence of some unrecorded files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   556
    If set, all "unknown" children existing on disk (at the time of the last
dfc5a505ddc5 dirstate-v2: adds two flag to track the presence of some unrecorded files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   557
    status) have been recorded and the `mtime` associated with
48275
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   558
    `DIRECTORY` can be used for optimization even when "unknown" file
48262
dfc5a505ddc5 dirstate-v2: adds two flag to track the presence of some unrecorded files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   559
    are listed.
dfc5a505ddc5 dirstate-v2: adds two flag to track the presence of some unrecorded files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   560
dfc5a505ddc5 dirstate-v2: adds two flag to track the presence of some unrecorded files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   561
    Note that the amount recorded "unknown" children can still be zero if None
dfc5a505ddc5 dirstate-v2: adds two flag to track the presence of some unrecorded files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   562
    where present.
dfc5a505ddc5 dirstate-v2: adds two flag to track the presence of some unrecorded files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   563
dfc5a505ddc5 dirstate-v2: adds two flag to track the presence of some unrecorded files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   564
    Also note that having this flag unset does not imply that no "unknown"
48321
6248607381f2 internals: typo pass on the dirstate-v2 help file
Raphaël Gomès <rgomes@octobus.net>
parents: 48320
diff changeset
   565
    children have been recorded. Some might be present, but there is
6248607381f2 internals: typo pass on the dirstate-v2 help file
Raphaël Gomès <rgomes@octobus.net>
parents: 48320
diff changeset
   566
    no guarantee that is will be all of them.
48262
dfc5a505ddc5 dirstate-v2: adds two flag to track the presence of some unrecorded files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   567
dfc5a505ddc5 dirstate-v2: adds two flag to track the presence of some unrecorded files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   568
`ALL_IGNORED_RECORDED`
dfc5a505ddc5 dirstate-v2: adds two flag to track the presence of some unrecorded files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   569
    If set, all "ignored" children existing on disk (at the time of the last
dfc5a505ddc5 dirstate-v2: adds two flag to track the presence of some unrecorded files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   570
    status) have been recorded and the `mtime` associated with
48275
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48272
diff changeset
   571
    `DIRECTORY` can be used for optimization even when "ignored" file
48262
dfc5a505ddc5 dirstate-v2: adds two flag to track the presence of some unrecorded files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   572
    are listed.
dfc5a505ddc5 dirstate-v2: adds two flag to track the presence of some unrecorded files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   573
dfc5a505ddc5 dirstate-v2: adds two flag to track the presence of some unrecorded files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   574
    Note that the amount recorded "ignored" children can still be zero if None
dfc5a505ddc5 dirstate-v2: adds two flag to track the presence of some unrecorded files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   575
    where present.
dfc5a505ddc5 dirstate-v2: adds two flag to track the presence of some unrecorded files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   576
dfc5a505ddc5 dirstate-v2: adds two flag to track the presence of some unrecorded files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   577
    Also note that having this flag unset does not imply that no "ignored"
48321
6248607381f2 internals: typo pass on the dirstate-v2 help file
Raphaël Gomès <rgomes@octobus.net>
parents: 48320
diff changeset
   578
    children have been recorded. Some might be present, but there is
6248607381f2 internals: typo pass on the dirstate-v2 help file
Raphaël Gomès <rgomes@octobus.net>
parents: 48320
diff changeset
   579
    no guarantee that is will be all of them.
48265
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   580
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   581
`HAS_FALLBACK_EXEC`
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   582
    If this flag is set, the entry carries "fallback" information for the
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   583
    executable bit in the `FALLBACK_EXEC` flag.
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   584
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   585
    Fallback information can be stored in the dirstate to keep track of
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   586
    filesystem attribute tracked by Mercurial when the underlying file
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   587
    system or operating system does not support that property, (e.g.
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   588
    Windows).
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   589
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   590
`FALLBACK_EXEC`
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   591
    Should be ignored if `HAS_FALLBACK_EXEC` is unset. If set the file for this
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   592
    entry should be considered executable if that information cannot be
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   593
    extracted from the file system. If unset it should be considered
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   594
    non-executable instead.
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   595
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   596
`HAS_FALLBACK_SYMLINK`
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   597
    If this flag is set, the entry carries "fallback" information for symbolic
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   598
    link status in the `FALLBACK_SYMLINK` flag.
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   599
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   600
    Fallback information can be stored in the dirstate to keep track of
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   601
    filesystem attribute tracked by Mercurial when the underlying file
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   602
    system or operating system does not support that property, (e.g.
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   603
    Windows).
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   604
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   605
`FALLBACK_SYMLINK`
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   606
    Should be ignored if `HAS_FALLBACK_SYMLINK` is unset. If set the file for
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   607
    this entry should be considered a symlink if that information cannot be
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   608
    extracted from the file system. If unset it should be considered a normal
b874e8d81a98 dirstate-v2: preserve the fallback values on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48262
diff changeset
   609
    file instead.
48272
9205d9be8b41 dirstate-v2: add a new MTIME_SECOND_AMBIGUOUS flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48265
diff changeset
   610
9205d9be8b41 dirstate-v2: add a new MTIME_SECOND_AMBIGUOUS flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48265
diff changeset
   611
`MTIME_SECOND_AMBIGUOUS`
9205d9be8b41 dirstate-v2: add a new MTIME_SECOND_AMBIGUOUS flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48265
diff changeset
   612
    This flag is relevant only when `HAS_FILE_MTIME` is set.  When set, the
9205d9be8b41 dirstate-v2: add a new MTIME_SECOND_AMBIGUOUS flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48265
diff changeset
   613
    `mtime` stored in the entry is only valid for comparison with timestamps
9205d9be8b41 dirstate-v2: add a new MTIME_SECOND_AMBIGUOUS flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48265
diff changeset
   614
    that have nanosecond information. If available timestamp does not carries
48321
6248607381f2 internals: typo pass on the dirstate-v2 help file
Raphaël Gomès <rgomes@octobus.net>
parents: 48320
diff changeset
   615
    nanosecond information, the `mtime` should be ignored and no optimization
48272
9205d9be8b41 dirstate-v2: add a new MTIME_SECOND_AMBIGUOUS flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48265
diff changeset
   616
    can be applied.