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 |