annotate hgsubversion/wrappers.py @ 933:a9f315eae67c

push: use native rebase instead of our rebase wrapper Our rebase wrapper doesn't quite do the right thing with repect to a just-pushed revision. In particular, it will try to rebase the just-pushed revision on top of the version of that revision we just pulled down from svn. This will sometimes result in a local revision with an identical commit message as the revision from svn, but no file changes. This changes the rebase portion of the push command to instead use the native rebase with a revset that excludes the revision we just pushed to svn from the set to be rebased. It also moves to a single strip operation that removes all of the revisions based on a pre-push or partially pushed revision. This moves to a separate rebase and strip operation since we now need to strip revisions we are not rebasing.
author David Schleimer <dschleimer@fb.com>
date Mon, 24 Sep 2012 10:18:28 -0700
parents 5bacb9c63e3e
children 289f2c7752a8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
264
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
1 from hgext import rebase as hgrebase
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
2
440
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 438
diff changeset
3 from mercurial import cmdutil
876
b450448a9033 wrappers: don't break on old hg versions that lack discovery
Augie Fackler <raf@durin42.com>
parents: 845
diff changeset
4 try:
b450448a9033 wrappers: don't break on old hg versions that lack discovery
Augie Fackler <raf@durin42.com>
parents: 845
diff changeset
5 from mercurial import discovery
b450448a9033 wrappers: don't break on old hg versions that lack discovery
Augie Fackler <raf@durin42.com>
parents: 845
diff changeset
6 discovery.nullid # force demandimport to import the module
b450448a9033 wrappers: don't break on old hg versions that lack discovery
Augie Fackler <raf@durin42.com>
parents: 845
diff changeset
7 except ImportError:
b450448a9033 wrappers: don't break on old hg versions that lack discovery
Augie Fackler <raf@durin42.com>
parents: 845
diff changeset
8 discovery = None
257
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9 from mercurial import patch
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10 from mercurial import hg
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11 from mercurial import util as hgutil
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
12 from mercurial import node
283
521d9c1bb11d Implement -u/--update support when pulling.
Martijn Pieters <mj@zopatista.com>
parents: 278
diff changeset
13 from mercurial import i18n
713
69c0e7c4faf9 clone: call the wrapped function (fixes #181)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 705
diff changeset
14 from mercurial import extensions
933
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
15 from mercurial import repair
257
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
16
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 432
diff changeset
17 import replay
438
e8f13bd20467 pushmod: split push functions out into separate module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 435
diff changeset
18 import pushmod
257
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
19 import stupid as stupidmod
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
20 import svnwrap
464
0f7095f53ca3 Extend svnrepos with SubversionRepo and SVNMeta
Patrick Mezard <pmezard@gmail.com>
parents: 463
diff changeset
21 import svnrepo
257
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
22 import util
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
23
804
6beca5b97dc7 wrappers: fix revpair after hg.b33f3e35efb0
Patrick Mezard <pmezard@gmail.com>
parents: 802
diff changeset
24 try:
819
e30ff6d5feff Fix import based feature detection
Patrick Mezard <pmezard@gmail.com>
parents: 816
diff changeset
25 from mercurial import scmutil
e30ff6d5feff Fix import based feature detection
Patrick Mezard <pmezard@gmail.com>
parents: 816
diff changeset
26 revpair = scmutil.revpair
804
6beca5b97dc7 wrappers: fix revpair after hg.b33f3e35efb0
Patrick Mezard <pmezard@gmail.com>
parents: 802
diff changeset
27 except ImportError:
819
e30ff6d5feff Fix import based feature detection
Patrick Mezard <pmezard@gmail.com>
parents: 816
diff changeset
28 revpair = cmdutil.revpair
804
6beca5b97dc7 wrappers: fix revpair after hg.b33f3e35efb0
Patrick Mezard <pmezard@gmail.com>
parents: 802
diff changeset
29
366
25ebdc16b05b Simplify pulling revs a bit, unify stupid/replay interfaces.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 356
diff changeset
30 pullfuns = {
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 432
diff changeset
31 True: replay.convert_rev,
366
25ebdc16b05b Simplify pulling revs a bit, unify stupid/replay interfaces.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 356
diff changeset
32 False: stupidmod.convert_rev,
25ebdc16b05b Simplify pulling revs a bit, unify stupid/replay interfaces.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 356
diff changeset
33 }
25ebdc16b05b Simplify pulling revs a bit, unify stupid/replay interfaces.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 356
diff changeset
34
404
28e4b47b2179 add a working incoming wrapper command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 403
diff changeset
35 revmeta = [
28e4b47b2179 add a working incoming wrapper command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 403
diff changeset
36 ('revision', 'revnum'),
28e4b47b2179 add a working incoming wrapper command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 403
diff changeset
37 ('user', 'author'),
28e4b47b2179 add a working incoming wrapper command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 403
diff changeset
38 ('date', 'date'),
28e4b47b2179 add a working incoming wrapper command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 403
diff changeset
39 ('message', 'message'),
28e4b47b2179 add a working incoming wrapper command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 403
diff changeset
40 ]
28e4b47b2179 add a working incoming wrapper command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 403
diff changeset
41
507
4ce09bf4d382 wrappers: wrap version with a --svn flag
Augie Fackler <durin42@gmail.com>
parents: 499
diff changeset
42
4ce09bf4d382 wrappers: wrap version with a --svn flag
Augie Fackler <durin42@gmail.com>
parents: 499
diff changeset
43 def version(orig, ui, *args, **opts):
4ce09bf4d382 wrappers: wrap version with a --svn flag
Augie Fackler <durin42@gmail.com>
parents: 499
diff changeset
44 svn = opts.pop('svn', None)
4ce09bf4d382 wrappers: wrap version with a --svn flag
Augie Fackler <durin42@gmail.com>
parents: 499
diff changeset
45 orig(ui, *args, **opts)
4ce09bf4d382 wrappers: wrap version with a --svn flag
Augie Fackler <durin42@gmail.com>
parents: 499
diff changeset
46 if svn:
664
5c94a86ddd73 version: mention bindings type in version
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 657
diff changeset
47 svnversion, bindings = svnwrap.version()
5c94a86ddd73 version: mention bindings type in version
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 657
diff changeset
48 ui.status('\n')
507
4ce09bf4d382 wrappers: wrap version with a --svn flag
Augie Fackler <durin42@gmail.com>
parents: 499
diff changeset
49 ui.status('hgsubversion: %s\n' % util.version(ui))
664
5c94a86ddd73 version: mention bindings type in version
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 657
diff changeset
50 ui.status('Subversion: %s\n' % svnversion)
5c94a86ddd73 version: mention bindings type in version
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 657
diff changeset
51 ui.status('bindings: %s\n' % bindings)
507
4ce09bf4d382 wrappers: wrap version with a --svn flag
Augie Fackler <durin42@gmail.com>
parents: 499
diff changeset
52
4ce09bf4d382 wrappers: wrap version with a --svn flag
Augie Fackler <durin42@gmail.com>
parents: 499
diff changeset
53
403
37c96b78b8c0 uisetup: use a single loop/abstraction for wrapping all the commands
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 402
diff changeset
54 def parents(orig, ui, repo, *args, **opts):
257
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
55 """show Mercurial & Subversion parents of the working dir or revision
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
56 """
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
57 if not opts.get('svn', False):
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
58 return orig(ui, repo, *args, **opts)
464
0f7095f53ca3 Extend svnrepos with SubversionRepo and SVNMeta
Patrick Mezard <pmezard@gmail.com>
parents: 463
diff changeset
59 meta = repo.svnmeta()
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
60 hashes = meta.revmap.hashes()
440
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 438
diff changeset
61 ha = util.parentrev(ui, repo, meta, hashes)
257
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
62 if ha.node() == node.nullid:
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
63 raise hgutil.Abort('No parent svn revision!')
440
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 438
diff changeset
64 displayer = cmdutil.show_changeset(ui, repo, opts, buffered=False)
257
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
65 displayer.show(ha)
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
66 return 0
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
67
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
68
915
d6c47c33f6a2 fix breakage introduced by peer classes in hg 2.3
Bryan O'Sullivan <bryano@fb.com>
parents: 908
diff changeset
69 def getpeer(ui, opts, source):
d6c47c33f6a2 fix breakage introduced by peer classes in hg 2.3
Bryan O'Sullivan <bryano@fb.com>
parents: 908
diff changeset
70 # Since 2.3 (1ac628cd7113)
d6c47c33f6a2 fix breakage introduced by peer classes in hg 2.3
Bryan O'Sullivan <bryano@fb.com>
parents: 908
diff changeset
71 peer = getattr(hg, 'peer', None)
d6c47c33f6a2 fix breakage introduced by peer classes in hg 2.3
Bryan O'Sullivan <bryano@fb.com>
parents: 908
diff changeset
72 if peer:
d6c47c33f6a2 fix breakage introduced by peer classes in hg 2.3
Bryan O'Sullivan <bryano@fb.com>
parents: 908
diff changeset
73 return peer(ui, opts, source)
d6c47c33f6a2 fix breakage introduced by peer classes in hg 2.3
Bryan O'Sullivan <bryano@fb.com>
parents: 908
diff changeset
74 return hg.repository(ui, source)
d6c47c33f6a2 fix breakage introduced by peer classes in hg 2.3
Bryan O'Sullivan <bryano@fb.com>
parents: 908
diff changeset
75
930
5bacb9c63e3e Fix more peer breakage with old hg versions
Patrick Mezard <patrick@mezard.eu>
parents: 928
diff changeset
76 def getlocalpeer(ui, opts, source):
5bacb9c63e3e Fix more peer breakage with old hg versions
Patrick Mezard <patrick@mezard.eu>
parents: 928
diff changeset
77 peer = getpeer(ui, opts, source)
5bacb9c63e3e Fix more peer breakage with old hg versions
Patrick Mezard <patrick@mezard.eu>
parents: 928
diff changeset
78 repo = getattr(peer, 'local', lambda: peer)()
5bacb9c63e3e Fix more peer breakage with old hg versions
Patrick Mezard <patrick@mezard.eu>
parents: 928
diff changeset
79 if isinstance(repo, bool):
5bacb9c63e3e Fix more peer breakage with old hg versions
Patrick Mezard <patrick@mezard.eu>
parents: 928
diff changeset
80 repo = peer
5bacb9c63e3e Fix more peer breakage with old hg versions
Patrick Mezard <patrick@mezard.eu>
parents: 928
diff changeset
81 return repo
915
d6c47c33f6a2 fix breakage introduced by peer classes in hg 2.3
Bryan O'Sullivan <bryano@fb.com>
parents: 908
diff changeset
82
d6c47c33f6a2 fix breakage introduced by peer classes in hg 2.3
Bryan O'Sullivan <bryano@fb.com>
parents: 908
diff changeset
83 def getcaps(other):
d6c47c33f6a2 fix breakage introduced by peer classes in hg 2.3
Bryan O'Sullivan <bryano@fb.com>
parents: 908
diff changeset
84 return (getattr(other, 'caps', None) or
d6c47c33f6a2 fix breakage introduced by peer classes in hg 2.3
Bryan O'Sullivan <bryano@fb.com>
parents: 908
diff changeset
85 getattr(other, 'capabilities', None) or set())
d6c47c33f6a2 fix breakage introduced by peer classes in hg 2.3
Bryan O'Sullivan <bryano@fb.com>
parents: 908
diff changeset
86
d6c47c33f6a2 fix breakage introduced by peer classes in hg 2.3
Bryan O'Sullivan <bryano@fb.com>
parents: 908
diff changeset
87
771
768639283275 incoming: pass unexpanded source to wrapped function (fixes #178)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 769
diff changeset
88 def incoming(orig, ui, repo, origsource='default', **opts):
404
28e4b47b2179 add a working incoming wrapper command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 403
diff changeset
89 """show incoming revisions from Subversion
28e4b47b2179 add a working incoming wrapper command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 403
diff changeset
90 """
28e4b47b2179 add a working incoming wrapper command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 403
diff changeset
91
771
768639283275 incoming: pass unexpanded source to wrapped function (fixes #178)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 769
diff changeset
92 source, revs, checkout = util.parseurl(ui.expandpath(origsource))
915
d6c47c33f6a2 fix breakage introduced by peer classes in hg 2.3
Bryan O'Sullivan <bryano@fb.com>
parents: 908
diff changeset
93 other = getpeer(ui, opts, source)
d6c47c33f6a2 fix breakage introduced by peer classes in hg 2.3
Bryan O'Sullivan <bryano@fb.com>
parents: 908
diff changeset
94 if 'subversion' not in getcaps(other):
771
768639283275 incoming: pass unexpanded source to wrapped function (fixes #178)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 769
diff changeset
95 return orig(ui, repo, origsource, **opts)
404
28e4b47b2179 add a working incoming wrapper command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 403
diff changeset
96
751
5e54e333ec3d wrappers: pass on subdir when creating obtaining svnmeta
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 749
diff changeset
97 svn = other.svn
5e54e333ec3d wrappers: pass on subdir when creating obtaining svnmeta
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 749
diff changeset
98 meta = repo.svnmeta(svn.uuid, svn.subdir)
404
28e4b47b2179 add a working incoming wrapper command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 403
diff changeset
99
28e4b47b2179 add a working incoming wrapper command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 403
diff changeset
100 ui.status('incoming changes from %s\n' % other.svnurl)
751
5e54e333ec3d wrappers: pass on subdir when creating obtaining svnmeta
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 749
diff changeset
101 for r in svn.revisions(start=meta.revmap.youngest):
404
28e4b47b2179 add a working incoming wrapper command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 403
diff changeset
102 ui.status('\n')
28e4b47b2179 add a working incoming wrapper command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 403
diff changeset
103 for label, attr in revmeta:
28e4b47b2179 add a working incoming wrapper command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 403
diff changeset
104 l1 = label + ':'
28e4b47b2179 add a working incoming wrapper command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 403
diff changeset
105 val = str(getattr(r, attr)).strip()
28e4b47b2179 add a working incoming wrapper command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 403
diff changeset
106 if not ui.verbose:
28e4b47b2179 add a working incoming wrapper command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 403
diff changeset
107 val = val.split('\n')[0]
28e4b47b2179 add a working incoming wrapper command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 403
diff changeset
108 ui.status('%s%s\n' % (l1.ljust(13), val))
28e4b47b2179 add a working incoming wrapper command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 403
diff changeset
109
28e4b47b2179 add a working incoming wrapper command
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 403
diff changeset
110
805
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 804
diff changeset
111 def findcommonoutgoing(repo, other, onlyheads=None, force=False, commoninc=None):
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 804
diff changeset
112 assert other.capable('subversion')
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 804
diff changeset
113 # split off #rev; TODO implement --revision/#rev support
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 804
diff changeset
114 svn = other.svn
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 804
diff changeset
115 meta = repo.svnmeta(svn.uuid, svn.subdir)
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 804
diff changeset
116 parent = repo.parents()[0].node()
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 804
diff changeset
117 hashes = meta.revmap.hashes()
845
8cf8ff0f52fe outgoing: fix for hg change cd956049fc14
Augie Fackler <durin42@gmail.com>
parents: 841
diff changeset
118 common, heads = util.outgoing_common_and_heads(repo, hashes, parent)
876
b450448a9033 wrappers: don't break on old hg versions that lack discovery
Augie Fackler <raf@durin42.com>
parents: 845
diff changeset
119 if discovery is not None:
b450448a9033 wrappers: don't break on old hg versions that lack discovery
Augie Fackler <raf@durin42.com>
parents: 845
diff changeset
120 outobj = getattr(discovery, 'outgoing', None)
b450448a9033 wrappers: don't break on old hg versions that lack discovery
Augie Fackler <raf@durin42.com>
parents: 845
diff changeset
121 if outobj is not None:
b450448a9033 wrappers: don't break on old hg versions that lack discovery
Augie Fackler <raf@durin42.com>
parents: 845
diff changeset
122 # Mercurial 2.1 and later
b450448a9033 wrappers: don't break on old hg versions that lack discovery
Augie Fackler <raf@durin42.com>
parents: 845
diff changeset
123 return outobj(repo.changelog, common, heads)
845
8cf8ff0f52fe outgoing: fix for hg change cd956049fc14
Augie Fackler <durin42@gmail.com>
parents: 841
diff changeset
124 # Mercurial 2.0 and earlier
8cf8ff0f52fe outgoing: fix for hg change cd956049fc14
Augie Fackler <durin42@gmail.com>
parents: 841
diff changeset
125 return common, heads
805
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 804
diff changeset
126
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 804
diff changeset
127
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 804
diff changeset
128 def findoutgoing(repo, dest=None, heads=None, force=False):
257
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
129 """show changesets not found in the Subversion repository
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
130 """
347
537de0300510 Remove the 'outgoing' wrapper, and use the Mercurial infrastructure instead.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 346
diff changeset
131 assert dest.capable('subversion')
284
f8f9a2993705 Implement parseurl support (#revision in repository urls)
Martijn Pieters <mj@zopatista.com>
parents: 283
diff changeset
132 # split off #rev; TODO implement --revision/#rev support
837
805ef27fbcbe hgsubversion/*.py: add space after comment symbol #
Yonggang Luo <luoyonggang@gmail.com>
parents: 821
diff changeset
133 # svnurl, revs, checkout = util.parseurl(dest.svnurl, heads)
751
5e54e333ec3d wrappers: pass on subdir when creating obtaining svnmeta
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 749
diff changeset
134 svn = dest.svn
5e54e333ec3d wrappers: pass on subdir when creating obtaining svnmeta
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 749
diff changeset
135 meta = repo.svnmeta(svn.uuid, svn.subdir)
406
e360558ba65f add a function to generate svn_commit_hashes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 405
diff changeset
136 parent = repo.parents()[0].node()
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
137 hashes = meta.revmap.hashes()
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
138 return util.outgoing_revisions(repo, hashes, parent)
257
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
139
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
140
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
141 def diff(orig, ui, repo, *args, **opts):
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
142 """show a diff of the most recent revision against its parent from svn
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
143 """
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
144 if not opts.get('svn', False) or opts.get('change', None):
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
145 return orig(ui, repo, *args, **opts)
464
0f7095f53ca3 Extend svnrepos with SubversionRepo and SVNMeta
Patrick Mezard <pmezard@gmail.com>
parents: 463
diff changeset
146 meta = repo.svnmeta()
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
147 hashes = meta.revmap.hashes()
257
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
148 if not opts.get('rev', None):
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
149 parent = repo.parents()[0]
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
150 o_r = util.outgoing_revisions(repo, hashes, parent.node())
257
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
151 if o_r:
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
152 parent = repo[o_r[-1]].parents()[0]
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
153 opts['rev'] = ['%s:.' % node.hex(parent.node()), ]
804
6beca5b97dc7 wrappers: fix revpair after hg.b33f3e35efb0
Patrick Mezard <pmezard@gmail.com>
parents: 802
diff changeset
154 node1, node2 = revpair(repo, opts['rev'])
406
e360558ba65f add a function to generate svn_commit_hashes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 405
diff changeset
155 baserev, _junk = hashes.get(node1, (-1, 'junk'))
e360558ba65f add a function to generate svn_commit_hashes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 405
diff changeset
156 newrev, _junk = hashes.get(node2, (-1, 'junk'))
257
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
157 it = patch.diff(repo, node1, node2,
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
158 opts=patch.diffopts(ui, opts={'git': True,
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
159 'show_function': False,
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
160 'ignore_all_space': False,
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
161 'ignore_space_change': False,
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
162 'ignore_blank_lines': False,
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
163 'unified': True,
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
164 'text': False,
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
165 }))
440
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 438
diff changeset
166 ui.write(util.filterdiff(''.join(it), baserev, newrev))
257
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
167
347
537de0300510 Remove the 'outgoing' wrapper, and use the Mercurial infrastructure instead.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 346
diff changeset
168 def push(repo, dest, force, revs):
257
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
169 """push revisions starting at a specified head back to Subversion.
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
170 """
331
75f082b5897e Switch to using url scheme wrappers instead of duplicating each command we wrap.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 329
diff changeset
171 assert not revs, 'designated revisions for push remains unimplemented.'
802
d50858a8a17b wrapper: fix bail_if_changed() after hg.d68ddccf276b
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
172 if hasattr(cmdutil, 'bail_if_changed'):
d50858a8a17b wrapper: fix bail_if_changed() after hg.d68ddccf276b
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
173 cmdutil.bail_if_changed(repo)
d50858a8a17b wrapper: fix bail_if_changed() after hg.d68ddccf276b
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
174 else:
d50858a8a17b wrapper: fix bail_if_changed() after hg.d68ddccf276b
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
175 # Since 1.9 (d68ddccf276b)
d50858a8a17b wrapper: fix bail_if_changed() after hg.d68ddccf276b
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
176 cmdutil.bailifchanged(repo)
783
7913a82a8cdd Check mercurial/third-parties push conditions before pushing
Patrick Mezard <pmezard@gmail.com>
parents: 779
diff changeset
177 checkpush = getattr(repo, 'checkpush', None)
7913a82a8cdd Check mercurial/third-parties push conditions before pushing
Patrick Mezard <pmezard@gmail.com>
parents: 779
diff changeset
178 if checkpush:
7913a82a8cdd Check mercurial/third-parties push conditions before pushing
Patrick Mezard <pmezard@gmail.com>
parents: 779
diff changeset
179 checkpush(force, revs)
331
75f082b5897e Switch to using url scheme wrappers instead of duplicating each command we wrap.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 329
diff changeset
180 ui = repo.ui
257
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
181 old_encoding = util.swap_out_encoding()
926
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
182 try:
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
183 # TODO: implement --rev/#rev support
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
184 # TODO: do credentials specified in the URL still work?
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
185 svn = dest.svn
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
186 meta = repo.svnmeta(svn.uuid, svn.subdir)
331
75f082b5897e Switch to using url scheme wrappers instead of duplicating each command we wrap.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 329
diff changeset
187
926
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
188 # Strategy:
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
189 # 1. Find all outgoing commits from this head
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
190 if len(repo.parents()) != 1:
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
191 ui.status('Cowardly refusing to push branch merge\n')
626
8e621dbb82d4 push: return reasonable status codes to the end user
Augie Fackler <durin42@gmail.com>
parents: 620
diff changeset
192 return 0 # results in nonzero exit status, see hg's commands.py
926
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
193 workingrev = repo.parents()[0]
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
194 ui.status('searching for changes\n')
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
195 hashes = meta.revmap.hashes()
926
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
196 outgoing = util.outgoing_revisions(repo, hashes, workingrev.node())
933
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
197 to_strip=[]
926
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
198 if not (outgoing and len(outgoing)):
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
199 ui.status('no changes found\n')
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
200 return 1 # so we get a sane exit status, see hg's commands.push
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
201 while outgoing:
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
202
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
203 # 2. Commit oldest revision that needs to be pushed
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
204 oldest = outgoing.pop(-1)
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
205 old_ctx = repo[oldest]
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
206 old_pars = old_ctx.parents()
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
207 if len(old_pars) != 1:
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
208 ui.status('Found a branch merge, this needs discussion and '
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
209 'implementation.\n')
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
210 # results in nonzero exit status, see hg's commands.py
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
211 return 0
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
212 # We will commit to svn against this node's parent rev. Any
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
213 # file-level conflicts here will result in an error reported
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
214 # by svn.
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
215 base_ctx = old_pars[0]
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
216 base_revision = hashes[base_ctx.node()][0]
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
217 svnbranch = base_ctx.branch()
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
218 # Find most recent svn commit we have on this branch. This
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
219 # node will become the nearest known ancestor of the pushed
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
220 # rev.
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
221 oldtipctx = base_ctx
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
222 old_children = oldtipctx.descendants()
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
223 seen = set(c.node() for c in old_children)
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
224 samebranchchildren = [c for c in old_children
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
225 if c.branch() == svnbranch and c.node() in hashes]
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
226 if samebranchchildren:
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
227 # The following relies on descendants being sorted by rev.
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
228 oldtipctx = samebranchchildren[-1]
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
229 # All set, so commit now.
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
230 try:
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
231 pushmod.commit(ui, repo, old_ctx, meta, base_revision, svn)
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
232 except pushmod.NoFilesException:
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
233 ui.warn("Could not push revision %s because it had no changes "
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
234 "in svn.\n" % old_ctx)
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
235 return 1
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
236
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
237 # 3. Fetch revisions from svn
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
238 # TODO: this probably should pass in the source explicitly -
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
239 # rev too?
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
240 r = repo.pull(dest, force=force)
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
241 assert not r or r == 0
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
242
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
243 # 4. Find the new head of the target branch
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
244 # We expect to get our own new commit back, but we might
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
245 # also get other commits that happened since our last pull,
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
246 # or even right after our own commit (race).
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
247 for c in oldtipctx.descendants():
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
248 if c.node() not in seen and c.branch() == svnbranch:
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
249 newtipctx = c
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
250
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
251 # 5. Rebase all children of the currently-pushing rev to the
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
252 # new head
933
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
253 #
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
254 # there may be commits descended from the one we just
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
255 # pushed to svn that we aren't going to push to svn in
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
256 # this operation
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
257 oldhex = node.hex(old_ctx.node())
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
258 needs_rebase_set = "%s:: and not(%s)" % (oldhex, oldhex)
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
259 def extrafn(ctx, extra):
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
260 extra['branch'] = ctx.branch()
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
261
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
262 util.swap_out_encoding(old_encoding)
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
263 try:
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
264 hgrebase.rebase(ui, repo, dest=node.hex(newtipctx.node()),
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
265 rev=[needs_rebase_set],
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
266 extrafn=extrafn,
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
267 # We actually want to strip one more rev than
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
268 # we're rebasing
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
269 keep=True)
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
270 finally:
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
271 util.swap_out_encoding()
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
272
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
273 to_strip.append(old_ctx.node())
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
274 # don't trust the pre-rebase repo. Do not reuse
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
275 # contexts across this.
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
276 newtip = newtipctx.node()
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
277 repo = getlocalpeer(ui, {}, meta.path)
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
278 newtipctx = repo[newtip]
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
279
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
280 rebasemap = dict()
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
281 for child in newtipctx.descendants():
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
282 rebasesrc = child.extra().get('rebase_source')
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
283 if rebasesrc:
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
284 rebasemap[node.bin(rebasesrc)] = child.node()
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
285 outgoing = [rebasemap.get(n) or n for n in outgoing]
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
286
926
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
287 meta = repo.svnmeta(svn.uuid, svn.subdir)
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
288 hashes = meta.revmap.hashes()
933
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
289 hg.update(repo, repo['tip'].node())
a9f315eae67c push: use native rebase instead of our rebase wrapper
David Schleimer <dschleimer@fb.com>
parents: 930
diff changeset
290 repair.strip(ui, repo, to_strip, "all")
926
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
291 finally:
c4001eecfdb1 wrappers: properly reset encoding when leaving push()
Patrick Mezard <patrick@mezard.eu>
parents: 925
diff changeset
292 util.swap_out_encoding(old_encoding)
626
8e621dbb82d4 push: return reasonable status codes to the end user
Augie Fackler <durin42@gmail.com>
parents: 620
diff changeset
293 return 1 # so we get a sane exit status, see hg's commands.push
257
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
294
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
295
347
537de0300510 Remove the 'outgoing' wrapper, and use the Mercurial infrastructure instead.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 346
diff changeset
296 def pull(repo, source, heads=[], force=False):
537de0300510 Remove the 'outgoing' wrapper, and use the Mercurial infrastructure instead.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 346
diff changeset
297 """pull new revisions from Subversion"""
537de0300510 Remove the 'outgoing' wrapper, and use the Mercurial infrastructure instead.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 346
diff changeset
298 assert source.capable('subversion')
537de0300510 Remove the 'outgoing' wrapper, and use the Mercurial infrastructure instead.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 346
diff changeset
299 svn_url = source.svnurl
331
75f082b5897e Switch to using url scheme wrappers instead of duplicating each command we wrap.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 329
diff changeset
300
342
76c833526fbc Use fallbacks in the wrappers for Subversion support, instead of prefixes.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 341
diff changeset
301 # Split off #rev
555
cbd7065e6ab4 util: add parseurl method to abstract away differences between 1.4 and 1.5
Augie Fackler <durin42@gmail.com>
parents: 523
diff changeset
302 svn_url, heads, checkout = util.parseurl(svn_url, heads)
257
ffccf0080e54 Move wrappers for hg commands to their own module.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
303 old_encoding = util.swap_out_encoding()
927
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
304 total = None
342
76c833526fbc Use fallbacks in the wrappers for Subversion support, instead of prefixes.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 341
diff changeset
305 try:
927
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
306 try:
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
307 stopat_rev = int(checkout or 0)
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
308 except ValueError:
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
309 raise hgutil.Abort('unrecognised Subversion revision %s: '
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
310 'only numbers work.' % checkout)
342
76c833526fbc Use fallbacks in the wrappers for Subversion support, instead of prefixes.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 341
diff changeset
311
927
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
312 have_replay = not repo.ui.configbool('hgsubversion', 'stupid')
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
313 if not have_replay:
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
314 repo.ui.note('fetching stupidly...\n')
331
75f082b5897e Switch to using url scheme wrappers instead of duplicating each command we wrap.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 329
diff changeset
315
927
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
316 svn = source.svn
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
317 meta = repo.svnmeta(svn.uuid, svn.subdir)
331
75f082b5897e Switch to using url scheme wrappers instead of duplicating each command we wrap.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 329
diff changeset
318
927
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
319 layout = repo.ui.config('hgsubversion', 'layout', 'auto')
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
320 if layout == 'auto':
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
321 try:
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
322 rootlist = svn.list_dir('', revision=(stopat_rev or None))
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
323 except svnwrap.SubversionException, e:
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
324 err = "%s (subversion error: %d)" % (e.args[0], e.args[1])
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
325 raise hgutil.Abort(err)
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
326 if sum(map(lambda x: x in rootlist, ('branches', 'tags', 'trunk'))):
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
327 layout = 'standard'
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
328 else:
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
329 layout = 'single'
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
330 repo.ui.setconfig('hgsubversion', 'layout', layout)
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
331 repo.ui.note('using %s layout\n' % layout)
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
332
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
333 branch = repo.ui.config('hgsubversion', 'branch')
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
334 if branch:
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
335 if layout != 'single':
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
336 msg = ('branch cannot be specified for Subversion clones using '
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
337 'standard directory layout')
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
338 raise hgutil.Abort(msg)
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
339
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
340 meta.branchmap['default'] = branch
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
341
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
342 ui = repo.ui
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
343 start = meta.revmap.youngest
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
344 origrevcount = len(meta.revmap)
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
345
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
346 if start <= 0:
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
347 # we are initializing a new repository
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
348 start = repo.ui.config('hgsubversion', 'startrev', 0)
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
349 if isinstance(start, str) and start.upper() == 'HEAD':
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
350 start = svn.last_changed_rev
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
351 else:
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
352 start = int(start)
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
353
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
354 if start > 0:
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
355 if layout == 'standard':
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
356 raise hgutil.Abort('non-zero start revisions are only '
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
357 'supported for single-directory clones.')
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
358 ui.note('starting at revision %d; any prior will be ignored\n'
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
359 % start)
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
360 # fetch all revisions *including* the one specified...
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
361 start -= 1
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
362
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
363 # anything less than zero makes no sense
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
364 if start < 0:
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
365 start = 0
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
366
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
367 skiprevs = repo.ui.configlist('hgsubversion', 'unsafeskip', '')
912
adf4a0890cc5 Catch/abort on subversion exceptions in list_dir
Brad Hall <bhall@fb.com>
parents: 908
diff changeset
368 try:
927
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
369 skiprevs = set(map(int, skiprevs))
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
370 except ValueError:
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
371 raise hgutil.Abort('unrecognised Subversion revisions %r: '
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
372 'only numbers work.' % checkout)
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
373
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
374 oldrevisions = len(meta.revmap)
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
375 if stopat_rev:
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
376 total = stopat_rev - start
651
827547493112 clone: allow specifying a start revision.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 647
diff changeset
377 else:
927
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
378 total = svn.HEAD - start
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
379 lastpulled = None
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
380
390
afe93f14a361 wrappers: Python 2.4 compat.
Augie Fackler <durin42@gmail.com>
parents: 367
diff changeset
381 try:
afe93f14a361 wrappers: Python 2.4 compat.
Augie Fackler <durin42@gmail.com>
parents: 367
diff changeset
382 # start converting revisions
787
4bbc6bf947f5 replay: fetch full revision at most once per run (issue252)
Patrick Mezard <pmezard@gmail.com>
parents: 783
diff changeset
383 firstrun = True
390
afe93f14a361 wrappers: Python 2.4 compat.
Augie Fackler <durin42@gmail.com>
parents: 367
diff changeset
384 for r in svn.revisions(start=start, stop=stopat_rev):
908
c4ee11a5d04c pull: add a hgsubversion.unsafeskip option to omit unwanted revs
Bryan O'Sullivan <bryano@fb.com>
parents: 895
diff changeset
385 if r.revnum in skiprevs:
c4ee11a5d04c pull: add a hgsubversion.unsafeskip option to omit unwanted revs
Bryan O'Sullivan <bryano@fb.com>
parents: 895
diff changeset
386 ui.status('[r%d SKIPPED]\n' % r.revnum)
c4ee11a5d04c pull: add a hgsubversion.unsafeskip option to omit unwanted revs
Bryan O'Sullivan <bryano@fb.com>
parents: 895
diff changeset
387 continue
821
f28e0f54a6ef svnmeta: store youngest revision pulled from subversion
Augie Fackler <durin42@gmail.com>
parents: 819
diff changeset
388 lastpulled = r.revnum
390
afe93f14a361 wrappers: Python 2.4 compat.
Augie Fackler <durin42@gmail.com>
parents: 367
diff changeset
389 if (r.author is None and
afe93f14a361 wrappers: Python 2.4 compat.
Augie Fackler <durin42@gmail.com>
parents: 367
diff changeset
390 r.message == 'This is an empty revision for padding.'):
afe93f14a361 wrappers: Python 2.4 compat.
Augie Fackler <durin42@gmail.com>
parents: 367
diff changeset
391 continue
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
392 tbdelta = meta.update_branch_tag_map_for_rev(r)
390
afe93f14a361 wrappers: Python 2.4 compat.
Augie Fackler <durin42@gmail.com>
parents: 367
diff changeset
393 # got a 502? Try more than once!
afe93f14a361 wrappers: Python 2.4 compat.
Augie Fackler <durin42@gmail.com>
parents: 367
diff changeset
394 tries = 0
afe93f14a361 wrappers: Python 2.4 compat.
Augie Fackler <durin42@gmail.com>
parents: 367
diff changeset
395 converted = False
afe93f14a361 wrappers: Python 2.4 compat.
Augie Fackler <durin42@gmail.com>
parents: 367
diff changeset
396 while not converted:
afe93f14a361 wrappers: Python 2.4 compat.
Augie Fackler <durin42@gmail.com>
parents: 367
diff changeset
397 try:
561
312c8c98eeff pull: handle commits without any commit message
Augie Fackler <durin42@gmail.com>
parents: 560
diff changeset
398 msg = ''
312c8c98eeff pull: handle commits without any commit message
Augie Fackler <durin42@gmail.com>
parents: 560
diff changeset
399 if r.message:
312c8c98eeff pull: handle commits without any commit message
Augie Fackler <durin42@gmail.com>
parents: 560
diff changeset
400 msg = r.message.strip()
431
612b8d753549 inline describe_revision(), use custom termwidth
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 419
diff changeset
401 if not msg:
769
cc1d4aa3ba41 configurable substitution for empty commit message (fixes #195)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 751
diff changeset
402 msg = util.default_commit_msg(ui)
431
612b8d753549 inline describe_revision(), use custom termwidth
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 419
diff changeset
403 else:
612b8d753549 inline describe_revision(), use custom termwidth
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 419
diff changeset
404 msg = [s.strip() for s in msg.splitlines() if s][0]
749
ec52205e5ed1 pull: handle change in termwidth() api from hg change c52c629ce19e
Augie Fackler <durin42@gmail.com>
parents: 748
diff changeset
405 if getattr(ui, 'termwidth', False):
ec52205e5ed1 pull: handle change in termwidth() api from hg change c52c629ce19e
Augie Fackler <durin42@gmail.com>
parents: 748
diff changeset
406 w = ui.termwidth()
ec52205e5ed1 pull: handle change in termwidth() api from hg change c52c629ce19e
Augie Fackler <durin42@gmail.com>
parents: 748
diff changeset
407 else:
ec52205e5ed1 pull: handle change in termwidth() api from hg change c52c629ce19e
Augie Fackler <durin42@gmail.com>
parents: 748
diff changeset
408 w = hgutil.termwidth()
431
612b8d753549 inline describe_revision(), use custom termwidth
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 419
diff changeset
409 bits = (r.revnum, r.author, msg)
606
789eec0a339c wrappers: fix pull output if termwidth() is inexact
Patrick Mezard <pmezard@gmail.com>
parents: 604
diff changeset
410 ui.status(('[r%d] %s: %s' % bits)[:w] + '\n')
602
7c44bc259505 wrappers.pull: fix calculation of progress totals.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 601
diff changeset
411 util.progress(ui, 'pull', r.revnum - start, total=total)
431
612b8d753549 inline describe_revision(), use custom termwidth
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 419
diff changeset
412
444
8c545dcad7b1 wrappers: save tbdelta in one place for both stupid and replay
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 440
diff changeset
413 meta.save_tbdelta(tbdelta)
787
4bbc6bf947f5 replay: fetch full revision at most once per run (issue252)
Patrick Mezard <pmezard@gmail.com>
parents: 783
diff changeset
414 close = pullfuns[have_replay](ui, meta, svn, r, tbdelta,
4bbc6bf947f5 replay: fetch full revision at most once per run (issue252)
Patrick Mezard <pmezard@gmail.com>
parents: 783
diff changeset
415 firstrun)
520
5a5b90a6d522 svnmeta: internalize tags delta
Patrick Mezard <pmezard@gmail.com>
parents: 507
diff changeset
416 meta.committags(r, close)
432
4bf90f8c9b7b consolidate metadata calls from stupid and replay code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
417 for branch, parent in close.iteritems():
4bf90f8c9b7b consolidate metadata calls from stupid and replay code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
418 if parent in (None, node.nullid):
4bf90f8c9b7b consolidate metadata calls from stupid and replay code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
419 continue
4bf90f8c9b7b consolidate metadata calls from stupid and replay code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
420 meta.delbranch(branch, parent, r)
4bf90f8c9b7b consolidate metadata calls from stupid and replay code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
421
418
92beeefeaf93 save metadata from one place
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 416
diff changeset
422 meta.save()
390
afe93f14a361 wrappers: Python 2.4 compat.
Augie Fackler <durin42@gmail.com>
parents: 367
diff changeset
423 converted = True
787
4bbc6bf947f5 replay: fetch full revision at most once per run (issue252)
Patrick Mezard <pmezard@gmail.com>
parents: 783
diff changeset
424 firstrun = False
431
612b8d753549 inline describe_revision(), use custom termwidth
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 419
diff changeset
425
837
805ef27fbcbe hgsubversion/*.py: add space after comment symbol #
Yonggang Luo <luoyonggang@gmail.com>
parents: 821
diff changeset
426 except svnwrap.SubversionRepoCanNotReplay, e: # pragma: no cover
390
afe93f14a361 wrappers: Python 2.4 compat.
Augie Fackler <durin42@gmail.com>
parents: 367
diff changeset
427 ui.status('%s\n' % e.message)
afe93f14a361 wrappers: Python 2.4 compat.
Augie Fackler <durin42@gmail.com>
parents: 367
diff changeset
428 stupidmod.print_your_svn_is_old_message(ui)
afe93f14a361 wrappers: Python 2.4 compat.
Augie Fackler <durin42@gmail.com>
parents: 367
diff changeset
429 have_replay = False
837
805ef27fbcbe hgsubversion/*.py: add space after comment symbol #
Yonggang Luo <luoyonggang@gmail.com>
parents: 821
diff changeset
430 except svnwrap.SubversionException, e: # pragma: no cover
601
0fe490ce2fbb isolate all imports of Subversion modules in svnwrap.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 600
diff changeset
431 if (e.args[1] == svnwrap.ERR_RA_DAV_REQUEST_FAILED
390
afe93f14a361 wrappers: Python 2.4 compat.
Augie Fackler <durin42@gmail.com>
parents: 367
diff changeset
432 and '502' in str(e)
afe93f14a361 wrappers: Python 2.4 compat.
Augie Fackler <durin42@gmail.com>
parents: 367
diff changeset
433 and tries < 3):
afe93f14a361 wrappers: Python 2.4 compat.
Augie Fackler <durin42@gmail.com>
parents: 367
diff changeset
434 tries += 1
afe93f14a361 wrappers: Python 2.4 compat.
Augie Fackler <durin42@gmail.com>
parents: 367
diff changeset
435 ui.status('Got a 502, retrying (%s)\n' % tries)
afe93f14a361 wrappers: Python 2.4 compat.
Augie Fackler <durin42@gmail.com>
parents: 367
diff changeset
436 else:
705
385213d2e2da pull: reveal the handled SubversionException to --traceback.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 701
diff changeset
437 ui.traceback()
390
afe93f14a361 wrappers: Python 2.4 compat.
Augie Fackler <durin42@gmail.com>
parents: 367
diff changeset
438 raise hgutil.Abort(*e.args)
afe93f14a361 wrappers: Python 2.4 compat.
Augie Fackler <durin42@gmail.com>
parents: 367
diff changeset
439 except KeyboardInterrupt:
895
5b9f17e34126 don't suppress KeyboardInterrupt exception tracebacks
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 876
diff changeset
440 ui.traceback()
347
537de0300510 Remove the 'outgoing' wrapper, and use the Mercurial infrastructure instead.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 346
diff changeset
441 finally:
927
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
442 if total is not None:
3271fa883f34 wrappers: ensure all pull() code path reset the encoding
Patrick Mezard <patrick@mezard.eu>
parents: 926
diff changeset
443 util.progress(ui, 'pull', None, total=total)
347
537de0300510 Remove the 'outgoing' wrapper, and use the Mercurial infrastructure instead.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 346
diff changeset
444 util.swap_out_encoding(old_encoding)
264
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
445
821
f28e0f54a6ef svnmeta: store youngest revision pulled from subversion
Augie Fackler <durin42@gmail.com>
parents: 819
diff changeset
446 if lastpulled is not None:
f28e0f54a6ef svnmeta: store youngest revision pulled from subversion
Augie Fackler <durin42@gmail.com>
parents: 819
diff changeset
447 meta.revmap.youngest = lastpulled
523
fa7aab230f1d wrappers: calculate and return exact count of changesets added.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 520
diff changeset
448 revisions = len(meta.revmap) - oldrevisions
fa7aab230f1d wrappers: calculate and return exact count of changesets added.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 520
diff changeset
449
283
521d9c1bb11d Implement -u/--update support when pulling.
Martijn Pieters <mj@zopatista.com>
parents: 278
diff changeset
450 if revisions == 0:
521d9c1bb11d Implement -u/--update support when pulling.
Martijn Pieters <mj@zopatista.com>
parents: 278
diff changeset
451 ui.status(i18n._("no changes found\n"))
347
537de0300510 Remove the 'outgoing' wrapper, and use the Mercurial infrastructure instead.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 346
diff changeset
452 return 0
283
521d9c1bb11d Implement -u/--update support when pulling.
Martijn Pieters <mj@zopatista.com>
parents: 278
diff changeset
453 else:
341
cfbd0e563af9 wrappers: remove unused clone() function.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 337
diff changeset
454 ui.status("pulled %d revisions\n" % revisions)
264
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
455
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
456 def rebase(orig, ui, repo, **opts):
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
457 """rebase current unpushed revisions onto the Subversion head
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
458
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
459 This moves a line of development from making its own head to the top of
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
460 Subversion development, linearizing the changes. In order to make sure you
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
461 rebase on top of the current top of Subversion work, you should probably run
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
462 'hg svn pull' before running this.
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
463
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
464 Also looks for svnextrafn and svnsourcerev in **opts.
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
465 """
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
466 if not opts.get('svn', False):
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
467 return orig(ui, repo, **opts)
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
468 def extrafn2(ctx, extra):
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
469 """defined here so we can add things easily.
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
470 """
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
471 extra['branch'] = ctx.branch()
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
472 extrafn = opts.get('svnextrafn', extrafn2)
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
473 sourcerev = opts.get('svnsourcerev', repo.parents()[0].node())
464
0f7095f53ca3 Extend svnrepos with SubversionRepo and SVNMeta
Patrick Mezard <pmezard@gmail.com>
parents: 463
diff changeset
474 meta = repo.svnmeta()
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
475 hashes = meta.revmap.hashes()
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
476 o_r = util.outgoing_revisions(repo, hashes, sourcerev=sourcerev)
264
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
477 if not o_r:
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
478 ui.status('Nothing to rebase!\n')
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
479 return 0
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
480 if len(repo[sourcerev].children()):
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
481 ui.status('Refusing to rebase non-head commit like a coward\n')
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
482 return 0
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
483 parent_rev = repo[o_r[-1]].parents()[0]
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
484 target_rev = parent_rev
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
485 p_n = parent_rev.node()
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
486 exhausted_choices = False
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
487 while target_rev.children() and not exhausted_choices:
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
488 for c in target_rev.children():
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
489 exhausted_choices = True
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
490 n = c.node()
406
e360558ba65f add a function to generate svn_commit_hashes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 405
diff changeset
491 if (n in hashes and hashes[n][1] == hashes[p_n][1]):
264
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
492 target_rev = c
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
493 exhausted_choices = False
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
494 break
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
495 if parent_rev == target_rev:
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
496 ui.status('Already up to date!\n')
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
497 return 0
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
498 return orig(ui, repo, dest=node.hex(target_rev.node()),
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
499 base=node.hex(sourcerev),
112d57bb736e rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
500 extrafn=extrafn)
402
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
501
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
502
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
503 optionmap = {
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
504 'tagpaths': ('hgsubversion', 'tagpaths'),
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
505 'authors': ('hgsubversion', 'authormap'),
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
506 'filemap': ('hgsubversion', 'filemap'),
574
8e025a6f0db4 add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 561
diff changeset
507 'branchmap': ('hgsubversion', 'branchmap'),
729
467b95348e6a implement tag renames
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 713
diff changeset
508 'tagmap': ('hgsubversion', 'tagmap'),
402
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
509 'stupid': ('hgsubversion', 'stupid'),
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
510 'defaulthost': ('hgsubversion', 'defaulthost'),
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
511 'defaultauthors': ('hgsubversion', 'defaultauthors'),
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
512 'usebranchnames': ('hgsubversion', 'usebranchnames'),
499
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 466
diff changeset
513 'layout': ('hgsubversion', 'layout'),
651
827547493112 clone: allow specifying a start revision.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 647
diff changeset
514 'startrev': ('hgsubversion', 'startrev'),
402
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
515 }
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
516
499
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 466
diff changeset
517 dontretain = { 'hgsubversion': set(['authormap', 'filemap', 'layout', ]) }
402
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
518
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
519 def clone(orig, ui, source, dest=None, **opts):
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
520 """
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
521 Some of the options listed below only apply to Subversion
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
522 %(target)s. See 'hg help %(extension)s' for more information on
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
523 them as well as other ways of customising the conversion process.
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
524 """
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
525
713
69c0e7c4faf9 clone: call the wrapped function (fixes #181)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 705
diff changeset
526 data = {}
816
86d124a8768e Fix hg.clone() calls changed by d976542986d2
Patrick Mezard <pmezard@gmail.com>
parents: 807
diff changeset
527 def hgclonewrapper(orig, ui, *args, **opts):
86d124a8768e Fix hg.clone() calls changed by d976542986d2
Patrick Mezard <pmezard@gmail.com>
parents: 807
diff changeset
528 if getattr(hg, 'peer', None):
86d124a8768e Fix hg.clone() calls changed by d976542986d2
Patrick Mezard <pmezard@gmail.com>
parents: 807
diff changeset
529 # Since 1.9 (d976542986d2)
86d124a8768e Fix hg.clone() calls changed by d976542986d2
Patrick Mezard <pmezard@gmail.com>
parents: 807
diff changeset
530 origsource = args[1]
86d124a8768e Fix hg.clone() calls changed by d976542986d2
Patrick Mezard <pmezard@gmail.com>
parents: 807
diff changeset
531 else:
86d124a8768e Fix hg.clone() calls changed by d976542986d2
Patrick Mezard <pmezard@gmail.com>
parents: 807
diff changeset
532 origsource = args[0]
86d124a8768e Fix hg.clone() calls changed by d976542986d2
Patrick Mezard <pmezard@gmail.com>
parents: 807
diff changeset
533
713
69c0e7c4faf9 clone: call the wrapped function (fixes #181)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 705
diff changeset
534 if isinstance(origsource, str):
69c0e7c4faf9 clone: call the wrapped function (fixes #181)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 705
diff changeset
535 source, branch, checkout = util.parseurl(ui.expandpath(origsource),
69c0e7c4faf9 clone: call the wrapped function (fixes #181)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 705
diff changeset
536 opts.get('branch'))
915
d6c47c33f6a2 fix breakage introduced by peer classes in hg 2.3
Bryan O'Sullivan <bryano@fb.com>
parents: 908
diff changeset
537 srcrepo = getpeer(ui, opts, source)
713
69c0e7c4faf9 clone: call the wrapped function (fixes #181)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 705
diff changeset
538 else:
69c0e7c4faf9 clone: call the wrapped function (fixes #181)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 705
diff changeset
539 srcrepo = origsource
69c0e7c4faf9 clone: call the wrapped function (fixes #181)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 705
diff changeset
540
69c0e7c4faf9 clone: call the wrapped function (fixes #181)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 705
diff changeset
541 if srcrepo.capable('subversion'):
69c0e7c4faf9 clone: call the wrapped function (fixes #181)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 705
diff changeset
542 branches = opts.pop('branch', None)
69c0e7c4faf9 clone: call the wrapped function (fixes #181)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 705
diff changeset
543 if branches:
69c0e7c4faf9 clone: call the wrapped function (fixes #181)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 705
diff changeset
544 data['branches'] = branches
69c0e7c4faf9 clone: call the wrapped function (fixes #181)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 705
diff changeset
545 ui.setconfig('hgsubversion', 'branch', branches[-1])
69c0e7c4faf9 clone: call the wrapped function (fixes #181)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 705
diff changeset
546
816
86d124a8768e Fix hg.clone() calls changed by d976542986d2
Patrick Mezard <pmezard@gmail.com>
parents: 807
diff changeset
547 data['srcrepo'], data['dstrepo'] = orig(ui, *args, **opts)
701
3b8088de027d clone: replace the --singlebranch with overloading for --branch
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 693
diff changeset
548
840
88f3cda47def wrappers: clone must return hg.clone() result (issue300, issue306)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 821
diff changeset
549 return data['srcrepo'], data['dstrepo']
88f3cda47def wrappers: clone must return hg.clone() result (issue300, issue306)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 821
diff changeset
550
402
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
551 for opt, (section, name) in optionmap.iteritems():
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
552 if opt in opts and opts[opt]:
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
553 ui.setconfig(section, name, str(opts.pop(opt)))
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
554
713
69c0e7c4faf9 clone: call the wrapped function (fixes #181)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 705
diff changeset
555 # calling hg.clone directoly to get the repository instances it returns,
69c0e7c4faf9 clone: call the wrapped function (fixes #181)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 705
diff changeset
556 # breaks in subtle ways, so we double-wrap
69c0e7c4faf9 clone: call the wrapped function (fixes #181)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 705
diff changeset
557 orighgclone = extensions.wrapfunction(hg, 'clone', hgclonewrapper)
69c0e7c4faf9 clone: call the wrapped function (fixes #181)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 705
diff changeset
558 orig(ui, source, dest, **opts)
69c0e7c4faf9 clone: call the wrapped function (fixes #181)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 705
diff changeset
559 hg.clone = orighgclone
69c0e7c4faf9 clone: call the wrapped function (fixes #181)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 705
diff changeset
560
69c0e7c4faf9 clone: call the wrapped function (fixes #181)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 705
diff changeset
561 # do this again; the ui instance isn't shared between the wrappers
69c0e7c4faf9 clone: call the wrapped function (fixes #181)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 705
diff changeset
562 if data.get('branches'):
69c0e7c4faf9 clone: call the wrapped function (fixes #181)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 705
diff changeset
563 ui.setconfig('hgsubversion', 'branch', data['branches'][-1])
69c0e7c4faf9 clone: call the wrapped function (fixes #181)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 705
diff changeset
564
69c0e7c4faf9 clone: call the wrapped function (fixes #181)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 705
diff changeset
565 dstrepo = data.get('dstrepo')
69c0e7c4faf9 clone: call the wrapped function (fixes #181)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 705
diff changeset
566 srcrepo = data.get('srcrepo')
402
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
567
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
568 if dstrepo.local() and srcrepo.capable('subversion'):
915
d6c47c33f6a2 fix breakage introduced by peer classes in hg 2.3
Bryan O'Sullivan <bryano@fb.com>
parents: 908
diff changeset
569 dst = dstrepo.local()
930
5bacb9c63e3e Fix more peer breakage with old hg versions
Patrick Mezard <patrick@mezard.eu>
parents: 928
diff changeset
570 if isinstance(dst, bool):
5bacb9c63e3e Fix more peer breakage with old hg versions
Patrick Mezard <patrick@mezard.eu>
parents: 928
diff changeset
571 # Apparently <= hg@1.9
5bacb9c63e3e Fix more peer breakage with old hg versions
Patrick Mezard <patrick@mezard.eu>
parents: 928
diff changeset
572 fd = dstrepo.opener("hgrc", "a", text=True)
5bacb9c63e3e Fix more peer breakage with old hg versions
Patrick Mezard <patrick@mezard.eu>
parents: 928
diff changeset
573 else:
5bacb9c63e3e Fix more peer breakage with old hg versions
Patrick Mezard <patrick@mezard.eu>
parents: 928
diff changeset
574 fd = dst.opener("hgrc", "a", text=True)
402
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
575 for section in set(s for s, v in optionmap.itervalues()):
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
576 config = dict(ui.configitems(section))
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
577 for name in dontretain[section]:
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
578 config.pop(name, None)
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
579
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
580 if config:
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
581 fd.write('\n[%s]\n' % section)
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
582 map(fd.write, ('%s = %s\n' % p for p in config.iteritems()))
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
583
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
584
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
585 def generic(orig, ui, repo, *args, **opts):
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
586 """
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
587 Subversion %(target)s can be used for %(command)s. See 'hg help
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
588 %(extension)s' for more on the conversion process.
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
589 """
701
3b8088de027d clone: replace the --singlebranch with overloading for --branch
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 693
diff changeset
590
3b8088de027d clone: replace the --singlebranch with overloading for --branch
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 693
diff changeset
591 branch = opts.get('branch', None)
3b8088de027d clone: replace the --singlebranch with overloading for --branch
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 693
diff changeset
592 if branch:
3b8088de027d clone: replace the --singlebranch with overloading for --branch
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 693
diff changeset
593 ui.setconfig('hgsubversion', 'branch', branch[-1])
3b8088de027d clone: replace the --singlebranch with overloading for --branch
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 693
diff changeset
594
402
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
595 for opt, (section, name) in optionmap.iteritems():
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
596 if opt in opts and opts[opt]:
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
597 if isinstance(repo, str):
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
598 ui.setconfig(section, name, opts.pop(opt))
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
599 else:
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
600 repo.ui.setconfig(section, name, opts.pop(opt))
d453cf1aafa3 uisetup: move clone and push/pull wrappers to wrappers module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 390
diff changeset
601 return orig(ui, repo, *args, **opts)