comparison hgext/fetch.py @ 6941:b2bc2d984bac

fetch: linearize code by eliminating nested functions
author Dirkjan Ochtman <dirkjan@ochtman.nl>
date Thu, 28 Aug 2008 11:19:17 +0200
parents 53465a7464e2
children a6b74fbb5ce0
comparison
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':