annotate mercurial/mergestate.py @ 52095:3e7b9357bbb8

tests: add coverage to for `HGCB_BUNDLE_BASENAME` with special characters Per request on IRC, to show the behavior of dropping the quoting of `HGCB_BUNDLE_BASENAME` in the next commit. This current failure is basically the same error and output that currently happens on Windows with any path (even without the embedded quote). The only difference is Windows doesn't print the `cp: cannot stat ...` line.
author Matt Harbison <matt_harbison@yahoo.com>
date Mon, 21 Oct 2024 15:24:55 -0400
parents 09a54892b7ee
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
51863
f4733654f144 typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
1 from __future__ import annotations
f4733654f144 typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
2
45381
ede4c121239e mergestate: use collections.defaultdict(dict) for _stateextras
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
3 import collections
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
4 import shutil
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
5 import struct
48712
773ad0f5152d merge-actions: gather all created action into a set
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48711
diff changeset
6 import weakref
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
7
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
8 from .i18n import _
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
9 from .node import (
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
10 bin,
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
11 hex,
46843
728d89f6f9b1 refactor: prefer checks against nullrev over nullid
Joerg Sonnenberger <joerg@bec.de>
parents: 46781
diff changeset
12 nullrev,
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
13 )
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
14 from . import (
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26570
diff changeset
15 error,
25959
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
16 filemerge,
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
17 util,
892d601f0d44 merge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25844
diff changeset
18 )
44060
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43798
diff changeset
19 from .utils import hashutil
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
20
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
21 _pack = struct.pack
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
22 _unpack = struct.unpack
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
23
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
24
20593
3678707e4017 merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20592
diff changeset
25 def _droponode(data):
3678707e4017 merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20592
diff changeset
26 # used for compatibility for v1
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
27 bits = data.split(b'\0')
20593
3678707e4017 merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20592
diff changeset
28 bits = bits[:-2] + bits[-1:]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
29 return b'\0'.join(bits)
20593
3678707e4017 merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20592
diff changeset
30
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
31
44871
17d928f8abaf mergestate: move staticmethod _filectxorabsent to module level
Augie Fackler <augie@google.com>
parents: 44856
diff changeset
32 def _filectxorabsent(hexnode, ctx, f):
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46845
diff changeset
33 if hexnode == ctx.repo().nodeconstants.nullhex:
44871
17d928f8abaf mergestate: move staticmethod _filectxorabsent to module level
Augie Fackler <augie@google.com>
parents: 44856
diff changeset
34 return filemerge.absentfilectx(ctx, f)
17d928f8abaf mergestate: move staticmethod _filectxorabsent to module level
Augie Fackler <augie@google.com>
parents: 44856
diff changeset
35 else:
17d928f8abaf mergestate: move staticmethod _filectxorabsent to module level
Augie Fackler <augie@google.com>
parents: 44856
diff changeset
36 return ctx[f]
17d928f8abaf mergestate: move staticmethod _filectxorabsent to module level
Augie Fackler <augie@google.com>
parents: 44856
diff changeset
37
17d928f8abaf mergestate: move staticmethod _filectxorabsent to module level
Augie Fackler <augie@google.com>
parents: 44856
diff changeset
38
37109
a532b2f54f95 merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37107
diff changeset
39 # Merge state record types. See ``mergestate`` docs for more.
45163
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
40
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
41 ####
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
42 # merge records which records metadata about a current merge
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
43 # exists only once in a mergestate
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
44 #####
37109
a532b2f54f95 merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37107
diff changeset
45 RECORD_LOCAL = b'L'
a532b2f54f95 merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37107
diff changeset
46 RECORD_OTHER = b'O'
45161
9abdc0bd2ab9 mergestate: add comments about couple of record types and minor reorder
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45160
diff changeset
47 # record merge labels
9abdc0bd2ab9 mergestate: add comments about couple of record types and minor reorder
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45160
diff changeset
48 RECORD_LABELS = b'l'
9abdc0bd2ab9 mergestate: add comments about couple of record types and minor reorder
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45160
diff changeset
49
45163
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
50 #####
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
51 # record extra information about files, with one entry containing info about one
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
52 # file. Hence, multiple of them can exists
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
53 #####
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
54 RECORD_FILE_VALUES = b'f'
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
55
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
56 #####
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
57 # merge records which represents state of individual merges of files/folders
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
58 # These are top level records for each entry containing merge related info.
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
59 # Each record of these has info about one file. Hence multiple of them can
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
60 # exists
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
61 #####
37109
a532b2f54f95 merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37107
diff changeset
62 RECORD_MERGED = b'F'
a532b2f54f95 merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37107
diff changeset
63 RECORD_CHANGEDELETE_CONFLICT = b'C'
45163
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
64 # the path was dir on one side of merge and file on another
37109
a532b2f54f95 merge: use constants for merge state record types
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37107
diff changeset
65 RECORD_PATH_CONFLICT = b'P'
45161
9abdc0bd2ab9 mergestate: add comments about couple of record types and minor reorder
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45160
diff changeset
66
45163
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
67 #####
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
68 # possible state which a merge entry can have. These are stored inside top-level
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
69 # merge records mentioned just above.
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
70 #####
37111
aa5199c7aa42 merge: use constants for merge record state
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37110
diff changeset
71 MERGE_RECORD_UNRESOLVED = b'u'
aa5199c7aa42 merge: use constants for merge record state
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37110
diff changeset
72 MERGE_RECORD_RESOLVED = b'r'
aa5199c7aa42 merge: use constants for merge record state
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37110
diff changeset
73 MERGE_RECORD_UNRESOLVED_PATH = b'pu'
aa5199c7aa42 merge: use constants for merge record state
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37110
diff changeset
74 MERGE_RECORD_RESOLVED_PATH = b'pr'
44687
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
75 # represents that the file was automatically merged in favor
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
76 # of other version. This info is used on commit.
45382
0652a533fe3c mergestate: use _stateextras instead of merge records for commit related info
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45381
diff changeset
77 # This is now deprecated and commit related information is now
0652a533fe3c mergestate: use _stateextras instead of merge records for commit related info
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45381
diff changeset
78 # stored in RECORD_FILE_VALUES
44687
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
79 MERGE_RECORD_MERGED_OTHER = b'o'
37111
aa5199c7aa42 merge: use constants for merge record state
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37110
diff changeset
80
45163
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
81 #####
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
82 # top level record which stores other unknown records. Multiple of these can
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
83 # exists
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
84 #####
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
85 RECORD_OVERRIDE = b't'
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
86
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
87 #####
45271
7fc3c5fbc65f mergestate: fix BC breakage introduced because of removal of a merge record
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45166
diff changeset
88 # legacy records which are no longer used but kept to prevent breaking BC
7fc3c5fbc65f mergestate: fix BC breakage introduced because of removal of a merge record
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45166
diff changeset
89 #####
7fc3c5fbc65f mergestate: fix BC breakage introduced because of removal of a merge record
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45166
diff changeset
90 # This record was release in 5.4 and usage was removed in 5.5
7fc3c5fbc65f mergestate: fix BC breakage introduced because of removal of a merge record
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45166
diff changeset
91 LEGACY_RECORD_RESOLVED_OTHER = b'R'
45518
32ce4cbaec4b mergedriver: delete it
Martin von Zweigbergk <martinvonz@google.com>
parents: 45501
diff changeset
92 # This record was release in 3.7 and usage was removed in 5.6
32ce4cbaec4b mergedriver: delete it
Martin von Zweigbergk <martinvonz@google.com>
parents: 45501
diff changeset
93 LEGACY_RECORD_DRIVER_RESOLVED = b'd'
32ce4cbaec4b mergedriver: delete it
Martin von Zweigbergk <martinvonz@google.com>
parents: 45501
diff changeset
94 # This record was release in 3.7 and usage was removed in 5.6
32ce4cbaec4b mergedriver: delete it
Martin von Zweigbergk <martinvonz@google.com>
parents: 45501
diff changeset
95 LEGACY_MERGE_DRIVER_STATE = b'm'
32ce4cbaec4b mergedriver: delete it
Martin von Zweigbergk <martinvonz@google.com>
parents: 45501
diff changeset
96 # This record was release in 3.7 and usage was removed in 5.6
32ce4cbaec4b mergedriver: delete it
Martin von Zweigbergk <martinvonz@google.com>
parents: 45501
diff changeset
97 LEGACY_MERGE_DRIVER_MERGE = b'D'
45271
7fc3c5fbc65f mergestate: fix BC breakage introduced because of removal of a merge record
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45166
diff changeset
98
48715
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
99 CHANGE_ADDED = b'added'
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
100 CHANGE_REMOVED = b'removed'
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
101 CHANGE_MODIFIED = b'modified'
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
102
45163
f69253935bf8 mergestate: document mergestate records in an organized way
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45162
diff changeset
103
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48935
diff changeset
104 class MergeAction:
48711
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
105 """represent an "action" merge need to take for a given file
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
106
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
107 Attributes:
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
108
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
109 _short: internal representation used to identify each action
48713
5dfaca4464d1 merge-actions: add an explicite "no_op" attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48712
diff changeset
110
5dfaca4464d1 merge-actions: add an explicite "no_op" attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48712
diff changeset
111 no_op: True if the action does affect the file content or tracking status
48714
c5f05c0d1c8c merge-actions: have an attribute for narrow safetiness
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48713
diff changeset
112
c5f05c0d1c8c merge-actions: have an attribute for narrow safetiness
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48713
diff changeset
113 narrow_safe:
c5f05c0d1c8c merge-actions: have an attribute for narrow safetiness
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48713
diff changeset
114 True if the action can be safely used for a file outside of the narrow
c5f05c0d1c8c merge-actions: have an attribute for narrow safetiness
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48713
diff changeset
115 set
48715
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
116
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
117 changes:
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
118 The types of changes that this actions involves. This is a work in
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
119 progress and not all actions have one yet. In addition, some requires
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
120 user changes and cannot be fully decided. The value currently available
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
121 are:
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
122
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
123 - ADDED: the files is new in both parents
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
124 - REMOVED: the files existed in one parent and is getting removed
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
125 - MODIFIED: the files existed in at least one parent and is getting changed
48711
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
126 """
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
127
48712
773ad0f5152d merge-actions: gather all created action into a set
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48711
diff changeset
128 ALL_ACTIONS = weakref.WeakSet()
48713
5dfaca4464d1 merge-actions: add an explicite "no_op" attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48712
diff changeset
129 NO_OP_ACTIONS = weakref.WeakSet()
48712
773ad0f5152d merge-actions: gather all created action into a set
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48711
diff changeset
130
48715
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
131 def __init__(self, short, no_op=False, narrow_safe=False, changes=None):
48711
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
132 self._short = short
48712
773ad0f5152d merge-actions: gather all created action into a set
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48711
diff changeset
133 self.ALL_ACTIONS.add(self)
48713
5dfaca4464d1 merge-actions: add an explicite "no_op" attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48712
diff changeset
134 self.no_op = no_op
5dfaca4464d1 merge-actions: add an explicite "no_op" attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48712
diff changeset
135 if self.no_op:
5dfaca4464d1 merge-actions: add an explicite "no_op" attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48712
diff changeset
136 self.NO_OP_ACTIONS.add(self)
48714
c5f05c0d1c8c merge-actions: have an attribute for narrow safetiness
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48713
diff changeset
137 self.narrow_safe = narrow_safe
48715
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
138 self.changes = changes
48711
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
139
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
140 def __hash__(self):
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
141 return hash(self._short)
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
142
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
143 def __repr__(self):
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
144 return 'MergeAction<%s>' % self._short.decode('ascii')
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
145
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
146 def __bytes__(self):
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
147 return self._short
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
148
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
149 def __eq__(self, other):
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
150 if other is None:
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
151 return False
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
152 assert isinstance(other, MergeAction)
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
153 return self._short == other._short
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
154
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
155 def __lt__(self, other):
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
156 return self._short < other._short
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
157
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
158
48715
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
159 ACTION_FORGET = MergeAction(b'f', narrow_safe=True, changes=CHANGE_REMOVED)
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
160 ACTION_REMOVE = MergeAction(b'r', narrow_safe=True, changes=CHANGE_REMOVED)
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
161 ACTION_ADD = MergeAction(b'a', narrow_safe=True, changes=CHANGE_ADDED)
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
162 ACTION_GET = MergeAction(b'g', narrow_safe=True, changes=CHANGE_MODIFIED)
48711
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
163 ACTION_PATH_CONFLICT = MergeAction(b'p')
49392
34e15bbab67c mergestate: action name was str
Georges Racinet <georges.racinet@octobus.net>
parents: 49306
diff changeset
164 ACTION_PATH_CONFLICT_RESOLVE = MergeAction(b'pr')
48715
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
165 ACTION_ADD_MODIFIED = MergeAction(
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
166 b'am', narrow_safe=True, changes=CHANGE_ADDED
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
167 ) # not 100% about the changes value here
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
168 ACTION_CREATED = MergeAction(b'c', narrow_safe=True, changes=CHANGE_ADDED)
48711
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
169 ACTION_DELETED_CHANGED = MergeAction(b'dc')
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
170 ACTION_CHANGED_DELETED = MergeAction(b'cd')
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
171 ACTION_MERGE = MergeAction(b'm')
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
172 ACTION_LOCAL_DIR_RENAME_GET = MergeAction(b'dg')
9bc86adf32f6 merge-actions: make merge action a full featured object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48710
diff changeset
173 ACTION_DIR_RENAME_MOVE_LOCAL = MergeAction(b'dm')
48713
5dfaca4464d1 merge-actions: add an explicite "no_op" attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48712
diff changeset
174 ACTION_KEEP = MergeAction(b'k', no_op=True)
45467
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45385
diff changeset
175 # the file was absent on local side before merge and we should
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45385
diff changeset
176 # keep it absent (absent means file not present, it can be a result
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45385
diff changeset
177 # of file deletion, rename etc.)
48713
5dfaca4464d1 merge-actions: add an explicite "no_op" attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48712
diff changeset
178 ACTION_KEEP_ABSENT = MergeAction(b'ka', no_op=True)
45524
6877b0ee5f9d mergestate: introduce a new ACTION_KEEP_NEW
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45518
diff changeset
179 # the file is absent on the ancestor and remote side of the merge
6877b0ee5f9d mergestate: introduce a new ACTION_KEEP_NEW
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45518
diff changeset
180 # hence this file is new and we should keep it
48713
5dfaca4464d1 merge-actions: add an explicite "no_op" attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48712
diff changeset
181 ACTION_KEEP_NEW = MergeAction(b'kn', no_op=True)
48715
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
182 ACTION_EXEC = MergeAction(b'e', narrow_safe=True, changes=CHANGE_MODIFIED)
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
183 ACTION_CREATED_MERGE = MergeAction(
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
184 b'cm', narrow_safe=True, changes=CHANGE_ADDED
7d073df49a54 merge-actions: add some information about the "changes" the action do
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48714
diff changeset
185 )
37112
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
186
45525
590a840fa367 mergestate: define NO_OP_ACTION in module scope instead of inside mergeresult
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45524
diff changeset
187
48710
b0aa9b0b9c21 convert: use the merge action constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48506
diff changeset
188 # Used by concert to detect situation it does not like, not sure what the exact
b0aa9b0b9c21 convert: use the merge action constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48506
diff changeset
189 # criteria is
b0aa9b0b9c21 convert: use the merge action constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48506
diff changeset
190 CONVERT_MERGE_ACTIONS = (
b0aa9b0b9c21 convert: use the merge action constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48506
diff changeset
191 ACTION_MERGE,
b0aa9b0b9c21 convert: use the merge action constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48506
diff changeset
192 ACTION_DIR_RENAME_MOVE_LOCAL,
b0aa9b0b9c21 convert: use the merge action constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48506
diff changeset
193 ACTION_CHANGED_DELETED,
b0aa9b0b9c21 convert: use the merge action constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48506
diff changeset
194 ACTION_DELETED_CHANGED,
b0aa9b0b9c21 convert: use the merge action constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48506
diff changeset
195 )
b0aa9b0b9c21 convert: use the merge action constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48506
diff changeset
196
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
197
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48935
diff changeset
198 class _mergestate_base:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45715
diff changeset
199 """track 3-way merge state of individual files
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
200
27022
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
201 The merge state is stored on disk when needed. Two files are used: one with
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
202 an old format (version 1), and one with a new format (version 2). Version 2
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
203 stores a superset of the data in version 1, including new kinds of records
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
204 in the future. For more about the new format, see the documentation for
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
205 `_readrecordsv2`.
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
206
27022
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
207 Each record can contain arbitrary content, and has an associated type. This
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
208 `type` should be a letter. If `type` is uppercase, the record is mandatory:
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
209 versions of Mercurial that don't support it should abort. If `type` is
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
210 lowercase, the record can be safely ignored.
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
211
27022
35102876d648 mergestate: move binary format documentation into _readrecordsv2
Siddharth Agarwal <sid0@fb.com>
parents: 27006
diff changeset
212 Currently known records:
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
213
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
214 L: the node of the "local" part of the merge (hexified version)
20591
02c60e380fd0 merge: record the "other" node in merge state
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20590
diff changeset
215 O: the node of the "other" part of the merge (hexified version)
20590
2b7d54e929b4 merge: introduce new format for the state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20589
diff changeset
216 F: a file to be merged entry
27031
8be0af32e513 mergestate: allow storing and retrieving change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27027
diff changeset
217 C: a change/delete or delete/change conflict
34545
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
218 P: a path conflict (file vs directory)
30332
318a24b52eeb spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents: 30200
diff changeset
219 f: a (filename, dictionary) tuple of optional values for a given file
28634
3ceac01bc29f merge: save merge part labels for later reuse
Simon Farnsworth <simonfar@fb.com>
parents: 28267
diff changeset
220 l: the labels for the parts of the merge.
26649
f618b6aa8cdd merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26641
diff changeset
221
34545
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
222 Merge record states (stored in self._state, indexed by filename):
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
223 u: unresolved conflict
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
224 r: resolved conflict
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
225 pu: unresolved path conflict (file conflicts with directory)
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
226 pr: resolved path conflict
45714
ecf6d7aa874b mergestate: document `o` merge record state in _mergestate_base docs
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45583
diff changeset
227 o: file was merged in favor of other parent of merge (DEPRECATED)
34545
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
228
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
229 The resolve command transitions between 'u' and 'r' for conflicts and
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
230 'pu' and 'pr' for path conflicts.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45715
diff changeset
231 """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
232
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
233 def __init__(self, repo):
27005
3185c01c551c mergestate: move _read() call to read constructor
Siddharth Agarwal <sid0@fb.com>
parents: 26991
diff changeset
234 """Initialize the merge state.
3185c01c551c mergestate: move _read() call to read constructor
Siddharth Agarwal <sid0@fb.com>
parents: 26991
diff changeset
235
3185c01c551c mergestate: move _read() call to read constructor
Siddharth Agarwal <sid0@fb.com>
parents: 26991
diff changeset
236 Do not use this directly! Instead call read() or clean()."""
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
237 self._repo = repo
45496
ef3273ac5f6e mergestate: initialize all properties in __init__()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45495
diff changeset
238 self._state = {}
ef3273ac5f6e mergestate: initialize all properties in __init__()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45495
diff changeset
239 self._stateextras = collections.defaultdict(dict)
ef3273ac5f6e mergestate: initialize all properties in __init__()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45495
diff changeset
240 self._local = None
ef3273ac5f6e mergestate: initialize all properties in __init__()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45495
diff changeset
241 self._other = None
ef3273ac5f6e mergestate: initialize all properties in __init__()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45495
diff changeset
242 self._labels = None
ef3273ac5f6e mergestate: initialize all properties in __init__()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45495
diff changeset
243 # contains a mapping of form:
ef3273ac5f6e mergestate: initialize all properties in __init__()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45495
diff changeset
244 # {filename : (merge_return_value, action_to_be_performed}
ef3273ac5f6e mergestate: initialize all properties in __init__()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45495
diff changeset
245 # these are results of re-running merge process
ef3273ac5f6e mergestate: initialize all properties in __init__()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45495
diff changeset
246 # this dict is used to perform actions on dirstate caused by re-running
ef3273ac5f6e mergestate: initialize all properties in __init__()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45495
diff changeset
247 # the merge
ef3273ac5f6e mergestate: initialize all properties in __init__()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45495
diff changeset
248 self._results = {}
12369
6f0d9d79111f merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12279
diff changeset
249 self._dirty = False
20651
c1a52dd56eb4 merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20642
diff changeset
250
45492
08c6d6962b2a mergestate: split up reset() for its two use cases
Martin von Zweigbergk <martinvonz@google.com>
parents: 45491
diff changeset
251 def reset(self):
45500
f2efc44213ec mergestate: make in-memory mergestate not clear on-disk mergestate on reset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45499
diff changeset
252 pass
45494
9ea4b52ac6bb mergestate: move most of of reset() into start()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45493
diff changeset
253
9ea4b52ac6bb mergestate: move most of of reset() into start()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45493
diff changeset
254 def start(self, node, other, labels=None):
9ea4b52ac6bb mergestate: move most of of reset() into start()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45493
diff changeset
255 self._local = node
9ea4b52ac6bb mergestate: move most of of reset() into start()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45493
diff changeset
256 self._other = other
9ea4b52ac6bb mergestate: move most of of reset() into start()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45493
diff changeset
257 self._labels = labels
26768
ac68769a5985 merge.mergestate: only check for merge driver when property is accessed
Siddharth Agarwal <sid0@fb.com>
parents: 26766
diff changeset
258
26765
45976219eb80 merge.mergestate: add a way to get the other side of the merge
Siddharth Agarwal <sid0@fb.com>
parents: 26752
diff changeset
259 @util.propertycache
44215
b1069b369d6e mergestate: add accessors for local and other nodeid, not just contexts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44212
diff changeset
260 def local(self):
27130
6f045b563fa5 mergestate: add a cached property accessor for the local context
Siddharth Agarwal <sid0@fb.com>
parents: 27129
diff changeset
261 if self._local is None:
44215
b1069b369d6e mergestate: add accessors for local and other nodeid, not just contexts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44212
diff changeset
262 msg = b"local accessed but self._local isn't set"
31646
e960eba3581c merge: use ProgrammingError
Jun Wu <quark@fb.com>
parents: 31515
diff changeset
263 raise error.ProgrammingError(msg)
44215
b1069b369d6e mergestate: add accessors for local and other nodeid, not just contexts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44212
diff changeset
264 return self._local
b1069b369d6e mergestate: add accessors for local and other nodeid, not just contexts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44212
diff changeset
265
b1069b369d6e mergestate: add accessors for local and other nodeid, not just contexts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44212
diff changeset
266 @util.propertycache
b1069b369d6e mergestate: add accessors for local and other nodeid, not just contexts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44212
diff changeset
267 def localctx(self):
b1069b369d6e mergestate: add accessors for local and other nodeid, not just contexts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44212
diff changeset
268 return self._repo[self.local]
b1069b369d6e mergestate: add accessors for local and other nodeid, not just contexts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44212
diff changeset
269
b1069b369d6e mergestate: add accessors for local and other nodeid, not just contexts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44212
diff changeset
270 @util.propertycache
b1069b369d6e mergestate: add accessors for local and other nodeid, not just contexts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44212
diff changeset
271 def other(self):
b1069b369d6e mergestate: add accessors for local and other nodeid, not just contexts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44212
diff changeset
272 if self._other is None:
b1069b369d6e mergestate: add accessors for local and other nodeid, not just contexts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44212
diff changeset
273 msg = b"other accessed but self._other isn't set"
b1069b369d6e mergestate: add accessors for local and other nodeid, not just contexts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44212
diff changeset
274 raise error.ProgrammingError(msg)
b1069b369d6e mergestate: add accessors for local and other nodeid, not just contexts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44212
diff changeset
275 return self._other
27130
6f045b563fa5 mergestate: add a cached property accessor for the local context
Siddharth Agarwal <sid0@fb.com>
parents: 27129
diff changeset
276
6f045b563fa5 mergestate: add a cached property accessor for the local context
Siddharth Agarwal <sid0@fb.com>
parents: 27129
diff changeset
277 @util.propertycache
26765
45976219eb80 merge.mergestate: add a way to get the other side of the merge
Siddharth Agarwal <sid0@fb.com>
parents: 26752
diff changeset
278 def otherctx(self):
44215
b1069b369d6e mergestate: add accessors for local and other nodeid, not just contexts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44212
diff changeset
279 return self._repo[self.other]
26649
f618b6aa8cdd merge.mergestate: add support for persisting a custom merge driver
Siddharth Agarwal <sid0@fb.com>
parents: 26641
diff changeset
280
21264
4e932dc5c113 resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21261
diff changeset
281 def active(self):
4e932dc5c113 resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21261
diff changeset
282 """Whether mergestate is active.
4e932dc5c113 resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21261
diff changeset
283
4e932dc5c113 resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21261
diff changeset
284 Returns True if there appears to be mergestate. This is a rough proxy
4e932dc5c113 resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21261
diff changeset
285 for "is a merge in progress."
4e932dc5c113 resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21261
diff changeset
286 """
44394
5e3402a0b868 mergestate: determine if active without looking for state files on disk
Martin von Zweigbergk <martinvonz@google.com>
parents: 44383
diff changeset
287 return bool(self._local) or bool(self._state)
21264
4e932dc5c113 resolve: abort when not applicable (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21261
diff changeset
288
12369
6f0d9d79111f merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12279
diff changeset
289 def commit(self):
20652
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
290 """Write current state on disk (if necessary)"""
27006
9d58dc193c46 mergestate.commit: factor out making the list of records
Siddharth Agarwal <sid0@fb.com>
parents: 27005
diff changeset
291
41155
8c222bec97da merge: make local file storage in the .hg/merge directory extensible
Daniel Ploch <dploch@google.com>
parents: 41050
diff changeset
292 @staticmethod
8c222bec97da merge: make local file storage in the .hg/merge directory extensible
Daniel Ploch <dploch@google.com>
parents: 41050
diff changeset
293 def getlocalkey(path):
8c222bec97da merge: make local file storage in the .hg/merge directory extensible
Daniel Ploch <dploch@google.com>
parents: 41050
diff changeset
294 """hash the path of a local file context for storage in the .hg/merge
8c222bec97da merge: make local file storage in the .hg/merge directory extensible
Daniel Ploch <dploch@google.com>
parents: 41050
diff changeset
295 directory."""
8c222bec97da merge: make local file storage in the .hg/merge directory extensible
Daniel Ploch <dploch@google.com>
parents: 41050
diff changeset
296
44060
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43798
diff changeset
297 return hex(hashutil.sha1(path).digest())
41155
8c222bec97da merge: make local file storage in the .hg/merge directory extensible
Daniel Ploch <dploch@google.com>
parents: 41050
diff changeset
298
45497
e833ff4dd0ea mergestate: extract overridable methods for making/restoring file backups
Martin von Zweigbergk <martinvonz@google.com>
parents: 45496
diff changeset
299 def _make_backup(self, fctx, localkey):
45498
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
300 raise NotImplementedError()
45497
e833ff4dd0ea mergestate: extract overridable methods for making/restoring file backups
Martin von Zweigbergk <martinvonz@google.com>
parents: 45496
diff changeset
301
e833ff4dd0ea mergestate: extract overridable methods for making/restoring file backups
Martin von Zweigbergk <martinvonz@google.com>
parents: 45496
diff changeset
302 def _restore_backup(self, fctx, localkey, flags):
45498
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
303 raise NotImplementedError()
45497
e833ff4dd0ea mergestate: extract overridable methods for making/restoring file backups
Martin von Zweigbergk <martinvonz@google.com>
parents: 45496
diff changeset
304
18338
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
305 def add(self, fcl, fco, fca, fd):
20652
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
306 """add a new (potentially?) conflicting file the merge state
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
307 fcl: file context for local,
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
308 fco: file context for remote,
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
309 fca: file context for ancestors,
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
310 fd: file path of the resulting merge.
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
311
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
312 note: also write the local version to the `.hg/merge` directory.
2a4871c2511d merge: adds documentation to the mergestate class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20651
diff changeset
313 """
27049
0d61f7ec7f76 mergestate.add: store absentfilectxes as nullhex
Siddharth Agarwal <sid0@fb.com>
parents: 27048
diff changeset
314 if fcl.isabsent():
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46845
diff changeset
315 localkey = self._repo.nodeconstants.nullhex
27049
0d61f7ec7f76 mergestate.add: store absentfilectxes as nullhex
Siddharth Agarwal <sid0@fb.com>
parents: 27048
diff changeset
316 else:
41155
8c222bec97da merge: make local file storage in the .hg/merge directory extensible
Daniel Ploch <dploch@google.com>
parents: 41050
diff changeset
317 localkey = mergestate.getlocalkey(fcl.path())
45497
e833ff4dd0ea mergestate: extract overridable methods for making/restoring file backups
Martin von Zweigbergk <martinvonz@google.com>
parents: 45496
diff changeset
318 self._make_backup(fcl, localkey)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
319 self._state[fd] = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
320 MERGE_RECORD_UNRESOLVED,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
321 localkey,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
322 fcl.path(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
323 fca.path(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
324 hex(fca.filenode()),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
325 fco.path(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
326 hex(fco.filenode()),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
327 fcl.flags(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
328 ]
45583
9f14bb4d59ea mergestate: update _stateextras instead of reassinging
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45525
diff changeset
329 self._stateextras[fd][b'ancestorlinknode'] = hex(fca.node())
12369
6f0d9d79111f merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12279
diff changeset
330 self._dirty = True
20651
c1a52dd56eb4 merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20642
diff changeset
331
45159
e05a488cbed0 mergestate: rename addpath() -> addpathonflict() to prevent confusion
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44939
diff changeset
332 def addpathconflict(self, path, frename, forigin):
34545
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
333 """add a new conflicting path to the merge state
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
334 path: the path that conflicts
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
335 frename: the filename the conflicting file was renamed to
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
336 forigin: origin of the file ('l' or 'r' for local/remote)
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
337 """
37111
aa5199c7aa42 merge: use constants for merge record state
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37110
diff changeset
338 self._state[path] = [MERGE_RECORD_UNRESOLVED_PATH, frename, forigin]
34545
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
339 self._dirty = True
1913162854f2 merge: add pathconflict merge state
Mark Thomas <mbthomas@fb.com>
parents: 34522
diff changeset
340
45385
05d19ca33b33 mergestate: replace `addmergedother()` with generic `addcommitinfo()` (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45382
diff changeset
341 def addcommitinfo(self, path, data):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45715
diff changeset
342 """stores information which is required at commit
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45715
diff changeset
343 into _stateextras"""
45385
05d19ca33b33 mergestate: replace `addmergedother()` with generic `addcommitinfo()` (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45382
diff changeset
344 self._stateextras[path].update(data)
44687
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
345 self._dirty = True
1b8fd4af3318 mergestate: store about files resolved in favour of other
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44452
diff changeset
346
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
347 def __contains__(self, dfile):
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
348 return dfile in self._state
20651
c1a52dd56eb4 merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20642
diff changeset
349
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
350 def __getitem__(self, dfile):
6518
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6517
diff changeset
351 return self._state[dfile][0]
20651
c1a52dd56eb4 merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20642
diff changeset
352
6518
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6517
diff changeset
353 def __iter__(self):
21268
a0b8a912ec81 merge: simplify mergestate iter
Mads Kiilerich <mads@kiilerich.com>
parents: 21266
diff changeset
354 return iter(sorted(self._state))
20651
c1a52dd56eb4 merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20642
diff changeset
355
19285
feaf5749d7a4 merge: add a files method to the mergestate class
Bryan O'Sullivan <bryano@fb.com>
parents: 19226
diff changeset
356 def files(self):
feaf5749d7a4 merge: add a files method to the mergestate class
Bryan O'Sullivan <bryano@fb.com>
parents: 19226
diff changeset
357 return self._state.keys()
20651
c1a52dd56eb4 merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20642
diff changeset
358
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6425
diff changeset
359 def mark(self, dfile, state):
6518
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6517
diff changeset
360 self._state[dfile][0] = state
12369
6f0d9d79111f merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 12279
diff changeset
361 self._dirty = True
20651
c1a52dd56eb4 merge: add blank line between mergestate's method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20642
diff changeset
362
21266
19d6fec60b81 resolve: print message when no unresolved files remain (issue4214)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21264
diff changeset
363 def unresolved(self):
19d6fec60b81 resolve: print message when no unresolved files remain (issue4214)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21264
diff changeset
364 """Obtain the paths of unresolved files."""
19d6fec60b81 resolve: print message when no unresolved files remain (issue4214)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21264
diff changeset
365
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
366 for f, entry in self._state.items():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
367 if entry[0] in (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
368 MERGE_RECORD_UNRESOLVED,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
369 MERGE_RECORD_UNRESOLVED_PATH,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
370 ):
21266
19d6fec60b81 resolve: print message when no unresolved files remain (issue4214)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21264
diff changeset
371 yield f
19d6fec60b81 resolve: print message when no unresolved files remain (issue4214)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21264
diff changeset
372
45715
0428978bca22 mergestate: add `allextras()` to get all extras
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45714
diff changeset
373 def allextras(self):
47062
f38bf44e077f black: make codebase compatible with black v21.4b2 and v20.8b1
Kyle Lippincott <spectral@google.com>
parents: 46845
diff changeset
374 """return all extras information stored with the mergestate"""
45715
0428978bca22 mergestate: add `allextras()` to get all extras
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45714
diff changeset
375 return self._stateextras
0428978bca22 mergestate: add `allextras()` to get all extras
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45714
diff changeset
376
28009
4a25e91fa55d merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents: 27951
diff changeset
377 def extras(self, filename):
47062
f38bf44e077f black: make codebase compatible with black v21.4b2 and v20.8b1
Kyle Lippincott <spectral@google.com>
parents: 46845
diff changeset
378 """return extras stored with the mergestate for the given filename"""
45381
ede4c121239e mergestate: use collections.defaultdict(dict) for _stateextras
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45302
diff changeset
379 return self._stateextras[filename]
28009
4a25e91fa55d merge: add state extras merge state data
Durham Goode <durham@fb.com>
parents: 27951
diff changeset
380
48429
f9bc36863923 mergestate: inline `_resolve()` into `resolve()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 48428
diff changeset
381 def resolve(self, dfile, wctx):
f9bc36863923 mergestate: inline `_resolve()` into `resolve()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 48428
diff changeset
382 """run merge process for dfile
f9bc36863923 mergestate: inline `_resolve()` into `resolve()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 48428
diff changeset
383
f9bc36863923 mergestate: inline `_resolve()` into `resolve()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 48428
diff changeset
384 Returns the exit code of the merge."""
45518
32ce4cbaec4b mergedriver: delete it
Martin von Zweigbergk <martinvonz@google.com>
parents: 45501
diff changeset
385 if self[dfile] in (
32ce4cbaec4b mergedriver: delete it
Martin von Zweigbergk <martinvonz@google.com>
parents: 45501
diff changeset
386 MERGE_RECORD_RESOLVED,
32ce4cbaec4b mergedriver: delete it
Martin von Zweigbergk <martinvonz@google.com>
parents: 45501
diff changeset
387 LEGACY_RECORD_DRIVER_RESOLVED,
32ce4cbaec4b mergedriver: delete it
Martin von Zweigbergk <martinvonz@google.com>
parents: 45501
diff changeset
388 ):
48428
c25a67cfc291 mergestate: make `_resolve()` do both preresolve and resolve
Martin von Zweigbergk <martinvonz@google.com>
parents: 48427
diff changeset
389 return 0
20593
3678707e4017 merge: add "other" file node in the merge state file
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20592
diff changeset
390 stateentry = self._state[dfile]
41155
8c222bec97da merge: make local file storage in the .hg/merge directory extensible
Daniel Ploch <dploch@google.com>
parents: 41050
diff changeset
391 state, localkey, lfile, afile, anode, ofile, onode, flags = stateentry
20594
ba619c50a355 resolve: use "other" changeset from merge state (issue4163)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20593
diff changeset
392 octx = self._repo[self._other]
28011
8abd9f785030 merge: add file ancestor linknode to mergestate
Durham Goode <durham@fb.com>
parents: 28009
diff changeset
393 extras = self.extras(dfile)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
394 anccommitnode = extras.get(b'ancestorlinknode')
28011
8abd9f785030 merge: add file ancestor linknode to mergestate
Durham Goode <durham@fb.com>
parents: 28009
diff changeset
395 if anccommitnode:
8abd9f785030 merge: add file ancestor linknode to mergestate
Durham Goode <durham@fb.com>
parents: 28009
diff changeset
396 actx = self._repo[anccommitnode]
8abd9f785030 merge: add file ancestor linknode to mergestate
Durham Goode <durham@fb.com>
parents: 28009
diff changeset
397 else:
8abd9f785030 merge: add file ancestor linknode to mergestate
Durham Goode <durham@fb.com>
parents: 28009
diff changeset
398 actx = None
44871
17d928f8abaf mergestate: move staticmethod _filectxorabsent to module level
Augie Fackler <augie@google.com>
parents: 44856
diff changeset
399 fcd = _filectxorabsent(localkey, wctx, dfile)
17d928f8abaf mergestate: move staticmethod _filectxorabsent to module level
Augie Fackler <augie@google.com>
parents: 44856
diff changeset
400 fco = _filectxorabsent(onode, octx, ofile)
27048
86290f6f6599 mergestate._resolve: handle change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27035
diff changeset
401 # TODO: move this to filectxorabsent
37172
daef13da66fe context: avoid using a context object as a changeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37125
diff changeset
402 fca = self._repo.filectx(afile, fileid=anode, changectx=actx)
18338
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
403 # "premerge" x flags
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
404 flo = fco.flags()
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
405 fla = fca.flags()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
406 if b'x' in flags + flo + fla and b'l' not in flags + flo + fla:
46843
728d89f6f9b1 refactor: prefer checks against nullrev over nullid
Joerg Sonnenberger <joerg@bec.de>
parents: 46781
diff changeset
407 if fca.rev() == nullrev and flags != flo:
48428
c25a67cfc291 mergestate: make `_resolve()` do both preresolve and resolve
Martin von Zweigbergk <martinvonz@google.com>
parents: 48427
diff changeset
408 self._repo.ui.warn(
c25a67cfc291 mergestate: make `_resolve()` do both preresolve and resolve
Martin von Zweigbergk <martinvonz@google.com>
parents: 48427
diff changeset
409 _(
c25a67cfc291 mergestate: make `_resolve()` do both preresolve and resolve
Martin von Zweigbergk <martinvonz@google.com>
parents: 48427
diff changeset
410 b'warning: cannot merge flags for %s '
c25a67cfc291 mergestate: make `_resolve()` do both preresolve and resolve
Martin von Zweigbergk <martinvonz@google.com>
parents: 48427
diff changeset
411 b'without common ancestor - keeping local flags\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
412 )
48428
c25a67cfc291 mergestate: make `_resolve()` do both preresolve and resolve
Martin von Zweigbergk <martinvonz@google.com>
parents: 48427
diff changeset
413 % afile
c25a67cfc291 mergestate: make `_resolve()` do both preresolve and resolve
Martin von Zweigbergk <martinvonz@google.com>
parents: 48427
diff changeset
414 )
18338
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
415 elif flags == fla:
384df4db6520 merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents: 18336
diff changeset
416 flags = flo
48428
c25a67cfc291 mergestate: make `_resolve()` do both preresolve and resolve
Martin von Zweigbergk <martinvonz@google.com>
parents: 48427
diff changeset
417 # restore local
c25a67cfc291 mergestate: make `_resolve()` do both preresolve and resolve
Martin von Zweigbergk <martinvonz@google.com>
parents: 48427
diff changeset
418 if localkey != self._repo.nodeconstants.nullhex:
c25a67cfc291 mergestate: make `_resolve()` do both preresolve and resolve
Martin von Zweigbergk <martinvonz@google.com>
parents: 48427
diff changeset
419 self._restore_backup(wctx[dfile], localkey, flags)
26617
dfd9811c5c9b merge: introduce a preresolve function
Siddharth Agarwal <sid0@fb.com>
parents: 26616
diff changeset
420 else:
48428
c25a67cfc291 mergestate: make `_resolve()` do both preresolve and resolve
Martin von Zweigbergk <martinvonz@google.com>
parents: 48427
diff changeset
421 wctx[dfile].remove(ignoremissing=True)
48760
93d6f0e7ba2f filemerge: move check for identical sides out of filemerge()
Martin von Zweigbergk <martinvonz@google.com>
parents: 48759
diff changeset
422
93d6f0e7ba2f filemerge: move check for identical sides out of filemerge()
Martin von Zweigbergk <martinvonz@google.com>
parents: 48759
diff changeset
423 if not fco.cmp(fcd): # files identical?
93d6f0e7ba2f filemerge: move check for identical sides out of filemerge()
Martin von Zweigbergk <martinvonz@google.com>
parents: 48759
diff changeset
424 # If return value of merge is None, then there are no real conflict
93d6f0e7ba2f filemerge: move check for identical sides out of filemerge()
Martin von Zweigbergk <martinvonz@google.com>
parents: 48759
diff changeset
425 del self._state[dfile]
93d6f0e7ba2f filemerge: move check for identical sides out of filemerge()
Martin von Zweigbergk <martinvonz@google.com>
parents: 48759
diff changeset
426 self._results[dfile] = None, None
93d6f0e7ba2f filemerge: move check for identical sides out of filemerge()
Martin von Zweigbergk <martinvonz@google.com>
parents: 48759
diff changeset
427 self._dirty = True
93d6f0e7ba2f filemerge: move check for identical sides out of filemerge()
Martin von Zweigbergk <martinvonz@google.com>
parents: 48759
diff changeset
428 return None
93d6f0e7ba2f filemerge: move check for identical sides out of filemerge()
Martin von Zweigbergk <martinvonz@google.com>
parents: 48759
diff changeset
429
48506
608a35db186c filemerge: stop returning always-`True` value
Martin von Zweigbergk <martinvonz@google.com>
parents: 48430
diff changeset
430 merge_ret, deleted = filemerge.filemerge(
48428
c25a67cfc291 mergestate: make `_resolve()` do both preresolve and resolve
Martin von Zweigbergk <martinvonz@google.com>
parents: 48427
diff changeset
431 self._repo,
c25a67cfc291 mergestate: make `_resolve()` do both preresolve and resolve
Martin von Zweigbergk <martinvonz@google.com>
parents: 48427
diff changeset
432 wctx,
c25a67cfc291 mergestate: make `_resolve()` do both preresolve and resolve
Martin von Zweigbergk <martinvonz@google.com>
parents: 48427
diff changeset
433 self._local,
c25a67cfc291 mergestate: make `_resolve()` do both preresolve and resolve
Martin von Zweigbergk <martinvonz@google.com>
parents: 48427
diff changeset
434 lfile,
c25a67cfc291 mergestate: make `_resolve()` do both preresolve and resolve
Martin von Zweigbergk <martinvonz@google.com>
parents: 48427
diff changeset
435 fcd,
c25a67cfc291 mergestate: make `_resolve()` do both preresolve and resolve
Martin von Zweigbergk <martinvonz@google.com>
parents: 48427
diff changeset
436 fco,
c25a67cfc291 mergestate: make `_resolve()` do both preresolve and resolve
Martin von Zweigbergk <martinvonz@google.com>
parents: 48427
diff changeset
437 fca,
c25a67cfc291 mergestate: make `_resolve()` do both preresolve and resolve
Martin von Zweigbergk <martinvonz@google.com>
parents: 48427
diff changeset
438 labels=self._labels,
c25a67cfc291 mergestate: make `_resolve()` do both preresolve and resolve
Martin von Zweigbergk <martinvonz@google.com>
parents: 48427
diff changeset
439 )
48759
d169e651066b mergestate: use an early return for trivial merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 48715
diff changeset
440
d169e651066b mergestate: use an early return for trivial merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 48715
diff changeset
441 if not merge_ret:
37111
aa5199c7aa42 merge: use constants for merge record state
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37110
diff changeset
442 self.mark(dfile, MERGE_RECORD_RESOLVED)
27035
de7bf242644e merge.mergestate: compute dirstate action
Siddharth Agarwal <sid0@fb.com>
parents: 27034
diff changeset
443
48506
608a35db186c filemerge: stop returning always-`True` value
Martin von Zweigbergk <martinvonz@google.com>
parents: 48430
diff changeset
444 action = None
608a35db186c filemerge: stop returning always-`True` value
Martin von Zweigbergk <martinvonz@google.com>
parents: 48430
diff changeset
445 if deleted:
608a35db186c filemerge: stop returning always-`True` value
Martin von Zweigbergk <martinvonz@google.com>
parents: 48430
diff changeset
446 if fcd.isabsent():
608a35db186c filemerge: stop returning always-`True` value
Martin von Zweigbergk <martinvonz@google.com>
parents: 48430
diff changeset
447 # dc: local picked. Need to drop if present, which may
608a35db186c filemerge: stop returning always-`True` value
Martin von Zweigbergk <martinvonz@google.com>
parents: 48430
diff changeset
448 # happen on re-resolves.
608a35db186c filemerge: stop returning always-`True` value
Martin von Zweigbergk <martinvonz@google.com>
parents: 48430
diff changeset
449 action = ACTION_FORGET
608a35db186c filemerge: stop returning always-`True` value
Martin von Zweigbergk <martinvonz@google.com>
parents: 48430
diff changeset
450 else:
608a35db186c filemerge: stop returning always-`True` value
Martin von Zweigbergk <martinvonz@google.com>
parents: 48430
diff changeset
451 # cd: remote picked (or otherwise deleted)
608a35db186c filemerge: stop returning always-`True` value
Martin von Zweigbergk <martinvonz@google.com>
parents: 48430
diff changeset
452 action = ACTION_REMOVE
608a35db186c filemerge: stop returning always-`True` value
Martin von Zweigbergk <martinvonz@google.com>
parents: 48430
diff changeset
453 else:
608a35db186c filemerge: stop returning always-`True` value
Martin von Zweigbergk <martinvonz@google.com>
parents: 48430
diff changeset
454 if fcd.isabsent(): # dc: remote picked
608a35db186c filemerge: stop returning always-`True` value
Martin von Zweigbergk <martinvonz@google.com>
parents: 48430
diff changeset
455 action = ACTION_GET
608a35db186c filemerge: stop returning always-`True` value
Martin von Zweigbergk <martinvonz@google.com>
parents: 48430
diff changeset
456 elif fco.isabsent(): # cd: local picked
608a35db186c filemerge: stop returning always-`True` value
Martin von Zweigbergk <martinvonz@google.com>
parents: 48430
diff changeset
457 if dfile in self.localctx:
608a35db186c filemerge: stop returning always-`True` value
Martin von Zweigbergk <martinvonz@google.com>
parents: 48430
diff changeset
458 action = ACTION_ADD_MODIFIED
27122
77d760ba8dcd mergestate: explicitly forget 'dc' conflicts where the deleted side is picked
Siddharth Agarwal <sid0@fb.com>
parents: 27121
diff changeset
459 else:
48506
608a35db186c filemerge: stop returning always-`True` value
Martin von Zweigbergk <martinvonz@google.com>
parents: 48430
diff changeset
460 action = ACTION_ADD
608a35db186c filemerge: stop returning always-`True` value
Martin von Zweigbergk <martinvonz@google.com>
parents: 48430
diff changeset
461 # else: regular merges (no action necessary)
608a35db186c filemerge: stop returning always-`True` value
Martin von Zweigbergk <martinvonz@google.com>
parents: 48430
diff changeset
462 self._results[dfile] = merge_ret, action
27035
de7bf242644e merge.mergestate: compute dirstate action
Siddharth Agarwal <sid0@fb.com>
parents: 27034
diff changeset
463
48428
c25a67cfc291 mergestate: make `_resolve()` do both preresolve and resolve
Martin von Zweigbergk <martinvonz@google.com>
parents: 48427
diff changeset
464 return merge_ret
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
465
27076
09139ccf3085 mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents: 27075
diff changeset
466 def counts(self):
09139ccf3085 mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents: 27075
diff changeset
467 """return counts for updated, merged and removed files in this
09139ccf3085 mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents: 27075
diff changeset
468 session"""
09139ccf3085 mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents: 27075
diff changeset
469 updated, merged, removed = 0, 0, 0
48935
2cce2fa5bcf7 py3: replace pycompat.itervalues(x) with x.values()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
470 for r, action in self._results.values():
27076
09139ccf3085 mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents: 27075
diff changeset
471 if r is None:
09139ccf3085 mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents: 27075
diff changeset
472 updated += 1
09139ccf3085 mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents: 27075
diff changeset
473 elif r == 0:
37112
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
474 if action == ACTION_REMOVE:
27076
09139ccf3085 mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents: 27075
diff changeset
475 removed += 1
09139ccf3085 mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents: 27075
diff changeset
476 else:
09139ccf3085 mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents: 27075
diff changeset
477 merged += 1
09139ccf3085 mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents: 27075
diff changeset
478 return updated, merged, removed
09139ccf3085 mergestate: add a method to return updated/merged/removed counts
Siddharth Agarwal <sid0@fb.com>
parents: 27075
diff changeset
479
27077
ca3fbf9dad8c mergestate: add a function to return the number of unresolved files
Siddharth Agarwal <sid0@fb.com>
parents: 27076
diff changeset
480 def unresolvedcount(self):
ca3fbf9dad8c mergestate: add a function to return the number of unresolved files
Siddharth Agarwal <sid0@fb.com>
parents: 27076
diff changeset
481 """get unresolved count for this merge (persistent)"""
33311
f8f716da90fa mergestate: implement unresolvedcount() in terms of unresolved()
Martin von Zweigbergk <martinvonz@google.com>
parents: 33310
diff changeset
482 return len(list(self.unresolved()))
27077
ca3fbf9dad8c mergestate: add a function to return the number of unresolved files
Siddharth Agarwal <sid0@fb.com>
parents: 27076
diff changeset
483
27079
a88a10a933b2 mergestate: add a method to compute actions to perform on dirstate
Siddharth Agarwal <sid0@fb.com>
parents: 27078
diff changeset
484 def actions(self):
a88a10a933b2 mergestate: add a method to compute actions to perform on dirstate
Siddharth Agarwal <sid0@fb.com>
parents: 27078
diff changeset
485 """return lists of actions to perform on the dirstate"""
37112
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
486 actions = {
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
487 ACTION_REMOVE: [],
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
488 ACTION_FORGET: [],
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
489 ACTION_ADD: [],
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
490 ACTION_ADD_MODIFIED: [],
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
491 ACTION_GET: [],
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
492 }
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
493 for f, (r, action) in self._results.items():
27079
a88a10a933b2 mergestate: add a method to compute actions to perform on dirstate
Siddharth Agarwal <sid0@fb.com>
parents: 27078
diff changeset
494 if action is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
495 actions[action].append((f, None, b"merge result"))
27079
a88a10a933b2 mergestate: add a method to compute actions to perform on dirstate
Siddharth Agarwal <sid0@fb.com>
parents: 27078
diff changeset
496 return actions
a88a10a933b2 mergestate: add a method to compute actions to perform on dirstate
Siddharth Agarwal <sid0@fb.com>
parents: 27078
diff changeset
497
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
498
45498
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
499 class mergestate(_mergestate_base):
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
500 statepathv1 = b'merge/state'
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
501 statepathv2 = b'merge/state2'
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
502
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
503 @staticmethod
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
504 def clean(repo):
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
505 """Initialize a brand new merge state, removing any existing state on
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
506 disk."""
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
507 ms = mergestate(repo)
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
508 ms.reset()
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
509 return ms
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
510
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
511 @staticmethod
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
512 def read(repo):
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
513 """Initialize the merge state, reading it from disk."""
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
514 ms = mergestate(repo)
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
515 ms._read()
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
516 return ms
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
517
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
518 def _read(self):
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
519 """Analyse each record content to restore a serialized state from disk
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
520
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
521 This function process "record" entry produced by the de-serialization
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
522 of on disk file.
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
523 """
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
524 unsupported = set()
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
525 records = self._readrecords()
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
526 for rtype, record in records:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
527 if rtype == RECORD_LOCAL:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
528 self._local = bin(record)
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
529 elif rtype == RECORD_OTHER:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
530 self._other = bin(record)
45518
32ce4cbaec4b mergedriver: delete it
Martin von Zweigbergk <martinvonz@google.com>
parents: 45501
diff changeset
531 elif rtype == LEGACY_MERGE_DRIVER_STATE:
32ce4cbaec4b mergedriver: delete it
Martin von Zweigbergk <martinvonz@google.com>
parents: 45501
diff changeset
532 pass
45498
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
533 elif rtype in (
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
534 RECORD_MERGED,
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
535 RECORD_CHANGEDELETE_CONFLICT,
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
536 RECORD_PATH_CONFLICT,
45518
32ce4cbaec4b mergedriver: delete it
Martin von Zweigbergk <martinvonz@google.com>
parents: 45501
diff changeset
537 LEGACY_MERGE_DRIVER_MERGE,
45498
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
538 LEGACY_RECORD_RESOLVED_OTHER,
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
539 ):
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
540 bits = record.split(b'\0')
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
541 # merge entry type MERGE_RECORD_MERGED_OTHER is deprecated
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
542 # and we now store related information in _stateextras, so
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
543 # lets write to _stateextras directly
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
544 if bits[1] == MERGE_RECORD_MERGED_OTHER:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
545 self._stateextras[bits[0]][b'filenode-source'] = b'other'
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
546 else:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
547 self._state[bits[0]] = bits[1:]
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
548 elif rtype == RECORD_FILE_VALUES:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
549 filename, rawextras = record.split(b'\0', 1)
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
550 extraparts = rawextras.split(b'\0')
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
551 extras = {}
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
552 i = 0
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
553 while i < len(extraparts):
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
554 extras[extraparts[i]] = extraparts[i + 1]
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
555 i += 2
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
556
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
557 self._stateextras[filename] = extras
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
558 elif rtype == RECORD_LABELS:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
559 labels = record.split(b'\0', 2)
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
560 self._labels = [l for l in labels if len(l) > 0]
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
561 elif not rtype.islower():
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
562 unsupported.add(rtype)
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
563
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
564 if unsupported:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
565 raise error.UnsupportedMergeRecords(unsupported)
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
566
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
567 def _readrecords(self):
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
568 """Read merge state from disk and return a list of record (TYPE, data)
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
569
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
570 We read data from both v1 and v2 files and decide which one to use.
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
571
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
572 V1 has been used by version prior to 2.9.1 and contains less data than
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
573 v2. We read both versions and check if no data in v2 contradicts
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
574 v1. If there is not contradiction we can safely assume that both v1
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
575 and v2 were written at the same time and use the extract data in v2. If
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
576 there is contradiction we ignore v2 content as we assume an old version
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
577 of Mercurial has overwritten the mergestate file and left an old v2
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
578 file around.
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
579
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
580 returns list of record [(TYPE, data), ...]"""
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
581 v1records = self._readrecordsv1()
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
582 v2records = self._readrecordsv2()
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
583 if self._v1v2match(v1records, v2records):
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
584 return v2records
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
585 else:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
586 # v1 file is newer than v2 file, use it
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
587 # we have to infer the "other" changeset of the merge
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
588 # we cannot do better than that with v1 of the format
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
589 mctx = self._repo[None].parents()[-1]
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
590 v1records.append((RECORD_OTHER, mctx.hex()))
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
591 # add place holder "other" file node information
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
592 # nobody is using it yet so we do no need to fetch the data
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
593 # if mctx was wrong `mctx[bits[-2]]` may fails.
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
594 for idx, r in enumerate(v1records):
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
595 if r[0] == RECORD_MERGED:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
596 bits = r[1].split(b'\0')
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
597 bits.insert(-2, b'')
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
598 v1records[idx] = (r[0], b'\0'.join(bits))
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
599 return v1records
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
600
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
601 def _v1v2match(self, v1records, v2records):
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
602 oldv2 = set() # old format version of v2 record
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
603 for rec in v2records:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
604 if rec[0] == RECORD_LOCAL:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
605 oldv2.add(rec)
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
606 elif rec[0] == RECORD_MERGED:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
607 # drop the onode data (not contained in v1)
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
608 oldv2.add((RECORD_MERGED, _droponode(rec[1])))
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
609 for rec in v1records:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
610 if rec not in oldv2:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
611 return False
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
612 else:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
613 return True
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
614
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
615 def _readrecordsv1(self):
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
616 """read on disk merge state for version 1 file
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
617
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
618 returns list of record [(TYPE, data), ...]
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
619
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
620 Note: the "F" data from this file are one entry short
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
621 (no "other file node" entry)
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
622 """
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
623 records = []
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
624 try:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
625 f = self._repo.vfs(self.statepathv1)
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
626 for i, l in enumerate(f):
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
627 if i == 0:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
628 records.append((RECORD_LOCAL, l[:-1]))
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
629 else:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
630 records.append((RECORD_MERGED, l[:-1]))
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
631 f.close()
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 48946
diff changeset
632 except FileNotFoundError:
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 48946
diff changeset
633 pass
45498
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
634 return records
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
635
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
636 def _readrecordsv2(self):
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
637 """read on disk merge state for version 2 file
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
638
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
639 This format is a list of arbitrary records of the form:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
640
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
641 [type][length][content]
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
642
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
643 `type` is a single character, `length` is a 4 byte integer, and
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
644 `content` is an arbitrary byte sequence of length `length`.
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
645
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
646 Mercurial versions prior to 3.7 have a bug where if there are
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
647 unsupported mandatory merge records, attempting to clear out the merge
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
648 state with hg update --clean or similar aborts. The 't' record type
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
649 works around that by writing out what those versions treat as an
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
650 advisory record, but later versions interpret as special: the first
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
651 character is the 'real' record type and everything onwards is the data.
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
652
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
653 Returns list of records [(TYPE, data), ...]."""
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
654 records = []
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
655 try:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
656 f = self._repo.vfs(self.statepathv2)
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
657 data = f.read()
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
658 off = 0
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
659 end = len(data)
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
660 while off < end:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
661 rtype = data[off : off + 1]
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
662 off += 1
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
663 length = _unpack(b'>I', data[off : (off + 4)])[0]
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
664 off += 4
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
665 record = data[off : (off + length)]
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
666 off += length
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
667 if rtype == RECORD_OVERRIDE:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
668 rtype, record = record[0:1], record[1:]
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
669 records.append((rtype, record))
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
670 f.close()
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 48946
diff changeset
671 except FileNotFoundError:
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 48946
diff changeset
672 pass
45498
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
673 return records
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
674
45501
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
675 def commit(self):
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
676 if self._dirty:
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
677 records = self._makerecords()
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
678 self._writerecords(records)
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
679 self._dirty = False
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
680
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
681 def _makerecords(self):
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
682 records = []
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
683 records.append((RECORD_LOCAL, hex(self._local)))
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
684 records.append((RECORD_OTHER, hex(self._other)))
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
685 # Write out state items. In all cases, the value of the state map entry
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
686 # is written as the contents of the record. The record type depends on
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
687 # the type of state that is stored, and capital-letter records are used
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
688 # to prevent older versions of Mercurial that do not support the feature
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
689 # from loading them.
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
690 for filename, v in self._state.items():
45518
32ce4cbaec4b mergedriver: delete it
Martin von Zweigbergk <martinvonz@google.com>
parents: 45501
diff changeset
691 if v[0] in (
45501
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
692 MERGE_RECORD_UNRESOLVED_PATH,
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
693 MERGE_RECORD_RESOLVED_PATH,
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
694 ):
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
695 # Path conflicts. These are stored in 'P' records. The current
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
696 # resolution state ('pu' or 'pr') is stored within the record.
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
697 records.append(
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
698 (RECORD_PATH_CONFLICT, b'\0'.join([filename] + v))
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
699 )
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46845
diff changeset
700 elif (
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46845
diff changeset
701 v[1] == self._repo.nodeconstants.nullhex
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46845
diff changeset
702 or v[6] == self._repo.nodeconstants.nullhex
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46845
diff changeset
703 ):
45501
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
704 # Change/Delete or Delete/Change conflicts. These are stored in
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
705 # 'C' records. v[1] is the local file, and is nullhex when the
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
706 # file is deleted locally ('dc'). v[6] is the remote file, and
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
707 # is nullhex when the file is deleted remotely ('cd').
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
708 records.append(
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
709 (RECORD_CHANGEDELETE_CONFLICT, b'\0'.join([filename] + v))
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
710 )
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
711 else:
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
712 # Normal files. These are stored in 'F' records.
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
713 records.append((RECORD_MERGED, b'\0'.join([filename] + v)))
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
714 for filename, extras in sorted(self._stateextras.items()):
45501
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
715 rawextras = b'\0'.join(
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
716 b'%s\0%s' % (k, v) for k, v in extras.items()
45501
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
717 )
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
718 records.append(
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
719 (RECORD_FILE_VALUES, b'%s\0%s' % (filename, rawextras))
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
720 )
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
721 if self._labels is not None:
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
722 labels = b'\0'.join(self._labels)
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
723 records.append((RECORD_LABELS, labels))
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
724 return records
0e75c088f0dc mergestate: move commit() from base class to on-disk subclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 45500
diff changeset
725
45498
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
726 def _writerecords(self, records):
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
727 """Write current state on disk (both v1 and v2)"""
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
728 self._writerecordsv1(records)
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
729 self._writerecordsv2(records)
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
730
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
731 def _writerecordsv1(self, records):
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
732 """Write current state on disk in a version 1 file"""
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
733 f = self._repo.vfs(self.statepathv1, b'wb')
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
734 irecords = iter(records)
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
735 lrecords = next(irecords)
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
736 assert lrecords[0] == RECORD_LOCAL
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
737 f.write(hex(self._local) + b'\n')
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
738 for rtype, data in irecords:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
739 if rtype == RECORD_MERGED:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
740 f.write(b'%s\n' % _droponode(data))
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
741 f.close()
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
742
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
743 def _writerecordsv2(self, records):
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
744 """Write current state on disk in a version 2 file
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
745
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
746 See the docstring for _readrecordsv2 for why we use 't'."""
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
747 # these are the records that all version 2 clients can read
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
748 allowlist = (RECORD_LOCAL, RECORD_OTHER, RECORD_MERGED)
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
749 f = self._repo.vfs(self.statepathv2, b'wb')
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
750 for key, data in records:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
751 assert len(key) == 1
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
752 if key not in allowlist:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
753 key, data = RECORD_OVERRIDE, b'%s%s' % (key, data)
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
754 format = b'>sI%is' % len(data)
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
755 f.write(_pack(format, key, len(data), data))
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
756 f.close()
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
757
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
758 def _make_backup(self, fctx, localkey):
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
759 self._repo.vfs.write(b'merge/' + localkey, fctx.data())
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
760
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
761 def _restore_backup(self, fctx, localkey, flags):
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
762 with self._repo.vfs(b'merge/' + localkey) as f:
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
763 fctx.write(f.read(), flags)
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
764
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
765 def reset(self):
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
766 shutil.rmtree(self._repo.vfs.join(b'merge'), True)
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
767
cc5f811b1f15 mergestate: extract a base class to be shared by future memmergestate
Martin von Zweigbergk <martinvonz@google.com>
parents: 45497
diff changeset
768
45499
19590b126764 merge: use in-memory mergestate when using in-memory context
Martin von Zweigbergk <martinvonz@google.com>
parents: 45498
diff changeset
769 class memmergestate(_mergestate_base):
19590b126764 merge: use in-memory mergestate when using in-memory context
Martin von Zweigbergk <martinvonz@google.com>
parents: 45498
diff changeset
770 def __init__(self, repo):
19590b126764 merge: use in-memory mergestate when using in-memory context
Martin von Zweigbergk <martinvonz@google.com>
parents: 45498
diff changeset
771 super(memmergestate, self).__init__(repo)
19590b126764 merge: use in-memory mergestate when using in-memory context
Martin von Zweigbergk <martinvonz@google.com>
parents: 45498
diff changeset
772 self._backups = {}
19590b126764 merge: use in-memory mergestate when using in-memory context
Martin von Zweigbergk <martinvonz@google.com>
parents: 45498
diff changeset
773
19590b126764 merge: use in-memory mergestate when using in-memory context
Martin von Zweigbergk <martinvonz@google.com>
parents: 45498
diff changeset
774 def _make_backup(self, fctx, localkey):
19590b126764 merge: use in-memory mergestate when using in-memory context
Martin von Zweigbergk <martinvonz@google.com>
parents: 45498
diff changeset
775 self._backups[localkey] = fctx.data()
19590b126764 merge: use in-memory mergestate when using in-memory context
Martin von Zweigbergk <martinvonz@google.com>
parents: 45498
diff changeset
776
19590b126764 merge: use in-memory mergestate when using in-memory context
Martin von Zweigbergk <martinvonz@google.com>
parents: 45498
diff changeset
777 def _restore_backup(self, fctx, localkey, flags):
19590b126764 merge: use in-memory mergestate when using in-memory context
Martin von Zweigbergk <martinvonz@google.com>
parents: 45498
diff changeset
778 fctx.write(self._backups[localkey], flags)
19590b126764 merge: use in-memory mergestate when using in-memory context
Martin von Zweigbergk <martinvonz@google.com>
parents: 45498
diff changeset
779
19590b126764 merge: use in-memory mergestate when using in-memory context
Martin von Zweigbergk <martinvonz@google.com>
parents: 45498
diff changeset
780
42456
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42412
diff changeset
781 def recordupdates(repo, actions, branchmerge, getfiledata):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43713
diff changeset
782 """record merge actions to the dirstate"""
52032
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
783 dirstate = repo.dirstate
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
784 update_file = dirstate.update_file
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
785
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
786 # remove (must come first)
37112
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
787 for f, args, msg in actions.get(ACTION_REMOVE, []):
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
788 if branchmerge:
52032
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
789 update_file(f, p1_tracked=True, wc_tracked=False)
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
790 else:
52032
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
791 update_file(f, p1_tracked=False, wc_tracked=False)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
792
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
793 # forget (must come first)
37112
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
794 for f, args, msg in actions.get(ACTION_FORGET, []):
52032
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
795 update_file(f, p1_tracked=False, wc_tracked=False)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
796
34548
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
797 # resolve path conflicts
37112
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
798 for f, args, msg in actions.get(ACTION_PATH_CONFLICT_RESOLVE, []):
44939
818b4f19ef23 merge: move an inspection of the dirstate from record to calculate phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 44871
diff changeset
799 (f0, origf0) = args
52032
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
800 update_file(f, p1_tracked=False, wc_tracked=True)
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
801 dirstate.copy(origf0, f)
34548
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
802 if f0 == origf0:
52032
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
803 update_file(f0, p1_tracked=True, wc_tracked=False)
34548
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
804 else:
52032
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
805 update_file(f0, p1_tracked=False, wc_tracked=False)
34548
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
806
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
807 # re-add
37112
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
808 for f, args, msg in actions.get(ACTION_ADD, []):
52032
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
809 update_file(f, p1_tracked=False, wc_tracked=True)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
810
27131
d837da26155e merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents: 27130
diff changeset
811 # re-add/mark as modified
37112
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
812 for f, args, msg in actions.get(ACTION_ADD_MODIFIED, []):
27131
d837da26155e merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents: 27130
diff changeset
813 if branchmerge:
52032
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
814 update_file(
47726
8e2e8d0a9a56 mergestate: use `update_file` to handle for `ACTION_ADD_MODIFIED`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47691
diff changeset
815 f, p1_tracked=True, wc_tracked=True, possibly_dirty=True
8e2e8d0a9a56 mergestate: use `update_file` to handle for `ACTION_ADD_MODIFIED`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47691
diff changeset
816 )
27131
d837da26155e merge: add a new action type representing files to add/mark as modified
Siddharth Agarwal <sid0@fb.com>
parents: 27130
diff changeset
817 else:
52032
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
818 update_file(f, p1_tracked=False, wc_tracked=True)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
819
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
820 # exec change
37112
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
821 for f, args, msg in actions.get(ACTION_EXEC, []):
52032
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
822 update_file(f, p1_tracked=True, wc_tracked=True, possibly_dirty=True)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
823
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
824 # keep
37112
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
825 for f, args, msg in actions.get(ACTION_KEEP, []):
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
826 pass
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
827
45467
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45385
diff changeset
828 # keep deleted
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45385
diff changeset
829 for f, args, msg in actions.get(ACTION_KEEP_ABSENT, []):
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45385
diff changeset
830 pass
bb9888d32601 merge: add `ACTION_KEEP_ABSENT` to represent files we want to keep absent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45385
diff changeset
831
45524
6877b0ee5f9d mergestate: introduce a new ACTION_KEEP_NEW
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45518
diff changeset
832 # keep new
6877b0ee5f9d mergestate: introduce a new ACTION_KEEP_NEW
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45518
diff changeset
833 for f, args, msg in actions.get(ACTION_KEEP_NEW, []):
6877b0ee5f9d mergestate: introduce a new ACTION_KEEP_NEW
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45518
diff changeset
834 pass
6877b0ee5f9d mergestate: introduce a new ACTION_KEEP_NEW
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45518
diff changeset
835
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
836 # get
42522
d29db0a0c4eb update: fix spurious unclean status bug shown by previous commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42456
diff changeset
837 for f, args, msg in actions.get(ACTION_GET, []):
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
838 if branchmerge:
47613
8b16ccc71001 mergestate: use dirstate.update_file API in recordupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 47128
diff changeset
839 # tracked in p1 can be True also but update_file should not care
52032
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
840 old_entry = dirstate.get_entry(f)
48108
d4e715d2be0b dirstate: remove a update_file's special case for tracked file with p2 data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47727
diff changeset
841 p1_tracked = old_entry.any_tracked and not old_entry.added
52032
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
842 update_file(
47613
8b16ccc71001 mergestate: use dirstate.update_file API in recordupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 47128
diff changeset
843 f,
48108
d4e715d2be0b dirstate: remove a update_file's special case for tracked file with p2 data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47727
diff changeset
844 p1_tracked=p1_tracked,
47613
8b16ccc71001 mergestate: use dirstate.update_file API in recordupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 47128
diff changeset
845 wc_tracked=True,
48144
6f54afb094bd dirstate: align the dirstate's API to the lower level ones
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48109
diff changeset
846 p2_info=True,
47613
8b16ccc71001 mergestate: use dirstate.update_file API in recordupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 47128
diff changeset
847 )
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
848 else:
42522
d29db0a0c4eb update: fix spurious unclean status bug shown by previous commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42456
diff changeset
849 parentfiledata = getfiledata[f] if getfiledata else None
52032
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
850 update_file(
47691
33beeb32f73a dirstate: replace `update_parent_file_data` with simpler `update_parent` call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47613
diff changeset
851 f,
33beeb32f73a dirstate: replace `update_parent_file_data` with simpler `update_parent` call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47613
diff changeset
852 p1_tracked=True,
33beeb32f73a dirstate: replace `update_parent_file_data` with simpler `update_parent` call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47613
diff changeset
853 wc_tracked=True,
33beeb32f73a dirstate: replace `update_parent_file_data` with simpler `update_parent` call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47613
diff changeset
854 parentfiledata=parentfiledata,
33beeb32f73a dirstate: replace `update_parent_file_data` with simpler `update_parent` call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47613
diff changeset
855 )
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
856
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
857 # merge
37112
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
858 for f, args, msg in actions.get(ACTION_MERGE, []):
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
859 f1, f2, fa, move, anc = args
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
860 if branchmerge:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
861 # We've done a branch merge, mark this file as merged
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
862 # so that we properly record the merger later
48109
2c2788ce0257 dirstate: remove a update_file's special case for `merged` file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48108
diff changeset
863 p1_tracked = f1 == f
52032
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
864 update_file(
48109
2c2788ce0257 dirstate: remove a update_file's special case for `merged` file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48108
diff changeset
865 f,
2c2788ce0257 dirstate: remove a update_file's special case for `merged` file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48108
diff changeset
866 p1_tracked=p1_tracked,
2c2788ce0257 dirstate: remove a update_file's special case for `merged` file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48108
diff changeset
867 wc_tracked=True,
48144
6f54afb094bd dirstate: align the dirstate's API to the lower level ones
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48109
diff changeset
868 p2_info=True,
47613
8b16ccc71001 mergestate: use dirstate.update_file API in recordupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 47128
diff changeset
869 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
870 if f1 != f2: # copy/rename
3308
ecc1bf27378c merge: unify merge and copy actions
Matt Mackall <mpm@selenic.com>
parents: 3307
diff changeset
871 if move:
52032
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
872 update_file(f1, p1_tracked=True, wc_tracked=False)
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
873 if f1 != f:
52032
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
874 dirstate.copy(f1, f)
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
875 else:
52032
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
876 dirstate.copy(f2, f)
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
877 else:
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
878 # We've update-merged a locally modified file, so
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
879 # we set the dirstate to emulate a normal checkout
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
880 # of that file some time in the past. Thus our
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
881 # merge will appear as a normal local file
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
882 # modification.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42972
diff changeset
883 if f2 == f: # file not locally copied/moved
52032
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
884 update_file(
47613
8b16ccc71001 mergestate: use dirstate.update_file API in recordupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 47128
diff changeset
885 f, p1_tracked=True, wc_tracked=True, possibly_dirty=True
8b16ccc71001 mergestate: use dirstate.update_file API in recordupdates()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 47128
diff changeset
886 )
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
887 if move:
52032
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
888 update_file(f1, p1_tracked=False, wc_tracked=False)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
889
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
890 # directory rename, move local
37112
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
891 for f, args, msg in actions.get(ACTION_DIR_RENAME_MOVE_LOCAL, []):
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
892 f0, flag = args
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
893 if branchmerge:
52032
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
894 update_file(f, p1_tracked=False, wc_tracked=True)
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
895 update_file(f0, p1_tracked=True, wc_tracked=False)
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
896 dirstate.copy(f0, f)
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
897 else:
52032
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
898 update_file(f, p1_tracked=True, wc_tracked=True)
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
899 update_file(f0, p1_tracked=False, wc_tracked=False)
21391
cb15835456cb merge: change debug logging - test output changes but no real changes
Mads Kiilerich <madski@unity3d.com>
parents: 21390
diff changeset
900
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
901 # directory rename, get
37112
43ffd9070da1 merge: use constants for actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37111
diff changeset
902 for f, args, msg in actions.get(ACTION_LOCAL_DIR_RENAME_GET, []):
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
903 f0, flag = args
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
904 if branchmerge:
52032
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
905 update_file(f, p1_tracked=False, wc_tracked=True)
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
906 dirstate.copy(f0, f)
21551
bde505f47141 merge: fix stupid indentation left over from previous refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 21545
diff changeset
907 else:
52032
09a54892b7ee mergestate: reduce the number of attribute lookups
Raphaël Gomès <rgomes@octobus.net>
parents: 51863
diff changeset
908 update_file(f, p1_tracked=True, wc_tracked=True)