Mercurial > hg
annotate mercurial/hg.py @ 34092:8a8e7a94ba07
rebase: do not crash rebasing merge with a parent having hidden successor
The added test will crash with previous code.
Differential Revision: https://phab.mercurial-scm.org/D640
author | Jun Wu <quark@fb.com> |
---|---|
date | Wed, 06 Sep 2017 12:40:00 -0700 |
parents | 6294654453ee |
children | 0fa781320203 |
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 | 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 | 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 _ |
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
17 from .node import nullid |
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
|
18 |
25939
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
19 from . import ( |
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
20 bookmarks, |
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
21 bundlerepo, |
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
22 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
|
23 destutil, |
25939
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
24 discovery, |
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
25 error, |
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
26 exchange, |
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
27 extensions, |
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
28 httppeer, |
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
29 localrepo, |
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
30 lock, |
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
31 merge as mergemod, |
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
32 node, |
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
33 phases, |
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
34 repoview, |
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
35 scmutil, |
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
36 sshpeer, |
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
37 statichttprepo, |
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
38 ui as uimod, |
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
39 unionrepo, |
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
40 url, |
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
41 util, |
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
42 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
|
43 vfs as vfsmod, |
25939
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
44 ) |
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
45 |
130c0b83e963
hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25761
diff
changeset
|
46 release = lock.release |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
47 |
29424
f21e0d91d386
share: move magic string to a constant
Martijn Pieters <mjpieters@fb.com>
parents:
29389
diff
changeset
|
48 # shared features |
f21e0d91d386
share: move magic string to a constant
Martijn Pieters <mjpieters@fb.com>
parents:
29389
diff
changeset
|
49 sharedbookmarks = 'bookmarks' |
f21e0d91d386
share: move magic string to a constant
Martijn Pieters <mjpieters@fb.com>
parents:
29389
diff
changeset
|
50 |
2740
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2738
diff
changeset
|
51 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
|
52 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
|
53 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
|
54 |
17191
5884812686f7
peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents:
17159
diff
changeset
|
55 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
|
56 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
|
57 hashbranch, branches = branches |
3d6915f5a2bb
improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents:
11312
diff
changeset
|
58 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
|
59 x = revs or None |
d7b114493315
repair: use `first` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22648
diff
changeset
|
60 if util.safehasattr(revs, 'first'): |
27637
b502138f5faa
cleanup: remove superfluous space after space after equals (python)
timeless <timeless@mozdev.org>
parents:
27404
diff
changeset
|
61 y = revs.first() |
22818
d7b114493315
repair: use `first` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22648
diff
changeset
|
62 elif revs: |
d7b114493315
repair: use `first` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22648
diff
changeset
|
63 y = revs[0] |
d7b114493315
repair: use `first` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22648
diff
changeset
|
64 else: |
d7b114493315
repair: use `first` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22648
diff
changeset
|
65 y = None |
d7b114493315
repair: use `first` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22648
diff
changeset
|
66 return x, y |
24306
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
24290
diff
changeset
|
67 if revs: |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
24290
diff
changeset
|
68 revs = list(revs) |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
24290
diff
changeset
|
69 else: |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
24290
diff
changeset
|
70 revs = [] |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
24290
diff
changeset
|
71 |
17191
5884812686f7
peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents:
17159
diff
changeset
|
72 if not peer.capable('branchmap'): |
11322
3d6915f5a2bb
improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents:
11312
diff
changeset
|
73 if branches: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26354
diff
changeset
|
74 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
|
75 revs.append(hashbranch) |
10380
ee72d89c0d9f
addbranchrevs: fallback for older servers
Sune Foldager <cryo@cyanite.org>
parents:
10379
diff
changeset
|
76 return revs, revs[0] |
17191
5884812686f7
peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents:
17159
diff
changeset
|
77 branchmap = peer.branchmap() |
11322
3d6915f5a2bb
improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents:
11312
diff
changeset
|
78 |
13047
6c375e07d673
branch: operate on branch names in local string space where possible
Matt Mackall <mpm@selenic.com>
parents:
12735
diff
changeset
|
79 def primary(branch): |
6c375e07d673
branch: operate on branch names in local string space where possible
Matt Mackall <mpm@selenic.com>
parents:
12735
diff
changeset
|
80 if branch == '.': |
17191
5884812686f7
peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents:
17159
diff
changeset
|
81 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
|
82 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
|
83 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
|
84 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
|
85 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
|
86 return True |
10365
d757bc0c7865
interpret repo#name url syntax as branch instead of revision
Sune Foldager <cryo@cyanite.org>
parents:
10358
diff
changeset
|
87 else: |
11322
3d6915f5a2bb
improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents:
11312
diff
changeset
|
88 return False |
3d6915f5a2bb
improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents:
11312
diff
changeset
|
89 |
3d6915f5a2bb
improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents:
11312
diff
changeset
|
90 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
|
91 if not primary(branch): |
11322
3d6915f5a2bb
improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents:
11312
diff
changeset
|
92 raise error.RepoLookupError(_("unknown branch '%s'") % branch) |
3d6915f5a2bb
improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents:
11312
diff
changeset
|
93 if hashbranch: |
13047
6c375e07d673
branch: operate on branch names in local string space where possible
Matt Mackall <mpm@selenic.com>
parents:
12735
diff
changeset
|
94 if not primary(hashbranch): |
11322
3d6915f5a2bb
improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents:
11312
diff
changeset
|
95 revs.append(hashbranch) |
10365
d757bc0c7865
interpret repo#name url syntax as branch instead of revision
Sune Foldager <cryo@cyanite.org>
parents:
10358
diff
changeset
|
96 return revs, revs[0] |
d757bc0c7865
interpret repo#name url syntax as branch instead of revision
Sune Foldager <cryo@cyanite.org>
parents:
10358
diff
changeset
|
97 |
13824
ec1695350361
hg: use url.url to parse branch names in parseurl()
Brodie Rao <brodie@bitheap.org>
parents:
13823
diff
changeset
|
98 def parseurl(path, branches=None): |
11322
3d6915f5a2bb
improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents:
11312
diff
changeset
|
99 '''parse url#branch, returning (url, (branch, branches))''' |
5177
92236732d5a1
move parseurl from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents:
4917
diff
changeset
|
100 |
14076
924c82157d46
url: move URL parsing functions into util to improve startup time
Brodie Rao <brodie@bitheap.org>
parents:
14073
diff
changeset
|
101 u = util.url(path) |
13897
375872fdadba
hg: make parseurl() consistently return normalised path
Thomas Arendsen Hein <thomas@intevation.de>
parents:
13826
diff
changeset
|
102 branch = None |
375872fdadba
hg: make parseurl() consistently return normalised path
Thomas Arendsen Hein <thomas@intevation.de>
parents:
13826
diff
changeset
|
103 if u.fragment: |
375872fdadba
hg: make parseurl() consistently return normalised path
Thomas Arendsen Hein <thomas@intevation.de>
parents:
13826
diff
changeset
|
104 branch = u.fragment |
375872fdadba
hg: make parseurl() consistently return normalised path
Thomas Arendsen Hein <thomas@intevation.de>
parents:
13826
diff
changeset
|
105 u.fragment = None |
31841
9ff5a124d111
py3: replace str() with bytes()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
31456
diff
changeset
|
106 return bytes(u), (branch, branches or []) |
5177
92236732d5a1
move parseurl from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents:
4917
diff
changeset
|
107 |
14606
6e631c24c6d9
hg: move peerschemes back to schemes
Matt Mackall <mpm@selenic.com>
parents:
14605
diff
changeset
|
108 schemes = { |
14568
5f002e3336ba
hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents:
14556
diff
changeset
|
109 'bundle': bundlerepo, |
18944
a9c443b3b240
unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
18553
diff
changeset
|
110 'union': unionrepo, |
14568
5f002e3336ba
hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents:
14556
diff
changeset
|
111 'file': _local, |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17191
diff
changeset
|
112 'http': httppeer, |
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17191
diff
changeset
|
113 'https': httppeer, |
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17191
diff
changeset
|
114 'ssh': sshpeer, |
14568
5f002e3336ba
hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents:
14556
diff
changeset
|
115 'static-http': statichttprepo, |
5f002e3336ba
hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents:
14556
diff
changeset
|
116 } |
5f002e3336ba
hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents:
14556
diff
changeset
|
117 |
5f002e3336ba
hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents:
14556
diff
changeset
|
118 def _peerlookup(path): |
5f002e3336ba
hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents:
14556
diff
changeset
|
119 u = util.url(path) |
5f002e3336ba
hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents:
14556
diff
changeset
|
120 scheme = u.scheme or 'file' |
14606
6e631c24c6d9
hg: move peerschemes back to schemes
Matt Mackall <mpm@selenic.com>
parents:
14605
diff
changeset
|
121 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
|
122 try: |
5f002e3336ba
hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents:
14556
diff
changeset
|
123 return thing(path) |
5f002e3336ba
hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents:
14556
diff
changeset
|
124 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
|
125 # 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
|
126 # 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
|
127 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
|
128 raise |
14568
5f002e3336ba
hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents:
14556
diff
changeset
|
129 return thing |
5f002e3336ba
hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents:
14556
diff
changeset
|
130 |
14605
9f1139cf5c76
hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents:
14568
diff
changeset
|
131 def islocal(repo): |
20355
7d269e7620c4
hg: note that islocal only accepts paths pointing to repos
Siddharth Agarwal <sid0@fb.com>
parents:
20354
diff
changeset
|
132 '''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
|
133 if isinstance(repo, bytes): |
14605
9f1139cf5c76
hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents:
14568
diff
changeset
|
134 try: |
9f1139cf5c76
hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents:
14568
diff
changeset
|
135 return _peerlookup(repo).islocal(repo) |
9f1139cf5c76
hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents:
14568
diff
changeset
|
136 except AttributeError: |
9f1139cf5c76
hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents:
14568
diff
changeset
|
137 return False |
9f1139cf5c76
hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents:
14568
diff
changeset
|
138 return repo.local() |
9f1139cf5c76
hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents:
14568
diff
changeset
|
139 |
17887
0e2846b2482c
url: use open and not url.open for local files (issue3624)
Siddharth Agarwal <sid0@fb.com>
parents:
17882
diff
changeset
|
140 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
|
141 '''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
|
142 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
|
143 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
|
144 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
|
145 else: |
0e2846b2482c
url: use open and not url.open for local files (issue3624)
Siddharth Agarwal <sid0@fb.com>
parents:
17882
diff
changeset
|
146 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
|
147 |
20858
bc56ec9e64df
hg: introduce "wirepeersetupfuncs" to setup wire peer by extensions (issue4109)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20825
diff
changeset
|
148 # 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
|
149 wirepeersetupfuncs = [] |
bc56ec9e64df
hg: introduce "wirepeersetupfuncs" to setup wire peer by extensions (issue4109)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20825
diff
changeset
|
150 |
32379
71e735bd8170
dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents:
32172
diff
changeset
|
151 def _peerorrepo(ui, path, create=False, presetupfuncs=None): |
14605
9f1139cf5c76
hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents:
14568
diff
changeset
|
152 """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
|
153 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
|
154 ui = getattr(obj, "ui", ui) |
32379
71e735bd8170
dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents:
32172
diff
changeset
|
155 for f in presetupfuncs or []: |
71e735bd8170
dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents:
32172
diff
changeset
|
156 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
|
157 for name, module in extensions.extensions(ui): |
14605
9f1139cf5c76
hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents:
14568
diff
changeset
|
158 hook = getattr(module, 'reposetup', None) |
9f1139cf5c76
hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents:
14568
diff
changeset
|
159 if hook: |
17191
5884812686f7
peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents:
17159
diff
changeset
|
160 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
|
161 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
|
162 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
|
163 f(ui, obj) |
17191
5884812686f7
peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents:
17159
diff
changeset
|
164 return obj |
5884812686f7
peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents:
17159
diff
changeset
|
165 |
32379
71e735bd8170
dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents:
32172
diff
changeset
|
166 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
|
167 """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
|
168 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
|
169 repo = peer.local() |
5884812686f7
peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents:
17159
diff
changeset
|
170 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
|
171 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
|
172 (path or peer.url())) |
18382
f3b21beb9802
filtering: rename filters to their antonyms
Kevin Bullock <kbullock@ringworld.org>
parents:
18303
diff
changeset
|
173 return repo.filtered('visible') |
14605
9f1139cf5c76
hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents:
14568
diff
changeset
|
174 |
14839
510c893a726f
peer: change arg name to convey it can be a repo as well
Idan Kamara <idankk86@gmail.com>
parents:
14825
diff
changeset
|
175 def peer(uiorrepo, opts, path, create=False): |
14554 | 176 '''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
|
177 rui = remoteui(uiorrepo, opts) |
17191
5884812686f7
peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents:
17159
diff
changeset
|
178 return _peerorrepo(rui, path, create).peer() |
14554 | 179 |
2719
532809ba1db5
hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2631
diff
changeset
|
180 def defaultdest(source): |
20799
069bf1b821c8
clone: add doctest for default destination
Yuya Nishihara <yuya@tcha.org>
parents:
20790
diff
changeset
|
181 '''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
|
182 |
069bf1b821c8
clone: add doctest for default destination
Yuya Nishihara <yuya@tcha.org>
parents:
20790
diff
changeset
|
183 >>> defaultdest('foo') |
069bf1b821c8
clone: add doctest for default destination
Yuya Nishihara <yuya@tcha.org>
parents:
20790
diff
changeset
|
184 'foo' |
069bf1b821c8
clone: add doctest for default destination
Yuya Nishihara <yuya@tcha.org>
parents:
20790
diff
changeset
|
185 >>> defaultdest('/foo/bar') |
069bf1b821c8
clone: add doctest for default destination
Yuya Nishihara <yuya@tcha.org>
parents:
20790
diff
changeset
|
186 'bar' |
069bf1b821c8
clone: add doctest for default destination
Yuya Nishihara <yuya@tcha.org>
parents:
20790
diff
changeset
|
187 >>> defaultdest('/') |
069bf1b821c8
clone: add doctest for default destination
Yuya Nishihara <yuya@tcha.org>
parents:
20790
diff
changeset
|
188 '' |
069bf1b821c8
clone: add doctest for default destination
Yuya Nishihara <yuya@tcha.org>
parents:
20790
diff
changeset
|
189 >>> defaultdest('') |
20800
8253e55930a3
clone: abort if default destination has no meaningful name (BC)
Yuya Nishihara <yuya@tcha.org>
parents:
20799
diff
changeset
|
190 '' |
20799
069bf1b821c8
clone: add doctest for default destination
Yuya Nishihara <yuya@tcha.org>
parents:
20790
diff
changeset
|
191 >>> defaultdest('http://example.org/') |
20800
8253e55930a3
clone: abort if default destination has no meaningful name (BC)
Yuya Nishihara <yuya@tcha.org>
parents:
20799
diff
changeset
|
192 '' |
20799
069bf1b821c8
clone: add doctest for default destination
Yuya Nishihara <yuya@tcha.org>
parents:
20790
diff
changeset
|
193 >>> defaultdest('http://example.org/foo/') |
069bf1b821c8
clone: add doctest for default destination
Yuya Nishihara <yuya@tcha.org>
parents:
20790
diff
changeset
|
194 'foo' |
069bf1b821c8
clone: add doctest for default destination
Yuya Nishihara <yuya@tcha.org>
parents:
20790
diff
changeset
|
195 ''' |
20800
8253e55930a3
clone: abort if default destination has no meaningful name (BC)
Yuya Nishihara <yuya@tcha.org>
parents:
20799
diff
changeset
|
196 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
|
197 if not path: |
8253e55930a3
clone: abort if default destination has no meaningful name (BC)
Yuya Nishihara <yuya@tcha.org>
parents:
20799
diff
changeset
|
198 return '' |
8253e55930a3
clone: abort if default destination has no meaningful name (BC)
Yuya Nishihara <yuya@tcha.org>
parents:
20799
diff
changeset
|
199 return os.path.basename(os.path.normpath(path)) |
2774 | 200 |
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
|
201 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
|
202 relative=False): |
8800
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
203 '''create a shared repository''' |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
204 |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
205 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
|
206 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
|
207 |
8807
8bf6eb68ddaf
share: allow dest to default to the basename of source
Matt Mackall <mpm@selenic.com>
parents:
8800
diff
changeset
|
208 if not dest: |
10099
f5e46dfb38c7
share: use defaultdest to compute unspecified destination
Brendan Cully <brendan@kublai.com>
parents:
9984
diff
changeset
|
209 dest = defaultdest(source) |
9344 | 210 else: |
211 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
|
212 |
8800
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
213 if isinstance(source, str): |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
214 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
|
215 source, branches = parseurl(origsource) |
8800
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
216 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
|
217 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
|
218 else: |
17191
5884812686f7
peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents:
17159
diff
changeset
|
219 srcrepo = source.local() |
8800
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
220 origsource = source = srcrepo.url() |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
221 checkout = None |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
222 |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
223 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
|
224 |
31218
4cc3797aa59c
vfs: use 'vfs' module directly in 'mercurial.hg'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31168
diff
changeset
|
225 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
|
226 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
|
227 |
21801
2ccd71bbd0f7
hg: update to use vfs functions in shared destination repository
Chinmay Joshi <c@chinmayjoshi.com>
parents:
21800
diff
changeset
|
228 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
|
229 raise error.Abort(_('destination already exists')) |
8800
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
230 |
21800
219af1521a6a
hg: use vfs functions in destination repository with share
Chinmay Joshi <c@chinmayjoshi.com>
parents:
21537
diff
changeset
|
231 if not destwvfs.isdir(): |
219af1521a6a
hg: use vfs functions in destination repository with share
Chinmay Joshi <c@chinmayjoshi.com>
parents:
21537
diff
changeset
|
232 destwvfs.mkdir() |
21801
2ccd71bbd0f7
hg: update to use vfs functions in shared destination repository
Chinmay Joshi <c@chinmayjoshi.com>
parents:
21800
diff
changeset
|
233 destvfs.makedir() |
8800
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
234 |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
235 requirements = '' |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
236 try: |
23877
7cc77030c557
localrepo: remove all external users of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23614
diff
changeset
|
237 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
|
238 except IOError as inst: |
8800
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
239 if inst.errno != errno.ENOENT: |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
240 raise |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
241 |
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
|
242 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
|
243 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
|
244 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
|
245 requirements += 'relshared\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
|
246 except IOError as 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
|
247 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
|
248 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
|
249 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
|
250 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
|
251 |
21802
ff27fad408c4
hg: update util.writefile method to use write with vfs in share
Chinmay Joshi <c@chinmayjoshi.com>
parents:
21801
diff
changeset
|
252 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
|
253 destvfs.write('sharedpath', sharedpath) |
8800
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
254 |
21800
219af1521a6a
hg: use vfs functions in destination repository with share
Chinmay Joshi <c@chinmayjoshi.com>
parents:
21537
diff
changeset
|
255 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
|
256 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
|
257 _postshareupdate(r, update, checkout=checkout) |
8800
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
258 |
30041
1779dde4c9ef
hg: set default path correctly when doing a clone+share (issue5378)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29902
diff
changeset
|
259 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
|
260 """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
|
261 |
bced7180db19
hg: establish function for performing post-share actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27344
diff
changeset
|
262 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
|
263 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
|
264 |
bced7180db19
hg: establish function for performing post-share actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27344
diff
changeset
|
265 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
|
266 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
|
267 """ |
30041
1779dde4c9ef
hg: set default path correctly when doing a clone+share (issue5378)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29902
diff
changeset
|
268 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
|
269 if default: |
bced7180db19
hg: establish function for performing post-share actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27344
diff
changeset
|
270 fp = destrepo.vfs("hgrc", "w", text=True) |
bced7180db19
hg: establish function for performing post-share actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27344
diff
changeset
|
271 fp.write("[paths]\n") |
bced7180db19
hg: establish function for performing post-share actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27344
diff
changeset
|
272 fp.write("default = %s\n" % default) |
bced7180db19
hg: establish function for performing post-share actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27344
diff
changeset
|
273 fp.close() |
bced7180db19
hg: establish function for performing post-share actions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27344
diff
changeset
|
274 |
29753
e93408080646
shared: take wlock for writting the 'shared' file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29645
diff
changeset
|
275 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
|
276 if bookmarks: |
e93408080646
shared: take wlock for writting the 'shared' file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29645
diff
changeset
|
277 fp = destrepo.vfs('shared', 'w') |
e93408080646
shared: take wlock for writting the 'shared' file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29645
diff
changeset
|
278 fp.write(sharedbookmarks + '\n') |
e93408080646
shared: take wlock for writting the 'shared' file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29645
diff
changeset
|
279 fp.close() |
23614
cd79fb4d75fd
share: add option to share bookmarks
Ryan McElroy <rmcelroy@fb.com>
parents:
23545
diff
changeset
|
280 |
28632
a2c2dd399f3b
hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28289
diff
changeset
|
281 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
|
282 """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
|
283 |
a2c2dd399f3b
hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28289
diff
changeset
|
284 ``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
|
285 """ |
a2c2dd399f3b
hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28289
diff
changeset
|
286 if not update: |
a2c2dd399f3b
hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28289
diff
changeset
|
287 return |
a2c2dd399f3b
hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28289
diff
changeset
|
288 |
a2c2dd399f3b
hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28289
diff
changeset
|
289 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
|
290 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
|
291 checkout = update |
a2c2dd399f3b
hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28289
diff
changeset
|
292 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
|
293 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
|
294 continue |
a2c2dd399f3b
hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28289
diff
changeset
|
295 try: |
a2c2dd399f3b
hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28289
diff
changeset
|
296 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
|
297 break |
a2c2dd399f3b
hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28289
diff
changeset
|
298 except error.RepoLookupError: |
a2c2dd399f3b
hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28289
diff
changeset
|
299 continue |
a2c2dd399f3b
hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28289
diff
changeset
|
300 _update(repo, uprev) |
a2c2dd399f3b
hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28289
diff
changeset
|
301 |
15078
193e7018dc8c
hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents:
14952
diff
changeset
|
302 def copystore(ui, srcrepo, destpath): |
193e7018dc8c
hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents:
14952
diff
changeset
|
303 '''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
|
304 |
193e7018dc8c
hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents:
14952
diff
changeset
|
305 returns destlock |
193e7018dc8c
hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents:
14952
diff
changeset
|
306 ''' |
193e7018dc8c
hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents:
14952
diff
changeset
|
307 destlock = None |
193e7018dc8c
hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents:
14952
diff
changeset
|
308 try: |
193e7018dc8c
hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents:
14952
diff
changeset
|
309 hardlink = None |
193e7018dc8c
hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents:
14952
diff
changeset
|
310 num = 0 |
24440
27ad6b91f5c2
clone: add progress support to hardlink clones (issue3059)
Augie Fackler <augie@google.com>
parents:
24306
diff
changeset
|
311 closetopic = [None] |
27ad6b91f5c2
clone: add progress support to hardlink clones (issue3059)
Augie Fackler <augie@google.com>
parents:
24306
diff
changeset
|
312 def prog(topic, pos): |
27ad6b91f5c2
clone: add progress support to hardlink clones (issue3059)
Augie Fackler <augie@google.com>
parents:
24306
diff
changeset
|
313 if pos is None: |
27ad6b91f5c2
clone: add progress support to hardlink clones (issue3059)
Augie Fackler <augie@google.com>
parents:
24306
diff
changeset
|
314 closetopic[0] = topic |
27ad6b91f5c2
clone: add progress support to hardlink clones (issue3059)
Augie Fackler <augie@google.com>
parents:
24306
diff
changeset
|
315 else: |
27ad6b91f5c2
clone: add progress support to hardlink clones (issue3059)
Augie Fackler <augie@google.com>
parents:
24306
diff
changeset
|
316 ui.progress(topic, pos + num) |
25624
f0745da75056
publishing: use new helper method
Matt Mackall <mpm@selenic.com>
parents:
25591
diff
changeset
|
317 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
|
318 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
|
319 dstvfs = vfsmod.vfs(destpath) |
15078
193e7018dc8c
hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents:
14952
diff
changeset
|
320 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
|
321 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
|
322 continue |
20089
2d0ab571b822
hg: rewrite "copystore()" with vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19777
diff
changeset
|
323 dstbase = os.path.dirname(f) |
2d0ab571b822
hg: rewrite "copystore()" with vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19777
diff
changeset
|
324 if dstbase and not dstvfs.exists(dstbase): |
2d0ab571b822
hg: rewrite "copystore()" with vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19777
diff
changeset
|
325 dstvfs.mkdir(dstbase) |
2d0ab571b822
hg: rewrite "copystore()" with vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19777
diff
changeset
|
326 if srcvfs.exists(f): |
2d0ab571b822
hg: rewrite "copystore()" with vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19777
diff
changeset
|
327 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
|
328 # '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
|
329 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
|
330 # 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
|
331 destlock = lock.lock(dstvfs, lockfile) |
20089
2d0ab571b822
hg: rewrite "copystore()" with vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19777
diff
changeset
|
332 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
|
333 hardlink, progress=prog) |
15078
193e7018dc8c
hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents:
14952
diff
changeset
|
334 num += n |
193e7018dc8c
hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents:
14952
diff
changeset
|
335 if hardlink: |
193e7018dc8c
hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents:
14952
diff
changeset
|
336 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
|
337 if closetopic[0]: |
27ad6b91f5c2
clone: add progress support to hardlink clones (issue3059)
Augie Fackler <augie@google.com>
parents:
24306
diff
changeset
|
338 ui.progress(closetopic[0], None) |
15078
193e7018dc8c
hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents:
14952
diff
changeset
|
339 else: |
193e7018dc8c
hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents:
14952
diff
changeset
|
340 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
|
341 if closetopic[0]: |
27ad6b91f5c2
clone: add progress support to hardlink clones (issue3059)
Augie Fackler <augie@google.com>
parents:
24306
diff
changeset
|
342 ui.progress(closetopic[0], None) |
15078
193e7018dc8c
hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents:
14952
diff
changeset
|
343 return destlock |
16705
c2d9ef43ff6c
check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents:
16352
diff
changeset
|
344 except: # re-raises |
15078
193e7018dc8c
hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents:
14952
diff
changeset
|
345 release(destlock) |
193e7018dc8c
hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents:
14952
diff
changeset
|
346 raise |
193e7018dc8c
hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents:
14952
diff
changeset
|
347 |
25761
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
348 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
|
349 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
|
350 """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
|
351 |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
352 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
|
353 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
|
354 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
|
355 True. |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
356 """ |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
357 revs = None |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
358 if rev: |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
359 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
|
360 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
|
361 "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
|
362 "support clone by revision")) |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
363 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
|
364 |
28289
d493d64757eb
hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27637
diff
changeset
|
365 # 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
|
366 # 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
|
367 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
|
368 # 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
|
369 try: |
d493d64757eb
hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27637
diff
changeset
|
370 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
|
371 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
|
372 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
|
373 raise |
d493d64757eb
hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27637
diff
changeset
|
374 |
31218
4cc3797aa59c
vfs: use 'vfs' module directly in 'mercurial.hg'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31168
diff
changeset
|
375 poolvfs = vfsmod.vfs(pooldir) |
25761
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
376 basename = os.path.basename(sharepath) |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
377 |
28289
d493d64757eb
hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27637
diff
changeset
|
378 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
|
379 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
|
380 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
|
381 basename) |
d493d64757eb
hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27637
diff
changeset
|
382 else: |
d493d64757eb
hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27637
diff
changeset
|
383 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
|
384 # 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
|
385 # 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
|
386 # share mode. |
d493d64757eb
hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27637
diff
changeset
|
387 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
|
388 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
|
389 |
30041
1779dde4c9ef
hg: set default path correctly when doing a clone+share (issue5378)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29902
diff
changeset
|
390 # 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
|
391 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
|
392 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
|
393 else: |
1779dde4c9ef
hg: set default path correctly when doing a clone+share (issue5378)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29902
diff
changeset
|
394 defaultpath = source |
1779dde4c9ef
hg: set default path correctly when doing a clone+share (issue5378)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29902
diff
changeset
|
395 |
25761
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
396 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
|
397 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
|
398 defaultpath=defaultpath) |
25761
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
399 |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
400 # 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
|
401 # 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
|
402 # 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
|
403 # 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
|
404 # 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
|
405 destrepo = repository(ui, path=dest) |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
406 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
|
407 |
28632
a2c2dd399f3b
hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28289
diff
changeset
|
408 _postshareupdate(destrepo, update) |
a2c2dd399f3b
hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28289
diff
changeset
|
409 |
25761
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
410 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
|
411 |
32492
963de566de2f
local-clone: extract the closure copying caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32379
diff
changeset
|
412 # 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
|
413 # so just copy it |
963de566de2f
local-clone: extract the closure copying caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32379
diff
changeset
|
414 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
|
415 """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
|
416 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
|
417 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
|
418 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
|
419 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
|
420 os.mkdir(dstcachedir) |
963de566de2f
local-clone: extract the closure copying caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32379
diff
changeset
|
421 util.copyfile(srcbranchcache, dstbranchcache) |
963de566de2f
local-clone: extract the closure copying caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32379
diff
changeset
|
422 |
32493
3c8a71a8df11
local-clone: extract the listing of caches to copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32492
diff
changeset
|
423 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
|
424 """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
|
425 # 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
|
426 # 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
|
427 cachefiles = ['branch2'] |
32494
53a67ba9fb44
local-clone: also copy revs-branch-cache files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32493
diff
changeset
|
428 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
|
429 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
|
430 cachefiles += ['tags2'] |
a25cc3ca874f
local-clone: also copy tags related caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32494
diff
changeset
|
431 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
|
432 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
|
433 return cachefiles |
3c8a71a8df11
local-clone: extract the listing of caches to copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32492
diff
changeset
|
434 |
14607
bd1acea552ff
hg: rename opts argument to peeropts in clone
Martin Geisler <mg@aragost.com>
parents:
14606
diff
changeset
|
435 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
|
436 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
|
437 """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
|
438 |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
439 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
|
440 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
|
441 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
|
442 newly created destination. |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
443 |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
444 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
|
445 .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
|
446 pushes. |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
447 |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
448 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
|
449 repository will be deleted. |
2600
c4325f0a9b91
clean up trailing white space.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2597
diff
changeset
|
450 |
2719
532809ba1db5
hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2631
diff
changeset
|
451 Arguments: |
532809ba1db5
hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2631
diff
changeset
|
452 |
532809ba1db5
hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2631
diff
changeset
|
453 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
|
454 |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
455 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
|
456 name of source repository) |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
457 |
23545
68c434799559
hg.clone: set 'stream' depending on whether --pull was requested or not
Siddharth Agarwal <sid0@fb.com>
parents:
23139
diff
changeset
|
458 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
|
459 server prefers streaming |
2597
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
460 |
2621
5a5852a417b1
clone: disable stream support on server side by default.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2613
diff
changeset
|
461 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
|
462 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
|
463 |
2597
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
464 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
|
465 |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
466 update: update working directory after clone completes, if |
6526
cfeeac24fc1e
repo: add rjoin method
Bryan O'Sullivan <bos@serpentine.com>
parents:
6525
diff
changeset
|
467 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
|
468 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
|
469 |
a78bfaf988e1
add -b/--branch option to clone, bundle, incoming, outgoing, pull, push
Sune Foldager <cryo@cyanite.org>
parents:
10365
diff
changeset
|
470 branch: branches to clone |
25761
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
471 |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
472 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
|
473 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
|
474 "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
|
475 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
|
476 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
|
477 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
|
478 """ |
4478
b2b55acbacdd
Add support for url#id syntax
Matt Mackall <mpm@selenic.com>
parents:
4477
diff
changeset
|
479 |
32970
11c0bb4ccc76
py3: replace str with bytes in isinstance()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32495
diff
changeset
|
480 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
|
481 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
|
482 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
|
483 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
|
484 else: |
17191
5884812686f7
peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents:
17159
diff
changeset
|
485 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
|
486 branch = (None, branch or []) |
17191
5884812686f7
peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents:
17159
diff
changeset
|
487 origsource = source = srcpeer.url() |
5884812686f7
peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents:
17159
diff
changeset
|
488 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
|
489 |
2597
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
490 if dest is None: |
2719
532809ba1db5
hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2631
diff
changeset
|
491 dest = defaultdest(source) |
20800
8253e55930a3
clone: abort if default destination has no meaningful name (BC)
Yuya Nishihara <yuya@tcha.org>
parents:
20799
diff
changeset
|
492 if dest: |
8253e55930a3
clone: abort if default destination has no meaningful name (BC)
Yuya Nishihara <yuya@tcha.org>
parents:
20799
diff
changeset
|
493 ui.status(_("destination directory: %s\n") % dest) |
9344 | 494 else: |
495 dest = ui.expandpath(dest) | |
2719
532809ba1db5
hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2631
diff
changeset
|
496 |
14825
de9eb6b1da4f
util: rename the util.localpath that uses url to urllocalpath (issue2875)
Mads Kiilerich <mads@kiilerich.com>
parents:
14737
diff
changeset
|
497 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
|
498 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
|
499 |
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
|
500 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
|
501 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
|
502 |
31218
4cc3797aa59c
vfs: use 'vfs' module directly in 'mercurial.hg'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31168
diff
changeset
|
503 destvfs = vfsmod.vfs(dest, expandpath=True) |
21803
62cc4055c6c8
hg: use vfs functions in clone
Chinmay Joshi <c@chinmayjoshi.com>
parents:
21802
diff
changeset
|
504 if destvfs.lexists(): |
62cc4055c6c8
hg: use vfs functions in clone
Chinmay Joshi <c@chinmayjoshi.com>
parents:
21802
diff
changeset
|
505 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
|
506 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
|
507 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
|
508 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
|
509 |
25761
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
510 shareopts = shareopts or {} |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
511 sharepool = shareopts.get('pool') |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
512 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
|
513 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
|
514 sharepath = None |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
515 if sharenamemode == 'identity': |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
516 # 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
|
517 # 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
|
518 # 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
|
519 # 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
|
520 try: |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
521 rootnode = srcpeer.lookup('0') |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
522 if rootnode != node.nullid: |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
523 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
|
524 else: |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
525 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
|
526 '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
|
527 except error.RepoLookupError: |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
528 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
|
529 '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
|
530 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
|
531 sharepath = os.path.join( |
0d83ad967bf8
cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents:
29021
diff
changeset
|
532 sharepool, hashlib.sha1(source).hexdigest()) |
25761
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
533 else: |
29389
98e8313dcd9e
i18n: translate abort messages
liscju <piotr.listkiewicz@gmail.com>
parents:
29341
diff
changeset
|
534 raise error.Abort(_('unknown share naming mode: %s') % |
98e8313dcd9e
i18n: translate abort messages
liscju <piotr.listkiewicz@gmail.com>
parents:
29341
diff
changeset
|
535 sharenamemode) |
25761
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
536 |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
537 if sharepath: |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
538 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
|
539 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
|
540 stream=stream) |
0d37b9b21467
hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
541 |
18441
1f794204abbd
hg: replace DirCleanup class with normal try/finally use
Augie Fackler <raf@durin42.com>
parents:
18382
diff
changeset
|
542 srclock = destlock = cleandir = None |
17191
5884812686f7
peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents:
17159
diff
changeset
|
543 srcrepo = srcpeer.local() |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
544 try: |
14377
f90d5641c78b
clone: make default path absolute for all local paths
Brendan Cully <brendan@kublai.com>
parents:
14213
diff
changeset
|
545 abspath = origsource |
f90d5641c78b
clone: make default path absolute for all local paths
Brendan Cully <brendan@kublai.com>
parents:
14213
diff
changeset
|
546 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
|
547 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
|
548 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
549 if islocal(dest): |
18441
1f794204abbd
hg: replace DirCleanup class with normal try/finally use
Augie Fackler <raf@durin42.com>
parents:
18382
diff
changeset
|
550 cleandir = dest |
2597
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
551 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
552 copy = False |
17194
32a6a33b9a35
peer: remove cancopy from peer api; use directly on repo instead
Sune Foldager <cryo@cyanite.org>
parents:
17192
diff
changeset
|
553 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
|
554 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
|
555 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
|
556 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
557 if copy: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
558 try: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
559 # 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
|
560 # 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
|
561 # 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
|
562 # fail |
14463
81f559d1b9b2
hg: remove underscores in clone function
Martin Geisler <mg@aragost.com>
parents:
14377
diff
changeset
|
563 srclock = srcrepo.lock(wait=False) |
7640 | 564 except error.LockError: |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
565 copy = False |
2597
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
566 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
567 if copy: |
14463
81f559d1b9b2
hg: remove underscores in clone function
Martin Geisler <mg@aragost.com>
parents:
14377
diff
changeset
|
568 srcrepo.hook('preoutgoing', throw=True, source='clone') |
15381
c519cd8f0169
backout dbdb777502dc (issue3077) (issue3071)
Matt Mackall <mpm@selenic.com>
parents:
15355
diff
changeset
|
569 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
|
570 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
|
571 os.mkdir(dest) |
7935
39566bb99a9c
on clone failure, only remove directories we created
Steve Borho <steve@borho.org>
parents:
7927
diff
changeset
|
572 else: |
39566bb99a9c
on clone failure, only remove directories we created
Steve Borho <steve@borho.org>
parents:
7927
diff
changeset
|
573 # 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
|
574 cleandir = hgdir |
5569
9e209193f18d
clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents:
5277
diff
changeset
|
575 try: |
14463
81f559d1b9b2
hg: remove underscores in clone function
Martin Geisler <mg@aragost.com>
parents:
14377
diff
changeset
|
576 destpath = hgdir |
81f559d1b9b2
hg: remove underscores in clone function
Martin Geisler <mg@aragost.com>
parents:
14377
diff
changeset
|
577 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
|
578 except OSError as inst: |
5569
9e209193f18d
clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents:
5277
diff
changeset
|
579 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
|
580 cleandir = None |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26354
diff
changeset
|
581 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
|
582 % dest) |
9e209193f18d
clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents:
5277
diff
changeset
|
583 raise |
2597
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
584 |
15078
193e7018dc8c
hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents:
14952
diff
changeset
|
585 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
|
586 # 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
|
587 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
|
588 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
|
589 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
|
590 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
|
591 |
17740
e6067bec18da
branchcache: fetch source branchcache during clone (issue3378)
Tomasz Kleczek <tomasz.kleczek@fb.com>
parents:
17704
diff
changeset
|
592 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
|
593 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
|
594 _copycache(srcrepo, dstcachedir, cache) |
17740
e6067bec18da
branchcache: fetch source branchcache during clone (issue3378)
Tomasz Kleczek <tomasz.kleczek@fb.com>
parents:
17704
diff
changeset
|
595 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
596 # 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
|
597 # 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
|
598 destpeer = peer(srcrepo, peeropts, dest) |
14463
81f559d1b9b2
hg: remove underscores in clone function
Martin Geisler <mg@aragost.com>
parents:
14377
diff
changeset
|
599 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
|
600 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
|
601 else: |
5569
9e209193f18d
clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents:
5277
diff
changeset
|
602 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
|
603 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
|
604 # 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
|
605 except OSError as inst: |
5569
9e209193f18d
clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents:
5277
diff
changeset
|
606 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
|
607 cleandir = None |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26354
diff
changeset
|
608 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
|
609 % dest) |
9e209193f18d
clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents:
5277
diff
changeset
|
610 raise |
2597
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
611 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
612 revs = None |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
613 if rev: |
17191
5884812686f7
peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents:
17159
diff
changeset
|
614 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
|
615 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
|
616 "revision lookup and so doesn't " |
a458b9bf4f3a
hg: better wrapping of string literal
Martin Geisler <mg@lazybytes.net>
parents:
8907
diff
changeset
|
617 "support clone by revision")) |
17191
5884812686f7
peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents:
17159
diff
changeset
|
618 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
|
619 checkout = revs[0] |
27165
70884715725e
localrepo: remove clone method by hoisting into hg.py
Augie Fackler <augie@google.com>
parents:
26781
diff
changeset
|
620 local = destpeer.local() |
70884715725e
localrepo: remove clone method by hoisting into hg.py
Augie Fackler <augie@google.com>
parents:
26781
diff
changeset
|
621 if local: |
23545
68c434799559
hg.clone: set 'stream' depending on whether --pull was requested or not
Siddharth Agarwal <sid0@fb.com>
parents:
23139
diff
changeset
|
622 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
|
623 if pull: |
68c434799559
hg.clone: set 'stream' depending on whether --pull was requested or not
Siddharth Agarwal <sid0@fb.com>
parents:
23139
diff
changeset
|
624 stream = False |
68c434799559
hg.clone: set 'stream' depending on whether --pull was requested or not
Siddharth Agarwal <sid0@fb.com>
parents:
23139
diff
changeset
|
625 else: |
68c434799559
hg.clone: set 'stream' depending on whether --pull was requested or not
Siddharth Agarwal <sid0@fb.com>
parents:
23139
diff
changeset
|
626 stream = None |
27165
70884715725e
localrepo: remove clone method by hoisting into hg.py
Augie Fackler <augie@google.com>
parents:
26781
diff
changeset
|
627 # internal config: ui.quietbookmarkmove |
31456 | 628 overrides = {('ui', 'quietbookmarkmove'): True} |
629 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
|
630 exchange.pull(local, srcpeer, revs, |
70884715725e
localrepo: remove clone method by hoisting into hg.py
Augie Fackler <augie@google.com>
parents:
26781
diff
changeset
|
631 streamclonerequested=stream) |
17191
5884812686f7
peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents:
17159
diff
changeset
|
632 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
|
633 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
|
634 bookmarks=srcrepo._bookmarks.keys()) |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
635 else: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26354
diff
changeset
|
636 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
|
637 ) |
2597
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
638 |
18441
1f794204abbd
hg: replace DirCleanup class with normal try/finally use
Augie Fackler <raf@durin42.com>
parents:
18382
diff
changeset
|
639 cleandir = None |
2597
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
640 |
17191
5884812686f7
peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents:
17159
diff
changeset
|
641 destrepo = destpeer.local() |
5884812686f7
peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents:
17159
diff
changeset
|
642 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
|
643 template = uimod.samplehgrcs['cloned'] |
33687
6294654453ee
py3: use bytes IO to write sample hgrc
Yuya Nishihara <yuya@tcha.org>
parents:
33018
diff
changeset
|
644 fp = destrepo.vfs("hgrc", "wb") |
15552
62c9183a0bbb
clone: don't save user's password in .hg/hgrc (Issue3122)
Augie Fackler <durin42@gmail.com>
parents:
15381
diff
changeset
|
645 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
|
646 u.passwd = None |
33687
6294654453ee
py3: use bytes IO to write sample hgrc
Yuya Nishihara <yuya@tcha.org>
parents:
33018
diff
changeset
|
647 defaulturl = bytes(u) |
6294654453ee
py3: use bytes IO to write sample hgrc
Yuya Nishihara <yuya@tcha.org>
parents:
33018
diff
changeset
|
648 fp.write(util.tonativeeol(template % defaulturl)) |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
649 fp.close() |
5185
156f4c8a12aa
clone: do not delete the target if only the update fails
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
4635
diff
changeset
|
650 |
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
|
651 destrepo.ui.setconfig('paths', 'default', defaulturl, 'clone') |
8814
ab668c92a036
subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents:
8807
diff
changeset
|
652 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
653 if update: |
6526
cfeeac24fc1e
repo: add rjoin method
Bryan O'Sullivan <bos@serpentine.com>
parents:
6525
diff
changeset
|
654 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
|
655 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
|
656 uprev = None |
17882
36ed69d4593d
clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents:
17875
diff
changeset
|
657 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
|
658 if checkout is not None: |
5248 | 659 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
|
660 uprev = destrepo.lookup(checkout) |
9423
1444a42f6052
Make distinct lookup error for localrepo.lookup
Matt Mackall <mpm@selenic.com>
parents:
9344
diff
changeset
|
661 except error.RepoLookupError: |
26354
c1fb2cab6260
clone: check update rev for being True
Sean Farley <sean@farley.io>
parents:
26353
diff
changeset
|
662 if update is not True: |
c1fb2cab6260
clone: check update rev for being True
Sean Farley <sean@farley.io>
parents:
26353
diff
changeset
|
663 try: |
c1fb2cab6260
clone: check update rev for being True
Sean Farley <sean@farley.io>
parents:
26353
diff
changeset
|
664 uprev = destrepo.lookup(update) |
c1fb2cab6260
clone: check update rev for being True
Sean Farley <sean@farley.io>
parents:
26353
diff
changeset
|
665 except error.RepoLookupError: |
c1fb2cab6260
clone: check update rev for being True
Sean Farley <sean@farley.io>
parents:
26353
diff
changeset
|
666 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
|
667 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
|
668 try: |
c9339efed653
clone: make sure to use "@" as bookmark and "default" as branch (issue3677)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
17844
diff
changeset
|
669 uprev = destrepo._bookmarks['@'] |
17870
7d2dd10ce9ea
clone: activate @ bookmark if updating to it
Thomas Arendsen Hein <thomas@intevation.de>
parents:
17867
diff
changeset
|
670 update = '@' |
17882
36ed69d4593d
clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents:
17875
diff
changeset
|
671 bn = destrepo[uprev].branch() |
36ed69d4593d
clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents:
17875
diff
changeset
|
672 if bn == 'default': |
36ed69d4593d
clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents:
17875
diff
changeset
|
673 status = _("updating to bookmark @\n") |
36ed69d4593d
clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents:
17875
diff
changeset
|
674 else: |
20868
5db105f216c3
i18n: fix "% inside _()" problems
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20858
diff
changeset
|
675 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
|
676 % 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
|
677 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
|
678 try: |
c9339efed653
clone: make sure to use "@" as bookmark and "default" as branch (issue3677)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
17844
diff
changeset
|
679 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
|
680 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
|
681 uprev = destrepo.lookup('tip') |
17882
36ed69d4593d
clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents:
17875
diff
changeset
|
682 if not status: |
36ed69d4593d
clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents:
17875
diff
changeset
|
683 bn = destrepo[uprev].branch() |
36ed69d4593d
clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents:
17875
diff
changeset
|
684 status = _("updating to branch %s\n") % bn |
36ed69d4593d
clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents:
17875
diff
changeset
|
685 destrepo.ui.status(status) |
14463
81f559d1b9b2
hg: remove underscores in clone function
Martin Geisler <mg@aragost.com>
parents:
14377
diff
changeset
|
686 _update(destrepo, uprev) |
17703
4a07d2ff7c66
clone: activate bookmark specified with --updaterev
Thomas Arendsen Hein <thomas@intevation.de>
parents:
17342
diff
changeset
|
687 if update in destrepo._bookmarks: |
24945
e0b0fbd47491
bookmarks: rename setcurrent to activate (API)
Ryan McElroy <rmcelroy@fb.com>
parents:
24440
diff
changeset
|
688 bookmarks.activate(destrepo, update) |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
689 finally: |
15908
60cb4f381a78
bookmarks: backout locking change in 12dea4d998ec
Matt Mackall <mpm@selenic.com>
parents:
15887
diff
changeset
|
690 release(srclock, destlock) |
18441
1f794204abbd
hg: replace DirCleanup class with normal try/finally use
Augie Fackler <raf@durin42.com>
parents:
18382
diff
changeset
|
691 if cleandir is not None: |
1f794204abbd
hg: replace DirCleanup class with normal try/finally use
Augie Fackler <raf@durin42.com>
parents:
18382
diff
changeset
|
692 shutil.rmtree(cleandir, True) |
17191
5884812686f7
peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents:
17159
diff
changeset
|
693 if srcpeer is not None: |
5884812686f7
peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents:
17159
diff
changeset
|
694 srcpeer.close() |
19313
3b96d6e44a4d
hg: move return statement after finally block
simon@laptop-tosh
parents:
18944
diff
changeset
|
695 return srcpeer, destpeer |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
2774
diff
changeset
|
696 |
27402
5184089f5d30
hg: add quietempty flag to _showstats
timeless <timeless@mozdev.org>
parents:
27354
diff
changeset
|
697 def _showstats(repo, stats, quietempty=False): |
5184089f5d30
hg: add quietempty flag to _showstats
timeless <timeless@mozdev.org>
parents:
27354
diff
changeset
|
698 if quietempty and not any(stats): |
5184089f5d30
hg: add quietempty flag to _showstats
timeless <timeless@mozdev.org>
parents:
27354
diff
changeset
|
699 return |
9454
dafadd7ff07e
hg: avoid combining translated strings
Martin Geisler <mg@lazybytes.net>
parents:
9425
diff
changeset
|
700 repo.ui.status(_("%d files updated, %d files merged, " |
dafadd7ff07e
hg: avoid combining translated strings
Martin Geisler <mg@lazybytes.net>
parents:
9425
diff
changeset
|
701 "%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
|
702 |
31166
fad5e299cfc7
update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents:
31133
diff
changeset
|
703 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
|
704 """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
|
705 |
17c030014ddf
subrepo: only do clean update when overwrite is set (issue3276)
Simon Heimberg <simohe@besonet.ch>
parents:
17887
diff
changeset
|
706 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
|
707 |
17c030014ddf
subrepo: only do clean update when overwrite is set (issue3276)
Simon Heimberg <simohe@besonet.ch>
parents:
17887
diff
changeset
|
708 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
|
709 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
|
710 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
|
711 updatecheck=updatecheck) |
17895
17c030014ddf
subrepo: only do clean update when overwrite is set (issue3276)
Simon Heimberg <simohe@besonet.ch>
parents:
17887
diff
changeset
|
712 |
31166
fad5e299cfc7
update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents:
31133
diff
changeset
|
713 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
|
714 """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
|
715 stats = updaterepo(repo, node, False, updatecheck=updatecheck) |
27404
1cf3543cc780
update: add quietempty flag to _showstats
timeless <timeless@mozdev.org>
parents:
27403
diff
changeset
|
716 _showstats(repo, stats, quietempty) |
3316
39fd6e82ea38
merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents:
3195
diff
changeset
|
717 if stats[3]: |
6518 | 718 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
|
719 return stats[3] > 0 |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
2774
diff
changeset
|
720 |
7546
c7f48414f3ad
add a comment about the need of hg._update()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7280
diff
changeset
|
721 # 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
|
722 _update = update |
c7f48414f3ad
add a comment about the need of hg._update()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7280
diff
changeset
|
723 |
27403
50b6a04f817f
histedit: omit useless message from abort
timeless <timeless@mozdev.org>
parents:
27402
diff
changeset
|
724 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
|
725 """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
|
726 stats = updaterepo(repo, node, True) |
31311
f59b6cf663a9
vfs: use repo.vfs.unlinkpath
Mads Kiilerich <mads@kiilerich.com>
parents:
31218
diff
changeset
|
727 repo.vfs.unlinkpath('graftstate', ignoremissing=True) |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
728 if show_stats: |
27403
50b6a04f817f
histedit: omit useless message from abort
timeless <timeless@mozdev.org>
parents:
27402
diff
changeset
|
729 _showstats(repo, stats, quietempty) |
5635
0c608a8d9c5f
merge: make return codes more sensible
Matt Mackall <mpm@selenic.com>
parents:
5569
diff
changeset
|
730 return stats[3] > 0 |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
2774
diff
changeset
|
731 |
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
|
732 # 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
|
733 _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
|
734 |
31166
fad5e299cfc7
update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents:
31133
diff
changeset
|
735 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
|
736 """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
|
737 |
66513f6ca038
commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28324
diff
changeset
|
738 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
|
739 |
66513f6ca038
commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28324
diff
changeset
|
740 :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
|
741 |
66513f6ca038
commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28324
diff
changeset
|
742 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
|
743 |
66513f6ca038
commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28324
diff
changeset
|
744 :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
|
745 :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
|
746 :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
|
747 :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
|
748 |
fad5e299cfc7
update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents:
31133
diff
changeset
|
749 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
|
750 |
fad5e299cfc7
update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents:
31133
diff
changeset
|
751 * 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
|
752 * 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
|
753 * 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
|
754 changes into destination |
31168
41a9edc5d00f
update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents:
31167
diff
changeset
|
755 * 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
|
756 |
66513f6ca038
commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28324
diff
changeset
|
757 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
|
758 """ |
31166
fad5e299cfc7
update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents:
31133
diff
changeset
|
759 if updatecheck is None: |
31167
696e321b304d
update: add experimental config for default way of handling dirty wdir
Martin von Zweigbergk <martinvonz@google.com>
parents:
31166
diff
changeset
|
760 updatecheck = ui.config('experimental', 'updatecheck') |
31168
41a9edc5d00f
update: allow setting default update check to "noconflict"
Martin von Zweigbergk <martinvonz@google.com>
parents:
31167
diff
changeset
|
761 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
|
762 # 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
|
763 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
|
764 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
|
765 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
|
766 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
|
767 if checkout is None: |
30962
11c253997b0e
destutil: drop now-unused "check" parameter from destupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents:
30062
diff
changeset
|
768 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
|
769 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
|
770 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
|
771 |
66513f6ca038
commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28324
diff
changeset
|
772 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
|
773 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
|
774 else: |
31166
fad5e299cfc7
update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents:
31133
diff
changeset
|
775 if updatecheck == 'abort': |
30963
7beb3ec34443
update: move check for dirty wdir into hg.updatetotally()
Martin von Zweigbergk <martinvonz@google.com>
parents:
30962
diff
changeset
|
776 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
|
777 updatecheck = 'none' |
fad5e299cfc7
update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents:
31133
diff
changeset
|
778 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
|
779 |
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 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
|
781 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
|
782 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
|
783 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
|
784 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
|
785 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
|
786 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
|
787 # 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
|
788 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
|
789 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
|
790 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
|
791 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
|
792 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
|
793 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
|
794 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
|
795 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
|
796 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
|
797 if repo._activebookmark: |
29902
a77d48219edd
update: label bookmark name in message
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29753
diff
changeset
|
798 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
|
799 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
|
800 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
|
801 |
66513f6ca038
commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28324
diff
changeset
|
802 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
|
803 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
|
804 |
66513f6ca038
commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28324
diff
changeset
|
805 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
|
806 |
30062
940c05b25b07
merge: add conflict labels to merge command
Simon Farnsworth <simonfar@fb.com>
parents:
30041
diff
changeset
|
807 def merge(repo, node, force=None, remind=True, mergeforce=False, labels=None): |
13162
115a9760c382
merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents:
13047
diff
changeset
|
808 """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
|
809 unresolved conflicts.""" |
30062
940c05b25b07
merge: add conflict labels to merge command
Simon Farnsworth <simonfar@fb.com>
parents:
30041
diff
changeset
|
810 stats = mergemod.update(repo, node, True, force, mergeforce=mergeforce, |
940c05b25b07
merge: add conflict labels to merge command
Simon Farnsworth <simonfar@fb.com>
parents:
30041
diff
changeset
|
811 labels=labels) |
3316
39fd6e82ea38
merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents:
3195
diff
changeset
|
812 _showstats(repo, stats) |
39fd6e82ea38
merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents:
3195
diff
changeset
|
813 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
|
814 repo.ui.status(_("use 'hg resolve' to retry unresolved file merges " |
12314
f2daa6ab514a
merge: suggest 'hg up -C .' for discarding changes, not 'hg up -C'
Brodie Rao <brodie@bitheap.org>
parents:
12273
diff
changeset
|
815 "or 'hg update -C .' to abandon\n")) |
3316
39fd6e82ea38
merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents:
3195
diff
changeset
|
816 elif remind: |
39fd6e82ea38
merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents:
3195
diff
changeset
|
817 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
|
818 return stats[3] > 0 |
2808
30f59f4a327e
Introduce update helper functions: update, merge, clean, and revert
Matt Mackall <mpm@selenic.com>
parents:
2778
diff
changeset
|
819 |
12730
33e1fd2aeb3c
incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12729
diff
changeset
|
820 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
|
821 opts, buffered=False): |
33e1fd2aeb3c
incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12729
diff
changeset
|
822 """ |
33e1fd2aeb3c
incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12729
diff
changeset
|
823 Helper for incoming / gincoming. |
33e1fd2aeb3c
incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12729
diff
changeset
|
824 displaychlist gets called with |
33e1fd2aeb3c
incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12729
diff
changeset
|
825 (remoterepo, incomingchangesetlist, displayer) parameters, |
33e1fd2aeb3c
incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12729
diff
changeset
|
826 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
|
827 """ |
33e1fd2aeb3c
incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12729
diff
changeset
|
828 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
|
829 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
|
830 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
|
831 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
|
832 |
33e1fd2aeb3c
incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12729
diff
changeset
|
833 if revs: |
33e1fd2aeb3c
incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12729
diff
changeset
|
834 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
|
835 other, chlist, cleanupfn = bundlerepo.getremotechanges(ui, repo, other, |
8a0fca925992
bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14156
diff
changeset
|
836 revs, opts["bundle"], opts["force"]) |
8a0fca925992
bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14156
diff
changeset
|
837 try: |
8a0fca925992
bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14156
diff
changeset
|
838 if not chlist: |
8a0fca925992
bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14156
diff
changeset
|
839 ui.status(_("no changes found\n")) |
8a0fca925992
bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14156
diff
changeset
|
840 return subreporecurse() |
31057
16d7db8f752c
incoming: delay pager activation until right before printing changes
Augie Fackler <augie@google.com>
parents:
30963
diff
changeset
|
841 ui.pager('incoming') |
12730
33e1fd2aeb3c
incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12729
diff
changeset
|
842 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
|
843 displaychlist(other, chlist, displayer) |
33e1fd2aeb3c
incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12729
diff
changeset
|
844 displayer.close() |
33e1fd2aeb3c
incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12729
diff
changeset
|
845 finally: |
14161
8a0fca925992
bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14156
diff
changeset
|
846 cleanupfn() |
12730
33e1fd2aeb3c
incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12729
diff
changeset
|
847 subreporecurse() |
33e1fd2aeb3c
incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12729
diff
changeset
|
848 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
|
849 |
12273
e392d00ab5b0
incoming: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents:
12271
diff
changeset
|
850 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
|
851 def subreporecurse(): |
12400
40852b4b910c
incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents:
12314
diff
changeset
|
852 ret = 1 |
40852b4b910c
incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents:
12314
diff
changeset
|
853 if opts.get('subrepos'): |
40852b4b910c
incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents:
12314
diff
changeset
|
854 ctx = repo[None] |
40852b4b910c
incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents:
12314
diff
changeset
|
855 for subpath in sorted(ctx.substate): |
40852b4b910c
incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents:
12314
diff
changeset
|
856 sub = ctx.sub(subpath) |
40852b4b910c
incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents:
12314
diff
changeset
|
857 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
|
858 return ret |
40852b4b910c
incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents:
12314
diff
changeset
|
859 |
12730
33e1fd2aeb3c
incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12729
diff
changeset
|
860 def display(other, chlist, displayer): |
33e1fd2aeb3c
incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12729
diff
changeset
|
861 limit = cmdutil.loglimit(opts) |
12273
e392d00ab5b0
incoming: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents:
12271
diff
changeset
|
862 if opts.get('newest_first'): |
12729
55f0648c7e2d
incoming: rename variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12400
diff
changeset
|
863 chlist.reverse() |
12273
e392d00ab5b0
incoming: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents:
12271
diff
changeset
|
864 count = 0 |
12729
55f0648c7e2d
incoming: rename variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12400
diff
changeset
|
865 for n in chlist: |
12273
e392d00ab5b0
incoming: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents:
12271
diff
changeset
|
866 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
|
867 break |
e392d00ab5b0
incoming: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents:
12271
diff
changeset
|
868 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
|
869 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
|
870 continue |
e392d00ab5b0
incoming: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents:
12271
diff
changeset
|
871 count += 1 |
e392d00ab5b0
incoming: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents:
12271
diff
changeset
|
872 displayer.show(other[n]) |
12730
33e1fd2aeb3c
incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12729
diff
changeset
|
873 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
|
874 |
12735
8888e56ac417
outgoing: unify common graphlog.outgoing and hg.outgoing code
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12734
diff
changeset
|
875 def _outgoing(ui, repo, dest, opts): |
8888e56ac417
outgoing: unify common graphlog.outgoing and hg.outgoing code
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12734
diff
changeset
|
876 dest = ui.expandpath(dest or 'default-push', dest or 'default') |
8888e56ac417
outgoing: unify common graphlog.outgoing and hg.outgoing code
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12734
diff
changeset
|
877 dest, branches = parseurl(dest, opts.get('branch')) |
14076
924c82157d46
url: move URL parsing functions into util to improve startup time
Brodie Rao <brodie@bitheap.org>
parents:
14073
diff
changeset
|
878 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
|
879 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
|
880 if revs: |
17198
ecde35a1af9e
outgoing: accept revset argument for --rev
Matt Harbison <matt_harbison@yahoo.com>
parents:
17194
diff
changeset
|
881 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
|
882 |
14556
517e1d88bf7e
hg: change various repository() users to use peer() where appropriate
Matt Mackall <mpm@selenic.com>
parents:
14555
diff
changeset
|
883 other = peer(repo, opts, dest) |
32172
448ed4d3ee90
outgoing: run on filtered repo
Martin von Zweigbergk <martinvonz@google.com>
parents:
31841
diff
changeset
|
884 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
|
885 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
|
886 o = outgoing.missing |
12735
8888e56ac417
outgoing: unify common graphlog.outgoing and hg.outgoing code
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12734
diff
changeset
|
887 if not o: |
17248
6ffb35b2284c
discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents:
17198
diff
changeset
|
888 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
|
889 return o, other |
12735
8888e56ac417
outgoing: unify common graphlog.outgoing and hg.outgoing code
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12734
diff
changeset
|
890 |
12271
01dc8ba3e032
outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents:
12144
diff
changeset
|
891 def outgoing(ui, repo, dest, opts): |
12400
40852b4b910c
incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents:
12314
diff
changeset
|
892 def recurse(): |
40852b4b910c
incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents:
12314
diff
changeset
|
893 ret = 1 |
40852b4b910c
incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents:
12314
diff
changeset
|
894 if opts.get('subrepos'): |
40852b4b910c
incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents:
12314
diff
changeset
|
895 ctx = repo[None] |
40852b4b910c
incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents:
12314
diff
changeset
|
896 for subpath in sorted(ctx.substate): |
40852b4b910c
incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents:
12314
diff
changeset
|
897 sub = ctx.sub(subpath) |
40852b4b910c
incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents:
12314
diff
changeset
|
898 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
|
899 return ret |
40852b4b910c
incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents:
12314
diff
changeset
|
900 |
12271
01dc8ba3e032
outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents:
12144
diff
changeset
|
901 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
|
902 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
|
903 if not o: |
21051
1004d3cd65fd
outgoing: introduce "outgoinghooks" to avoid redundant outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21050
diff
changeset
|
904 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
|
905 return recurse() |
40852b4b910c
incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents:
12314
diff
changeset
|
906 |
12271
01dc8ba3e032
outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents:
12144
diff
changeset
|
907 if opts.get('newest_first'): |
01dc8ba3e032
outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents:
12144
diff
changeset
|
908 o.reverse() |
31058
d2ed0abce08e
outgoing: avoid running pager until we're actually showing changes
Augie Fackler <augie@google.com>
parents:
31057
diff
changeset
|
909 ui.pager('outgoing') |
12271
01dc8ba3e032
outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents:
12144
diff
changeset
|
910 displayer = cmdutil.show_changeset(ui, repo, opts) |
01dc8ba3e032
outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents:
12144
diff
changeset
|
911 count = 0 |
01dc8ba3e032
outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents:
12144
diff
changeset
|
912 for n in o: |
01dc8ba3e032
outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents:
12144
diff
changeset
|
913 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
|
914 break |
01dc8ba3e032
outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents:
12144
diff
changeset
|
915 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
|
916 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
|
917 continue |
01dc8ba3e032
outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents:
12144
diff
changeset
|
918 count += 1 |
01dc8ba3e032
outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents:
12144
diff
changeset
|
919 displayer.show(repo[n]) |
01dc8ba3e032
outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents:
12144
diff
changeset
|
920 displayer.close() |
21051
1004d3cd65fd
outgoing: introduce "outgoinghooks" to avoid redundant outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21050
diff
changeset
|
921 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
|
922 recurse() |
40852b4b910c
incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents:
12314
diff
changeset
|
923 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
|
924 |
2778 | 925 def verify(repo): |
926 """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
|
927 ret = verifymod.verify(repo) |
f1d46075b13a
verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents:
25365
diff
changeset
|
928 |
f1d46075b13a
verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents:
25365
diff
changeset
|
929 # 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
|
930 # 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
|
931 # concern. |
f1d46075b13a
verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents:
25365
diff
changeset
|
932 |
f1d46075b13a
verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents:
25365
diff
changeset
|
933 # pathto() is needed for -R case |
f1d46075b13a
verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents:
25365
diff
changeset
|
934 revs = repo.revs("filelog(%s)", |
f1d46075b13a
verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents:
25365
diff
changeset
|
935 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
|
936 |
f1d46075b13a
verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents:
25365
diff
changeset
|
937 if revs: |
f1d46075b13a
verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents:
25365
diff
changeset
|
938 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
|
939 for rev in revs: |
f1d46075b13a
verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents:
25365
diff
changeset
|
940 ctx = repo[rev] |
f1d46075b13a
verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents:
25365
diff
changeset
|
941 try: |
f1d46075b13a
verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents:
25365
diff
changeset
|
942 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
|
943 try: |
92d37fb3f1aa
verify: don't init subrepo when missing one is referenced (issue5128) (API)
Matt Harbison <matt_harbison@yahoo.com>
parents:
28655
diff
changeset
|
944 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
|
945 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
|
946 except error.RepoError as e: |
29645
3b4d69b3988d
doc: omit useless _() invocation
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29616
diff
changeset
|
947 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
|
948 except Exception: |
f1d46075b13a
verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents:
25365
diff
changeset
|
949 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
|
950 node.short(ctx.node())) |
f1d46075b13a
verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents:
25365
diff
changeset
|
951 |
f1d46075b13a
verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents:
25365
diff
changeset
|
952 return ret |
11273
d1908cb95a82
remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents:
11256
diff
changeset
|
953 |
d1908cb95a82
remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents:
11256
diff
changeset
|
954 def remoteui(src, opts): |
d1908cb95a82
remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents:
11256
diff
changeset
|
955 '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
|
956 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
|
957 dst = src.baseui.copy() # drop repo-specific config |
d1908cb95a82
remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents:
11256
diff
changeset
|
958 src = src.ui # copy target options from repo |
d1908cb95a82
remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents:
11256
diff
changeset
|
959 else: # assume it's a global ui object |
d1908cb95a82
remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents:
11256
diff
changeset
|
960 dst = src.copy() # keep all global options |
d1908cb95a82
remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents:
11256
diff
changeset
|
961 |
d1908cb95a82
remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents:
11256
diff
changeset
|
962 # copy ssh-specific options |
d1908cb95a82
remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents:
11256
diff
changeset
|
963 for o in 'ssh', 'remotecmd': |
d1908cb95a82
remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents:
11256
diff
changeset
|
964 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
|
965 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
|
966 dst.setconfig("ui", o, v, 'copied') |
11273
d1908cb95a82
remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents:
11256
diff
changeset
|
967 |
d1908cb95a82
remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents:
11256
diff
changeset
|
968 # copy bundle-specific options |
d1908cb95a82
remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents:
11256
diff
changeset
|
969 r = src.config('bundle', 'mainreporoot') |
d1908cb95a82
remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents:
11256
diff
changeset
|
970 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
|
971 dst.setconfig('bundle', 'mainreporoot', r, 'copied') |
11273
d1908cb95a82
remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents:
11256
diff
changeset
|
972 |
13192
4d03707916d3
https: use web.cacerts configuration from local repo to validate remote repo
Mads Kiilerich <mads@kiilerich.com>
parents:
12735
diff
changeset
|
973 # 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
|
974 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
|
975 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
|
976 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
|
977 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
|
978 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
|
979 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
|
980 |
d1908cb95a82
remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents:
11256
diff
changeset
|
981 return dst |
26219
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
982 |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
983 # Files of interest |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
984 # 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
|
985 # these files. |
26219
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
986 foi = [('spath', '00changelog.i'), |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
987 ('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
|
988 ('spath', 'obsstore'), |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
989 ('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
|
990 ] |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
991 |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
992 class cachedlocalrepo(object): |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
993 """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
|
994 |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
995 def __init__(self, repo): |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
996 """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
|
997 |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
998 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
|
999 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
|
1000 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
|
1001 """ |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1002 assert isinstance(repo, localrepo.localrepository) |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1003 self._repo = repo |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1004 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
|
1005 self._filtername = repo.filtername |
26219
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1006 |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1007 def fetch(self): |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1008 """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
|
1009 |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1010 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
|
1011 automatically and returned. |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1012 |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1013 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
|
1014 repo instance was created. |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1015 """ |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1016 # 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
|
1017 # 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
|
1018 # 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
|
1019 # 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
|
1020 |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1021 state, mtime = self._repostate() |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1022 if state == self._state: |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1023 return self._repo, False |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1024 |
28119
91a827e760df
hg: make cachedlocalrepo cache appropriate repoview object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28020
diff
changeset
|
1025 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
|
1026 if self._filtername: |
91a827e760df
hg: make cachedlocalrepo cache appropriate repoview object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28020
diff
changeset
|
1027 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
|
1028 else: |
91a827e760df
hg: make cachedlocalrepo cache appropriate repoview object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28020
diff
changeset
|
1029 self._repo = repo.unfiltered() |
26219
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1030 self._state = state |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1031 self.mtime = mtime |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1032 |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1033 return self._repo, True |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1034 |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1035 def _repostate(self): |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1036 state = [] |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1037 maxmtime = -1 |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1038 for attr, fname in foi: |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1039 prefix = getattr(self._repo, attr) |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1040 p = os.path.join(prefix, fname) |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1041 try: |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1042 st = os.stat(p) |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1043 except OSError: |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1044 st = os.stat(prefix) |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1045 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
|
1046 maxmtime = max(maxmtime, st.st_mtime) |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1047 |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1048 return tuple(state), maxmtime |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1049 |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1050 def copy(self): |
26240
2b1434e5eaa0
hg: always create new localrepository instance
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26219
diff
changeset
|
1051 """Obtain a copy of this class instance. |
2b1434e5eaa0
hg: always create new localrepository instance
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26219
diff
changeset
|
1052 |
2b1434e5eaa0
hg: always create new localrepository instance
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26219
diff
changeset
|
1053 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
|
1054 completely independent of the original. |
2b1434e5eaa0
hg: always create new localrepository instance
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26219
diff
changeset
|
1055 """ |
2b1434e5eaa0
hg: always create new localrepository instance
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26219
diff
changeset
|
1056 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
|
1057 if self._filtername: |
91a827e760df
hg: make cachedlocalrepo cache appropriate repoview object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28020
diff
changeset
|
1058 repo = repo.filtered(self._filtername) |
91a827e760df
hg: make cachedlocalrepo cache appropriate repoview object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28020
diff
changeset
|
1059 else: |
91a827e760df
hg: make cachedlocalrepo cache appropriate repoview object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28020
diff
changeset
|
1060 repo = repo.unfiltered() |
26240
2b1434e5eaa0
hg: always create new localrepository instance
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26219
diff
changeset
|
1061 c = cachedlocalrepo(repo) |
26219
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1062 c._state = self._state |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1063 c.mtime = self.mtime |
ae33fff17c1e
hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26103
diff
changeset
|
1064 return c |