mercurial/subrepo.py
changeset 30060 a145161debed
parent 29510 19205a0e2bf1
child 30615 bb77654dc7ae
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