Mercurial > hg
comparison mercurial/merge.py @ 20651:c1a52dd56eb4
merge: add blank line between mergestate's method
This class is now too big to be a single big block of continuous text.
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Wed, 05 Mar 2014 10:22:43 -0800 |
parents | 0dc7a50345c2 |
children | 2a4871c2511d |
comparison
equal
deleted
inserted
replaced
20650:e811b93f2cb1 | 20651:c1a52dd56eb4 |
---|---|
45 O: the node of the "other" part of the merge (hexified version) | 45 O: the node of the "other" part of the merge (hexified version) |
46 F: a file to be merged entry | 46 F: a file to be merged entry |
47 ''' | 47 ''' |
48 statepathv1 = "merge/state" | 48 statepathv1 = "merge/state" |
49 statepathv2 = "merge/state2" | 49 statepathv2 = "merge/state2" |
50 | |
50 def __init__(self, repo): | 51 def __init__(self, repo): |
51 self._repo = repo | 52 self._repo = repo |
52 self._dirty = False | 53 self._dirty = False |
53 self._read() | 54 self._read() |
55 | |
54 def reset(self, node=None, other=None): | 56 def reset(self, node=None, other=None): |
55 self._state = {} | 57 self._state = {} |
56 if node: | 58 if node: |
57 self._local = node | 59 self._local = node |
58 self._other = other | 60 self._other = other |
59 shutil.rmtree(self._repo.join("merge"), True) | 61 shutil.rmtree(self._repo.join("merge"), True) |
60 self._dirty = False | 62 self._dirty = False |
63 | |
61 def _read(self): | 64 def _read(self): |
62 self._state = {} | 65 self._state = {} |
63 records = self._readrecords() | 66 records = self._readrecords() |
64 for rtype, record in records: | 67 for rtype, record in records: |
65 if rtype == 'L': | 68 if rtype == 'L': |
71 self._state[bits[0]] = bits[1:] | 74 self._state[bits[0]] = bits[1:] |
72 elif not rtype.islower(): | 75 elif not rtype.islower(): |
73 raise util.Abort(_('unsupported merge state record:' | 76 raise util.Abort(_('unsupported merge state record:' |
74 % rtype)) | 77 % rtype)) |
75 self._dirty = False | 78 self._dirty = False |
79 | |
76 def _readrecords(self): | 80 def _readrecords(self): |
77 v1records = self._readrecordsv1() | 81 v1records = self._readrecordsv1() |
78 v2records = self._readrecordsv2() | 82 v2records = self._readrecordsv2() |
79 oldv2 = set() # old format version of v2 record | 83 oldv2 = set() # old format version of v2 record |
80 for rec in v2records: | 84 for rec in v2records: |
99 bits.insert(-2, '') | 103 bits.insert(-2, '') |
100 v1records[idx] = (r[0], "\0".join(bits)) | 104 v1records[idx] = (r[0], "\0".join(bits)) |
101 return v1records | 105 return v1records |
102 else: | 106 else: |
103 return v2records | 107 return v2records |
108 | |
104 def _readrecordsv1(self): | 109 def _readrecordsv1(self): |
105 records = [] | 110 records = [] |
106 try: | 111 try: |
107 f = self._repo.opener(self.statepathv1) | 112 f = self._repo.opener(self.statepathv1) |
108 for i, l in enumerate(f): | 113 for i, l in enumerate(f): |
113 f.close() | 118 f.close() |
114 except IOError, err: | 119 except IOError, err: |
115 if err.errno != errno.ENOENT: | 120 if err.errno != errno.ENOENT: |
116 raise | 121 raise |
117 return records | 122 return records |
123 | |
118 def _readrecordsv2(self): | 124 def _readrecordsv2(self): |
119 records = [] | 125 records = [] |
120 try: | 126 try: |
121 f = self._repo.opener(self.statepathv2) | 127 f = self._repo.opener(self.statepathv2) |
122 data = f.read() | 128 data = f.read() |
133 f.close() | 139 f.close() |
134 except IOError, err: | 140 except IOError, err: |
135 if err.errno != errno.ENOENT: | 141 if err.errno != errno.ENOENT: |
136 raise | 142 raise |
137 return records | 143 return records |
144 | |
138 def commit(self): | 145 def commit(self): |
139 if self._dirty: | 146 if self._dirty: |
140 records = [] | 147 records = [] |
141 records.append(("L", hex(self._local))) | 148 records.append(("L", hex(self._local))) |
142 records.append(("O", hex(self._other))) | 149 records.append(("O", hex(self._other))) |
143 for d, v in self._state.iteritems(): | 150 for d, v in self._state.iteritems(): |
144 records.append(("F", "\0".join([d] + v))) | 151 records.append(("F", "\0".join([d] + v))) |
145 self._writerecords(records) | 152 self._writerecords(records) |
146 self._dirty = False | 153 self._dirty = False |
154 | |
147 def _writerecords(self, records): | 155 def _writerecords(self, records): |
148 self._writerecordsv1(records) | 156 self._writerecordsv1(records) |
149 self._writerecordsv2(records) | 157 self._writerecordsv2(records) |
158 | |
150 def _writerecordsv1(self, records): | 159 def _writerecordsv1(self, records): |
151 f = self._repo.opener(self.statepathv1, "w") | 160 f = self._repo.opener(self.statepathv1, "w") |
152 irecords = iter(records) | 161 irecords = iter(records) |
153 lrecords = irecords.next() | 162 lrecords = irecords.next() |
154 assert lrecords[0] == 'L' | 163 assert lrecords[0] == 'L' |
155 f.write(hex(self._local) + "\n") | 164 f.write(hex(self._local) + "\n") |
156 for rtype, data in irecords: | 165 for rtype, data in irecords: |
157 if rtype == "F": | 166 if rtype == "F": |
158 f.write("%s\n" % _droponode(data)) | 167 f.write("%s\n" % _droponode(data)) |
159 f.close() | 168 f.close() |
169 | |
160 def _writerecordsv2(self, records): | 170 def _writerecordsv2(self, records): |
161 f = self._repo.opener(self.statepathv2, "w") | 171 f = self._repo.opener(self.statepathv2, "w") |
162 for key, data in records: | 172 for key, data in records: |
163 assert len(key) == 1 | 173 assert len(key) == 1 |
164 format = ">sI%is" % len(data) | 174 format = ">sI%is" % len(data) |
165 f.write(_pack(format, key, len(data), data)) | 175 f.write(_pack(format, key, len(data), data)) |
166 f.close() | 176 f.close() |
177 | |
167 def add(self, fcl, fco, fca, fd): | 178 def add(self, fcl, fco, fca, fd): |
168 hash = util.sha1(fcl.path()).hexdigest() | 179 hash = util.sha1(fcl.path()).hexdigest() |
169 self._repo.opener.write("merge/" + hash, fcl.data()) | 180 self._repo.opener.write("merge/" + hash, fcl.data()) |
170 self._state[fd] = ['u', hash, fcl.path(), | 181 self._state[fd] = ['u', hash, fcl.path(), |
171 fca.path(), hex(fca.filenode()), | 182 fca.path(), hex(fca.filenode()), |
172 fco.path(), hex(fco.filenode()), | 183 fco.path(), hex(fco.filenode()), |
173 fcl.flags()] | 184 fcl.flags()] |
174 self._dirty = True | 185 self._dirty = True |
186 | |
175 def __contains__(self, dfile): | 187 def __contains__(self, dfile): |
176 return dfile in self._state | 188 return dfile in self._state |
189 | |
177 def __getitem__(self, dfile): | 190 def __getitem__(self, dfile): |
178 return self._state[dfile][0] | 191 return self._state[dfile][0] |
192 | |
179 def __iter__(self): | 193 def __iter__(self): |
180 l = self._state.keys() | 194 l = self._state.keys() |
181 l.sort() | 195 l.sort() |
182 for f in l: | 196 for f in l: |
183 yield f | 197 yield f |
198 | |
184 def files(self): | 199 def files(self): |
185 return self._state.keys() | 200 return self._state.keys() |
201 | |
186 def mark(self, dfile, state): | 202 def mark(self, dfile, state): |
187 self._state[dfile][0] = state | 203 self._state[dfile][0] = state |
188 self._dirty = True | 204 self._dirty = True |
205 | |
189 def resolve(self, dfile, wctx): | 206 def resolve(self, dfile, wctx): |
190 if self[dfile] == 'r': | 207 if self[dfile] == 'r': |
191 return 0 | 208 return 0 |
192 stateentry = self._state[dfile] | 209 stateentry = self._state[dfile] |
193 state, hash, lfile, afile, anode, ofile, onode, flags = stateentry | 210 state, hash, lfile, afile, anode, ofile, onode, flags = stateentry |