Mercurial > hg
view mercurial/helptext/internals/mergestate.txt @ 46472:98e39f04d60e
upgrade: implement partial upgrade for upgrading persistent-nodemap
Upgrading repositories to use persistent nodemap should be fast and easy as it
requires only two things:
1) Updating the requirements
2) Writing a persistent-nodemap on disk
For both of the steps above, we don't need to edit existing revlogs.
This patch makes upgrade only do the above mentioned two steps if we are
only upgarding to use persistent-nodemap feature.
Since `nodemap.persist_nodemap()` assumes that there exists a nodemap file for
the given revlog if we are trying to call it, this patch adds `force` argument
to create a file if does not exist which is true in our upgrade case.
The test changes demonstrate that we no longer write nodemap files for manifest
after upgrade which I think is desirable.
Differential Revision: https://phab.mercurial-scm.org/D9936
author | Pulkit Goyal <7895pulkit@gmail.com> |
---|---|
date | Mon, 01 Feb 2021 00:02:00 +0530 |
parents | 32ce4cbaec4b |
children |
line wrap: on
line source
The active mergestate is stored in ``.hg/merge`` when a merge is triggered by commands like ``hg merge``, ``hg rebase``, etc. until the merge is completed or aborted to track the 3-way merge state of individual files. The contents of the directory are: Conflicting files ----------------- The local version of the conflicting files are stored with their filenames as the hash of their paths. state ----- This mergestate file record is used by hg version prior to 2.9.1 and contains less data than ``state2``. If there is no contradiction with ``state2``, we can assume that both are written at the same time. In this case, data from ``state2`` is used. Otherwise, we use ``state``. We read/write both ``state`` and ``state2`` records to ensure backward compatibility. state2 ------ This record stores a superset of data in ``state``, including new kinds of records in the future. Each record can contain arbitrary content and has an associated type. This `type` should be a letter. If `type` is uppercase, the record is mandatory: versions of Mercurial that don't support it should abort. If `type` is lowercase, the record can be safely ignored. Currently known records: | * L: the node of the "local" part of the merge (hexified version) | * O: the node of the "other" part of the merge (hexified version) | * F: a file to be merged entry | * C: a change/delete or delete/change conflict | * P: a path conflict (file vs directory) | * f: a (filename, dictionary) tuple of optional values for a given file | * X: unsupported mandatory record type (used in tests) | * x: unsupported advisory record type (used in tests) | * l: the labels for the parts of the merge. Merge record states (indexed by filename): | * u: unresolved conflict | * r: resolved conflict | * pu: unresolved path conflict (file conflicts with directory) | * pr: resolved path conflict The resolve command transitions between 'u' and 'r' for conflicts and 'pu' and 'pr' for path conflicts. This format is a list of arbitrary records of the form: [type][length][content] `type` is a single character, `length` is a 4 byte integer, and `content` is an arbitrary byte sequence of length `length`. Mercurial versions prior to 3.7 have a bug where if there are unsupported mandatory merge records, attempting to clear out the merge state with hg update --clean or similar aborts. The 't' record type works around that by writing out what those versions treat as an advisory record, but later versions interpret as special: the first character is the 'real' record type and everything onwards is the data.