hgext/fetch.py
changeset 43076 2372284d9457
parent 41399 5cb8158a61f7
child 43077 687b865b95ad
equal deleted inserted replaced
43075:57875cf423c9 43076:2372284d9457
     8 '''pull, update and merge in one command (DEPRECATED)'''
     8 '''pull, update and merge in one command (DEPRECATED)'''
     9 
     9 
    10 from __future__ import absolute_import
    10 from __future__ import absolute_import
    11 
    11 
    12 from mercurial.i18n import _
    12 from mercurial.i18n import _
    13 from mercurial.node import (
    13 from mercurial.node import short
    14     short,
       
    15 )
       
    16 from mercurial import (
    14 from mercurial import (
    17     cmdutil,
    15     cmdutil,
    18     error,
    16     error,
    19     exchange,
    17     exchange,
    20     hg,
    18     hg,
    32 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
    30 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
    33 # be specifying the version(s) of Mercurial they are tested with, or
    31 # be specifying the version(s) of Mercurial they are tested with, or
    34 # leave the attribute unspecified.
    32 # leave the attribute unspecified.
    35 testedwith = 'ships-with-hg-core'
    33 testedwith = 'ships-with-hg-core'
    36 
    34 
    37 @command('fetch',
    35 
    38     [('r', 'rev', [],
    36 @command(
    39      _('a specific revision you would like to pull'), _('REV')),
    37     'fetch',
    40     ('', 'edit', None, _('invoke editor on commit messages')),
    38     [
    41     ('', 'force-editor', None, _('edit commit message (DEPRECATED)')),
    39         (
    42     ('', 'switch-parent', None, _('switch parents when merging')),
    40             'r',
    43     ] + cmdutil.commitopts + cmdutil.commitopts2 + cmdutil.remoteopts,
    41             'rev',
       
    42             [],
       
    43             _('a specific revision you would like to pull'),
       
    44             _('REV'),
       
    45         ),
       
    46         ('', 'edit', None, _('invoke editor on commit messages')),
       
    47         ('', 'force-editor', None, _('edit commit message (DEPRECATED)')),
       
    48         ('', 'switch-parent', None, _('switch parents when merging')),
       
    49     ]
       
    50     + cmdutil.commitopts
       
    51     + cmdutil.commitopts2
       
    52     + cmdutil.remoteopts,
    44     _('hg fetch [SOURCE]'),
    53     _('hg fetch [SOURCE]'),
    45     helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT)
    54     helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
       
    55 )
    46 def fetch(ui, repo, source='default', **opts):
    56 def fetch(ui, repo, source='default', **opts):
    47     '''pull changes from a remote repository, merge new changes if needed.
    57     '''pull changes from a remote repository, merge new changes if needed.
    48 
    58 
    49     This finds all changes from the repository at the specified path
    59     This finds all changes from the repository at the specified path
    50     or URL and adds them to the local repository.
    60     or URL and adds them to the local repository.
    73     try:
    83     try:
    74         branchnode = repo.branchtip(branch)
    84         branchnode = repo.branchtip(branch)
    75     except error.RepoLookupError:
    85     except error.RepoLookupError:
    76         branchnode = None
    86         branchnode = None
    77     if parent != branchnode:
    87     if parent != branchnode:
    78         raise error.Abort(_('working directory not at branch tip'),
    88         raise error.Abort(
    79                          hint=_("use 'hg update' to check out branch tip"))
    89             _('working directory not at branch tip'),
       
    90             hint=_("use 'hg update' to check out branch tip"),
       
    91         )
    80 
    92 
    81     wlock = lock = None
    93     wlock = lock = None
    82     try:
    94     try:
    83         wlock = repo.wlock()
    95         wlock = repo.wlock()
    84         lock = repo.lock()
    96         lock = repo.lock()
    86         cmdutil.bailifchanged(repo)
    98         cmdutil.bailifchanged(repo)
    87 
    99 
    88         bheads = repo.branchheads(branch)
   100         bheads = repo.branchheads(branch)
    89         bheads = [head for head in bheads if len(repo[head].children()) == 0]
   101         bheads = [head for head in bheads if len(repo[head].children()) == 0]
    90         if len(bheads) > 1:
   102         if len(bheads) > 1:
    91             raise error.Abort(_('multiple heads in this branch '
   103             raise error.Abort(
    92                                '(use "hg heads ." and "hg merge" to merge)'))
   104                 _(
       
   105                     'multiple heads in this branch '
       
   106                     '(use "hg heads ." and "hg merge" to merge)'
       
   107                 )
       
   108             )
    93 
   109 
    94         other = hg.peer(repo, opts, ui.expandpath(source))
   110         other = hg.peer(repo, opts, ui.expandpath(source))
    95         ui.status(_('pulling from %s\n') %
   111         ui.status(
    96                   util.hidepassword(ui.expandpath(source)))
   112             _('pulling from %s\n') % util.hidepassword(ui.expandpath(source))
       
   113         )
    97         revs = None
   114         revs = None
    98         if opts['rev']:
   115         if opts['rev']:
    99             try:
   116             try:
   100                 revs = [other.lookup(rev) for rev in opts['rev']]
   117                 revs = [other.lookup(rev) for rev in opts['rev']]
   101             except error.CapabilityError:
   118             except error.CapabilityError:
   102                 err = _("other repository doesn't support revision lookup, "
   119                 err = _(
   103                         "so a rev cannot be specified.")
   120                     "other repository doesn't support revision lookup, "
       
   121                     "so a rev cannot be specified."
       
   122                 )
   104                 raise error.Abort(err)
   123                 raise error.Abort(err)
   105 
   124 
   106         # Are there any changes at all?
   125         # Are there any changes at all?
   107         modheads = exchange.pull(repo, other, heads=revs).cgresult
   126         modheads = exchange.pull(repo, other, heads=revs).cgresult
   108         if modheads == 0:
   127         if modheads == 0:
   123         if newchildren:
   142         if newchildren:
   124             newparent = newchildren[0]
   143             newparent = newchildren[0]
   125             hg.clean(repo, newparent)
   144             hg.clean(repo, newparent)
   126         newheads = [n for n in newheads if n != newparent]
   145         newheads = [n for n in newheads if n != newparent]
   127         if len(newheads) > 1:
   146         if len(newheads) > 1:
   128             ui.status(_('not merging with %d other new branch heads '
   147             ui.status(
   129                         '(use "hg heads ." and "hg merge" to merge them)\n') %
   148                 _(
   130                       (len(newheads) - 1))
   149                     'not merging with %d other new branch heads '
       
   150                     '(use "hg heads ." and "hg merge" to merge them)\n'
       
   151                 )
       
   152                 % (len(newheads) - 1)
       
   153             )
   131             return 1
   154             return 1
   132 
   155 
   133         if not newheads:
   156         if not newheads:
   134             return 0
   157             return 0
   135 
   158 
   141             # theirs.
   164             # theirs.
   142             if opts['switch_parent']:
   165             if opts['switch_parent']:
   143                 firstparent, secondparent = newparent, newheads[0]
   166                 firstparent, secondparent = newparent, newheads[0]
   144             else:
   167             else:
   145                 firstparent, secondparent = newheads[0], newparent
   168                 firstparent, secondparent = newheads[0], newparent
   146                 ui.status(_('updating to %d:%s\n') %
   169                 ui.status(
   147                           (repo.changelog.rev(firstparent),
   170                     _('updating to %d:%s\n')
   148                            short(firstparent)))
   171                     % (repo.changelog.rev(firstparent), short(firstparent))
       
   172                 )
   149             hg.clean(repo, firstparent)
   173             hg.clean(repo, firstparent)
   150             ui.status(_('merging with %d:%s\n') %
   174             ui.status(
   151                       (repo.changelog.rev(secondparent), short(secondparent)))
   175                 _('merging with %d:%s\n')
       
   176                 % (repo.changelog.rev(secondparent), short(secondparent))
       
   177             )
   152             err = hg.merge(repo, secondparent, remind=False)
   178             err = hg.merge(repo, secondparent, remind=False)
   153 
   179 
   154         if not err:
   180         if not err:
   155             # we don't translate commit messages
   181             # we don't translate commit messages
   156             message = (cmdutil.logmessage(ui, opts) or
   182             message = cmdutil.logmessage(ui, opts) or (
   157                        ('Automated merge with %s' %
   183                 'Automated merge with %s' % util.removeauth(other.url())
   158                         util.removeauth(other.url())))
   184             )
   159             editopt = opts.get('edit') or opts.get('force_editor')
   185             editopt = opts.get('edit') or opts.get('force_editor')
   160             editor = cmdutil.getcommiteditor(edit=editopt, editform='fetch')
   186             editor = cmdutil.getcommiteditor(edit=editopt, editform='fetch')
   161             n = repo.commit(message, opts['user'], opts['date'], editor=editor)
   187             n = repo.commit(message, opts['user'], opts['date'], editor=editor)
   162             ui.status(_('new changeset %d:%s merges remote changes '
   188             ui.status(
   163                         'with local\n') % (repo.changelog.rev(n),
   189                 _('new changeset %d:%s merges remote changes ' 'with local\n')
   164                                            short(n)))
   190                 % (repo.changelog.rev(n), short(n))
       
   191             )
   165 
   192 
   166         return err
   193         return err
   167 
   194 
   168     finally:
   195     finally:
   169         release(lock, wlock)
   196         release(lock, wlock)