hgext/fetch.py
changeset 6941 b2bc2d984bac
parent 6666 53465a7464e2
child 7007 a6b74fbb5ce0
equal deleted inserted replaced
6940:05ec27530d04 6941:b2bc2d984bac
    26     order, use --switch-parent.
    26     order, use --switch-parent.
    27 
    27 
    28     See 'hg help dates' for a list of formats valid for -d/--date.
    28     See 'hg help dates' for a list of formats valid for -d/--date.
    29     '''
    29     '''
    30 
    30 
    31     def postincoming(other, modheads):
    31     date = opts.get('date')
       
    32     if date:
       
    33         opts['date'] = util.parsedate(date)
       
    34 
       
    35     parent, p2 = repo.dirstate.parents()
       
    36     if parent != repo.changelog.tip():
       
    37         raise util.Abort(_('working dir not at tip '
       
    38                            '(use "hg update" to check out tip)'))
       
    39 
       
    40     if p2 != nullid:
       
    41         raise util.Abort(_('outstanding uncommitted merge'))
       
    42 
       
    43     wlock = lock = None
       
    44     try:
       
    45         wlock = repo.wlock()
       
    46         lock = repo.lock()
       
    47         mod, add, rem, del_ = repo.status()[:4]
       
    48 
       
    49         if mod or add or rem:
       
    50             raise util.Abort(_('outstanding uncommitted changes'))
       
    51         if del_:
       
    52             raise util.Abort(_('working directory is missing some files'))
       
    53         if len(repo.heads()) > 1:
       
    54             raise util.Abort(_('multiple heads in this repository '
       
    55                                '(use "hg heads" and "hg merge" to merge)'))
       
    56 
       
    57         cmdutil.setremoteconfig(ui, opts)
       
    58 
       
    59         other = hg.repository(ui, ui.expandpath(source))
       
    60         ui.status(_('pulling from %s\n') %
       
    61                   util.hidepassword(ui.expandpath(source)))
       
    62         revs = None
       
    63         if opts['rev']:
       
    64             if not other.local():
       
    65                 raise util.Abort(_("fetch -r doesn't work for remote "
       
    66                                    "repositories yet"))
       
    67             else:
       
    68                 revs = [other.lookup(rev) for rev in opts['rev']]
       
    69 
       
    70         modheads = repo.pull(other, heads=revs)
    32         if modheads == 0:
    71         if modheads == 0:
    33             return 0
    72             return 0
    34         if modheads == 1:
    73         if modheads == 1:
    35             return hg.clean(repo, repo.changelog.tip())
    74             return hg.clean(repo, repo.changelog.tip())
       
    75 
    36         newheads = repo.heads(parent)
    76         newheads = repo.heads(parent)
    37         newchildren = [n for n in repo.heads(parent) if n != parent]
    77         newchildren = [n for n in repo.heads(parent) if n != parent]
    38         newparent = parent
    78         newparent = parent
    39         if newchildren:
    79         if newchildren:
    40             newparent = newchildren[0]
    80             newparent = newchildren[0]
    41             hg.clean(repo, newparent)
    81             hg.clean(repo, newparent)
       
    82 
    42         newheads = [n for n in repo.heads() if n != newparent]
    83         newheads = [n for n in repo.heads() if n != newparent]
    43         if len(newheads) > 1:
    84         if len(newheads) > 1:
    44             ui.status(_('not merging with %d other new heads '
    85             ui.status(_('not merging with %d other new heads '
    45                         '(use "hg heads" and "hg merge" to merge them)') %
    86                         '(use "hg heads" and "hg merge" to merge them)') %
    46                       (len(newheads) - 1))
    87                       (len(newheads) - 1))
    47             return
    88             return
    48         err = False
    89         err = False
       
    90 
    49         if newheads:
    91         if newheads:
    50             # By default, we consider the repository we're pulling
    92             # By default, we consider the repository we're pulling
    51             # *from* as authoritative, so we merge our changes into
    93             # *from* as authoritative, so we merge our changes into
    52             # theirs.
    94             # theirs.
    53             if opts['switch_parent']:
    95             if opts['switch_parent']:
    59                            short(firstparent)))
   101                            short(firstparent)))
    60             hg.clean(repo, firstparent)
   102             hg.clean(repo, firstparent)
    61             ui.status(_('merging with %d:%s\n') %
   103             ui.status(_('merging with %d:%s\n') %
    62                       (repo.changelog.rev(secondparent), short(secondparent)))
   104                       (repo.changelog.rev(secondparent), short(secondparent)))
    63             err = hg.merge(repo, secondparent, remind=False)
   105             err = hg.merge(repo, secondparent, remind=False)
       
   106 
    64         if not err:
   107         if not err:
    65             mod, add, rem = repo.status()[:3]
   108             mod, add, rem = repo.status()[:3]
    66             message = (cmdutil.logmessage(opts) or
   109             message = (cmdutil.logmessage(opts) or
    67                        (_('Automated merge with %s') %
   110                        (_('Automated merge with %s') %
    68                         util.removeauth(other.url())))
   111                         util.removeauth(other.url())))
    72                             force_editor=force_editor)
   115                             force_editor=force_editor)
    73             ui.status(_('new changeset %d:%s merges remote changes '
   116             ui.status(_('new changeset %d:%s merges remote changes '
    74                         'with local\n') % (repo.changelog.rev(n),
   117                         'with local\n') % (repo.changelog.rev(n),
    75                                            short(n)))
   118                                            short(n)))
    76 
   119 
    77     def pull():
       
    78         cmdutil.setremoteconfig(ui, opts)
       
    79 
       
    80         other = hg.repository(ui, ui.expandpath(source))
       
    81         ui.status(_('pulling from %s\n') %
       
    82                   util.hidepassword(ui.expandpath(source)))
       
    83         revs = None
       
    84         if opts['rev']:
       
    85             if not other.local():
       
    86                 raise util.Abort(_("fetch -r doesn't work for remote "
       
    87                                    "repositories yet"))
       
    88             else:
       
    89                 revs = [other.lookup(rev) for rev in opts['rev']]
       
    90         modheads = repo.pull(other, heads=revs)
       
    91         return postincoming(other, modheads)
       
    92 
       
    93     date = opts.get('date')
       
    94     if date:
       
    95         opts['date'] = util.parsedate(date)
       
    96 
       
    97     parent, p2 = repo.dirstate.parents()
       
    98     if parent != repo.changelog.tip():
       
    99         raise util.Abort(_('working dir not at tip '
       
   100                            '(use "hg update" to check out tip)'))
       
   101     if p2 != nullid:
       
   102         raise util.Abort(_('outstanding uncommitted merge'))
       
   103     wlock = lock = None
       
   104     try:
       
   105         wlock = repo.wlock()
       
   106         lock = repo.lock()
       
   107         mod, add, rem, del_ = repo.status()[:4]
       
   108         if mod or add or rem:
       
   109             raise util.Abort(_('outstanding uncommitted changes'))
       
   110         if del_:
       
   111             raise util.Abort(_('working directory is missing some files'))
       
   112         if len(repo.heads()) > 1:
       
   113             raise util.Abort(_('multiple heads in this repository '
       
   114                                '(use "hg heads" and "hg merge" to merge)'))
       
   115         return pull()
       
   116     finally:
   120     finally:
   117         del lock, wlock
   121         del lock, wlock
   118 
   122 
   119 cmdtable = {
   123 cmdtable = {
   120     'fetch':
   124     'fetch':