comparison mercurial/merge.py @ 27031:8be0af32e513

mergestate: allow storing and retrieving change/delete conflicts We introduce a new record type, 'C', to indicate change/delete conflicts. This is a separate record type because older versions of Mercurial will not be able to handle these conflicts. We aren't actually storing any change/delete conflicts yet -- that will come in future patches.
author Siddharth Agarwal <sid0@fb.com>
date Wed, 18 Nov 2015 15:46:45 -0800
parents a01ecbcfaf84
children 86ede9eda252
comparison
equal deleted inserted replaced
27030:cf9ed6d32ccb 27031:8be0af32e513
14 14
15 from .i18n import _ 15 from .i18n import _
16 from .node import ( 16 from .node import (
17 bin, 17 bin,
18 hex, 18 hex,
19 nullhex,
19 nullid, 20 nullid,
20 nullrev, 21 nullrev,
21 ) 22 )
22 from . import ( 23 from . import (
23 copies, 24 copies,
56 Currently known records: 57 Currently known records:
57 58
58 L: the node of the "local" part of the merge (hexified version) 59 L: the node of the "local" part of the merge (hexified version)
59 O: the node of the "other" part of the merge (hexified version) 60 O: the node of the "other" part of the merge (hexified version)
60 F: a file to be merged entry 61 F: a file to be merged entry
62 C: a change/delete or delete/change conflict
61 D: a file that the external merge driver will merge internally 63 D: a file that the external merge driver will merge internally
62 (experimental) 64 (experimental)
63 m: the external merge driver defined for this merge plus its run state 65 m: the external merge driver defined for this merge plus its run state
64 (experimental) 66 (experimental)
65 X: unsupported mandatory record type (used in tests) 67 X: unsupported mandatory record type (used in tests)
141 # the merge driver should be idempotent, so just rerun it 143 # the merge driver should be idempotent, so just rerun it
142 mdstate = 'u' 144 mdstate = 'u'
143 145
144 self._readmergedriver = bits[0] 146 self._readmergedriver = bits[0]
145 self._mdstate = mdstate 147 self._mdstate = mdstate
146 elif rtype in 'FD': 148 elif rtype in 'FDC':
147 bits = record.split('\0') 149 bits = record.split('\0')
148 self._state[bits[0]] = bits[1:] 150 self._state[bits[0]] = bits[1:]
149 elif not rtype.islower(): 151 elif not rtype.islower():
150 unsupported.add(rtype) 152 unsupported.add(rtype)
151 self._dirty = False 153 self._dirty = False
313 records.append(('m', '\0'.join([ 315 records.append(('m', '\0'.join([
314 self.mergedriver, self._mdstate]))) 316 self.mergedriver, self._mdstate])))
315 for d, v in self._state.iteritems(): 317 for d, v in self._state.iteritems():
316 if v[0] == 'd': 318 if v[0] == 'd':
317 records.append(('D', '\0'.join([d] + v))) 319 records.append(('D', '\0'.join([d] + v)))
320 # v[1] == local ('cd'), v[6] == other ('dc') -- not supported by
321 # older versions of Mercurial
322 elif v[1] == nullhex or v[6] == nullhex:
323 records.append(('C', '\0'.join([d] + v)))
318 else: 324 else:
319 records.append(('F', '\0'.join([d] + v))) 325 records.append(('F', '\0'.join([d] + v)))
320 return records 326 return records
321 327
322 def _writerecords(self, records): 328 def _writerecords(self, records):