comparison mercurial/subrepo.py @ 30060:a145161debed

merge: use labels in subrepo merge This is the last place that doesn't respect conflict labels in merge output. Teach subrepos to use subrepo merge output too.
author Simon Farnsworth <simonfar@fb.com>
date Sat, 08 Oct 2016 01:25:28 -0700
parents 19205a0e2bf1
children bb77654dc7ae
comparison
equal deleted inserted replaced
30059:6ffb7e0249f4 30060:a145161debed
24 from . import ( 24 from . import (
25 cmdutil, 25 cmdutil,
26 config, 26 config,
27 error, 27 error,
28 exchange, 28 exchange,
29 filemerge,
29 match as matchmod, 30 match as matchmod,
30 node, 31 node,
31 pathutil, 32 pathutil,
32 phases, 33 phases,
33 scmutil, 34 scmutil,
172 """rewrite .hgsubstate in (outer) repo with these subrepo states""" 173 """rewrite .hgsubstate in (outer) repo with these subrepo states"""
173 lines = ['%s %s\n' % (state[s][1], s) for s in sorted(state) 174 lines = ['%s %s\n' % (state[s][1], s) for s in sorted(state)
174 if state[s][1] != nullstate[1]] 175 if state[s][1] != nullstate[1]]
175 repo.wwrite('.hgsubstate', ''.join(lines), '') 176 repo.wwrite('.hgsubstate', ''.join(lines), '')
176 177
177 def submerge(repo, wctx, mctx, actx, overwrite): 178 def submerge(repo, wctx, mctx, actx, overwrite, labels=None):
178 """delegated from merge.applyupdates: merging of .hgsubstate file 179 """delegated from merge.applyupdates: merging of .hgsubstate file
179 in working context, merging context and ancestor context""" 180 in working context, merging context and ancestor context"""
180 if mctx == actx: # backwards? 181 if mctx == actx: # backwards?
181 actx = wctx.p1() 182 actx = wctx.p1()
182 s1 = wctx.substate 183 s1 = wctx.substate
198 ld = (l[0], l[1] + "+") 199 ld = (l[0], l[1] + "+")
199 if wctx == actx: # overwrite 200 if wctx == actx: # overwrite
200 a = ld 201 a = ld
201 202
202 if s in s2: 203 if s in s2:
204 prompts = filemerge.partextras(labels)
205 prompts['s'] = s
203 r = s2[s] 206 r = s2[s]
204 if ld == r or r == a: # no change or local is newer 207 if ld == r or r == a: # no change or local is newer
205 sm[s] = l 208 sm[s] = l
206 continue 209 continue
207 elif ld == a: # other side changed 210 elif ld == a: # other side changed
208 debug(s, "other changed, get", r) 211 debug(s, "other changed, get", r)
209 wctx.sub(s).get(r, overwrite) 212 wctx.sub(s).get(r, overwrite)
210 sm[s] = r 213 sm[s] = r
211 elif ld[0] != r[0]: # sources differ 214 elif ld[0] != r[0]: # sources differ
215 prompts['lo'] = l[0]
216 prompts['ro'] = r[0]
212 if repo.ui.promptchoice( 217 if repo.ui.promptchoice(
213 _(' subrepository sources for %s differ\n' 218 _(' subrepository sources for %(s)s differ\n'
214 'use (l)ocal source (%s) or (r)emote source (%s)?' 219 'use (l)ocal%(l)s source (%(lo)s)'
215 '$$ &Local $$ &Remote') % (s, l[0], r[0]), 0): 220 ' or (r)emote%(o)s source (%(ro)s)?'
221 '$$ &Local $$ &Remote') % prompts, 0):
216 debug(s, "prompt changed, get", r) 222 debug(s, "prompt changed, get", r)
217 wctx.sub(s).get(r, overwrite) 223 wctx.sub(s).get(r, overwrite)
218 sm[s] = r 224 sm[s] = r
219 elif ld[1] == a[1]: # local side is unchanged 225 elif ld[1] == a[1]: # local side is unchanged
220 debug(s, "other side changed, get", r) 226 debug(s, "other side changed, get", r)
221 wctx.sub(s).get(r, overwrite) 227 wctx.sub(s).get(r, overwrite)
222 sm[s] = r 228 sm[s] = r
223 else: 229 else:
224 debug(s, "both sides changed") 230 debug(s, "both sides changed")
225 srepo = wctx.sub(s) 231 srepo = wctx.sub(s)
232 prompts['sl'] = srepo.shortid(l[1])
233 prompts['sr'] = srepo.shortid(r[1])
226 option = repo.ui.promptchoice( 234 option = repo.ui.promptchoice(
227 _(' subrepository %s diverged (local revision: %s, ' 235 _(' subrepository %(s)s diverged (local revision: %(sl)s, '
228 'remote revision: %s)\n' 236 'remote revision: %(sr)s)\n'
229 '(M)erge, keep (l)ocal or keep (r)emote?' 237 '(M)erge, keep (l)ocal%(l)s or keep (r)emote%(o)s?'
230 '$$ &Merge $$ &Local $$ &Remote') 238 '$$ &Merge $$ &Local $$ &Remote')
231 % (s, srepo.shortid(l[1]), srepo.shortid(r[1])), 0) 239 % prompts, 0)
232 if option == 0: 240 if option == 0:
233 wctx.sub(s).merge(r) 241 wctx.sub(s).merge(r)
234 sm[s] = l 242 sm[s] = l
235 debug(s, "merge with", r) 243 debug(s, "merge with", r)
236 elif option == 1: 244 elif option == 1:
247 debug(s, "local added, keep") 255 debug(s, "local added, keep")
248 sm[s] = l 256 sm[s] = l
249 continue 257 continue
250 else: 258 else:
251 if repo.ui.promptchoice( 259 if repo.ui.promptchoice(
252 _(' local changed subrepository %s which remote removed\n' 260 _(' local%(l)s changed subrepository %(s)s'
261 ' which remote%(o)s removed\n'
253 'use (c)hanged version or (d)elete?' 262 'use (c)hanged version or (d)elete?'
254 '$$ &Changed $$ &Delete') % s, 0): 263 '$$ &Changed $$ &Delete') % prompts, 0):
255 debug(s, "prompt remove") 264 debug(s, "prompt remove")
256 wctx.sub(s).remove() 265 wctx.sub(s).remove()
257 266
258 for s, r in sorted(s2.items()): 267 for s, r in sorted(s2.items()):
259 if s in s1: 268 if s in s1:
262 debug(s, "remote added, get", r) 271 debug(s, "remote added, get", r)
263 mctx.sub(s).get(r) 272 mctx.sub(s).get(r)
264 sm[s] = r 273 sm[s] = r
265 elif r != sa[s]: 274 elif r != sa[s]:
266 if repo.ui.promptchoice( 275 if repo.ui.promptchoice(
267 _(' remote changed subrepository %s which local removed\n' 276 _(' remote%(o)s changed subrepository %(s)s'
277 ' which local%(l)s removed\n'
268 'use (c)hanged version or (d)elete?' 278 'use (c)hanged version or (d)elete?'
269 '$$ &Changed $$ &Delete') % s, 0) == 0: 279 '$$ &Changed $$ &Delete') % prompts, 0) == 0:
270 debug(s, "prompt recreate", r) 280 debug(s, "prompt recreate", r)
271 mctx.sub(s).get(r) 281 mctx.sub(s).get(r)
272 sm[s] = r 282 sm[s] = r
273 283
274 # record merged .hgsubstate 284 # record merged .hgsubstate