annotate mercurial/hg.py @ 35704:41ef02ba329b

merge: add `--abort` flag which can abort the merge Currently we don't have a good functionality to abort the merge and tell user to do `hg update -C .` which can leads to different results if user missed the '.' and moreover does not align with other abort functionalities like rebase, shelve etc. This patch adds `hg merge --abort` which will abort the ongoing merge and take us back to the chagneset where we started from. Works in both cases when merge resulted in conflicts and when there were no conflicts. .. feature:: A `--abort` flag to merge command to abort the ongoing merge. Differential Revision: https://phab.mercurial-scm.org/D1829
author Pulkit Goyal <7895pulkit@gmail.com>
date Mon, 08 Jan 2018 19:41:47 +0530
parents e925f33ac088
children 7ffbd911dbc9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1 # hg.py - repository classes for mercurial
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
2 #
4635
63b9d2deed48 Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4478
diff changeset
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
2859
345bac2bc4ec update copyrights.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2847
diff changeset
4 # Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
5 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8179
diff changeset
6 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10099
diff changeset
7 # GNU General Public License version 2 or any later version.
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
8
25939
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
9 from __future__ import absolute_import
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
10
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
11 import errno
29341
0d83ad967bf8 cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents: 29021
diff changeset
12 import hashlib
25939
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
13 import os
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
14 import shutil
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
15
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
16 from .i18n import _
35704
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
17 from .node import (
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
18 hex,
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
19 nullid,
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
20 )
22837
2be7d5ebd4d0 config: use the same hgrc for a cloned repo as for an uninitted repo
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents: 22818
diff changeset
21
25939
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
22 from . import (
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
23 bookmarks,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
24 bundlerepo,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
25 cmdutil,
28501
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
26 destutil,
25939
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
27 discovery,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
28 error,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
29 exchange,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
30 extensions,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
31 httppeer,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
32 localrepo,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
33 lock,
35347
a29fe459fc49 remotenames: rename related file and storage dir to logexchange
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35331
diff changeset
34 logexchange,
25939
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
35 merge as mergemod,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
36 node,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
37 phases,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
38 repoview,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
39 scmutil,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
40 sshpeer,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
41 statichttprepo,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
42 ui as uimod,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
43 unionrepo,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
44 url,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
45 util,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
46 verify as verifymod,
31218
4cc3797aa59c vfs: use 'vfs' module directly in 'mercurial.hg'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31168
diff changeset
47 vfs as vfsmod,
25939
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
48 )
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
49
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
50 release = lock.release
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
51
29424
f21e0d91d386 share: move magic string to a constant
Martijn Pieters <mjpieters@fb.com>
parents: 29389
diff changeset
52 # shared features
f21e0d91d386 share: move magic string to a constant
Martijn Pieters <mjpieters@fb.com>
parents: 29389
diff changeset
53 sharedbookmarks = 'bookmarks'
f21e0d91d386 share: move magic string to a constant
Martijn Pieters <mjpieters@fb.com>
parents: 29389
diff changeset
54
2740
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2738
diff changeset
55 def _local(path):
14825
de9eb6b1da4f util: rename the util.localpath that uses url to urllocalpath (issue2875)
Mads Kiilerich <mads@kiilerich.com>
parents: 14737
diff changeset
56 path = util.expandpath(util.urllocalpath(path))
11154
17031fea4e95 expand paths to local repository or bundle in appropriate classes
Alexander Solovyov <piranha@piranha.org.ua>
parents: 10728
diff changeset
57 return (os.path.isfile(path) and bundlerepo or localrepo)
2469
2e91ba371c4c hg.repository: make protocol table driven.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2431
diff changeset
58
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
59 def addbranchrevs(lrepo, other, branches, revs):
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
60 peer = other.peer() # a courtesy to callers using a localrepo for other
11322
3d6915f5a2bb improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents: 11312
diff changeset
61 hashbranch, branches = branches
3d6915f5a2bb improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents: 11312
diff changeset
62 if not hashbranch and not branches:
22818
d7b114493315 repair: use `first` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22648
diff changeset
63 x = revs or None
d7b114493315 repair: use `first` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22648
diff changeset
64 if util.safehasattr(revs, 'first'):
27637
b502138f5faa cleanup: remove superfluous space after space after equals (python)
timeless <timeless@mozdev.org>
parents: 27404
diff changeset
65 y = revs.first()
22818
d7b114493315 repair: use `first` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22648
diff changeset
66 elif revs:
d7b114493315 repair: use `first` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22648
diff changeset
67 y = revs[0]
d7b114493315 repair: use `first` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22648
diff changeset
68 else:
d7b114493315 repair: use `first` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22648
diff changeset
69 y = None
d7b114493315 repair: use `first` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22648
diff changeset
70 return x, y
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents: 24290
diff changeset
71 if revs:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents: 24290
diff changeset
72 revs = list(revs)
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents: 24290
diff changeset
73 else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents: 24290
diff changeset
74 revs = []
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents: 24290
diff changeset
75
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
76 if not peer.capable('branchmap'):
11322
3d6915f5a2bb improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents: 11312
diff changeset
77 if branches:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26354
diff changeset
78 raise error.Abort(_("remote branch lookup not supported"))
11322
3d6915f5a2bb improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents: 11312
diff changeset
79 revs.append(hashbranch)
10380
ee72d89c0d9f addbranchrevs: fallback for older servers
Sune Foldager <cryo@cyanite.org>
parents: 10379
diff changeset
80 return revs, revs[0]
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
81 branchmap = peer.branchmap()
11322
3d6915f5a2bb improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents: 11312
diff changeset
82
13047
6c375e07d673 branch: operate on branch names in local string space where possible
Matt Mackall <mpm@selenic.com>
parents: 12735
diff changeset
83 def primary(branch):
6c375e07d673 branch: operate on branch names in local string space where possible
Matt Mackall <mpm@selenic.com>
parents: 12735
diff changeset
84 if branch == '.':
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
85 if not lrepo:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26354
diff changeset
86 raise error.Abort(_("dirstate branch not accessible"))
13047
6c375e07d673 branch: operate on branch names in local string space where possible
Matt Mackall <mpm@selenic.com>
parents: 12735
diff changeset
87 branch = lrepo.dirstate.branch()
6c375e07d673 branch: operate on branch names in local string space where possible
Matt Mackall <mpm@selenic.com>
parents: 12735
diff changeset
88 if branch in branchmap:
6c375e07d673 branch: operate on branch names in local string space where possible
Matt Mackall <mpm@selenic.com>
parents: 12735
diff changeset
89 revs.extend(node.hex(r) for r in reversed(branchmap[branch]))
11322
3d6915f5a2bb improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents: 11312
diff changeset
90 return True
10365
d757bc0c7865 interpret repo#name url syntax as branch instead of revision
Sune Foldager <cryo@cyanite.org>
parents: 10358
diff changeset
91 else:
11322
3d6915f5a2bb improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents: 11312
diff changeset
92 return False
3d6915f5a2bb improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents: 11312
diff changeset
93
3d6915f5a2bb improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents: 11312
diff changeset
94 for branch in branches:
13047
6c375e07d673 branch: operate on branch names in local string space where possible
Matt Mackall <mpm@selenic.com>
parents: 12735
diff changeset
95 if not primary(branch):
11322
3d6915f5a2bb improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents: 11312
diff changeset
96 raise error.RepoLookupError(_("unknown branch '%s'") % branch)
3d6915f5a2bb improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents: 11312
diff changeset
97 if hashbranch:
13047
6c375e07d673 branch: operate on branch names in local string space where possible
Matt Mackall <mpm@selenic.com>
parents: 12735
diff changeset
98 if not primary(hashbranch):
11322
3d6915f5a2bb improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents: 11312
diff changeset
99 revs.append(hashbranch)
10365
d757bc0c7865 interpret repo#name url syntax as branch instead of revision
Sune Foldager <cryo@cyanite.org>
parents: 10358
diff changeset
100 return revs, revs[0]
d757bc0c7865 interpret repo#name url syntax as branch instead of revision
Sune Foldager <cryo@cyanite.org>
parents: 10358
diff changeset
101
13824
ec1695350361 hg: use url.url to parse branch names in parseurl()
Brodie Rao <brodie@bitheap.org>
parents: 13823
diff changeset
102 def parseurl(path, branches=None):
11322
3d6915f5a2bb improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents: 11312
diff changeset
103 '''parse url#branch, returning (url, (branch, branches))'''
5177
92236732d5a1 move parseurl from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 4917
diff changeset
104
14076
924c82157d46 url: move URL parsing functions into util to improve startup time
Brodie Rao <brodie@bitheap.org>
parents: 14073
diff changeset
105 u = util.url(path)
13897
375872fdadba hg: make parseurl() consistently return normalised path
Thomas Arendsen Hein <thomas@intevation.de>
parents: 13826
diff changeset
106 branch = None
375872fdadba hg: make parseurl() consistently return normalised path
Thomas Arendsen Hein <thomas@intevation.de>
parents: 13826
diff changeset
107 if u.fragment:
375872fdadba hg: make parseurl() consistently return normalised path
Thomas Arendsen Hein <thomas@intevation.de>
parents: 13826
diff changeset
108 branch = u.fragment
375872fdadba hg: make parseurl() consistently return normalised path
Thomas Arendsen Hein <thomas@intevation.de>
parents: 13826
diff changeset
109 u.fragment = None
31841
9ff5a124d111 py3: replace str() with bytes()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31456
diff changeset
110 return bytes(u), (branch, branches or [])
5177
92236732d5a1 move parseurl from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 4917
diff changeset
111
14606
6e631c24c6d9 hg: move peerschemes back to schemes
Matt Mackall <mpm@selenic.com>
parents: 14605
diff changeset
112 schemes = {
14568
5f002e3336ba hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents: 14556
diff changeset
113 'bundle': bundlerepo,
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents: 18553
diff changeset
114 'union': unionrepo,
14568
5f002e3336ba hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents: 14556
diff changeset
115 'file': _local,
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17191
diff changeset
116 'http': httppeer,
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17191
diff changeset
117 'https': httppeer,
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17191
diff changeset
118 'ssh': sshpeer,
14568
5f002e3336ba hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents: 14556
diff changeset
119 'static-http': statichttprepo,
5f002e3336ba hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents: 14556
diff changeset
120 }
5f002e3336ba hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents: 14556
diff changeset
121
5f002e3336ba hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents: 14556
diff changeset
122 def _peerlookup(path):
5f002e3336ba hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents: 14556
diff changeset
123 u = util.url(path)
5f002e3336ba hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents: 14556
diff changeset
124 scheme = u.scheme or 'file'
14606
6e631c24c6d9 hg: move peerschemes back to schemes
Matt Mackall <mpm@selenic.com>
parents: 14605
diff changeset
125 thing = schemes.get(scheme) or schemes['file']
14568
5f002e3336ba hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents: 14556
diff changeset
126 try:
5f002e3336ba hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents: 14556
diff changeset
127 return thing(path)
5f002e3336ba hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents: 14556
diff changeset
128 except TypeError:
25365
4cc3fb23881d hg: explicitly check that peer lookup object has instance() if call failed
Yuya Nishihara <yuya@tcha.org>
parents: 24945
diff changeset
129 # we can't test callable(thing) because 'thing' can be an unloaded
4cc3fb23881d hg: explicitly check that peer lookup object has instance() if call failed
Yuya Nishihara <yuya@tcha.org>
parents: 24945
diff changeset
130 # module that implements __call__
4cc3fb23881d hg: explicitly check that peer lookup object has instance() if call failed
Yuya Nishihara <yuya@tcha.org>
parents: 24945
diff changeset
131 if not util.safehasattr(thing, 'instance'):
4cc3fb23881d hg: explicitly check that peer lookup object has instance() if call failed
Yuya Nishihara <yuya@tcha.org>
parents: 24945
diff changeset
132 raise
14568
5f002e3336ba hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents: 14556
diff changeset
133 return thing
5f002e3336ba hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents: 14556
diff changeset
134
14605
9f1139cf5c76 hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents: 14568
diff changeset
135 def islocal(repo):
20355
7d269e7620c4 hg: note that islocal only accepts paths pointing to repos
Siddharth Agarwal <sid0@fb.com>
parents: 20354
diff changeset
136 '''return true if repo (or path pointing to repo) is local'''
33018
071732d9c210 py3: check for bytes instead of str in isinstance
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32970
diff changeset
137 if isinstance(repo, bytes):
14605
9f1139cf5c76 hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents: 14568
diff changeset
138 try:
9f1139cf5c76 hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents: 14568
diff changeset
139 return _peerlookup(repo).islocal(repo)
9f1139cf5c76 hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents: 14568
diff changeset
140 except AttributeError:
9f1139cf5c76 hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents: 14568
diff changeset
141 return False
9f1139cf5c76 hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents: 14568
diff changeset
142 return repo.local()
9f1139cf5c76 hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents: 14568
diff changeset
143
17887
0e2846b2482c url: use open and not url.open for local files (issue3624)
Siddharth Agarwal <sid0@fb.com>
parents: 17882
diff changeset
144 def openpath(ui, path):
0e2846b2482c url: use open and not url.open for local files (issue3624)
Siddharth Agarwal <sid0@fb.com>
parents: 17882
diff changeset
145 '''open path with open if local, url.open if remote'''
20354
b433b43364e4 hg.openpath: use url.islocal to tell if the path is local (issue3624)
Siddharth Agarwal <sid0@fb.com>
parents: 20185
diff changeset
146 pathurl = util.url(path, parsequery=False, parsefragment=False)
b433b43364e4 hg.openpath: use url.islocal to tell if the path is local (issue3624)
Siddharth Agarwal <sid0@fb.com>
parents: 20185
diff changeset
147 if pathurl.islocal():
b433b43364e4 hg.openpath: use url.islocal to tell if the path is local (issue3624)
Siddharth Agarwal <sid0@fb.com>
parents: 20185
diff changeset
148 return util.posixfile(pathurl.localpath(), 'rb')
17887
0e2846b2482c url: use open and not url.open for local files (issue3624)
Siddharth Agarwal <sid0@fb.com>
parents: 17882
diff changeset
149 else:
0e2846b2482c url: use open and not url.open for local files (issue3624)
Siddharth Agarwal <sid0@fb.com>
parents: 17882
diff changeset
150 return url.open(ui, path)
0e2846b2482c url: use open and not url.open for local files (issue3624)
Siddharth Agarwal <sid0@fb.com>
parents: 17882
diff changeset
151
20858
bc56ec9e64df hg: introduce "wirepeersetupfuncs" to setup wire peer by extensions (issue4109)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20825
diff changeset
152 # a list of (ui, repo) functions called for wire peer initialization
bc56ec9e64df hg: introduce "wirepeersetupfuncs" to setup wire peer by extensions (issue4109)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20825
diff changeset
153 wirepeersetupfuncs = []
bc56ec9e64df hg: introduce "wirepeersetupfuncs" to setup wire peer by extensions (issue4109)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20825
diff changeset
154
32379
71e735bd8170 dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents: 32172
diff changeset
155 def _peerorrepo(ui, path, create=False, presetupfuncs=None):
14605
9f1139cf5c76 hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents: 14568
diff changeset
156 """return a repository object for the specified path"""
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
157 obj = _peerlookup(path).instance(ui, path, create)
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
158 ui = getattr(obj, "ui", ui)
32379
71e735bd8170 dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents: 32172
diff changeset
159 for f in presetupfuncs or []:
71e735bd8170 dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents: 32172
diff changeset
160 f(ui, obj)
19777
6f72e7d28b35 extensions: list up only enabled extensions, if "ui" is specified
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19371
diff changeset
161 for name, module in extensions.extensions(ui):
14605
9f1139cf5c76 hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents: 14568
diff changeset
162 hook = getattr(module, 'reposetup', None)
9f1139cf5c76 hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents: 14568
diff changeset
163 if hook:
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
164 hook(ui, obj)
20858
bc56ec9e64df hg: introduce "wirepeersetupfuncs" to setup wire peer by extensions (issue4109)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20825
diff changeset
165 if not obj.local():
bc56ec9e64df hg: introduce "wirepeersetupfuncs" to setup wire peer by extensions (issue4109)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20825
diff changeset
166 for f in wirepeersetupfuncs:
bc56ec9e64df hg: introduce "wirepeersetupfuncs" to setup wire peer by extensions (issue4109)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20825
diff changeset
167 f(ui, obj)
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
168 return obj
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
169
32379
71e735bd8170 dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents: 32172
diff changeset
170 def repository(ui, path='', create=False, presetupfuncs=None):
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
171 """return a repository object for the specified path"""
32379
71e735bd8170 dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents: 32172
diff changeset
172 peer = _peerorrepo(ui, path, create, presetupfuncs=presetupfuncs)
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
173 repo = peer.local()
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
174 if not repo:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26354
diff changeset
175 raise error.Abort(_("repository '%s' is not local") %
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
176 (path or peer.url()))
18382
f3b21beb9802 filtering: rename filters to their antonyms
Kevin Bullock <kbullock@ringworld.org>
parents: 18303
diff changeset
177 return repo.filtered('visible')
14605
9f1139cf5c76 hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents: 14568
diff changeset
178
14839
510c893a726f peer: change arg name to convey it can be a repo as well
Idan Kamara <idankk86@gmail.com>
parents: 14825
diff changeset
179 def peer(uiorrepo, opts, path, create=False):
14554
68db17047637 hg: add peer method
Matt Mackall <mpm@selenic.com>
parents: 14553
diff changeset
180 '''return a repository peer for the specified path'''
14839
510c893a726f peer: change arg name to convey it can be a repo as well
Idan Kamara <idankk86@gmail.com>
parents: 14825
diff changeset
181 rui = remoteui(uiorrepo, opts)
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
182 return _peerorrepo(rui, path, create).peer()
14554
68db17047637 hg: add peer method
Matt Mackall <mpm@selenic.com>
parents: 14553
diff changeset
183
2719
532809ba1db5 hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2631
diff changeset
184 def defaultdest(source):
20799
069bf1b821c8 clone: add doctest for default destination
Yuya Nishihara <yuya@tcha.org>
parents: 20790
diff changeset
185 '''return default destination of clone if none is given
069bf1b821c8 clone: add doctest for default destination
Yuya Nishihara <yuya@tcha.org>
parents: 20790
diff changeset
186
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 33687
diff changeset
187 >>> defaultdest(b'foo')
20799
069bf1b821c8 clone: add doctest for default destination
Yuya Nishihara <yuya@tcha.org>
parents: 20790
diff changeset
188 'foo'
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 33687
diff changeset
189 >>> defaultdest(b'/foo/bar')
20799
069bf1b821c8 clone: add doctest for default destination
Yuya Nishihara <yuya@tcha.org>
parents: 20790
diff changeset
190 'bar'
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 33687
diff changeset
191 >>> defaultdest(b'/')
20799
069bf1b821c8 clone: add doctest for default destination
Yuya Nishihara <yuya@tcha.org>
parents: 20790
diff changeset
192 ''
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 33687
diff changeset
193 >>> defaultdest(b'')
20800
8253e55930a3 clone: abort if default destination has no meaningful name (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 20799
diff changeset
194 ''
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 33687
diff changeset
195 >>> defaultdest(b'http://example.org/')
20800
8253e55930a3 clone: abort if default destination has no meaningful name (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 20799
diff changeset
196 ''
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 33687
diff changeset
197 >>> defaultdest(b'http://example.org/foo/')
20799
069bf1b821c8 clone: add doctest for default destination
Yuya Nishihara <yuya@tcha.org>
parents: 20790
diff changeset
198 'foo'
069bf1b821c8 clone: add doctest for default destination
Yuya Nishihara <yuya@tcha.org>
parents: 20790
diff changeset
199 '''
20800
8253e55930a3 clone: abort if default destination has no meaningful name (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 20799
diff changeset
200 path = util.url(source).path
8253e55930a3 clone: abort if default destination has no meaningful name (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 20799
diff changeset
201 if not path:
8253e55930a3 clone: abort if default destination has no meaningful name (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 20799
diff changeset
202 return ''
8253e55930a3 clone: abort if default destination has no meaningful name (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 20799
diff changeset
203 return os.path.basename(os.path.normpath(path))
2774
8cd3e19bf4a5 Add a doc string
Matt Mackall <mpm@selenic.com>
parents: 2768
diff changeset
204
31133
23080c03a604 share: add --relative flag to store a relative path to the source
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 31058
diff changeset
205 def share(ui, source, dest=None, update=True, bookmarks=True, defaultpath=None,
23080c03a604 share: add --relative flag to store a relative path to the source
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 31058
diff changeset
206 relative=False):
8800
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
207 '''create a shared repository'''
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
208
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
209 if not islocal(source):
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26354
diff changeset
210 raise error.Abort(_('can only share local repositories'))
8800
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
211
8807
8bf6eb68ddaf share: allow dest to default to the basename of source
Matt Mackall <mpm@selenic.com>
parents: 8800
diff changeset
212 if not dest:
10099
f5e46dfb38c7 share: use defaultdest to compute unspecified destination
Brendan Cully <brendan@kublai.com>
parents: 9984
diff changeset
213 dest = defaultdest(source)
9344
eb6af02307ec Merge with i18n-stable
Matt Mackall <mpm@selenic.com>
parents: 9245
diff changeset
214 else:
eb6af02307ec Merge with i18n-stable
Matt Mackall <mpm@selenic.com>
parents: 9245
diff changeset
215 dest = ui.expandpath(dest)
8807
8bf6eb68ddaf share: allow dest to default to the basename of source
Matt Mackall <mpm@selenic.com>
parents: 8800
diff changeset
216
8800
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
217 if isinstance(source, str):
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
218 origsource = ui.expandpath(source)
10365
d757bc0c7865 interpret repo#name url syntax as branch instead of revision
Sune Foldager <cryo@cyanite.org>
parents: 10358
diff changeset
219 source, branches = parseurl(origsource)
8800
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
220 srcrepo = repository(ui, source)
10365
d757bc0c7865 interpret repo#name url syntax as branch instead of revision
Sune Foldager <cryo@cyanite.org>
parents: 10358
diff changeset
221 rev, checkout = addbranchrevs(srcrepo, srcrepo, branches, None)
8800
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
222 else:
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
223 srcrepo = source.local()
8800
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
224 origsource = source = srcrepo.url()
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
225 checkout = None
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
226
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
227 sharedpath = srcrepo.sharedpath # if our source is already sharing
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
228
31218
4cc3797aa59c vfs: use 'vfs' module directly in 'mercurial.hg'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31168
diff changeset
229 destwvfs = vfsmod.vfs(dest, realpath=True)
4cc3797aa59c vfs: use 'vfs' module directly in 'mercurial.hg'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31168
diff changeset
230 destvfs = vfsmod.vfs(os.path.join(destwvfs.base, '.hg'), realpath=True)
8800
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
231
21801
2ccd71bbd0f7 hg: update to use vfs functions in shared destination repository
Chinmay Joshi <c@chinmayjoshi.com>
parents: 21800
diff changeset
232 if destvfs.lexists():
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26354
diff changeset
233 raise error.Abort(_('destination already exists'))
8800
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
234
21800
219af1521a6a hg: use vfs functions in destination repository with share
Chinmay Joshi <c@chinmayjoshi.com>
parents: 21537
diff changeset
235 if not destwvfs.isdir():
219af1521a6a hg: use vfs functions in destination repository with share
Chinmay Joshi <c@chinmayjoshi.com>
parents: 21537
diff changeset
236 destwvfs.mkdir()
21801
2ccd71bbd0f7 hg: update to use vfs functions in shared destination repository
Chinmay Joshi <c@chinmayjoshi.com>
parents: 21800
diff changeset
237 destvfs.makedir()
8800
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
238
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
239 requirements = ''
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
240 try:
23877
7cc77030c557 localrepo: remove all external users of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23614
diff changeset
241 requirements = srcrepo.vfs.read('requires')
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25624
diff changeset
242 except IOError as inst:
8800
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
243 if inst.errno != errno.ENOENT:
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
244 raise
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
245
31133
23080c03a604 share: add --relative flag to store a relative path to the source
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 31058
diff changeset
246 if relative:
23080c03a604 share: add --relative flag to store a relative path to the source
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 31058
diff changeset
247 try:
23080c03a604 share: add --relative flag to store a relative path to the source
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 31058
diff changeset
248 sharedpath = os.path.relpath(sharedpath, destvfs.base)
23080c03a604 share: add --relative flag to store a relative path to the source
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 31058
diff changeset
249 requirements += 'relshared\n'
34979
b64ea7fb9599 share: handle --relative shares to a different drive letter gracefully
Matt Harbison <matt_harbison@yahoo.com>
parents: 34879
diff changeset
250 except (IOError, ValueError) as e:
b64ea7fb9599 share: handle --relative shares to a different drive letter gracefully
Matt Harbison <matt_harbison@yahoo.com>
parents: 34879
diff changeset
251 # ValueError is raised on Windows if the drive letters differ on
b64ea7fb9599 share: handle --relative shares to a different drive letter gracefully
Matt Harbison <matt_harbison@yahoo.com>
parents: 34879
diff changeset
252 # each path
31133
23080c03a604 share: add --relative flag to store a relative path to the source
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 31058
diff changeset
253 raise error.Abort(_('cannot calculate relative path'),
23080c03a604 share: add --relative flag to store a relative path to the source
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 31058
diff changeset
254 hint=str(e))
23080c03a604 share: add --relative flag to store a relative path to the source
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 31058
diff changeset
255 else:
23080c03a604 share: add --relative flag to store a relative path to the source
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 31058
diff changeset
256 requirements += 'shared\n'
23080c03a604 share: add --relative flag to store a relative path to the source
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 31058
diff changeset
257
21802
ff27fad408c4 hg: update util.writefile method to use write with vfs in share
Chinmay Joshi <c@chinmayjoshi.com>
parents: 21801
diff changeset
258 destvfs.write('requires', requirements)
ff27fad408c4 hg: update util.writefile method to use write with vfs in share
Chinmay Joshi <c@chinmayjoshi.com>
parents: 21801
diff changeset
259 destvfs.write('sharedpath', sharedpath)
8800
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
260
21800
219af1521a6a hg: use vfs functions in destination repository with share
Chinmay Joshi <c@chinmayjoshi.com>
parents: 21537
diff changeset
261 r = repository(ui, destwvfs.base)
30041
1779dde4c9ef hg: set default path correctly when doing a clone+share (issue5378)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29902
diff changeset
262 postshare(srcrepo, r, bookmarks=bookmarks, defaultpath=defaultpath)
28632
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
263 _postshareupdate(r, update, checkout=checkout)
34815
68e0bcb90357 subrepo: share instead of clone if the parent repo is shared (issue5675) (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 34805
diff changeset
264 return r
8800
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
265
34878
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
266 def unshare(ui, repo):
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
267 """convert a shared repository to a normal one
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
268
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
269 Copy the store data to the repo and remove the sharedpath data.
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
270 """
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
271
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
272 destlock = lock = None
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
273 lock = repo.lock()
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
274 try:
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
275 # we use locks here because if we race with commit, we
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
276 # can end up with extra data in the cloned revlogs that's
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
277 # not pointed to by changesets, thus causing verify to
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
278 # fail
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
279
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
280 destlock = copystore(ui, repo, repo.path)
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
281
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
282 sharefile = repo.vfs.join('sharedpath')
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
283 util.rename(sharefile, sharefile + '.old')
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
284
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
285 repo.requirements.discard('shared')
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
286 repo.requirements.discard('relshared')
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
287 repo._writerequirements()
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
288 finally:
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
289 destlock and destlock.release()
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
290 lock and lock.release()
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
291
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
292 # update store, spath, svfs and sjoin of repo
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
293 repo.unfiltered().__init__(repo.baseui, repo.root)
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
294
34879
7d51a7792f52 subrepo: implement 'unshare' for Mercurial subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 34878
diff changeset
295 # TODO: figure out how to access subrepos that exist, but were previously
7d51a7792f52 subrepo: implement 'unshare' for Mercurial subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 34878
diff changeset
296 # removed from .hgsub
7d51a7792f52 subrepo: implement 'unshare' for Mercurial subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 34878
diff changeset
297 c = repo['.']
7d51a7792f52 subrepo: implement 'unshare' for Mercurial subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 34878
diff changeset
298 subs = c.substate
7d51a7792f52 subrepo: implement 'unshare' for Mercurial subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 34878
diff changeset
299 for s in sorted(subs):
7d51a7792f52 subrepo: implement 'unshare' for Mercurial subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 34878
diff changeset
300 c.sub(s).unshare()
7d51a7792f52 subrepo: implement 'unshare' for Mercurial subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 34878
diff changeset
301
30041
1779dde4c9ef hg: set default path correctly when doing a clone+share (issue5378)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29902
diff changeset
302 def postshare(sourcerepo, destrepo, bookmarks=True, defaultpath=None):
27354
bced7180db19 hg: establish function for performing post-share actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27344
diff changeset
303 """Called after a new shared repo is created.
bced7180db19 hg: establish function for performing post-share actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27344
diff changeset
304
bced7180db19 hg: establish function for performing post-share actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27344
diff changeset
305 The new repo only has a requirements file and pointer to the source.
bced7180db19 hg: establish function for performing post-share actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27344
diff changeset
306 This function configures additional shared data.
bced7180db19 hg: establish function for performing post-share actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27344
diff changeset
307
bced7180db19 hg: establish function for performing post-share actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27344
diff changeset
308 Extensions can wrap this function and write additional entries to
bced7180db19 hg: establish function for performing post-share actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27344
diff changeset
309 destrepo/.hg/shared to indicate additional pieces of data to be shared.
bced7180db19 hg: establish function for performing post-share actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27344
diff changeset
310 """
30041
1779dde4c9ef hg: set default path correctly when doing a clone+share (issue5378)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29902
diff changeset
311 default = defaultpath or sourcerepo.ui.config('paths', 'default')
27354
bced7180db19 hg: establish function for performing post-share actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27344
diff changeset
312 if default:
35622
e925f33ac088 share: convert EOL of hgrc before writing to bytes IO
Yuya Nishihara <yuya@tcha.org>
parents: 35620
diff changeset
313 template = ('[paths]\n'
e925f33ac088 share: convert EOL of hgrc before writing to bytes IO
Yuya Nishihara <yuya@tcha.org>
parents: 35620
diff changeset
314 'default = %s\n')
e925f33ac088 share: convert EOL of hgrc before writing to bytes IO
Yuya Nishihara <yuya@tcha.org>
parents: 35620
diff changeset
315 destrepo.vfs.write('hgrc', util.tonativeeol(template % default))
27354
bced7180db19 hg: establish function for performing post-share actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27344
diff changeset
316
29753
e93408080646 shared: take wlock for writting the 'shared' file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29645
diff changeset
317 with destrepo.wlock():
e93408080646 shared: take wlock for writting the 'shared' file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29645
diff changeset
318 if bookmarks:
35619
c751b9fdbc40 share: use context manager or utility function to write file
Yuya Nishihara <yuya@tcha.org>
parents: 35582
diff changeset
319 destrepo.vfs.write('shared', sharedbookmarks + '\n')
23614
cd79fb4d75fd share: add option to share bookmarks
Ryan McElroy <rmcelroy@fb.com>
parents: 23545
diff changeset
320
28632
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
321 def _postshareupdate(repo, update, checkout=None):
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
322 """Maybe perform a working directory update after a shared repo is created.
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
323
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
324 ``update`` can be a boolean or a revision to update to.
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
325 """
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
326 if not update:
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
327 return
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
328
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
329 repo.ui.status(_("updating working directory\n"))
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
330 if update is not True:
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
331 checkout = update
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
332 for test in (checkout, 'default', 'tip'):
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
333 if test is None:
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
334 continue
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
335 try:
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
336 uprev = repo.lookup(test)
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
337 break
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
338 except error.RepoLookupError:
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
339 continue
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
340 _update(repo, uprev)
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
341
15078
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
342 def copystore(ui, srcrepo, destpath):
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
343 '''copy files from store of srcrepo in destpath
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
344
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
345 returns destlock
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
346 '''
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
347 destlock = None
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
348 try:
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
349 hardlink = None
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
350 num = 0
24440
27ad6b91f5c2 clone: add progress support to hardlink clones (issue3059)
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
351 closetopic = [None]
27ad6b91f5c2 clone: add progress support to hardlink clones (issue3059)
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
352 def prog(topic, pos):
27ad6b91f5c2 clone: add progress support to hardlink clones (issue3059)
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
353 if pos is None:
27ad6b91f5c2 clone: add progress support to hardlink clones (issue3059)
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
354 closetopic[0] = topic
27ad6b91f5c2 clone: add progress support to hardlink clones (issue3059)
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
355 else:
27ad6b91f5c2 clone: add progress support to hardlink clones (issue3059)
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
356 ui.progress(topic, pos + num)
25624
f0745da75056 publishing: use new helper method
Matt Mackall <mpm@selenic.com>
parents: 25591
diff changeset
357 srcpublishing = srcrepo.publishing()
31218
4cc3797aa59c vfs: use 'vfs' module directly in 'mercurial.hg'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31168
diff changeset
358 srcvfs = vfsmod.vfs(srcrepo.sharedpath)
4cc3797aa59c vfs: use 'vfs' module directly in 'mercurial.hg'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31168
diff changeset
359 dstvfs = vfsmod.vfs(destpath)
15078
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
360 for f in srcrepo.store.copylist():
15741
60344b83e442 phases: on copy clone, do not copy phases data if repote is publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15590
diff changeset
361 if srcpublishing and f.endswith('phaseroots'):
60344b83e442 phases: on copy clone, do not copy phases data if repote is publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15590
diff changeset
362 continue
20089
2d0ab571b822 hg: rewrite "copystore()" with vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19777
diff changeset
363 dstbase = os.path.dirname(f)
2d0ab571b822 hg: rewrite "copystore()" with vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19777
diff changeset
364 if dstbase and not dstvfs.exists(dstbase):
2d0ab571b822 hg: rewrite "copystore()" with vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19777
diff changeset
365 dstvfs.mkdir(dstbase)
2d0ab571b822 hg: rewrite "copystore()" with vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19777
diff changeset
366 if srcvfs.exists(f):
2d0ab571b822 hg: rewrite "copystore()" with vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19777
diff changeset
367 if f.endswith('data'):
20825
dda11e799529 hg: use "os.path.join()" to join path components which may be empty (issue4203)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20355
diff changeset
368 # 'dstbase' may be empty (e.g. revlog format 0)
dda11e799529 hg: use "os.path.join()" to join path components which may be empty (issue4203)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20355
diff changeset
369 lockfile = os.path.join(dstbase, "lock")
15078
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
370 # lock to avoid premature writing to the target
20825
dda11e799529 hg: use "os.path.join()" to join path components which may be empty (issue4203)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20355
diff changeset
371 destlock = lock.lock(dstvfs, lockfile)
20089
2d0ab571b822 hg: rewrite "copystore()" with vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19777
diff changeset
372 hardlink, n = util.copyfiles(srcvfs.join(f), dstvfs.join(f),
24440
27ad6b91f5c2 clone: add progress support to hardlink clones (issue3059)
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
373 hardlink, progress=prog)
15078
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
374 num += n
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
375 if hardlink:
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
376 ui.debug("linked %d files\n" % num)
24440
27ad6b91f5c2 clone: add progress support to hardlink clones (issue3059)
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
377 if closetopic[0]:
27ad6b91f5c2 clone: add progress support to hardlink clones (issue3059)
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
378 ui.progress(closetopic[0], None)
15078
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
379 else:
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
380 ui.debug("copied %d files\n" % num)
24440
27ad6b91f5c2 clone: add progress support to hardlink clones (issue3059)
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
381 if closetopic[0]:
27ad6b91f5c2 clone: add progress support to hardlink clones (issue3059)
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
382 ui.progress(closetopic[0], None)
15078
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
383 return destlock
16705
c2d9ef43ff6c check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents: 16352
diff changeset
384 except: # re-raises
15078
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
385 release(destlock)
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
386 raise
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
387
25761
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
388 def clonewithshare(ui, peeropts, sharepath, source, srcpeer, dest, pull=False,
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
389 rev=None, update=True, stream=False):
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
390 """Perform a clone using a shared repo.
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
391
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
392 The store for the repository will be located at <sharepath>/.hg. The
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
393 specified revisions will be cloned or pulled from "source". A shared repo
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
394 will be created at "dest" and a working copy will be created if "update" is
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
395 True.
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
396 """
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
397 revs = None
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
398 if rev:
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
399 if not srcpeer.capable('lookup'):
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26354
diff changeset
400 raise error.Abort(_("src repository does not support "
25761
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
401 "revision lookup and so doesn't "
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
402 "support clone by revision"))
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
403 revs = [srcpeer.lookup(r) for r in rev]
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
404
28289
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
405 # Obtain a lock before checking for or cloning the pooled repo otherwise
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
406 # 2 clients may race creating or populating it.
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
407 pooldir = os.path.dirname(sharepath)
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
408 # lock class requires the directory to exist.
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
409 try:
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
410 util.makedir(pooldir, False)
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
411 except OSError as e:
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
412 if e.errno != errno.EEXIST:
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
413 raise
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
414
31218
4cc3797aa59c vfs: use 'vfs' module directly in 'mercurial.hg'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31168
diff changeset
415 poolvfs = vfsmod.vfs(pooldir)
25761
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
416 basename = os.path.basename(sharepath)
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
417
28289
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
418 with lock.lock(poolvfs, '%s.lock' % basename):
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
419 if os.path.exists(sharepath):
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
420 ui.status(_('(sharing from existing pooled repository %s)\n') %
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
421 basename)
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
422 else:
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
423 ui.status(_('(sharing from new pooled repository %s)\n') % basename)
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
424 # Always use pull mode because hardlinks in share mode don't work
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
425 # well. Never update because working copies aren't necessary in
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
426 # share mode.
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
427 clone(ui, peeropts, source, dest=sharepath, pull=True,
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
428 rev=rev, update=False, stream=stream)
25761
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
429
30041
1779dde4c9ef hg: set default path correctly when doing a clone+share (issue5378)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29902
diff changeset
430 # Resolve the value to put in [paths] section for the source.
1779dde4c9ef hg: set default path correctly when doing a clone+share (issue5378)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29902
diff changeset
431 if islocal(source):
1779dde4c9ef hg: set default path correctly when doing a clone+share (issue5378)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29902
diff changeset
432 defaultpath = os.path.abspath(util.urllocalpath(source))
1779dde4c9ef hg: set default path correctly when doing a clone+share (issue5378)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29902
diff changeset
433 else:
1779dde4c9ef hg: set default path correctly when doing a clone+share (issue5378)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29902
diff changeset
434 defaultpath = source
1779dde4c9ef hg: set default path correctly when doing a clone+share (issue5378)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29902
diff changeset
435
25761
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
436 sharerepo = repository(ui, path=sharepath)
30041
1779dde4c9ef hg: set default path correctly when doing a clone+share (issue5378)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29902
diff changeset
437 share(ui, sharerepo, dest=dest, update=False, bookmarks=False,
1779dde4c9ef hg: set default path correctly when doing a clone+share (issue5378)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29902
diff changeset
438 defaultpath=defaultpath)
25761
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
439
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
440 # We need to perform a pull against the dest repo to fetch bookmarks
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
441 # and other non-store data that isn't shared by default. In the case of
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
442 # non-existing shared repo, this means we pull from the remote twice. This
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
443 # is a bit weird. But at the time it was implemented, there wasn't an easy
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
444 # way to pull just non-changegroup data.
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
445 destrepo = repository(ui, path=dest)
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
446 exchange.pull(destrepo, srcpeer, heads=revs)
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
447
28632
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
448 _postshareupdate(destrepo, update)
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
449
25761
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
450 return srcpeer, peer(ui, peeropts, dest)
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
451
32492
963de566de2f local-clone: extract the closure copying caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32379
diff changeset
452 # Recomputing branch cache might be slow on big repos,
963de566de2f local-clone: extract the closure copying caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32379
diff changeset
453 # so just copy it
963de566de2f local-clone: extract the closure copying caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32379
diff changeset
454 def _copycache(srcrepo, dstcachedir, fname):
963de566de2f local-clone: extract the closure copying caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32379
diff changeset
455 """copy a cache from srcrepo to destcachedir (if it exists)"""
963de566de2f local-clone: extract the closure copying caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32379
diff changeset
456 srcbranchcache = srcrepo.vfs.join('cache/%s' % fname)
963de566de2f local-clone: extract the closure copying caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32379
diff changeset
457 dstbranchcache = os.path.join(dstcachedir, fname)
963de566de2f local-clone: extract the closure copying caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32379
diff changeset
458 if os.path.exists(srcbranchcache):
963de566de2f local-clone: extract the closure copying caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32379
diff changeset
459 if not os.path.exists(dstcachedir):
963de566de2f local-clone: extract the closure copying caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32379
diff changeset
460 os.mkdir(dstcachedir)
963de566de2f local-clone: extract the closure copying caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32379
diff changeset
461 util.copyfile(srcbranchcache, dstbranchcache)
963de566de2f local-clone: extract the closure copying caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32379
diff changeset
462
32493
3c8a71a8df11 local-clone: extract the listing of caches to copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32492
diff changeset
463 def _cachetocopy(srcrepo):
3c8a71a8df11 local-clone: extract the listing of caches to copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32492
diff changeset
464 """return the list of cache file valuable to copy during a clone"""
3c8a71a8df11 local-clone: extract the listing of caches to copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32492
diff changeset
465 # In local clones we're copying all nodes, not just served
3c8a71a8df11 local-clone: extract the listing of caches to copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32492
diff changeset
466 # ones. Therefore copy all branch caches over.
3c8a71a8df11 local-clone: extract the listing of caches to copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32492
diff changeset
467 cachefiles = ['branch2']
32494
53a67ba9fb44 local-clone: also copy revs-branch-cache files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32493
diff changeset
468 cachefiles += ['branch2-%s' % f for f in repoview.filtertable]
53a67ba9fb44 local-clone: also copy revs-branch-cache files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32493
diff changeset
469 cachefiles += ['rbc-names-v1', 'rbc-revs-v1']
32495
a25cc3ca874f local-clone: also copy tags related caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32494
diff changeset
470 cachefiles += ['tags2']
a25cc3ca874f local-clone: also copy tags related caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32494
diff changeset
471 cachefiles += ['tags2-%s' % f for f in repoview.filtertable]
a25cc3ca874f local-clone: also copy tags related caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32494
diff changeset
472 cachefiles += ['hgtagsfnodes1']
32493
3c8a71a8df11 local-clone: extract the listing of caches to copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32492
diff changeset
473 return cachefiles
3c8a71a8df11 local-clone: extract the listing of caches to copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32492
diff changeset
474
14607
bd1acea552ff hg: rename opts argument to peeropts in clone
Martin Geisler <mg@aragost.com>
parents: 14606
diff changeset
475 def clone(ui, peeropts, source, dest=None, pull=False, rev=None,
25761
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
476 update=True, stream=False, branch=None, shareopts=None):
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
477 """Make a copy of an existing repository.
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
478
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
479 Create a copy of an existing repository in a new directory. The
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
480 source and destination are URLs, as passed to the repository
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
481 function. Returns a pair of repository peers, the source and
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
482 newly created destination.
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
483
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
484 The location of the source is added to the new repository's
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
485 .hg/hgrc file, as the default to be used for future pulls and
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
486 pushes.
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
487
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
488 If an exception is raised, the partly cloned/updated destination
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
489 repository will be deleted.
2600
c4325f0a9b91 clean up trailing white space.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2597
diff changeset
490
2719
532809ba1db5 hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2631
diff changeset
491 Arguments:
532809ba1db5 hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2631
diff changeset
492
532809ba1db5 hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2631
diff changeset
493 source: repository object or URL
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
494
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
495 dest: URL of destination repository to create (defaults to base
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
496 name of source repository)
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
497
23545
68c434799559 hg.clone: set 'stream' depending on whether --pull was requested or not
Siddharth Agarwal <sid0@fb.com>
parents: 23139
diff changeset
498 pull: always pull from source repository, even in local case or if the
68c434799559 hg.clone: set 'stream' depending on whether --pull was requested or not
Siddharth Agarwal <sid0@fb.com>
parents: 23139
diff changeset
499 server prefers streaming
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
500
2621
5a5852a417b1 clone: disable stream support on server side by default.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2613
diff changeset
501 stream: stream raw data uncompressed from repository (fast over
5a5852a417b1 clone: disable stream support on server side by default.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2613
diff changeset
502 LAN, slow over WAN)
2613
479e26afa10f clone: do not make streaming default. add --stream option instead.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2612
diff changeset
503
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
504 rev: revision to clone up to (implies pull=True)
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
505
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
506 update: update working directory after clone completes, if
6526
cfeeac24fc1e repo: add rjoin method
Bryan O'Sullivan <bos@serpentine.com>
parents: 6525
diff changeset
507 destination is local repository (True means update to default rev,
cfeeac24fc1e repo: add rjoin method
Bryan O'Sullivan <bos@serpentine.com>
parents: 6525
diff changeset
508 anything else is treated as a revision)
10379
a78bfaf988e1 add -b/--branch option to clone, bundle, incoming, outgoing, pull, push
Sune Foldager <cryo@cyanite.org>
parents: 10365
diff changeset
509
a78bfaf988e1 add -b/--branch option to clone, bundle, incoming, outgoing, pull, push
Sune Foldager <cryo@cyanite.org>
parents: 10365
diff changeset
510 branch: branches to clone
25761
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
511
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
512 shareopts: dict of options to control auto sharing behavior. The "pool" key
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
513 activates auto sharing mode and defines the directory for stores. The
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
514 "mode" key determines how to construct the directory name of the shared
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
515 repository. "identity" means the name is derived from the node of the first
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
516 changeset in the repository. "remote" means the name is derived from the
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
517 remote's path/URL. Defaults to "identity."
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
518 """
4478
b2b55acbacdd Add support for url#id syntax
Matt Mackall <mpm@selenic.com>
parents: 4477
diff changeset
519
32970
11c0bb4ccc76 py3: replace str with bytes in isinstance()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32495
diff changeset
520 if isinstance(source, bytes):
6089
28054773438c clone: make things work when source is a repo object
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6088
diff changeset
521 origsource = ui.expandpath(source)
10379
a78bfaf988e1 add -b/--branch option to clone, bundle, incoming, outgoing, pull, push
Sune Foldager <cryo@cyanite.org>
parents: 10365
diff changeset
522 source, branch = parseurl(origsource, branch)
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
523 srcpeer = peer(ui, peeropts, source)
2719
532809ba1db5 hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2631
diff changeset
524 else:
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
525 srcpeer = source.peer() # in case we were called with a localrepo
11818
b1ae33b813cb hg.clone: do not ignore branch argument when source is a repo object
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11544
diff changeset
526 branch = (None, branch or [])
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
527 origsource = source = srcpeer.url()
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
528 rev, checkout = addbranchrevs(srcpeer, srcpeer, branch, rev)
2719
532809ba1db5 hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2631
diff changeset
529
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
530 if dest is None:
2719
532809ba1db5 hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2631
diff changeset
531 dest = defaultdest(source)
20800
8253e55930a3 clone: abort if default destination has no meaningful name (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 20799
diff changeset
532 if dest:
8253e55930a3 clone: abort if default destination has no meaningful name (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 20799
diff changeset
533 ui.status(_("destination directory: %s\n") % dest)
9344
eb6af02307ec Merge with i18n-stable
Matt Mackall <mpm@selenic.com>
parents: 9245
diff changeset
534 else:
eb6af02307ec Merge with i18n-stable
Matt Mackall <mpm@selenic.com>
parents: 9245
diff changeset
535 dest = ui.expandpath(dest)
2719
532809ba1db5 hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2631
diff changeset
536
14825
de9eb6b1da4f util: rename the util.localpath that uses url to urllocalpath (issue2875)
Mads Kiilerich <mads@kiilerich.com>
parents: 14737
diff changeset
537 dest = util.urllocalpath(dest)
de9eb6b1da4f util: rename the util.localpath that uses url to urllocalpath (issue2875)
Mads Kiilerich <mads@kiilerich.com>
parents: 14737
diff changeset
538 source = util.urllocalpath(source)
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
539
17159
36a3016811d1 localrepo: use the path relative to "self.vfs" instead of "path" argument
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16705
diff changeset
540 if not dest:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26354
diff changeset
541 raise error.Abort(_("empty destination path is not valid"))
21803
62cc4055c6c8 hg: use vfs functions in clone
Chinmay Joshi <c@chinmayjoshi.com>
parents: 21802
diff changeset
542
31218
4cc3797aa59c vfs: use 'vfs' module directly in 'mercurial.hg'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31168
diff changeset
543 destvfs = vfsmod.vfs(dest, expandpath=True)
21803
62cc4055c6c8 hg: use vfs functions in clone
Chinmay Joshi <c@chinmayjoshi.com>
parents: 21802
diff changeset
544 if destvfs.lexists():
62cc4055c6c8 hg: use vfs functions in clone
Chinmay Joshi <c@chinmayjoshi.com>
parents: 21802
diff changeset
545 if not destvfs.isdir():
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26354
diff changeset
546 raise error.Abort(_("destination '%s' already exists") % dest)
21804
becb61de90a1 hg: update newly added listdir function of vfs in clone
Chinmay Joshi <c@chinmayjoshi.com>
parents: 21803
diff changeset
547 elif destvfs.listdir():
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26354
diff changeset
548 raise error.Abort(_("destination '%s' is not empty") % dest)
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
549
25761
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
550 shareopts = shareopts or {}
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
551 sharepool = shareopts.get('pool')
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
552 sharenamemode = shareopts.get('mode')
26026
d08e7449ff27 hg: avoid auto sharing when the clone destination is remote
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25761
diff changeset
553 if sharepool and islocal(dest):
25761
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
554 sharepath = None
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
555 if sharenamemode == 'identity':
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
556 # Resolve the name from the initial changeset in the remote
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
557 # repository. This returns nullid when the remote is empty. It
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
558 # raises RepoLookupError if revision 0 is filtered or otherwise
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
559 # not available. If we fail to resolve, sharing is not enabled.
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
560 try:
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
561 rootnode = srcpeer.lookup('0')
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
562 if rootnode != node.nullid:
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
563 sharepath = os.path.join(sharepool, node.hex(rootnode))
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
564 else:
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
565 ui.status(_('(not using pooled storage: '
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
566 'remote appears to be empty)\n'))
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
567 except error.RepoLookupError:
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
568 ui.status(_('(not using pooled storage: '
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
569 'unable to resolve identity of remote)\n'))
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
570 elif sharenamemode == 'remote':
29341
0d83ad967bf8 cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents: 29021
diff changeset
571 sharepath = os.path.join(
35582
72b91f905065 py3: use node.hex(h.digest()) instead of h.hexdigest()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35565
diff changeset
572 sharepool, node.hex(hashlib.sha1(source).digest()))
25761
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
573 else:
29389
98e8313dcd9e i18n: translate abort messages
liscju <piotr.listkiewicz@gmail.com>
parents: 29341
diff changeset
574 raise error.Abort(_('unknown share naming mode: %s') %
98e8313dcd9e i18n: translate abort messages
liscju <piotr.listkiewicz@gmail.com>
parents: 29341
diff changeset
575 sharenamemode)
25761
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
576
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
577 if sharepath:
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
578 return clonewithshare(ui, peeropts, sharepath, source, srcpeer,
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
579 dest, pull=pull, rev=rev, update=update,
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
580 stream=stream)
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
581
18441
1f794204abbd hg: replace DirCleanup class with normal try/finally use
Augie Fackler <raf@durin42.com>
parents: 18382
diff changeset
582 srclock = destlock = cleandir = None
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
583 srcrepo = srcpeer.local()
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
584 try:
14377
f90d5641c78b clone: make default path absolute for all local paths
Brendan Cully <brendan@kublai.com>
parents: 14213
diff changeset
585 abspath = origsource
f90d5641c78b clone: make default path absolute for all local paths
Brendan Cully <brendan@kublai.com>
parents: 14213
diff changeset
586 if islocal(origsource):
14825
de9eb6b1da4f util: rename the util.localpath that uses url to urllocalpath (issue2875)
Mads Kiilerich <mads@kiilerich.com>
parents: 14737
diff changeset
587 abspath = os.path.abspath(util.urllocalpath(origsource))
14377
f90d5641c78b clone: make default path absolute for all local paths
Brendan Cully <brendan@kublai.com>
parents: 14213
diff changeset
588
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
589 if islocal(dest):
18441
1f794204abbd hg: replace DirCleanup class with normal try/finally use
Augie Fackler <raf@durin42.com>
parents: 18382
diff changeset
590 cleandir = dest
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
591
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
592 copy = False
17194
32a6a33b9a35 peer: remove cancopy from peer api; use directly on repo instead
Sune Foldager <cryo@cyanite.org>
parents: 17192
diff changeset
593 if (srcrepo and srcrepo.cancopy() and islocal(dest)
17671
fdd0fc046cf1 clfilter: introduce a `hassecret` function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17342
diff changeset
594 and not phases.hassecret(srcrepo)):
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
595 copy = not pull and not rev
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
596
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
597 if copy:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
598 try:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
599 # we use a lock here because if we race with commit, we
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
600 # can end up with extra data in the cloned revlogs that's
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
601 # not pointed to by changesets, thus causing verify to
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
602 # fail
14463
81f559d1b9b2 hg: remove underscores in clone function
Martin Geisler <mg@aragost.com>
parents: 14377
diff changeset
603 srclock = srcrepo.lock(wait=False)
7640
7197812e8d44 error: move lock errors
Matt Mackall <mpm@selenic.com>
parents: 7546
diff changeset
604 except error.LockError:
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
605 copy = False
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
606
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
607 if copy:
14463
81f559d1b9b2 hg: remove underscores in clone function
Martin Geisler <mg@aragost.com>
parents: 14377
diff changeset
608 srcrepo.hook('preoutgoing', throw=True, source='clone')
15381
c519cd8f0169 backout dbdb777502dc (issue3077) (issue3071)
Matt Mackall <mpm@selenic.com>
parents: 15355
diff changeset
609 hgdir = os.path.realpath(os.path.join(dest, ".hg"))
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
610 if not os.path.exists(dest):
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
611 os.mkdir(dest)
7935
39566bb99a9c on clone failure, only remove directories we created
Steve Borho <steve@borho.org>
parents: 7927
diff changeset
612 else:
39566bb99a9c on clone failure, only remove directories we created
Steve Borho <steve@borho.org>
parents: 7927
diff changeset
613 # only clean up directories we create ourselves
18441
1f794204abbd hg: replace DirCleanup class with normal try/finally use
Augie Fackler <raf@durin42.com>
parents: 18382
diff changeset
614 cleandir = hgdir
5569
9e209193f18d clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents: 5277
diff changeset
615 try:
14463
81f559d1b9b2 hg: remove underscores in clone function
Martin Geisler <mg@aragost.com>
parents: 14377
diff changeset
616 destpath = hgdir
81f559d1b9b2 hg: remove underscores in clone function
Martin Geisler <mg@aragost.com>
parents: 14377
diff changeset
617 util.makedir(destpath, notindexed=True)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25624
diff changeset
618 except OSError as inst:
5569
9e209193f18d clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents: 5277
diff changeset
619 if inst.errno == errno.EEXIST:
18441
1f794204abbd hg: replace DirCleanup class with normal try/finally use
Augie Fackler <raf@durin42.com>
parents: 18382
diff changeset
620 cleandir = None
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26354
diff changeset
621 raise error.Abort(_("destination '%s' already exists")
5569
9e209193f18d clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents: 5277
diff changeset
622 % dest)
9e209193f18d clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents: 5277
diff changeset
623 raise
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
624
15078
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
625 destlock = copystore(ui, srcrepo, destpath)
22646
d6ecdb8bfa16 clone: copy `.hg/bookmarks` during copy clone
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22618
diff changeset
626 # copy bookmarks over
31322
4282feb79432 hg-mod: directly use repo.vfs.join
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31311
diff changeset
627 srcbookmarks = srcrepo.vfs.join('bookmarks')
22646
d6ecdb8bfa16 clone: copy `.hg/bookmarks` during copy clone
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22618
diff changeset
628 dstbookmarks = os.path.join(destpath, 'bookmarks')
d6ecdb8bfa16 clone: copy `.hg/bookmarks` during copy clone
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22618
diff changeset
629 if os.path.exists(srcbookmarks):
d6ecdb8bfa16 clone: copy `.hg/bookmarks` during copy clone
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22618
diff changeset
630 util.copyfile(srcbookmarks, dstbookmarks)
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
631
17740
e6067bec18da branchcache: fetch source branchcache during clone (issue3378)
Tomasz Kleczek <tomasz.kleczek@fb.com>
parents: 17704
diff changeset
632 dstcachedir = os.path.join(destpath, 'cache')
32493
3c8a71a8df11 local-clone: extract the listing of caches to copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32492
diff changeset
633 for cache in _cachetocopy(srcrepo):
3c8a71a8df11 local-clone: extract the listing of caches to copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32492
diff changeset
634 _copycache(srcrepo, dstcachedir, cache)
17740
e6067bec18da branchcache: fetch source branchcache during clone (issue3378)
Tomasz Kleczek <tomasz.kleczek@fb.com>
parents: 17704
diff changeset
635
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
636 # we need to re-init the repo after manually copying the data
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
637 # into it
17874
2ba70eec1cf0 peer: subrepo isolation, pass repo instead of repo.ui to hg.peer
Simon Heimberg <simohe@besonet.ch>
parents: 17872
diff changeset
638 destpeer = peer(srcrepo, peeropts, dest)
14463
81f559d1b9b2 hg: remove underscores in clone function
Martin Geisler <mg@aragost.com>
parents: 14377
diff changeset
639 srcrepo.hook('outgoing', source='clone',
12144
be9c4131a8f4 clone, patch, convert: use hex(nullid) instead of '0'*40
Martin Geisler <mg@lazybytes.net>
parents: 11818
diff changeset
640 node=node.hex(node.nullid))
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
641 else:
5569
9e209193f18d clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents: 5277
diff changeset
642 try:
17875
92ba3cd55be6 subrepo: more isolation, only use ui for hg.peer when there is no repo
Simon Heimberg <simohe@besonet.ch>
parents: 17874
diff changeset
643 destpeer = peer(srcrepo or ui, peeropts, dest, create=True)
92ba3cd55be6 subrepo: more isolation, only use ui for hg.peer when there is no repo
Simon Heimberg <simohe@besonet.ch>
parents: 17874
diff changeset
644 # only pass ui when no srcrepo
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25624
diff changeset
645 except OSError as inst:
5569
9e209193f18d clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents: 5277
diff changeset
646 if inst.errno == errno.EEXIST:
18441
1f794204abbd hg: replace DirCleanup class with normal try/finally use
Augie Fackler <raf@durin42.com>
parents: 18382
diff changeset
647 cleandir = None
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26354
diff changeset
648 raise error.Abort(_("destination '%s' already exists")
5569
9e209193f18d clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents: 5277
diff changeset
649 % dest)
9e209193f18d clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents: 5277
diff changeset
650 raise
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
651
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
652 revs = None
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
653 if rev:
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
654 if not srcpeer.capable('lookup'):
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26354
diff changeset
655 raise error.Abort(_("src repository does not support "
9171
a458b9bf4f3a hg: better wrapping of string literal
Martin Geisler <mg@lazybytes.net>
parents: 8907
diff changeset
656 "revision lookup and so doesn't "
a458b9bf4f3a hg: better wrapping of string literal
Martin Geisler <mg@lazybytes.net>
parents: 8907
diff changeset
657 "support clone by revision"))
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
658 revs = [srcpeer.lookup(r) for r in rev]
8417
39cf453da958 clone: try updating to the actual changeset specified in options
Brett Carter <brett@rdnzl.net>
parents: 8312
diff changeset
659 checkout = revs[0]
27165
70884715725e localrepo: remove clone method by hoisting into hg.py
Augie Fackler <augie@google.com>
parents: 26781
diff changeset
660 local = destpeer.local()
70884715725e localrepo: remove clone method by hoisting into hg.py
Augie Fackler <augie@google.com>
parents: 26781
diff changeset
661 if local:
35565
bdae51a83dfb clonebundle: make it possible to retrieve the initial bundle through largefile
Boris Feld <boris.feld@octobus.net>
parents: 35438
diff changeset
662 u = util.url(abspath)
bdae51a83dfb clonebundle: make it possible to retrieve the initial bundle through largefile
Boris Feld <boris.feld@octobus.net>
parents: 35438
diff changeset
663 defaulturl = bytes(u)
bdae51a83dfb clonebundle: make it possible to retrieve the initial bundle through largefile
Boris Feld <boris.feld@octobus.net>
parents: 35438
diff changeset
664 local.ui.setconfig('paths', 'default', defaulturl, 'clone')
23545
68c434799559 hg.clone: set 'stream' depending on whether --pull was requested or not
Siddharth Agarwal <sid0@fb.com>
parents: 23139
diff changeset
665 if not stream:
68c434799559 hg.clone: set 'stream' depending on whether --pull was requested or not
Siddharth Agarwal <sid0@fb.com>
parents: 23139
diff changeset
666 if pull:
68c434799559 hg.clone: set 'stream' depending on whether --pull was requested or not
Siddharth Agarwal <sid0@fb.com>
parents: 23139
diff changeset
667 stream = False
68c434799559 hg.clone: set 'stream' depending on whether --pull was requested or not
Siddharth Agarwal <sid0@fb.com>
parents: 23139
diff changeset
668 else:
68c434799559 hg.clone: set 'stream' depending on whether --pull was requested or not
Siddharth Agarwal <sid0@fb.com>
parents: 23139
diff changeset
669 stream = None
27165
70884715725e localrepo: remove clone method by hoisting into hg.py
Augie Fackler <augie@google.com>
parents: 26781
diff changeset
670 # internal config: ui.quietbookmarkmove
31456
2545ee88a57e clone: get rid of ui.backupconfig
Jun Wu <quark@fb.com>
parents: 31322
diff changeset
671 overrides = {('ui', 'quietbookmarkmove'): True}
2545ee88a57e clone: get rid of ui.backupconfig
Jun Wu <quark@fb.com>
parents: 31322
diff changeset
672 with local.ui.configoverride(overrides, 'clone'):
27165
70884715725e localrepo: remove clone method by hoisting into hg.py
Augie Fackler <augie@google.com>
parents: 26781
diff changeset
673 exchange.pull(local, srcpeer, revs,
70884715725e localrepo: remove clone method by hoisting into hg.py
Augie Fackler <augie@google.com>
parents: 26781
diff changeset
674 streamclonerequested=stream)
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
675 elif srcrepo:
22647
5b6cd8526d56 clone: explicitly push bookmarks when cloning from local to remote
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22646
diff changeset
676 exchange.push(srcrepo, destpeer, revs=revs,
5b6cd8526d56 clone: explicitly push bookmarks when cloning from local to remote
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22646
diff changeset
677 bookmarks=srcrepo._bookmarks.keys())
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
678 else:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26354
diff changeset
679 raise error.Abort(_("clone from remote to remote not supported")
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26354
diff changeset
680 )
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
681
18441
1f794204abbd hg: replace DirCleanup class with normal try/finally use
Augie Fackler <raf@durin42.com>
parents: 18382
diff changeset
682 cleandir = None
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
683
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
684 destrepo = destpeer.local()
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
685 if destrepo:
22837
2be7d5ebd4d0 config: use the same hgrc for a cloned repo as for an uninitted repo
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents: 22818
diff changeset
686 template = uimod.samplehgrcs['cloned']
15552
62c9183a0bbb clone: don't save user's password in .hg/hgrc (Issue3122)
Augie Fackler <durin42@gmail.com>
parents: 15381
diff changeset
687 u = util.url(abspath)
62c9183a0bbb clone: don't save user's password in .hg/hgrc (Issue3122)
Augie Fackler <durin42@gmail.com>
parents: 15381
diff changeset
688 u.passwd = None
33687
6294654453ee py3: use bytes IO to write sample hgrc
Yuya Nishihara <yuya@tcha.org>
parents: 33018
diff changeset
689 defaulturl = bytes(u)
35620
545967ec33dc clone: use utility function to write hgrc
Yuya Nishihara <yuya@tcha.org>
parents: 35619
diff changeset
690 destrepo.vfs.write('hgrc', util.tonativeeol(template % defaulturl))
20790
49f2d5644f04 config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents: 20355
diff changeset
691 destrepo.ui.setconfig('paths', 'default', defaulturl, 'clone')
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8807
diff changeset
692
35331
773a9a06047c clone: add support for storing remotenames while cloning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34979
diff changeset
693 if ui.configbool('experimental', 'remotenames'):
35347
a29fe459fc49 remotenames: rename related file and storage dir to logexchange
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35331
diff changeset
694 logexchange.pullremotenames(destrepo, srcpeer)
35331
773a9a06047c clone: add support for storing remotenames while cloning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34979
diff changeset
695
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
696 if update:
6526
cfeeac24fc1e repo: add rjoin method
Bryan O'Sullivan <bos@serpentine.com>
parents: 6525
diff changeset
697 if update is not True:
17342
471f30d360ea clone: don't fail with --update for non-local clones (issue3578)
Augie Fackler <raf@durin42.com>
parents: 17248
diff changeset
698 checkout = srcpeer.lookup(update)
17867
c9339efed653 clone: make sure to use "@" as bookmark and "default" as branch (issue3677)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 17844
diff changeset
699 uprev = None
17882
36ed69d4593d clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents: 17875
diff changeset
700 status = None
17867
c9339efed653 clone: make sure to use "@" as bookmark and "default" as branch (issue3677)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 17844
diff changeset
701 if checkout is not None:
5248
5517aa5aafb0 Merge with crew-stable
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5192 5225
diff changeset
702 try:
17867
c9339efed653 clone: make sure to use "@" as bookmark and "default" as branch (issue3677)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 17844
diff changeset
703 uprev = destrepo.lookup(checkout)
9423
1444a42f6052 Make distinct lookup error for localrepo.lookup
Matt Mackall <mpm@selenic.com>
parents: 9344
diff changeset
704 except error.RepoLookupError:
26354
c1fb2cab6260 clone: check update rev for being True
Sean Farley <sean@farley.io>
parents: 26353
diff changeset
705 if update is not True:
c1fb2cab6260 clone: check update rev for being True
Sean Farley <sean@farley.io>
parents: 26353
diff changeset
706 try:
c1fb2cab6260 clone: check update rev for being True
Sean Farley <sean@farley.io>
parents: 26353
diff changeset
707 uprev = destrepo.lookup(update)
c1fb2cab6260 clone: check update rev for being True
Sean Farley <sean@farley.io>
parents: 26353
diff changeset
708 except error.RepoLookupError:
c1fb2cab6260 clone: check update rev for being True
Sean Farley <sean@farley.io>
parents: 26353
diff changeset
709 pass
17867
c9339efed653 clone: make sure to use "@" as bookmark and "default" as branch (issue3677)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 17844
diff changeset
710 if uprev is None:
c9339efed653 clone: make sure to use "@" as bookmark and "default" as branch (issue3677)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 17844
diff changeset
711 try:
c9339efed653 clone: make sure to use "@" as bookmark and "default" as branch (issue3677)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 17844
diff changeset
712 uprev = destrepo._bookmarks['@']
17870
7d2dd10ce9ea clone: activate @ bookmark if updating to it
Thomas Arendsen Hein <thomas@intevation.de>
parents: 17867
diff changeset
713 update = '@'
17882
36ed69d4593d clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents: 17875
diff changeset
714 bn = destrepo[uprev].branch()
36ed69d4593d clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents: 17875
diff changeset
715 if bn == 'default':
36ed69d4593d clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents: 17875
diff changeset
716 status = _("updating to bookmark @\n")
36ed69d4593d clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents: 17875
diff changeset
717 else:
20868
5db105f216c3 i18n: fix "% inside _()" problems
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20858
diff changeset
718 status = (_("updating to bookmark @ on branch %s\n")
26353
7c20d501709b clone: fix over-indented continuation line
Sean Farley <sean@farley.io>
parents: 26240
diff changeset
719 % bn)
17867
c9339efed653 clone: make sure to use "@" as bookmark and "default" as branch (issue3677)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 17844
diff changeset
720 except KeyError:
c9339efed653 clone: make sure to use "@" as bookmark and "default" as branch (issue3677)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 17844
diff changeset
721 try:
c9339efed653 clone: make sure to use "@" as bookmark and "default" as branch (issue3677)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 17844
diff changeset
722 uprev = destrepo.branchtip('default')
c9339efed653 clone: make sure to use "@" as bookmark and "default" as branch (issue3677)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 17844
diff changeset
723 except error.RepoLookupError:
c9339efed653 clone: make sure to use "@" as bookmark and "default" as branch (issue3677)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 17844
diff changeset
724 uprev = destrepo.lookup('tip')
17882
36ed69d4593d clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents: 17875
diff changeset
725 if not status:
36ed69d4593d clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents: 17875
diff changeset
726 bn = destrepo[uprev].branch()
36ed69d4593d clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents: 17875
diff changeset
727 status = _("updating to branch %s\n") % bn
36ed69d4593d clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents: 17875
diff changeset
728 destrepo.ui.status(status)
14463
81f559d1b9b2 hg: remove underscores in clone function
Martin Geisler <mg@aragost.com>
parents: 14377
diff changeset
729 _update(destrepo, uprev)
17703
4a07d2ff7c66 clone: activate bookmark specified with --updaterev
Thomas Arendsen Hein <thomas@intevation.de>
parents: 17342
diff changeset
730 if update in destrepo._bookmarks:
24945
e0b0fbd47491 bookmarks: rename setcurrent to activate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24440
diff changeset
731 bookmarks.activate(destrepo, update)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
732 finally:
15908
60cb4f381a78 bookmarks: backout locking change in 12dea4d998ec
Matt Mackall <mpm@selenic.com>
parents: 15887
diff changeset
733 release(srclock, destlock)
18441
1f794204abbd hg: replace DirCleanup class with normal try/finally use
Augie Fackler <raf@durin42.com>
parents: 18382
diff changeset
734 if cleandir is not None:
1f794204abbd hg: replace DirCleanup class with normal try/finally use
Augie Fackler <raf@durin42.com>
parents: 18382
diff changeset
735 shutil.rmtree(cleandir, True)
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
736 if srcpeer is not None:
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
737 srcpeer.close()
19313
3b96d6e44a4d hg: move return statement after finally block
simon@laptop-tosh
parents: 18944
diff changeset
738 return srcpeer, destpeer
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents: 2774
diff changeset
739
27402
5184089f5d30 hg: add quietempty flag to _showstats
timeless <timeless@mozdev.org>
parents: 27354
diff changeset
740 def _showstats(repo, stats, quietempty=False):
5184089f5d30 hg: add quietempty flag to _showstats
timeless <timeless@mozdev.org>
parents: 27354
diff changeset
741 if quietempty and not any(stats):
5184089f5d30 hg: add quietempty flag to _showstats
timeless <timeless@mozdev.org>
parents: 27354
diff changeset
742 return
9454
dafadd7ff07e hg: avoid combining translated strings
Martin Geisler <mg@lazybytes.net>
parents: 9425
diff changeset
743 repo.ui.status(_("%d files updated, %d files merged, "
dafadd7ff07e hg: avoid combining translated strings
Martin Geisler <mg@lazybytes.net>
parents: 9425
diff changeset
744 "%d files removed, %d files unresolved\n") % stats)
3316
39fd6e82ea38 merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents: 3195
diff changeset
745
31166
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
746 def updaterepo(repo, node, overwrite, updatecheck=None):
17895
17c030014ddf subrepo: only do clean update when overwrite is set (issue3276)
Simon Heimberg <simohe@besonet.ch>
parents: 17887
diff changeset
747 """Update the working directory to node.
17c030014ddf subrepo: only do clean update when overwrite is set (issue3276)
Simon Heimberg <simohe@besonet.ch>
parents: 17887
diff changeset
748
17c030014ddf subrepo: only do clean update when overwrite is set (issue3276)
Simon Heimberg <simohe@besonet.ch>
parents: 17887
diff changeset
749 When overwrite is set, changes are clobbered, merged else
17c030014ddf subrepo: only do clean update when overwrite is set (issue3276)
Simon Heimberg <simohe@besonet.ch>
parents: 17887
diff changeset
750
17c030014ddf subrepo: only do clean update when overwrite is set (issue3276)
Simon Heimberg <simohe@besonet.ch>
parents: 17887
diff changeset
751 returns stats (see pydoc mercurial.merge.applyupdates)"""
27344
43c00ca887d1 merge: have merge.update use a matcher instead of partial fn
Augie Fackler <augie@google.com>
parents: 27165
diff changeset
752 return mergemod.update(repo, node, False, overwrite,
31166
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
753 labels=['working copy', 'destination'],
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
754 updatecheck=updatecheck)
17895
17c030014ddf subrepo: only do clean update when overwrite is set (issue3276)
Simon Heimberg <simohe@besonet.ch>
parents: 17887
diff changeset
755
31166
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
756 def update(repo, node, quietempty=False, updatecheck=None):
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
757 """update the working directory to node"""
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
758 stats = updaterepo(repo, node, False, updatecheck=updatecheck)
27404
1cf3543cc780 update: add quietempty flag to _showstats
timeless <timeless@mozdev.org>
parents: 27403
diff changeset
759 _showstats(repo, stats, quietempty)
3316
39fd6e82ea38 merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents: 3195
diff changeset
760 if stats[3]:
6518
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6338
diff changeset
761 repo.ui.status(_("use 'hg resolve' to retry unresolved file merges\n"))
5635
0c608a8d9c5f merge: make return codes more sensible
Matt Mackall <mpm@selenic.com>
parents: 5569
diff changeset
762 return stats[3] > 0
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents: 2774
diff changeset
763
7546
c7f48414f3ad add a comment about the need of hg._update()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7280
diff changeset
764 # naming conflict in clone()
c7f48414f3ad add a comment about the need of hg._update()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7280
diff changeset
765 _update = update
c7f48414f3ad add a comment about the need of hg._update()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7280
diff changeset
766
27403
50b6a04f817f histedit: omit useless message from abort
timeless <timeless@mozdev.org>
parents: 27402
diff changeset
767 def clean(repo, node, show_stats=True, quietempty=False):
2808
30f59f4a327e Introduce update helper functions: update, merge, clean, and revert
Matt Mackall <mpm@selenic.com>
parents: 2778
diff changeset
768 """forcibly switch the working directory to node, clobbering changes"""
17895
17c030014ddf subrepo: only do clean update when overwrite is set (issue3276)
Simon Heimberg <simohe@besonet.ch>
parents: 17887
diff changeset
769 stats = updaterepo(repo, node, True)
31311
f59b6cf663a9 vfs: use repo.vfs.unlinkpath
Mads Kiilerich <mads@kiilerich.com>
parents: 31218
diff changeset
770 repo.vfs.unlinkpath('graftstate', ignoremissing=True)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
771 if show_stats:
27403
50b6a04f817f histedit: omit useless message from abort
timeless <timeless@mozdev.org>
parents: 27402
diff changeset
772 _showstats(repo, stats, quietempty)
5635
0c608a8d9c5f merge: make return codes more sensible
Matt Mackall <mpm@selenic.com>
parents: 5569
diff changeset
773 return stats[3] > 0
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents: 2774
diff changeset
774
28501
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
775 # naming conflict in updatetotally()
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
776 _clean = clean
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
777
31166
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
778 def updatetotally(ui, repo, checkout, brev, clean=False, updatecheck=None):
28501
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
779 """Update the working directory with extra care for non-file components
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
780
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
781 This takes care of non-file components below:
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
782
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
783 :bookmark: might be advanced or (in)activated
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
784
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
785 This takes arguments below:
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
786
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
787 :checkout: to which revision the working directory is updated
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
788 :brev: a name, which might be a bookmark to be activated after updating
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
789 :clean: whether changes in the working directory can be discarded
31166
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
790 :updatecheck: how to deal with a dirty working directory
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
791
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
792 Valid values for updatecheck are (None => linear):
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
793
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
794 * abort: abort if the working directory is dirty
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
795 * none: don't check (merge working directory changes into destination)
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
796 * linear: check that update is linear before merging working directory
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
797 changes into destination
31168
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31167
diff changeset
798 * noconflict: check that the update does not result in file merges
28501
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
799
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
800 This returns whether conflict is detected at updating or not.
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
801 """
31166
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
802 if updatecheck is None:
34705
23ed47a895d5 config: graduate experimental.updatecheck to commands.update.check
Augie Fackler <augie@google.com>
parents: 34131
diff changeset
803 updatecheck = ui.config('commands', 'update.check')
31168
41a9edc5d00f update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents: 31167
diff changeset
804 if updatecheck not in ('abort', 'none', 'linear', 'noconflict'):
31167
696e321b304d update: add experimental config for default way of handling dirty wdir
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
805 # If not configured, or invalid value configured
696e321b304d update: add experimental config for default way of handling dirty wdir
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
806 updatecheck = 'linear'
28503
138ec8835e63 hg: acquire wlock while updating the working directory via updatetotally
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28501
diff changeset
807 with repo.wlock():
28501
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
808 movemarkfrom = None
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
809 warndest = False
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
810 if checkout is None:
30962
11c253997b0e destutil: drop now-unused "check" parameter from destupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30062
diff changeset
811 updata = destutil.destupdate(repo, clean=clean)
28501
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
812 checkout, movemarkfrom, brev = updata
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
813 warndest = True
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
814
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
815 if clean:
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
816 ret = _clean(repo, checkout)
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
817 else:
31166
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
818 if updatecheck == 'abort':
30963
7beb3ec34443 update: move check for dirty wdir into hg.updatetotally()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30962
diff changeset
819 cmdutil.bailifchanged(repo, merge=False)
31166
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
820 updatecheck = 'none'
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
821 ret = _update(repo, checkout, updatecheck=updatecheck)
28501
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
822
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
823 if not ret and movemarkfrom:
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
824 if movemarkfrom == repo['.'].node():
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
825 pass # no-op update
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
826 elif bookmarks.update(repo, [movemarkfrom], repo['.'].node()):
29902
a77d48219edd update: label bookmark name in message
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29753
diff changeset
827 b = ui.label(repo._activebookmark, 'bookmarks.active')
a77d48219edd update: label bookmark name in message
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29753
diff changeset
828 ui.status(_("updating bookmark %s\n") % b)
28501
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
829 else:
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
830 # this can happen with a non-linear update
29902
a77d48219edd update: label bookmark name in message
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29753
diff changeset
831 b = ui.label(repo._activebookmark, 'bookmarks')
a77d48219edd update: label bookmark name in message
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29753
diff changeset
832 ui.status(_("(leaving bookmark %s)\n") % b)
28501
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
833 bookmarks.deactivate(repo)
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
834 elif brev in repo._bookmarks:
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
835 if brev != repo._activebookmark:
29902
a77d48219edd update: label bookmark name in message
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29753
diff changeset
836 b = ui.label(brev, 'bookmarks.active')
a77d48219edd update: label bookmark name in message
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29753
diff changeset
837 ui.status(_("(activating bookmark %s)\n") % b)
28501
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
838 bookmarks.activate(repo, brev)
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
839 elif brev:
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
840 if repo._activebookmark:
29902
a77d48219edd update: label bookmark name in message
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29753
diff changeset
841 b = ui.label(repo._activebookmark, 'bookmarks')
a77d48219edd update: label bookmark name in message
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29753
diff changeset
842 ui.status(_("(leaving bookmark %s)\n") % b)
28501
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
843 bookmarks.deactivate(repo)
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
844
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
845 if warndest:
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
846 destutil.statusotherdests(ui, repo)
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
847
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
848 return ret
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
849
35704
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
850 def merge(repo, node, force=None, remind=True, mergeforce=False, labels=None,
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
851 abort=False):
13162
115a9760c382 merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents: 13047
diff changeset
852 """Branch merge with node, resolving changes. Return true if any
115a9760c382 merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents: 13047
diff changeset
853 unresolved conflicts."""
35704
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
854 if not abort:
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
855 stats = mergemod.update(repo, node, True, force, mergeforce=mergeforce,
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
856 labels=labels)
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
857 else:
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
858 ms = mergemod.mergestate.read(repo)
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
859 if ms.active():
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
860 # there were conflicts
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
861 node = hex(ms._local)
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
862 else:
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
863 # there were no conficts, mergestate was not stored
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
864 node = repo['.'].hex()
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
865
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
866 repo.ui.status(_("aborting the merge, updating back to"
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
867 " %s\n") % node[:12])
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
868 stats = mergemod.update(repo, node, branchmerge=False, force=True,
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
869 labels=labels)
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
870
3316
39fd6e82ea38 merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents: 3195
diff changeset
871 _showstats(repo, stats)
39fd6e82ea38 merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents: 3195
diff changeset
872 if stats[3]:
7821
9fe7e6acf525 merge: better error messages to lead users to hg update --clean to abandon merges.
Augie Fackler <durin42@gmail.com>
parents: 7640
diff changeset
873 repo.ui.status(_("use 'hg resolve' to retry unresolved file merges "
35704
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
874 "or 'hg merge --abort' to abandon\n"))
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
875 elif remind and not abort:
3316
39fd6e82ea38 merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents: 3195
diff changeset
876 repo.ui.status(_("(branch merge, don't forget to commit)\n"))
5635
0c608a8d9c5f merge: make return codes more sensible
Matt Mackall <mpm@selenic.com>
parents: 5569
diff changeset
877 return stats[3] > 0
2808
30f59f4a327e Introduce update helper functions: update, merge, clean, and revert
Matt Mackall <mpm@selenic.com>
parents: 2778
diff changeset
878
12730
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
879 def _incoming(displaychlist, subreporecurse, ui, repo, source,
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
880 opts, buffered=False):
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
881 """
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
882 Helper for incoming / gincoming.
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
883 displaychlist gets called with
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
884 (remoterepo, incomingchangesetlist, displayer) parameters,
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
885 and is supposed to contain only code that can't be unified.
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
886 """
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
887 source, branches = parseurl(ui.expandpath(source), opts.get('branch'))
14556
517e1d88bf7e hg: change various repository() users to use peer() where appropriate
Matt Mackall <mpm@selenic.com>
parents: 14555
diff changeset
888 other = peer(repo, opts, source)
14076
924c82157d46 url: move URL parsing functions into util to improve startup time
Brodie Rao <brodie@bitheap.org>
parents: 14073
diff changeset
889 ui.status(_('comparing with %s\n') % util.hidepassword(source))
12730
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
890 revs, checkout = addbranchrevs(repo, other, branches, opts.get('rev'))
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
891
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
892 if revs:
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
893 revs = [other.lookup(rev) for rev in revs]
14161
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14156
diff changeset
894 other, chlist, cleanupfn = bundlerepo.getremotechanges(ui, repo, other,
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14156
diff changeset
895 revs, opts["bundle"], opts["force"])
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14156
diff changeset
896 try:
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14156
diff changeset
897 if not chlist:
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14156
diff changeset
898 ui.status(_("no changes found\n"))
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14156
diff changeset
899 return subreporecurse()
31057
16d7db8f752c incoming: delay pager activation until right before printing changes
Augie Fackler <augie@google.com>
parents: 30963
diff changeset
900 ui.pager('incoming')
12730
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
901 displayer = cmdutil.show_changeset(ui, other, opts, buffered)
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
902 displaychlist(other, chlist, displayer)
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
903 displayer.close()
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
904 finally:
14161
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14156
diff changeset
905 cleanupfn()
12730
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
906 subreporecurse()
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
907 return 0 # exit code is zero since we found incoming changes
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
908
12273
e392d00ab5b0 incoming: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12271
diff changeset
909 def incoming(ui, repo, source, opts):
12730
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
910 def subreporecurse():
12400
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
911 ret = 1
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
912 if opts.get('subrepos'):
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
913 ctx = repo[None]
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
914 for subpath in sorted(ctx.substate):
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
915 sub = ctx.sub(subpath)
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
916 ret = min(ret, sub.incoming(ui, source, opts))
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
917 return ret
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
918
12730
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
919 def display(other, chlist, displayer):
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
920 limit = cmdutil.loglimit(opts)
12273
e392d00ab5b0 incoming: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12271
diff changeset
921 if opts.get('newest_first'):
12729
55f0648c7e2d incoming: rename variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12400
diff changeset
922 chlist.reverse()
12273
e392d00ab5b0 incoming: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12271
diff changeset
923 count = 0
12729
55f0648c7e2d incoming: rename variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12400
diff changeset
924 for n in chlist:
12273
e392d00ab5b0 incoming: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12271
diff changeset
925 if limit is not None and count >= limit:
e392d00ab5b0 incoming: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12271
diff changeset
926 break
e392d00ab5b0 incoming: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12271
diff changeset
927 parents = [p for p in other.changelog.parents(n) if p != nullid]
e392d00ab5b0 incoming: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12271
diff changeset
928 if opts.get('no_merges') and len(parents) == 2:
e392d00ab5b0 incoming: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12271
diff changeset
929 continue
e392d00ab5b0 incoming: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12271
diff changeset
930 count += 1
e392d00ab5b0 incoming: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12271
diff changeset
931 displayer.show(other[n])
12730
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
932 return _incoming(display, subreporecurse, ui, repo, source, opts)
12273
e392d00ab5b0 incoming: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12271
diff changeset
933
12735
8888e56ac417 outgoing: unify common graphlog.outgoing and hg.outgoing code
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12734
diff changeset
934 def _outgoing(ui, repo, dest, opts):
35438
0ebd94ac56d1 outgoing: respect ":pushurl" paths (issue5365)
Hollis Blanchard <hollis_blanchard@mentor.com>
parents: 35347
diff changeset
935 path = ui.paths.getpath(dest, default=('default-push', 'default'))
0ebd94ac56d1 outgoing: respect ":pushurl" paths (issue5365)
Hollis Blanchard <hollis_blanchard@mentor.com>
parents: 35347
diff changeset
936 if not path:
0ebd94ac56d1 outgoing: respect ":pushurl" paths (issue5365)
Hollis Blanchard <hollis_blanchard@mentor.com>
parents: 35347
diff changeset
937 raise error.Abort(_('default repository not configured!'),
0ebd94ac56d1 outgoing: respect ":pushurl" paths (issue5365)
Hollis Blanchard <hollis_blanchard@mentor.com>
parents: 35347
diff changeset
938 hint=_("see 'hg help config.paths'"))
0ebd94ac56d1 outgoing: respect ":pushurl" paths (issue5365)
Hollis Blanchard <hollis_blanchard@mentor.com>
parents: 35347
diff changeset
939 dest = path.pushloc or path.loc
0ebd94ac56d1 outgoing: respect ":pushurl" paths (issue5365)
Hollis Blanchard <hollis_blanchard@mentor.com>
parents: 35347
diff changeset
940 branches = path.branch, opts.get('branch') or []
0ebd94ac56d1 outgoing: respect ":pushurl" paths (issue5365)
Hollis Blanchard <hollis_blanchard@mentor.com>
parents: 35347
diff changeset
941
14076
924c82157d46 url: move URL parsing functions into util to improve startup time
Brodie Rao <brodie@bitheap.org>
parents: 14073
diff changeset
942 ui.status(_('comparing with %s\n') % util.hidepassword(dest))
12735
8888e56ac417 outgoing: unify common graphlog.outgoing and hg.outgoing code
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12734
diff changeset
943 revs, checkout = addbranchrevs(repo, repo, branches, opts.get('rev'))
8888e56ac417 outgoing: unify common graphlog.outgoing and hg.outgoing code
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12734
diff changeset
944 if revs:
17198
ecde35a1af9e outgoing: accept revset argument for --rev
Matt Harbison <matt_harbison@yahoo.com>
parents: 17194
diff changeset
945 revs = [repo.lookup(rev) for rev in scmutil.revrange(repo, revs)]
12735
8888e56ac417 outgoing: unify common graphlog.outgoing and hg.outgoing code
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12734
diff changeset
946
14556
517e1d88bf7e hg: change various repository() users to use peer() where appropriate
Matt Mackall <mpm@selenic.com>
parents: 14555
diff changeset
947 other = peer(repo, opts, dest)
32172
448ed4d3ee90 outgoing: run on filtered repo
Martin von Zweigbergk <martinvonz@google.com>
parents: 31841
diff changeset
948 outgoing = discovery.findcommonoutgoing(repo, other, revs,
15837
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15741
diff changeset
949 force=opts.get('force'))
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15741
diff changeset
950 o = outgoing.missing
12735
8888e56ac417 outgoing: unify common graphlog.outgoing and hg.outgoing code
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12734
diff changeset
951 if not o:
17248
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17198
diff changeset
952 scmutil.nochangesfound(repo.ui, repo, outgoing.excluded)
21050
025ec0f08cb6 hg: make "_outgoing()" return peer object for remote repository
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21049
diff changeset
953 return o, other
12735
8888e56ac417 outgoing: unify common graphlog.outgoing and hg.outgoing code
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12734
diff changeset
954
12271
01dc8ba3e032 outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12144
diff changeset
955 def outgoing(ui, repo, dest, opts):
12400
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
956 def recurse():
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
957 ret = 1
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
958 if opts.get('subrepos'):
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
959 ctx = repo[None]
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
960 for subpath in sorted(ctx.substate):
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
961 sub = ctx.sub(subpath)
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
962 ret = min(ret, sub.outgoing(ui, dest, opts))
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
963 return ret
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
964
12271
01dc8ba3e032 outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12144
diff changeset
965 limit = cmdutil.loglimit(opts)
21050
025ec0f08cb6 hg: make "_outgoing()" return peer object for remote repository
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21049
diff changeset
966 o, other = _outgoing(ui, repo, dest, opts)
21049
f117a0ba5289 hg: make "_outgoing()" return empty list instead of "None"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20870
diff changeset
967 if not o:
21051
1004d3cd65fd outgoing: introduce "outgoinghooks" to avoid redundant outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21050
diff changeset
968 cmdutil.outgoinghooks(ui, repo, other, opts, o)
12400
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
969 return recurse()
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
970
12271
01dc8ba3e032 outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12144
diff changeset
971 if opts.get('newest_first'):
01dc8ba3e032 outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12144
diff changeset
972 o.reverse()
31058
d2ed0abce08e outgoing: avoid running pager until we're actually showing changes
Augie Fackler <augie@google.com>
parents: 31057
diff changeset
973 ui.pager('outgoing')
12271
01dc8ba3e032 outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12144
diff changeset
974 displayer = cmdutil.show_changeset(ui, repo, opts)
01dc8ba3e032 outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12144
diff changeset
975 count = 0
01dc8ba3e032 outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12144
diff changeset
976 for n in o:
01dc8ba3e032 outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12144
diff changeset
977 if limit is not None and count >= limit:
01dc8ba3e032 outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12144
diff changeset
978 break
01dc8ba3e032 outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12144
diff changeset
979 parents = [p for p in repo.changelog.parents(n) if p != nullid]
01dc8ba3e032 outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12144
diff changeset
980 if opts.get('no_merges') and len(parents) == 2:
01dc8ba3e032 outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12144
diff changeset
981 continue
01dc8ba3e032 outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12144
diff changeset
982 count += 1
01dc8ba3e032 outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12144
diff changeset
983 displayer.show(repo[n])
01dc8ba3e032 outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12144
diff changeset
984 displayer.close()
21051
1004d3cd65fd outgoing: introduce "outgoinghooks" to avoid redundant outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21050
diff changeset
985 cmdutil.outgoinghooks(ui, repo, other, opts, o)
12400
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
986 recurse()
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
987 return 0 # exit code is zero since we found outgoing changes
12271
01dc8ba3e032 outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12144
diff changeset
988
2778
fdc232d8a193 Move repo.verify
Matt Mackall <mpm@selenic.com>
parents: 2775
diff changeset
989 def verify(repo):
fdc232d8a193 Move repo.verify
Matt Mackall <mpm@selenic.com>
parents: 2775
diff changeset
990 """verify the consistency of a repository"""
25591
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
991 ret = verifymod.verify(repo)
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
992
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
993 # Broken subrepo references in hidden csets don't seem worth worrying about,
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
994 # since they can't be pushed/pulled, and --hidden can be used if they are a
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
995 # concern.
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
996
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
997 # pathto() is needed for -R case
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
998 revs = repo.revs("filelog(%s)",
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
999 util.pathto(repo.root, repo.getcwd(), '.hgsubstate'))
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1000
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1001 if revs:
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1002 repo.ui.status(_('checking subrepo links\n'))
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1003 for rev in revs:
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1004 ctx = repo[rev]
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1005 try:
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1006 for subpath in ctx.substate:
29021
92d37fb3f1aa verify: don't init subrepo when missing one is referenced (issue5128) (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 28655
diff changeset
1007 try:
92d37fb3f1aa verify: don't init subrepo when missing one is referenced (issue5128) (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 28655
diff changeset
1008 ret = (ctx.sub(subpath, allowcreate=False).verify()
92d37fb3f1aa verify: don't init subrepo when missing one is referenced (issue5128) (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 28655
diff changeset
1009 or ret)
92d37fb3f1aa verify: don't init subrepo when missing one is referenced (issue5128) (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 28655
diff changeset
1010 except error.RepoError as e:
29645
3b4d69b3988d doc: omit useless _() invocation
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29616
diff changeset
1011 repo.ui.warn(('%s: %s\n') % (rev, e))
25591
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1012 except Exception:
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1013 repo.ui.warn(_('.hgsubstate is corrupt in revision %s\n') %
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1014 node.short(ctx.node()))
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1015
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1016 return ret
11273
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1017
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1018 def remoteui(src, opts):
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1019 'build a remote ui from ui or repo and opts'
14952
4c523a2af6e7 hg: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents: 14839
diff changeset
1020 if util.safehasattr(src, 'baseui'): # looks like a repository
11273
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1021 dst = src.baseui.copy() # drop repo-specific config
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1022 src = src.ui # copy target options from repo
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1023 else: # assume it's a global ui object
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1024 dst = src.copy() # keep all global options
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1025
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1026 # copy ssh-specific options
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1027 for o in 'ssh', 'remotecmd':
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1028 v = opts.get(o) or src.config('ui', o)
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1029 if v:
20790
49f2d5644f04 config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents: 20355
diff changeset
1030 dst.setconfig("ui", o, v, 'copied')
11273
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1031
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1032 # copy bundle-specific options
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1033 r = src.config('bundle', 'mainreporoot')
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1034 if r:
20790
49f2d5644f04 config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents: 20355
diff changeset
1035 dst.setconfig('bundle', 'mainreporoot', r, 'copied')
11273
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1036
13192
4d03707916d3 https: use web.cacerts configuration from local repo to validate remote repo
Mads Kiilerich <mads@kiilerich.com>
parents: 12735
diff changeset
1037 # copy selected local settings to the remote ui
29616
3fde328d0913 hg: copy [hostsecurity] options to remote ui instances (issue5305)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29594
diff changeset
1038 for sect in ('auth', 'hostfingerprints', 'hostsecurity', 'http_proxy'):
11273
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1039 for key, val in src.configitems(sect):
20790
49f2d5644f04 config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents: 20355
diff changeset
1040 dst.setconfig(sect, key, val, 'copied')
13192
4d03707916d3 https: use web.cacerts configuration from local repo to validate remote repo
Mads Kiilerich <mads@kiilerich.com>
parents: 12735
diff changeset
1041 v = src.config('web', 'cacerts')
29594
e417664a3339 ssl: remove special case of web.cacerts=! from remoteui()
Yuya Nishihara <yuya@tcha.org>
parents: 29424
diff changeset
1042 if v:
20790
49f2d5644f04 config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents: 20355
diff changeset
1043 dst.setconfig('web', 'cacerts', util.expandpath(v), 'copied')
11273
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1044
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1045 return dst
26219
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1046
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1047 # Files of interest
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1048 # Used to check if the repository has changed looking at mtime and size of
26781
1aee2ab0f902 spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents: 26654
diff changeset
1049 # these files.
26219
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1050 foi = [('spath', '00changelog.i'),
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1051 ('spath', 'phaseroots'), # ! phase can change content at the same size
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1052 ('spath', 'obsstore'),
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1053 ('path', 'bookmarks'), # ! bookmark can change content at the same size
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1054 ]
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1055
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1056 class cachedlocalrepo(object):
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1057 """Holds a localrepository that can be cached and reused."""
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1058
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1059 def __init__(self, repo):
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1060 """Create a new cached repo from an existing repo.
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1061
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1062 We assume the passed in repo was recently created. If the
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1063 repo has changed between when it was created and when it was
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1064 turned into a cache, it may not refresh properly.
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1065 """
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1066 assert isinstance(repo, localrepo.localrepository)
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1067 self._repo = repo
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1068 self._state, self.mtime = self._repostate()
28119
91a827e760df hg: make cachedlocalrepo cache appropriate repoview object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28020
diff changeset
1069 self._filtername = repo.filtername
26219
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1070
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1071 def fetch(self):
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1072 """Refresh (if necessary) and return a repository.
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1073
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1074 If the cached instance is out of date, it will be recreated
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1075 automatically and returned.
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1076
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1077 Returns a tuple of the repo and a boolean indicating whether a new
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1078 repo instance was created.
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1079 """
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1080 # We compare the mtimes and sizes of some well-known files to
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1081 # determine if the repo changed. This is not precise, as mtimes
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1082 # are susceptible to clock skew and imprecise filesystems and
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1083 # file content can change while maintaining the same size.
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1084
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1085 state, mtime = self._repostate()
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1086 if state == self._state:
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1087 return self._repo, False
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1088
28119
91a827e760df hg: make cachedlocalrepo cache appropriate repoview object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28020
diff changeset
1089 repo = repository(self._repo.baseui, self._repo.url())
91a827e760df hg: make cachedlocalrepo cache appropriate repoview object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28020
diff changeset
1090 if self._filtername:
91a827e760df hg: make cachedlocalrepo cache appropriate repoview object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28020
diff changeset
1091 self._repo = repo.filtered(self._filtername)
91a827e760df hg: make cachedlocalrepo cache appropriate repoview object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28020
diff changeset
1092 else:
91a827e760df hg: make cachedlocalrepo cache appropriate repoview object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28020
diff changeset
1093 self._repo = repo.unfiltered()
26219
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1094 self._state = state
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1095 self.mtime = mtime
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1096
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1097 return self._repo, True
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1098
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1099 def _repostate(self):
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1100 state = []
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1101 maxmtime = -1
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1102 for attr, fname in foi:
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1103 prefix = getattr(self._repo, attr)
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1104 p = os.path.join(prefix, fname)
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1105 try:
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1106 st = os.stat(p)
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1107 except OSError:
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1108 st = os.stat(prefix)
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1109 state.append((st.st_mtime, st.st_size))
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1110 maxmtime = max(maxmtime, st.st_mtime)
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1111
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1112 return tuple(state), maxmtime
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1113
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1114 def copy(self):
26240
2b1434e5eaa0 hg: always create new localrepository instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26219
diff changeset
1115 """Obtain a copy of this class instance.
2b1434e5eaa0 hg: always create new localrepository instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26219
diff changeset
1116
2b1434e5eaa0 hg: always create new localrepository instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26219
diff changeset
1117 A new localrepository instance is obtained. The new instance should be
2b1434e5eaa0 hg: always create new localrepository instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26219
diff changeset
1118 completely independent of the original.
2b1434e5eaa0 hg: always create new localrepository instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26219
diff changeset
1119 """
2b1434e5eaa0 hg: always create new localrepository instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26219
diff changeset
1120 repo = repository(self._repo.baseui, self._repo.origroot)
28119
91a827e760df hg: make cachedlocalrepo cache appropriate repoview object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28020
diff changeset
1121 if self._filtername:
91a827e760df hg: make cachedlocalrepo cache appropriate repoview object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28020
diff changeset
1122 repo = repo.filtered(self._filtername)
91a827e760df hg: make cachedlocalrepo cache appropriate repoview object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28020
diff changeset
1123 else:
91a827e760df hg: make cachedlocalrepo cache appropriate repoview object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28020
diff changeset
1124 repo = repo.unfiltered()
26240
2b1434e5eaa0 hg: always create new localrepository instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26219
diff changeset
1125 c = cachedlocalrepo(repo)
26219
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1126 c._state = self._state
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1127 c.mtime = self.mtime
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1128 return c