annotate mercurial/hg.py @ 43035:ea83abf95630

sidedata: add a function to write sidedata into a raw text Differential Revision: https://phab.mercurial-scm.org/D6891
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Wed, 04 Sep 2019 01:20:54 +0200
parents ee1ef76d7339
children 2372284d9457
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1 # hg.py - repository classes for mercurial
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
2 #
4635
63b9d2deed48 Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4478
diff changeset
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
2859
345bac2bc4ec update copyrights.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2847
diff changeset
4 # Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
5 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8179
diff changeset
6 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10099
diff changeset
7 # GNU General Public License version 2 or any later version.
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
8
25939
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
9 from __future__ import absolute_import
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
10
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
11 import errno
29341
0d83ad967bf8 cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents: 29021
diff changeset
12 import hashlib
25939
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
13 import os
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
14 import shutil
36781
ffa3026d4196 cleanup: use stat_result[stat.ST_MTIME] instead of stat_result.st_mtime
Augie Fackler <augie@google.com>
parents: 36702
diff changeset
15 import stat
25939
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
16
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
17 from .i18n import _
35704
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
18 from .node import (
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
19 nullid,
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
20 )
22837
2be7d5ebd4d0 config: use the same hgrc for a cloned repo as for an uninitted repo
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22818
diff changeset
21
25939
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
22 from . import (
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
23 bookmarks,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
24 bundlerepo,
35766
72fdd99eb526 caches: make 'cachetocopy' available in scmutil
Boris Feld <boris.feld@octobus.net>
parents: 35713
diff changeset
25 cacheutil,
25939
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
26 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
27 destutil,
25939
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
28 discovery,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
29 error,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
30 exchange,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
31 extensions,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
32 httppeer,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
33 localrepo,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
34 lock,
35888
c8e2d6ed1f9e cmdutil: drop aliases for logcmdutil functions (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35766
diff changeset
35 logcmdutil,
35347
a29fe459fc49 remotenames: rename related file and storage dir to logexchange
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35331
diff changeset
36 logexchange,
25939
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
37 merge as mergemod,
39550
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
38 narrowspec,
25939
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
39 node,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
40 phases,
41484
7f366dd3df1f hg: raise Abort on invalid path
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41391
diff changeset
41 pycompat,
25939
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
42 scmutil,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
43 sshpeer,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
44 statichttprepo,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
45 ui as uimod,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
46 unionrepo,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
47 url,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
48 util,
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
49 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
50 vfs as vfsmod,
25939
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
51 )
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
52
42813
268662aac075 interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42604
diff changeset
53 from .interfaces import (
268662aac075 interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42604
diff changeset
54 repository as repositorymod,
268662aac075 interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42604
diff changeset
55 )
268662aac075 interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42604
diff changeset
56
25939
130c0b83e963 hg: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25761
diff changeset
57 release = lock.release
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
58
29424
f21e0d91d386 share: move magic string to a constant
Martijn Pieters <mjpieters@fb.com>
parents: 29389
diff changeset
59 # shared features
f21e0d91d386 share: move magic string to a constant
Martijn Pieters <mjpieters@fb.com>
parents: 29389
diff changeset
60 sharedbookmarks = 'bookmarks'
f21e0d91d386 share: move magic string to a constant
Martijn Pieters <mjpieters@fb.com>
parents: 29389
diff changeset
61
2740
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2738
diff changeset
62 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
63 path = util.expandpath(util.urllocalpath(path))
41484
7f366dd3df1f hg: raise Abort on invalid path
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41391
diff changeset
64
7f366dd3df1f hg: raise Abort on invalid path
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41391
diff changeset
65 try:
7f366dd3df1f hg: raise Abort on invalid path
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41391
diff changeset
66 isfile = os.path.isfile(path)
7f366dd3df1f hg: raise Abort on invalid path
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41391
diff changeset
67 # Python 2 raises TypeError, Python 3 ValueError.
7f366dd3df1f hg: raise Abort on invalid path
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41391
diff changeset
68 except (TypeError, ValueError) as e:
7f366dd3df1f hg: raise Abort on invalid path
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41391
diff changeset
69 raise error.Abort(_('invalid path %s: %s') % (
7f366dd3df1f hg: raise Abort on invalid path
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41391
diff changeset
70 path, pycompat.bytestr(e)))
7f366dd3df1f hg: raise Abort on invalid path
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41391
diff changeset
71
7f366dd3df1f hg: raise Abort on invalid path
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41391
diff changeset
72 return isfile and bundlerepo or localrepo
2469
2e91ba371c4c hg.repository: make protocol table driven.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2431
diff changeset
73
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
74 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
75 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
76 hashbranch, branches = branches
3d6915f5a2bb improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents: 11312
diff changeset
77 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
78 x = revs or None
37481
7c848ab13eff addbranchrevs: no longer accept revset as "revs" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37480
diff changeset
79 if revs:
22818
d7b114493315 repair: use `first` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22648
diff changeset
80 y = revs[0]
d7b114493315 repair: use `first` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22648
diff changeset
81 else:
d7b114493315 repair: use `first` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22648
diff changeset
82 y = None
d7b114493315 repair: use `first` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22648
diff changeset
83 return x, y
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24290
diff changeset
84 if revs:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24290
diff changeset
85 revs = list(revs)
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24290
diff changeset
86 else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24290
diff changeset
87 revs = []
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24290
diff changeset
88
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
89 if not peer.capable('branchmap'):
11322
3d6915f5a2bb improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents: 11312
diff changeset
90 if branches:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26354
diff changeset
91 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
92 revs.append(hashbranch)
10380
ee72d89c0d9f addbranchrevs: fallback for older servers
Sune Foldager <cryo@cyanite.org>
parents: 10379
diff changeset
93 return revs, revs[0]
37640
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
94
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
95 with peer.commandexecutor() as e:
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
96 branchmap = e.callcommand('branchmap', {}).result()
11322
3d6915f5a2bb improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents: 11312
diff changeset
97
13047
6c375e07d673 branch: operate on branch names in local string space where possible
Matt Mackall <mpm@selenic.com>
parents: 12735
diff changeset
98 def primary(branch):
6c375e07d673 branch: operate on branch names in local string space where possible
Matt Mackall <mpm@selenic.com>
parents: 12735
diff changeset
99 if branch == '.':
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
100 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
101 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
102 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
103 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
104 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
105 return True
10365
d757bc0c7865 interpret repo#name url syntax as branch instead of revision
Sune Foldager <cryo@cyanite.org>
parents: 10358
diff changeset
106 else:
11322
3d6915f5a2bb improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents: 11312
diff changeset
107 return False
3d6915f5a2bb improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents: 11312
diff changeset
108
3d6915f5a2bb improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents: 11312
diff changeset
109 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
110 if not primary(branch):
11322
3d6915f5a2bb improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents: 11312
diff changeset
111 raise error.RepoLookupError(_("unknown branch '%s'") % branch)
3d6915f5a2bb improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents: 11312
diff changeset
112 if hashbranch:
13047
6c375e07d673 branch: operate on branch names in local string space where possible
Matt Mackall <mpm@selenic.com>
parents: 12735
diff changeset
113 if not primary(hashbranch):
11322
3d6915f5a2bb improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents: 11312
diff changeset
114 revs.append(hashbranch)
10365
d757bc0c7865 interpret repo#name url syntax as branch instead of revision
Sune Foldager <cryo@cyanite.org>
parents: 10358
diff changeset
115 return revs, revs[0]
d757bc0c7865 interpret repo#name url syntax as branch instead of revision
Sune Foldager <cryo@cyanite.org>
parents: 10358
diff changeset
116
13824
ec1695350361 hg: use url.url to parse branch names in parseurl()
Brodie Rao <brodie@bitheap.org>
parents: 13823
diff changeset
117 def parseurl(path, branches=None):
11322
3d6915f5a2bb improve --branch processing (and differentiate from # syntax)
Sune Foldager <cryo@cyanite.org>
parents: 11312
diff changeset
118 '''parse url#branch, returning (url, (branch, branches))'''
5177
92236732d5a1 move parseurl from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 4917
diff changeset
119
14076
924c82157d46 url: move URL parsing functions into util to improve startup time
Brodie Rao <brodie@bitheap.org>
parents: 14073
diff changeset
120 u = util.url(path)
13897
375872fdadba hg: make parseurl() consistently return normalised path
Thomas Arendsen Hein <thomas@intevation.de>
parents: 13826
diff changeset
121 branch = None
375872fdadba hg: make parseurl() consistently return normalised path
Thomas Arendsen Hein <thomas@intevation.de>
parents: 13826
diff changeset
122 if u.fragment:
375872fdadba hg: make parseurl() consistently return normalised path
Thomas Arendsen Hein <thomas@intevation.de>
parents: 13826
diff changeset
123 branch = u.fragment
375872fdadba hg: make parseurl() consistently return normalised path
Thomas Arendsen Hein <thomas@intevation.de>
parents: 13826
diff changeset
124 u.fragment = None
31841
9ff5a124d111 py3: replace str() with bytes()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31456
diff changeset
125 return bytes(u), (branch, branches or [])
5177
92236732d5a1 move parseurl from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 4917
diff changeset
126
14606
6e631c24c6d9 hg: move peerschemes back to schemes
Matt Mackall <mpm@selenic.com>
parents: 14605
diff changeset
127 schemes = {
14568
5f002e3336ba hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents: 14556
diff changeset
128 'bundle': bundlerepo,
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents: 18553
diff changeset
129 'union': unionrepo,
14568
5f002e3336ba hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents: 14556
diff changeset
130 'file': _local,
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17191
diff changeset
131 'http': httppeer,
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17191
diff changeset
132 'https': httppeer,
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17191
diff changeset
133 'ssh': sshpeer,
14568
5f002e3336ba hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents: 14556
diff changeset
134 'static-http': statichttprepo,
5f002e3336ba hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents: 14556
diff changeset
135 }
5f002e3336ba hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents: 14556
diff changeset
136
5f002e3336ba hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents: 14556
diff changeset
137 def _peerlookup(path):
5f002e3336ba hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents: 14556
diff changeset
138 u = util.url(path)
5f002e3336ba hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents: 14556
diff changeset
139 scheme = u.scheme or 'file'
14606
6e631c24c6d9 hg: move peerschemes back to schemes
Matt Mackall <mpm@selenic.com>
parents: 14605
diff changeset
140 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
141 try:
5f002e3336ba hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents: 14556
diff changeset
142 return thing(path)
5f002e3336ba hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents: 14556
diff changeset
143 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
144 # 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
145 # 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
146 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
147 raise
14568
5f002e3336ba hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents: 14556
diff changeset
148 return thing
5f002e3336ba hg: split peer and repo lookup tables
Matt Mackall <mpm@selenic.com>
parents: 14556
diff changeset
149
14605
9f1139cf5c76 hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents: 14568
diff changeset
150 def islocal(repo):
20355
7d269e7620c4 hg: note that islocal only accepts paths pointing to repos
Siddharth Agarwal <sid0@fb.com>
parents: 20354
diff changeset
151 '''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
152 if isinstance(repo, bytes):
14605
9f1139cf5c76 hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents: 14568
diff changeset
153 try:
9f1139cf5c76 hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents: 14568
diff changeset
154 return _peerlookup(repo).islocal(repo)
9f1139cf5c76 hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents: 14568
diff changeset
155 except AttributeError:
9f1139cf5c76 hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents: 14568
diff changeset
156 return False
9f1139cf5c76 hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents: 14568
diff changeset
157 return repo.local()
9f1139cf5c76 hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents: 14568
diff changeset
158
42109
2a3c0106ded9 import: suppress accept: header
timeless <timeless@mozdev.org>
parents: 41484
diff changeset
159 def openpath(ui, path, sendaccept=True):
17887
0e2846b2482c url: use open and not url.open for local files (issue3624)
Siddharth Agarwal <sid0@fb.com>
parents: 17882
diff changeset
160 '''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
161 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
162 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
163 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
164 else:
42109
2a3c0106ded9 import: suppress accept: header
timeless <timeless@mozdev.org>
parents: 41484
diff changeset
165 return url.open(ui, path, sendaccept=sendaccept)
17887
0e2846b2482c url: use open and not url.open for local files (issue3624)
Siddharth Agarwal <sid0@fb.com>
parents: 17882
diff changeset
166
20858
bc56ec9e64df hg: introduce "wirepeersetupfuncs" to setup wire peer by extensions (issue4109)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20825
diff changeset
167 # 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
168 wirepeersetupfuncs = []
bc56ec9e64df hg: introduce "wirepeersetupfuncs" to setup wire peer by extensions (issue4109)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20825
diff changeset
169
37717
0664be4f0c1f hg: pass command intents to repo/peer creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37640
diff changeset
170 def _peerorrepo(ui, path, create=False, presetupfuncs=None,
39549
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39510
diff changeset
171 intents=None, createopts=None):
14605
9f1139cf5c76 hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents: 14568
diff changeset
172 """return a repository object for the specified path"""
39549
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39510
diff changeset
173 obj = _peerlookup(path).instance(ui, path, create, intents=intents,
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39510
diff changeset
174 createopts=createopts)
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
175 ui = getattr(obj, "ui", ui)
32379
71e735bd8170 dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents: 32172
diff changeset
176 for f in presetupfuncs or []:
71e735bd8170 dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents: 32172
diff changeset
177 f(ui, obj)
40996
6f2510b581a0 extensions: use ui.log() interface to provide detailed loading information
Yuya Nishihara <yuya@tcha.org>
parents: 40639
diff changeset
178 ui.log(b'extension', b'- executing reposetup hooks\n')
39510
340170192874 extensions: trace the total time of running all reposetup callbacks
Boris Feld <boris.feld@octobus.net>
parents: 39507
diff changeset
179 with util.timedcm('all reposetup') as allreposetupstats:
340170192874 extensions: trace the total time of running all reposetup callbacks
Boris Feld <boris.feld@octobus.net>
parents: 39507
diff changeset
180 for name, module in extensions.extensions(ui):
40996
6f2510b581a0 extensions: use ui.log() interface to provide detailed loading information
Yuya Nishihara <yuya@tcha.org>
parents: 40639
diff changeset
181 ui.log(b'extension', b' - running reposetup for %s\n', name)
39510
340170192874 extensions: trace the total time of running all reposetup callbacks
Boris Feld <boris.feld@octobus.net>
parents: 39507
diff changeset
182 hook = getattr(module, 'reposetup', None)
340170192874 extensions: trace the total time of running all reposetup callbacks
Boris Feld <boris.feld@octobus.net>
parents: 39507
diff changeset
183 if hook:
340170192874 extensions: trace the total time of running all reposetup callbacks
Boris Feld <boris.feld@octobus.net>
parents: 39507
diff changeset
184 with util.timedcm('reposetup %r', name) as stats:
340170192874 extensions: trace the total time of running all reposetup callbacks
Boris Feld <boris.feld@octobus.net>
parents: 39507
diff changeset
185 hook(ui, obj)
40996
6f2510b581a0 extensions: use ui.log() interface to provide detailed loading information
Yuya Nishihara <yuya@tcha.org>
parents: 40639
diff changeset
186 ui.log(b'extension', b' > reposetup for %s took %s\n',
6f2510b581a0 extensions: use ui.log() interface to provide detailed loading information
Yuya Nishihara <yuya@tcha.org>
parents: 40639
diff changeset
187 name, stats)
6f2510b581a0 extensions: use ui.log() interface to provide detailed loading information
Yuya Nishihara <yuya@tcha.org>
parents: 40639
diff changeset
188 ui.log(b'extension', b'> all reposetup took %s\n', allreposetupstats)
20858
bc56ec9e64df hg: introduce "wirepeersetupfuncs" to setup wire peer by extensions (issue4109)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20825
diff changeset
189 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
190 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
191 f(ui, obj)
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
192 return obj
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
193
39549
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39510
diff changeset
194 def repository(ui, path='', create=False, presetupfuncs=None, intents=None,
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39510
diff changeset
195 createopts=None):
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
196 """return a repository object for the specified path"""
37717
0664be4f0c1f hg: pass command intents to repo/peer creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37640
diff changeset
197 peer = _peerorrepo(ui, path, create, presetupfuncs=presetupfuncs,
39549
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39510
diff changeset
198 intents=intents, createopts=createopts)
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
199 repo = peer.local()
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
200 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
201 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
202 (path or peer.url()))
18382
f3b21beb9802 filtering: rename filters to their antonyms
Kevin Bullock <kbullock@ringworld.org>
parents: 18303
diff changeset
203 return repo.filtered('visible')
14605
9f1139cf5c76 hg: rearrange peer scheme lookup
Matt Mackall <mpm@selenic.com>
parents: 14568
diff changeset
204
39549
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39510
diff changeset
205 def peer(uiorrepo, opts, path, create=False, intents=None, createopts=None):
14554
68db17047637 hg: add peer method
Matt Mackall <mpm@selenic.com>
parents: 14553
diff changeset
206 '''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
207 rui = remoteui(uiorrepo, opts)
39549
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39510
diff changeset
208 return _peerorrepo(rui, path, create, intents=intents,
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39510
diff changeset
209 createopts=createopts).peer()
14554
68db17047637 hg: add peer method
Matt Mackall <mpm@selenic.com>
parents: 14553
diff changeset
210
2719
532809ba1db5 hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2631
diff changeset
211 def defaultdest(source):
20799
069bf1b821c8 clone: add doctest for default destination
Yuya Nishihara <yuya@tcha.org>
parents: 20790
diff changeset
212 '''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
213
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 33687
diff changeset
214 >>> defaultdest(b'foo')
20799
069bf1b821c8 clone: add doctest for default destination
Yuya Nishihara <yuya@tcha.org>
parents: 20790
diff changeset
215 'foo'
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 33687
diff changeset
216 >>> defaultdest(b'/foo/bar')
20799
069bf1b821c8 clone: add doctest for default destination
Yuya Nishihara <yuya@tcha.org>
parents: 20790
diff changeset
217 'bar'
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 33687
diff changeset
218 >>> defaultdest(b'/')
20799
069bf1b821c8 clone: add doctest for default destination
Yuya Nishihara <yuya@tcha.org>
parents: 20790
diff changeset
219 ''
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 33687
diff changeset
220 >>> defaultdest(b'')
20800
8253e55930a3 clone: abort if default destination has no meaningful name (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 20799
diff changeset
221 ''
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 33687
diff changeset
222 >>> defaultdest(b'http://example.org/')
20800
8253e55930a3 clone: abort if default destination has no meaningful name (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 20799
diff changeset
223 ''
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 33687
diff changeset
224 >>> defaultdest(b'http://example.org/foo/')
20799
069bf1b821c8 clone: add doctest for default destination
Yuya Nishihara <yuya@tcha.org>
parents: 20790
diff changeset
225 'foo'
069bf1b821c8 clone: add doctest for default destination
Yuya Nishihara <yuya@tcha.org>
parents: 20790
diff changeset
226 '''
20800
8253e55930a3 clone: abort if default destination has no meaningful name (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 20799
diff changeset
227 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
228 if not path:
8253e55930a3 clone: abort if default destination has no meaningful name (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 20799
diff changeset
229 return ''
8253e55930a3 clone: abort if default destination has no meaningful name (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 20799
diff changeset
230 return os.path.basename(os.path.normpath(path))
2774
8cd3e19bf4a5 Add a doc string
Matt Mackall <mpm@selenic.com>
parents: 2768
diff changeset
231
36159
0fe7e39dc683 hg: move share._getsrcrepo into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36049
diff changeset
232 def sharedreposource(repo):
0fe7e39dc683 hg: move share._getsrcrepo into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36049
diff changeset
233 """Returns repository object for source repository of a shared repo.
0fe7e39dc683 hg: move share._getsrcrepo into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36049
diff changeset
234
0fe7e39dc683 hg: move share._getsrcrepo into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36049
diff changeset
235 If repo is not a shared repository, returns None.
0fe7e39dc683 hg: move share._getsrcrepo into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36049
diff changeset
236 """
0fe7e39dc683 hg: move share._getsrcrepo into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36049
diff changeset
237 if repo.sharedpath == repo.path:
0fe7e39dc683 hg: move share._getsrcrepo into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36049
diff changeset
238 return None
0fe7e39dc683 hg: move share._getsrcrepo into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36049
diff changeset
239
0fe7e39dc683 hg: move share._getsrcrepo into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36049
diff changeset
240 if util.safehasattr(repo, 'srcrepo') and repo.srcrepo:
0fe7e39dc683 hg: move share._getsrcrepo into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36049
diff changeset
241 return repo.srcrepo
0fe7e39dc683 hg: move share._getsrcrepo into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36049
diff changeset
242
0fe7e39dc683 hg: move share._getsrcrepo into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36049
diff changeset
243 # the sharedpath always ends in the .hg; we want the path to the repo
0fe7e39dc683 hg: move share._getsrcrepo into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36049
diff changeset
244 source = repo.vfs.split(repo.sharedpath)[0]
0fe7e39dc683 hg: move share._getsrcrepo into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36049
diff changeset
245 srcurl, branches = parseurl(source)
0fe7e39dc683 hg: move share._getsrcrepo into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36049
diff changeset
246 srcrepo = repository(repo.ui, srcurl)
0fe7e39dc683 hg: move share._getsrcrepo into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36049
diff changeset
247 repo.srcrepo = srcrepo
0fe7e39dc683 hg: move share._getsrcrepo into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36049
diff changeset
248 return srcrepo
0fe7e39dc683 hg: move share._getsrcrepo into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36049
diff changeset
249
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
250 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
251 relative=False):
8800
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
252 '''create a shared repository'''
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
253
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
254 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
255 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
256
8807
8bf6eb68ddaf share: allow dest to default to the basename of source
Matt Mackall <mpm@selenic.com>
parents: 8800
diff changeset
257 if not dest:
10099
f5e46dfb38c7 share: use defaultdest to compute unspecified destination
Brendan Cully <brendan@kublai.com>
parents: 9984
diff changeset
258 dest = defaultdest(source)
9344
eb6af02307ec Merge with i18n-stable
Matt Mackall <mpm@selenic.com>
parents: 9245
diff changeset
259 else:
eb6af02307ec Merge with i18n-stable
Matt Mackall <mpm@selenic.com>
parents: 9245
diff changeset
260 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
261
36049
488e313954ea py3: check for bytes instead of str in hg.share()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36003
diff changeset
262 if isinstance(source, bytes):
8800
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
263 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
264 source, branches = parseurl(origsource)
8800
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
265 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
266 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
267 else:
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
268 srcrepo = source.local()
8800
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
269 checkout = None
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
270
39849
d3d4b4b5f725 localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39848
diff changeset
271 shareditems = set()
d3d4b4b5f725 localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39848
diff changeset
272 if bookmarks:
d3d4b4b5f725 localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39848
diff changeset
273 shareditems.add(sharedbookmarks)
d3d4b4b5f725 localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39848
diff changeset
274
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39606
diff changeset
275 r = repository(ui, dest, create=True, createopts={
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39606
diff changeset
276 'sharedrepo': srcrepo,
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39606
diff changeset
277 'sharedrelative': relative,
39849
d3d4b4b5f725 localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39848
diff changeset
278 'shareditems': shareditems,
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39606
diff changeset
279 })
8800
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
280
39849
d3d4b4b5f725 localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39848
diff changeset
281 postshare(srcrepo, r, defaultpath=defaultpath)
40575
fb490d798be0 share: reload repo after adjusting it in postshare()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40440
diff changeset
282 r = repository(ui, dest)
28632
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
283 _postshareupdate(r, update, checkout=checkout)
34815
68e0bcb90357 subrepo: share instead of clone if the parent repo is shared (issue5675) (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 34805
diff changeset
284 return r
8800
971e38a9344b add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents: 8649
diff changeset
285
34878
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
286 def unshare(ui, repo):
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
287 """convert a shared repository to a normal one
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
288
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
289 Copy the store data to the repo and remove the sharedpath data.
39606
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39555
diff changeset
290
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39555
diff changeset
291 Returns a new repository object representing the unshared repository.
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39555
diff changeset
292
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39555
diff changeset
293 The passed repository object is not usable after this function is
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39555
diff changeset
294 called.
34878
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
295 """
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
296
41391
bc843e251134 unshare: use context manager for locks
Martin von Zweigbergk <martinvonz@google.com>
parents: 41365
diff changeset
297 with repo.lock():
34878
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
298 # we use locks here because if we race with commit, we
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
299 # can end up with extra data in the cloned revlogs that's
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
300 # not pointed to by changesets, thus causing verify to
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
301 # fail
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
302 destlock = copystore(ui, repo, repo.path)
41391
bc843e251134 unshare: use context manager for locks
Martin von Zweigbergk <martinvonz@google.com>
parents: 41365
diff changeset
303 with destlock or util.nullcontextmanager():
34878
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
304
41391
bc843e251134 unshare: use context manager for locks
Martin von Zweigbergk <martinvonz@google.com>
parents: 41365
diff changeset
305 sharefile = repo.vfs.join('sharedpath')
bc843e251134 unshare: use context manager for locks
Martin von Zweigbergk <martinvonz@google.com>
parents: 41365
diff changeset
306 util.rename(sharefile, sharefile + '.old')
bc843e251134 unshare: use context manager for locks
Martin von Zweigbergk <martinvonz@google.com>
parents: 41365
diff changeset
307
bc843e251134 unshare: use context manager for locks
Martin von Zweigbergk <martinvonz@google.com>
parents: 41365
diff changeset
308 repo.requirements.discard('shared')
bc843e251134 unshare: use context manager for locks
Martin von Zweigbergk <martinvonz@google.com>
parents: 41365
diff changeset
309 repo.requirements.discard('relshared')
bc843e251134 unshare: use context manager for locks
Martin von Zweigbergk <martinvonz@google.com>
parents: 41365
diff changeset
310 repo._writerequirements()
34878
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
311
39606
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39555
diff changeset
312 # Removing share changes some fundamental properties of the repo instance.
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39555
diff changeset
313 # So we instantiate a new repo object and operate on it rather than
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39555
diff changeset
314 # try to keep the existing repo usable.
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39555
diff changeset
315 newrepo = repository(repo.baseui, repo.root, create=False)
34878
9f7ecc5bbc28 share: move the implementation of 'unshare' to the 'hg' module
Matt Harbison <matt_harbison@yahoo.com>
parents: 34815
diff changeset
316
34879
7d51a7792f52 subrepo: implement 'unshare' for Mercurial subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 34878
diff changeset
317 # TODO: figure out how to access subrepos that exist, but were previously
7d51a7792f52 subrepo: implement 'unshare' for Mercurial subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 34878
diff changeset
318 # removed from .hgsub
39606
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39555
diff changeset
319 c = newrepo['.']
34879
7d51a7792f52 subrepo: implement 'unshare' for Mercurial subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 34878
diff changeset
320 subs = c.substate
7d51a7792f52 subrepo: implement 'unshare' for Mercurial subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 34878
diff changeset
321 for s in sorted(subs):
7d51a7792f52 subrepo: implement 'unshare' for Mercurial subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 34878
diff changeset
322 c.sub(s).unshare()
7d51a7792f52 subrepo: implement 'unshare' for Mercurial subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 34878
diff changeset
323
39606
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39555
diff changeset
324 localrepo.poisonrepository(repo)
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39555
diff changeset
325
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39555
diff changeset
326 return newrepo
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39555
diff changeset
327
39849
d3d4b4b5f725 localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39848
diff changeset
328 def postshare(sourcerepo, destrepo, defaultpath=None):
27354
bced7180db19 hg: establish function for performing post-share actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27344
diff changeset
329 """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
330
bced7180db19 hg: establish function for performing post-share actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27344
diff changeset
331 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
332 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
333
bced7180db19 hg: establish function for performing post-share actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27344
diff changeset
334 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
335 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
336 """
30041
1779dde4c9ef hg: set default path correctly when doing a clone+share (issue5378)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29902
diff changeset
337 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
338 if default:
35622
e925f33ac088 share: convert EOL of hgrc before writing to bytes IO
Yuya Nishihara <yuya@tcha.org>
parents: 35620
diff changeset
339 template = ('[paths]\n'
e925f33ac088 share: convert EOL of hgrc before writing to bytes IO
Yuya Nishihara <yuya@tcha.org>
parents: 35620
diff changeset
340 'default = %s\n')
e925f33ac088 share: convert EOL of hgrc before writing to bytes IO
Yuya Nishihara <yuya@tcha.org>
parents: 35620
diff changeset
341 destrepo.vfs.write('hgrc', util.tonativeeol(template % default))
41043
ce0bc2952e2a narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents: 40996
diff changeset
342 if repositorymod.NARROW_REQUIREMENT in sourcerepo.requirements:
ce0bc2952e2a narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents: 40996
diff changeset
343 with destrepo.wlock():
41229
50ca531f1f24 narrow: copy store narrowspec to working copy immediately
Martin von Zweigbergk <martinvonz@google.com>
parents: 41043
diff changeset
344 narrowspec.copytoworkingcopy(destrepo)
27354
bced7180db19 hg: establish function for performing post-share actions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27344
diff changeset
345
28632
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
346 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
347 """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
348
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
349 ``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
350 """
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
351 if not update:
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
352 return
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
353
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
354 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
355 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
356 checkout = update
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
357 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
358 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
359 continue
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
360 try:
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
361 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
362 break
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
363 except error.RepoLookupError:
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
364 continue
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
365 _update(repo, uprev)
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
366
15078
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
367 def copystore(ui, srcrepo, destpath):
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
368 '''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
369
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
370 returns destlock
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
371 '''
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
372 destlock = None
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
373 try:
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
374 hardlink = None
38380
63e6f5ae84bc copystore: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 37717
diff changeset
375 topic = _('linking') if hardlink else _('copying')
40617
e5f54c4ec075 copystore: provide unit to ui.makeprogress()
Anton Shestakov <av6@dwimlabs.net>
parents: 40390
diff changeset
376 with ui.makeprogress(topic, unit=_('files')) as progress:
39388
ddfd80029306 hg: ensure the progress bar is completed when copying the store
Matt Harbison <matt_harbison@yahoo.com>
parents: 39186
diff changeset
377 num = 0
ddfd80029306 hg: ensure the progress bar is completed when copying the store
Matt Harbison <matt_harbison@yahoo.com>
parents: 39186
diff changeset
378 srcpublishing = srcrepo.publishing()
ddfd80029306 hg: ensure the progress bar is completed when copying the store
Matt Harbison <matt_harbison@yahoo.com>
parents: 39186
diff changeset
379 srcvfs = vfsmod.vfs(srcrepo.sharedpath)
ddfd80029306 hg: ensure the progress bar is completed when copying the store
Matt Harbison <matt_harbison@yahoo.com>
parents: 39186
diff changeset
380 dstvfs = vfsmod.vfs(destpath)
ddfd80029306 hg: ensure the progress bar is completed when copying the store
Matt Harbison <matt_harbison@yahoo.com>
parents: 39186
diff changeset
381 for f in srcrepo.store.copylist():
ddfd80029306 hg: ensure the progress bar is completed when copying the store
Matt Harbison <matt_harbison@yahoo.com>
parents: 39186
diff changeset
382 if srcpublishing and f.endswith('phaseroots'):
ddfd80029306 hg: ensure the progress bar is completed when copying the store
Matt Harbison <matt_harbison@yahoo.com>
parents: 39186
diff changeset
383 continue
ddfd80029306 hg: ensure the progress bar is completed when copying the store
Matt Harbison <matt_harbison@yahoo.com>
parents: 39186
diff changeset
384 dstbase = os.path.dirname(f)
ddfd80029306 hg: ensure the progress bar is completed when copying the store
Matt Harbison <matt_harbison@yahoo.com>
parents: 39186
diff changeset
385 if dstbase and not dstvfs.exists(dstbase):
ddfd80029306 hg: ensure the progress bar is completed when copying the store
Matt Harbison <matt_harbison@yahoo.com>
parents: 39186
diff changeset
386 dstvfs.mkdir(dstbase)
ddfd80029306 hg: ensure the progress bar is completed when copying the store
Matt Harbison <matt_harbison@yahoo.com>
parents: 39186
diff changeset
387 if srcvfs.exists(f):
ddfd80029306 hg: ensure the progress bar is completed when copying the store
Matt Harbison <matt_harbison@yahoo.com>
parents: 39186
diff changeset
388 if f.endswith('data'):
ddfd80029306 hg: ensure the progress bar is completed when copying the store
Matt Harbison <matt_harbison@yahoo.com>
parents: 39186
diff changeset
389 # 'dstbase' may be empty (e.g. revlog format 0)
ddfd80029306 hg: ensure the progress bar is completed when copying the store
Matt Harbison <matt_harbison@yahoo.com>
parents: 39186
diff changeset
390 lockfile = os.path.join(dstbase, "lock")
ddfd80029306 hg: ensure the progress bar is completed when copying the store
Matt Harbison <matt_harbison@yahoo.com>
parents: 39186
diff changeset
391 # lock to avoid premature writing to the target
ddfd80029306 hg: ensure the progress bar is completed when copying the store
Matt Harbison <matt_harbison@yahoo.com>
parents: 39186
diff changeset
392 destlock = lock.lock(dstvfs, lockfile)
ddfd80029306 hg: ensure the progress bar is completed when copying the store
Matt Harbison <matt_harbison@yahoo.com>
parents: 39186
diff changeset
393 hardlink, n = util.copyfiles(srcvfs.join(f), dstvfs.join(f),
ddfd80029306 hg: ensure the progress bar is completed when copying the store
Matt Harbison <matt_harbison@yahoo.com>
parents: 39186
diff changeset
394 hardlink, progress)
ddfd80029306 hg: ensure the progress bar is completed when copying the store
Matt Harbison <matt_harbison@yahoo.com>
parents: 39186
diff changeset
395 num += n
ddfd80029306 hg: ensure the progress bar is completed when copying the store
Matt Harbison <matt_harbison@yahoo.com>
parents: 39186
diff changeset
396 if hardlink:
ddfd80029306 hg: ensure the progress bar is completed when copying the store
Matt Harbison <matt_harbison@yahoo.com>
parents: 39186
diff changeset
397 ui.debug("linked %d files\n" % num)
ddfd80029306 hg: ensure the progress bar is completed when copying the store
Matt Harbison <matt_harbison@yahoo.com>
parents: 39186
diff changeset
398 else:
ddfd80029306 hg: ensure the progress bar is completed when copying the store
Matt Harbison <matt_harbison@yahoo.com>
parents: 39186
diff changeset
399 ui.debug("copied %d files\n" % num)
15078
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
400 return destlock
16705
c2d9ef43ff6c check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents: 16352
diff changeset
401 except: # re-raises
15078
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
402 release(destlock)
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
403 raise
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
404
25761
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
405 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
406 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
407 """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
408
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
409 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
410 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
411 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
412 True.
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
413 """
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
414 revs = None
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
415 if rev:
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
416 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
417 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
418 "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
419 "support clone by revision"))
37640
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
420
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
421 # TODO this is batchable.
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
422 remoterevs = []
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
423 for r in rev:
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
424 with srcpeer.commandexecutor() as e:
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
425 remoterevs.append(e.callcommand('lookup', {
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
426 'key': r,
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
427 }).result())
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
428 revs = remoterevs
25761
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
429
28289
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
430 # 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
431 # 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
432 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
433 # 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
434 try:
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
435 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
436 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
437 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
438 raise
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
439
31218
4cc3797aa59c vfs: use 'vfs' module directly in 'mercurial.hg'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31168
diff changeset
440 poolvfs = vfsmod.vfs(pooldir)
25761
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
441 basename = os.path.basename(sharepath)
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
442
28289
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
443 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
444 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
445 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
446 basename)
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
447 else:
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
448 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
449 # 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
450 # 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
451 # share mode.
d493d64757eb hg: obtain lock when creating share from pooled repo (issue5104)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27637
diff changeset
452 clone(ui, peeropts, source, dest=sharepath, pull=True,
37262
54435fd09f1d clone: rename "rev" to "revs" since there can be many
Martin von Zweigbergk <martinvonz@google.com>
parents: 37261
diff changeset
453 revs=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
454
30041
1779dde4c9ef hg: set default path correctly when doing a clone+share (issue5378)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29902
diff changeset
455 # 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
456 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
457 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
458 else:
1779dde4c9ef hg: set default path correctly when doing a clone+share (issue5378)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29902
diff changeset
459 defaultpath = source
1779dde4c9ef hg: set default path correctly when doing a clone+share (issue5378)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29902
diff changeset
460
25761
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
461 sharerepo = repository(ui, path=sharepath)
40576
85bf93def065 share: avoid a now-unnecessary reload of the repo
Martin von Zweigbergk <martinvonz@google.com>
parents: 40575
diff changeset
462 destrepo = share(ui, sharerepo, dest=dest, update=False, bookmarks=False,
85bf93def065 share: avoid a now-unnecessary reload of the repo
Martin von Zweigbergk <martinvonz@google.com>
parents: 40575
diff changeset
463 defaultpath=defaultpath)
25761
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
464
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
465 # 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
466 # 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
467 # 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
468 # 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
469 # 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
470 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
471
28632
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
472 _postshareupdate(destrepo, update)
a2c2dd399f3b hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28289
diff changeset
473
25761
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
474 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
475
32492
963de566de2f local-clone: extract the closure copying caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32379
diff changeset
476 # 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
477 # so just copy it
963de566de2f local-clone: extract the closure copying caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32379
diff changeset
478 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
479 """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
480 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
481 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
482 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
483 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
484 os.mkdir(dstcachedir)
963de566de2f local-clone: extract the closure copying caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32379
diff changeset
485 util.copyfile(srcbranchcache, dstbranchcache)
963de566de2f local-clone: extract the closure copying caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32379
diff changeset
486
37262
54435fd09f1d clone: rename "rev" to "revs" since there can be many
Martin von Zweigbergk <martinvonz@google.com>
parents: 37261
diff changeset
487 def clone(ui, peeropts, source, dest=None, pull=False, revs=None,
39550
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
488 update=True, stream=False, branch=None, shareopts=None,
40331
ac59de55c8b4 exchange: support declaring pull depth
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40324
diff changeset
489 storeincludepats=None, storeexcludepats=None, depth=None):
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
490 """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
491
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
492 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
493 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
494 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
495 newly created destination.
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
496
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
497 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
498 .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
499 pushes.
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
500
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
501 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
502 repository will be deleted.
2600
c4325f0a9b91 clean up trailing white space.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2597
diff changeset
503
2719
532809ba1db5 hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2631
diff changeset
504 Arguments:
532809ba1db5 hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2631
diff changeset
505
532809ba1db5 hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2631
diff changeset
506 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
507
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
508 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
509 name of source repository)
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
510
23545
68c434799559 hg.clone: set 'stream' depending on whether --pull was requested or not
Siddharth Agarwal <sid0@fb.com>
parents: 23139
diff changeset
511 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
512 server prefers streaming
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
513
2621
5a5852a417b1 clone: disable stream support on server side by default.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2613
diff changeset
514 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
515 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
516
37262
54435fd09f1d clone: rename "rev" to "revs" since there can be many
Martin von Zweigbergk <martinvonz@google.com>
parents: 37261
diff changeset
517 revs: revision to clone up to (implies pull=True)
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
518
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
519 update: update working directory after clone completes, if
6526
cfeeac24fc1e repo: add rjoin method
Bryan O'Sullivan <bos@serpentine.com>
parents: 6525
diff changeset
520 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
521 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
522
a78bfaf988e1 add -b/--branch option to clone, bundle, incoming, outgoing, pull, push
Sune Foldager <cryo@cyanite.org>
parents: 10365
diff changeset
523 branch: branches to clone
25761
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
524
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
525 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
526 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
527 "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
528 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
529 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
530 remote's path/URL. Defaults to "identity."
39550
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
531
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
532 storeincludepats and storeexcludepats: sets of file patterns to include and
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
533 exclude in the repository copy, respectively. If not defined, all files
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
534 will be included (a "full" clone). Otherwise a "narrow" clone containing
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
535 only the requested files will be performed. If ``storeincludepats`` is not
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
536 defined but ``storeexcludepats`` is, ``storeincludepats`` is assumed to be
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
537 ``path:.``. If both are empty sets, no files will be cloned.
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
538 """
4478
b2b55acbacdd Add support for url#id syntax
Matt Mackall <mpm@selenic.com>
parents: 4477
diff changeset
539
32970
11c0bb4ccc76 py3: replace str with bytes in isinstance()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32495
diff changeset
540 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
541 origsource = ui.expandpath(source)
37261
3809eafedf2c parseurl: consistently call second output "branches"
Martin von Zweigbergk <martinvonz@google.com>
parents: 37125
diff changeset
542 source, branches = parseurl(origsource, branch)
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
543 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
544 else:
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
545 srcpeer = source.peer() # in case we were called with a localrepo
37261
3809eafedf2c parseurl: consistently call second output "branches"
Martin von Zweigbergk <martinvonz@google.com>
parents: 37125
diff changeset
546 branches = (None, branch or [])
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
547 origsource = source = srcpeer.url()
37262
54435fd09f1d clone: rename "rev" to "revs" since there can be many
Martin von Zweigbergk <martinvonz@google.com>
parents: 37261
diff changeset
548 revs, checkout = addbranchrevs(srcpeer, srcpeer, branches, revs)
2719
532809ba1db5 hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2631
diff changeset
549
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
550 if dest is None:
2719
532809ba1db5 hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2631
diff changeset
551 dest = defaultdest(source)
20800
8253e55930a3 clone: abort if default destination has no meaningful name (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 20799
diff changeset
552 if dest:
8253e55930a3 clone: abort if default destination has no meaningful name (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 20799
diff changeset
553 ui.status(_("destination directory: %s\n") % dest)
9344
eb6af02307ec Merge with i18n-stable
Matt Mackall <mpm@selenic.com>
parents: 9245
diff changeset
554 else:
eb6af02307ec Merge with i18n-stable
Matt Mackall <mpm@selenic.com>
parents: 9245
diff changeset
555 dest = ui.expandpath(dest)
2719
532809ba1db5 hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2631
diff changeset
556
14825
de9eb6b1da4f util: rename the util.localpath that uses url to urllocalpath (issue2875)
Mads Kiilerich <mads@kiilerich.com>
parents: 14737
diff changeset
557 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
558 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
559
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
560 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
561 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
562
31218
4cc3797aa59c vfs: use 'vfs' module directly in 'mercurial.hg'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31168
diff changeset
563 destvfs = vfsmod.vfs(dest, expandpath=True)
21803
62cc4055c6c8 hg: use vfs functions in clone
Chinmay Joshi <c@chinmayjoshi.com>
parents: 21802
diff changeset
564 if destvfs.lexists():
62cc4055c6c8 hg: use vfs functions in clone
Chinmay Joshi <c@chinmayjoshi.com>
parents: 21802
diff changeset
565 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
566 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
567 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
568 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
569
39550
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
570 createopts = {}
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
571 narrow = False
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
572
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
573 if storeincludepats is not None:
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
574 narrowspec.validatepatterns(storeincludepats)
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
575 narrow = True
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
576
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
577 if storeexcludepats is not None:
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
578 narrowspec.validatepatterns(storeexcludepats)
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
579 narrow = True
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
580
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
581 if narrow:
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
582 # Include everything by default if only exclusion patterns defined.
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
583 if storeexcludepats and not storeincludepats:
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
584 storeincludepats = {'path:.'}
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
585
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
586 createopts['narrowfiles'] = True
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
587
40390
7e3b6c4f01a2 localrepo: support marking repos as having shallow file storage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40366
diff changeset
588 if depth:
7e3b6c4f01a2 localrepo: support marking repos as having shallow file storage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40366
diff changeset
589 createopts['shallowfilestore'] = True
7e3b6c4f01a2 localrepo: support marking repos as having shallow file storage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40366
diff changeset
590
40324
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 39849
diff changeset
591 if srcpeer.capable(b'lfs-serve'):
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 39849
diff changeset
592 # Repository creation honors the config if it disabled the extension, so
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 39849
diff changeset
593 # we can't just announce that lfs will be enabled. This check avoids
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 39849
diff changeset
594 # saying that lfs will be enabled, and then saying it's an unknown
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 39849
diff changeset
595 # feature. The lfs creation option is set in either case so that a
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 39849
diff changeset
596 # requirement is added. If the extension is explicitly disabled but the
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 39849
diff changeset
597 # requirement is set, the clone aborts early, before transferring any
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 39849
diff changeset
598 # data.
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 39849
diff changeset
599 createopts['lfs'] = True
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 39849
diff changeset
600
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 39849
diff changeset
601 if extensions.disabledext('lfs'):
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 39849
diff changeset
602 ui.status(_('(remote is using large file support (lfs), but it is '
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 39849
diff changeset
603 'explicitly disabled in the local configuration)\n'))
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 39849
diff changeset
604 else:
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 39849
diff changeset
605 ui.status(_('(remote is using large file support (lfs); lfs will '
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 39849
diff changeset
606 'be enabled for this repository)\n'))
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 39849
diff changeset
607
25761
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
608 shareopts = shareopts or {}
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
609 sharepool = shareopts.get('pool')
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
610 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
611 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
612 sharepath = None
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
613 if sharenamemode == 'identity':
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
614 # 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
615 # 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
616 # 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
617 # 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
618 try:
37640
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
619 with srcpeer.commandexecutor() as e:
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
620 rootnode = e.callcommand('lookup', {
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
621 'key': '0',
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
622 }).result()
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
623
25761
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
624 if rootnode != node.nullid:
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
625 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
626 else:
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
627 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
628 '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
629 except error.RepoLookupError:
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
630 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
631 '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
632 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
633 sharepath = os.path.join(
35582
72b91f905065 py3: use node.hex(h.digest()) instead of h.hexdigest()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35565
diff changeset
634 sharepool, node.hex(hashlib.sha1(source).digest()))
25761
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
635 else:
29389
98e8313dcd9e i18n: translate abort messages
liscju <piotr.listkiewicz@gmail.com>
parents: 29341
diff changeset
636 raise error.Abort(_('unknown share naming mode: %s') %
98e8313dcd9e i18n: translate abort messages
liscju <piotr.listkiewicz@gmail.com>
parents: 29341
diff changeset
637 sharenamemode)
25761
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
638
39550
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
639 # TODO this is a somewhat arbitrary restriction.
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
640 if narrow:
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
641 ui.status(_('(pooled storage not supported for narrow clones)\n'))
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
642 sharepath = None
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
643
25761
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
644 if sharepath:
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
645 return clonewithshare(ui, peeropts, sharepath, source, srcpeer,
37262
54435fd09f1d clone: rename "rev" to "revs" since there can be many
Martin von Zweigbergk <martinvonz@google.com>
parents: 37261
diff changeset
646 dest, pull=pull, rev=revs, update=update,
25761
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
647 stream=stream)
0d37b9b21467 hg: support for auto sharing stores when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
648
18441
1f794204abbd hg: replace DirCleanup class with normal try/finally use
Augie Fackler <raf@durin42.com>
parents: 18382
diff changeset
649 srclock = destlock = cleandir = None
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
650 srcrepo = srcpeer.local()
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
651 try:
14377
f90d5641c78b clone: make default path absolute for all local paths
Brendan Cully <brendan@kublai.com>
parents: 14213
diff changeset
652 abspath = origsource
f90d5641c78b clone: make default path absolute for all local paths
Brendan Cully <brendan@kublai.com>
parents: 14213
diff changeset
653 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
654 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
655
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
656 if islocal(dest):
18441
1f794204abbd hg: replace DirCleanup class with normal try/finally use
Augie Fackler <raf@durin42.com>
parents: 18382
diff changeset
657 cleandir = dest
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
658
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
659 copy = False
17194
32a6a33b9a35 peer: remove cancopy from peer api; use directly on repo instead
Sune Foldager <cryo@cyanite.org>
parents: 17192
diff changeset
660 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
661 and not phases.hassecret(srcrepo)):
37262
54435fd09f1d clone: rename "rev" to "revs" since there can be many
Martin von Zweigbergk <martinvonz@google.com>
parents: 37261
diff changeset
662 copy = not pull and not revs
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
663
39550
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
664 # TODO this is a somewhat arbitrary restriction.
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
665 if narrow:
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
666 copy = False
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
667
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
668 if copy:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
669 try:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
670 # 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
671 # 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
672 # 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
673 # fail
14463
81f559d1b9b2 hg: remove underscores in clone function
Martin Geisler <mg@aragost.com>
parents: 14377
diff changeset
674 srclock = srcrepo.lock(wait=False)
7640
7197812e8d44 error: move lock errors
Matt Mackall <mpm@selenic.com>
parents: 7546
diff changeset
675 except error.LockError:
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
676 copy = False
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
677
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
678 if copy:
14463
81f559d1b9b2 hg: remove underscores in clone function
Martin Geisler <mg@aragost.com>
parents: 14377
diff changeset
679 srcrepo.hook('preoutgoing', throw=True, source='clone')
15381
c519cd8f0169 backout dbdb777502dc (issue3077) (issue3071)
Matt Mackall <mpm@selenic.com>
parents: 15355
diff changeset
680 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
681 if not os.path.exists(dest):
39185
143efea71c2a clone: allow local cloning to create more than one level of directories
Matt Harbison <matt_harbison@yahoo.com>
parents: 38798
diff changeset
682 util.makedirs(dest)
7935
39566bb99a9c on clone failure, only remove directories we created
Steve Borho <steve@borho.org>
parents: 7927
diff changeset
683 else:
39566bb99a9c on clone failure, only remove directories we created
Steve Borho <steve@borho.org>
parents: 7927
diff changeset
684 # 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
685 cleandir = hgdir
5569
9e209193f18d clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents: 5277
diff changeset
686 try:
14463
81f559d1b9b2 hg: remove underscores in clone function
Martin Geisler <mg@aragost.com>
parents: 14377
diff changeset
687 destpath = hgdir
81f559d1b9b2 hg: remove underscores in clone function
Martin Geisler <mg@aragost.com>
parents: 14377
diff changeset
688 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
689 except OSError as inst:
5569
9e209193f18d clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents: 5277
diff changeset
690 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
691 cleandir = None
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26354
diff changeset
692 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
693 % dest)
9e209193f18d clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents: 5277
diff changeset
694 raise
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
695
15078
193e7018dc8c hg: extract copying the store out of clone
Simon Heimberg <simohe@besonet.ch>
parents: 14952
diff changeset
696 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
697 # 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
698 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
699 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
700 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
701 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
702
17740
e6067bec18da branchcache: fetch source branchcache during clone (issue3378)
Tomasz Kleczek <tomasz.kleczek@fb.com>
parents: 17704
diff changeset
703 dstcachedir = os.path.join(destpath, 'cache')
35766
72fdd99eb526 caches: make 'cachetocopy' available in scmutil
Boris Feld <boris.feld@octobus.net>
parents: 35713
diff changeset
704 for cache in cacheutil.cachetocopy(srcrepo):
32493
3c8a71a8df11 local-clone: extract the listing of caches to copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32492
diff changeset
705 _copycache(srcrepo, dstcachedir, cache)
17740
e6067bec18da branchcache: fetch source branchcache during clone (issue3378)
Tomasz Kleczek <tomasz.kleczek@fb.com>
parents: 17704
diff changeset
706
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
707 # 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
708 # 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
709 destpeer = peer(srcrepo, peeropts, dest)
14463
81f559d1b9b2 hg: remove underscores in clone function
Martin Geisler <mg@aragost.com>
parents: 14377
diff changeset
710 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
711 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
712 else:
5569
9e209193f18d clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents: 5277
diff changeset
713 try:
39550
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
714 # only pass ui when no srcrepo
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
715 destpeer = peer(srcrepo or ui, peeropts, dest, create=True,
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
716 createopts=createopts)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25624
diff changeset
717 except OSError as inst:
5569
9e209193f18d clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents: 5277
diff changeset
718 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
719 cleandir = None
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26354
diff changeset
720 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
721 % dest)
9e209193f18d clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents: 5277
diff changeset
722 raise
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
723
37262
54435fd09f1d clone: rename "rev" to "revs" since there can be many
Martin von Zweigbergk <martinvonz@google.com>
parents: 37261
diff changeset
724 if revs:
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
725 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
726 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
727 "revision lookup and so doesn't "
a458b9bf4f3a hg: better wrapping of string literal
Martin Geisler <mg@lazybytes.net>
parents: 8907
diff changeset
728 "support clone by revision"))
37640
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
729
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
730 # TODO this is batchable.
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
731 remoterevs = []
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
732 for rev in revs:
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
733 with srcpeer.commandexecutor() as e:
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
734 remoterevs.append(e.callcommand('lookup', {
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
735 'key': rev,
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
736 }).result())
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
737 revs = remoterevs
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
738
8417
39cf453da958 clone: try updating to the actual changeset specified in options
Brett Carter <brett@rdnzl.net>
parents: 8312
diff changeset
739 checkout = revs[0]
37262
54435fd09f1d clone: rename "rev" to "revs" since there can be many
Martin von Zweigbergk <martinvonz@google.com>
parents: 37261
diff changeset
740 else:
54435fd09f1d clone: rename "rev" to "revs" since there can be many
Martin von Zweigbergk <martinvonz@google.com>
parents: 37261
diff changeset
741 revs = None
27165
70884715725e localrepo: remove clone method by hoisting into hg.py
Augie Fackler <augie@google.com>
parents: 26781
diff changeset
742 local = destpeer.local()
70884715725e localrepo: remove clone method by hoisting into hg.py
Augie Fackler <augie@google.com>
parents: 26781
diff changeset
743 if local:
39555
cb675e95a2c2 hg: write narrow patterns after repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39553
diff changeset
744 if narrow:
41043
ce0bc2952e2a narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents: 40996
diff changeset
745 with local.wlock(), local.lock():
39555
cb675e95a2c2 hg: write narrow patterns after repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39553
diff changeset
746 local.setnarrowpats(storeincludepats, storeexcludepats)
41236
44a51c1c8e17 narrow: move copytonarrowspec() out of setnarrowpats()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41229
diff changeset
747 narrowspec.copytoworkingcopy(local)
39555
cb675e95a2c2 hg: write narrow patterns after repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39553
diff changeset
748
35565
bdae51a83dfb clonebundle: make it possible to retrieve the initial bundle through largefile
Boris Feld <boris.feld@octobus.net>
parents: 35438
diff changeset
749 u = util.url(abspath)
bdae51a83dfb clonebundle: make it possible to retrieve the initial bundle through largefile
Boris Feld <boris.feld@octobus.net>
parents: 35438
diff changeset
750 defaulturl = bytes(u)
bdae51a83dfb clonebundle: make it possible to retrieve the initial bundle through largefile
Boris Feld <boris.feld@octobus.net>
parents: 35438
diff changeset
751 local.ui.setconfig('paths', 'default', defaulturl, 'clone')
23545
68c434799559 hg.clone: set 'stream' depending on whether --pull was requested or not
Siddharth Agarwal <sid0@fb.com>
parents: 23139
diff changeset
752 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
753 if pull:
68c434799559 hg.clone: set 'stream' depending on whether --pull was requested or not
Siddharth Agarwal <sid0@fb.com>
parents: 23139
diff changeset
754 stream = False
68c434799559 hg.clone: set 'stream' depending on whether --pull was requested or not
Siddharth Agarwal <sid0@fb.com>
parents: 23139
diff changeset
755 else:
68c434799559 hg.clone: set 'stream' depending on whether --pull was requested or not
Siddharth Agarwal <sid0@fb.com>
parents: 23139
diff changeset
756 stream = None
27165
70884715725e localrepo: remove clone method by hoisting into hg.py
Augie Fackler <augie@google.com>
parents: 26781
diff changeset
757 # internal config: ui.quietbookmarkmove
31456
2545ee88a57e clone: get rid of ui.backupconfig
Jun Wu <quark@fb.com>
parents: 31322
diff changeset
758 overrides = {('ui', 'quietbookmarkmove'): True}
2545ee88a57e clone: get rid of ui.backupconfig
Jun Wu <quark@fb.com>
parents: 31322
diff changeset
759 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
760 exchange.pull(local, srcpeer, revs,
39553
130e5df346d5 exchange: support defining narrow file patterns for pull
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39550
diff changeset
761 streamclonerequested=stream,
130e5df346d5 exchange: support defining narrow file patterns for pull
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39550
diff changeset
762 includepats=storeincludepats,
40331
ac59de55c8b4 exchange: support declaring pull depth
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40324
diff changeset
763 excludepats=storeexcludepats,
ac59de55c8b4 exchange: support declaring pull depth
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40324
diff changeset
764 depth=depth)
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
765 elif srcrepo:
39550
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
766 # TODO lift restriction once exchange.push() accepts narrow
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
767 # push.
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
768 if narrow:
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
769 raise error.Abort(_('narrow clone not available for '
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
770 'remote destinations'))
65b5900f30be hg: recognize include and exclude patterns when cloning
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
771
22647
5b6cd8526d56 clone: explicitly push bookmarks when cloning from local to remote
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22646
diff changeset
772 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
773 bookmarks=srcrepo._bookmarks.keys())
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
774 else:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26354
diff changeset
775 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
776 )
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
777
18441
1f794204abbd hg: replace DirCleanup class with normal try/finally use
Augie Fackler <raf@durin42.com>
parents: 18382
diff changeset
778 cleandir = None
2597
5ba8be56fa8f clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2595
diff changeset
779
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
780 destrepo = destpeer.local()
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
781 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
782 template = uimod.samplehgrcs['cloned']
15552
62c9183a0bbb clone: don't save user's password in .hg/hgrc (Issue3122)
Augie Fackler <durin42@gmail.com>
parents: 15381
diff changeset
783 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
784 u.passwd = None
33687
6294654453ee py3: use bytes IO to write sample hgrc
Yuya Nishihara <yuya@tcha.org>
parents: 33018
diff changeset
785 defaulturl = bytes(u)
35620
545967ec33dc clone: use utility function to write hgrc
Yuya Nishihara <yuya@tcha.org>
parents: 35619
diff changeset
786 destrepo.vfs.write('hgrc', util.tonativeeol(template % defaulturl))
20790
49f2d5644f04 config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents: 20355
diff changeset
787 destrepo.ui.setconfig('paths', 'default', defaulturl, 'clone')
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8807
diff changeset
788
35331
773a9a06047c clone: add support for storing remotenames while cloning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34979
diff changeset
789 if ui.configbool('experimental', 'remotenames'):
35347
a29fe459fc49 remotenames: rename related file and storage dir to logexchange
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35331
diff changeset
790 logexchange.pullremotenames(destrepo, srcpeer)
35331
773a9a06047c clone: add support for storing remotenames while cloning
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34979
diff changeset
791
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
792 if update:
6526
cfeeac24fc1e repo: add rjoin method
Bryan O'Sullivan <bos@serpentine.com>
parents: 6525
diff changeset
793 if update is not True:
37640
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
794 with srcpeer.commandexecutor() as e:
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
795 checkout = e.callcommand('lookup', {
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
796 'key': update,
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
797 }).result()
ce8828217369 hg: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37579
diff changeset
798
17867
c9339efed653 clone: make sure to use "@" as bookmark and "default" as branch (issue3677)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 17844
diff changeset
799 uprev = None
17882
36ed69d4593d clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents: 17875
diff changeset
800 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
801 if checkout is not None:
38753
e06a10d3b926 clone: process 'lookup' return as an arbitrary symbol
Boris Feld <boris.feld@octobus.net>
parents: 38380
diff changeset
802 # Some extensions (at least hg-git and hg-subversion) have
e06a10d3b926 clone: process 'lookup' return as an arbitrary symbol
Boris Feld <boris.feld@octobus.net>
parents: 38380
diff changeset
803 # a peer.lookup() implementation that returns a name instead
e06a10d3b926 clone: process 'lookup' return as an arbitrary symbol
Boris Feld <boris.feld@octobus.net>
parents: 38380
diff changeset
804 # of a nodeid. We work around it here until we've figured
e06a10d3b926 clone: process 'lookup' return as an arbitrary symbol
Boris Feld <boris.feld@octobus.net>
parents: 38380
diff changeset
805 # out a better solution.
e06a10d3b926 clone: process 'lookup' return as an arbitrary symbol
Boris Feld <boris.feld@octobus.net>
parents: 38380
diff changeset
806 if len(checkout) == 20 and checkout in destrepo:
37480
c569e51ee449 clone: avoid using repo.lookup() with binary nodeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37313
diff changeset
807 uprev = checkout
38753
e06a10d3b926 clone: process 'lookup' return as an arbitrary symbol
Boris Feld <boris.feld@octobus.net>
parents: 38380
diff changeset
808 elif scmutil.isrevsymbol(destrepo, checkout):
e06a10d3b926 clone: process 'lookup' return as an arbitrary symbol
Boris Feld <boris.feld@octobus.net>
parents: 38380
diff changeset
809 uprev = scmutil.revsymbol(destrepo, checkout).node()
37480
c569e51ee449 clone: avoid using repo.lookup() with binary nodeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37313
diff changeset
810 else:
26354
c1fb2cab6260 clone: check update rev for being True
Sean Farley <sean@farley.io>
parents: 26353
diff changeset
811 if update is not True:
c1fb2cab6260 clone: check update rev for being True
Sean Farley <sean@farley.io>
parents: 26353
diff changeset
812 try:
c1fb2cab6260 clone: check update rev for being True
Sean Farley <sean@farley.io>
parents: 26353
diff changeset
813 uprev = destrepo.lookup(update)
c1fb2cab6260 clone: check update rev for being True
Sean Farley <sean@farley.io>
parents: 26353
diff changeset
814 except error.RepoLookupError:
c1fb2cab6260 clone: check update rev for being True
Sean Farley <sean@farley.io>
parents: 26353
diff changeset
815 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
816 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
817 try:
c9339efed653 clone: make sure to use "@" as bookmark and "default" as branch (issue3677)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 17844
diff changeset
818 uprev = destrepo._bookmarks['@']
17870
7d2dd10ce9ea clone: activate @ bookmark if updating to it
Thomas Arendsen Hein <thomas@intevation.de>
parents: 17867
diff changeset
819 update = '@'
17882
36ed69d4593d clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents: 17875
diff changeset
820 bn = destrepo[uprev].branch()
36ed69d4593d clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents: 17875
diff changeset
821 if bn == 'default':
36ed69d4593d clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents: 17875
diff changeset
822 status = _("updating to bookmark @\n")
36ed69d4593d clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents: 17875
diff changeset
823 else:
20868
5db105f216c3 i18n: fix "% inside _()" problems
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20858
diff changeset
824 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
825 % 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
826 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
827 try:
c9339efed653 clone: make sure to use "@" as bookmark and "default" as branch (issue3677)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 17844
diff changeset
828 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
829 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
830 uprev = destrepo.lookup('tip')
17882
36ed69d4593d clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents: 17875
diff changeset
831 if not status:
36ed69d4593d clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents: 17875
diff changeset
832 bn = destrepo[uprev].branch()
36ed69d4593d clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents: 17875
diff changeset
833 status = _("updating to branch %s\n") % bn
36ed69d4593d clone: show status "updating to bookmark @"
Adrian Buehlmann <adrian@cadifra.com>
parents: 17875
diff changeset
834 destrepo.ui.status(status)
14463
81f559d1b9b2 hg: remove underscores in clone function
Martin Geisler <mg@aragost.com>
parents: 14377
diff changeset
835 _update(destrepo, uprev)
17703
4a07d2ff7c66 clone: activate bookmark specified with --updaterev
Thomas Arendsen Hein <thomas@intevation.de>
parents: 17342
diff changeset
836 if update in destrepo._bookmarks:
24945
e0b0fbd47491 bookmarks: rename setcurrent to activate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24440
diff changeset
837 bookmarks.activate(destrepo, update)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4853
diff changeset
838 finally:
15908
60cb4f381a78 bookmarks: backout locking change in 12dea4d998ec
Matt Mackall <mpm@selenic.com>
parents: 15887
diff changeset
839 release(srclock, destlock)
18441
1f794204abbd hg: replace DirCleanup class with normal try/finally use
Augie Fackler <raf@durin42.com>
parents: 18382
diff changeset
840 if cleandir is not None:
1f794204abbd hg: replace DirCleanup class with normal try/finally use
Augie Fackler <raf@durin42.com>
parents: 18382
diff changeset
841 shutil.rmtree(cleandir, True)
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
842 if srcpeer is not None:
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 17159
diff changeset
843 srcpeer.close()
19313
3b96d6e44a4d hg: move return statement after finally block
simon@laptop-tosh
parents: 18944
diff changeset
844 return srcpeer, destpeer
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents: 2774
diff changeset
845
27402
5184089f5d30 hg: add quietempty flag to _showstats
timeless <timeless@mozdev.org>
parents: 27354
diff changeset
846 def _showstats(repo, stats, quietempty=False):
37125
6f570c501e3e merge: deprecate accessing update results by index
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37107
diff changeset
847 if quietempty and stats.isempty():
27402
5184089f5d30 hg: add quietempty flag to _showstats
timeless <timeless@mozdev.org>
parents: 27354
diff changeset
848 return
9454
dafadd7ff07e hg: avoid combining translated strings
Martin Geisler <mg@lazybytes.net>
parents: 9425
diff changeset
849 repo.ui.status(_("%d files updated, %d files merged, "
37107
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37084
diff changeset
850 "%d files removed, %d files unresolved\n") % (
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37084
diff changeset
851 stats.updatedcount, stats.mergedcount,
71543b942eea merge: return an attrs class from update() and applyupdates()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37084
diff changeset
852 stats.removedcount, stats.unresolvedcount))
3316
39fd6e82ea38 merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents: 3195
diff changeset
853
31166
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
854 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
855 """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
856
17c030014ddf subrepo: only do clean update when overwrite is set (issue3276)
Simon Heimberg <simohe@besonet.ch>
parents: 17887
diff changeset
857 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
858
17c030014ddf subrepo: only do clean update when overwrite is set (issue3276)
Simon Heimberg <simohe@besonet.ch>
parents: 17887
diff changeset
859 returns stats (see pydoc mercurial.merge.applyupdates)"""
40366
b14fdf1fb615 update: clarify update() call sites by specifying argument names
Martin von Zweigbergk <martinvonz@google.com>
parents: 40331
diff changeset
860 return mergemod.update(repo, node, branchmerge=False, force=overwrite,
31166
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
861 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
862 updatecheck=updatecheck)
17895
17c030014ddf subrepo: only do clean update when overwrite is set (issue3276)
Simon Heimberg <simohe@besonet.ch>
parents: 17887
diff changeset
863
31166
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
864 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
865 """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
866 stats = updaterepo(repo, node, False, updatecheck=updatecheck)
27404
1cf3543cc780 update: add quietempty flag to _showstats
timeless <timeless@mozdev.org>
parents: 27403
diff changeset
867 _showstats(repo, stats, quietempty)
37125
6f570c501e3e merge: deprecate accessing update results by index
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37107
diff changeset
868 if stats.unresolvedcount:
6518
92ccccb55ba3 resolve: new command
Matt Mackall <mpm@selenic.com>
parents: 6338
diff changeset
869 repo.ui.status(_("use 'hg resolve' to retry unresolved file merges\n"))
37125
6f570c501e3e merge: deprecate accessing update results by index
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37107
diff changeset
870 return stats.unresolvedcount > 0
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents: 2774
diff changeset
871
7546
c7f48414f3ad add a comment about the need of hg._update()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7280
diff changeset
872 # 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
873 _update = update
c7f48414f3ad add a comment about the need of hg._update()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7280
diff changeset
874
27403
50b6a04f817f histedit: omit useless message from abort
timeless <timeless@mozdev.org>
parents: 27402
diff changeset
875 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
876 """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
877 stats = updaterepo(repo, node, True)
31311
f59b6cf663a9 vfs: use repo.vfs.unlinkpath
Mads Kiilerich <mads@kiilerich.com>
parents: 31218
diff changeset
878 repo.vfs.unlinkpath('graftstate', ignoremissing=True)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
879 if show_stats:
27403
50b6a04f817f histedit: omit useless message from abort
timeless <timeless@mozdev.org>
parents: 27402
diff changeset
880 _showstats(repo, stats, quietempty)
37125
6f570c501e3e merge: deprecate accessing update results by index
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37107
diff changeset
881 return stats.unresolvedcount > 0
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents: 2774
diff changeset
882
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
883 # 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
884 _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
885
42971
ee1ef76d7339 hg: have `updatetotally` more thoroughly check updatecheck argument (API)
Augie Fackler <augie@google.com>
parents: 42970
diff changeset
886 _VALID_UPDATECHECKS = {mergemod.UPDATECHECK_ABORT,
ee1ef76d7339 hg: have `updatetotally` more thoroughly check updatecheck argument (API)
Augie Fackler <augie@google.com>
parents: 42970
diff changeset
887 mergemod.UPDATECHECK_NONE,
ee1ef76d7339 hg: have `updatetotally` more thoroughly check updatecheck argument (API)
Augie Fackler <augie@google.com>
parents: 42970
diff changeset
888 mergemod.UPDATECHECK_LINEAR,
ee1ef76d7339 hg: have `updatetotally` more thoroughly check updatecheck argument (API)
Augie Fackler <augie@google.com>
parents: 42970
diff changeset
889 mergemod.UPDATECHECK_NO_CONFLICT,
ee1ef76d7339 hg: have `updatetotally` more thoroughly check updatecheck argument (API)
Augie Fackler <augie@google.com>
parents: 42970
diff changeset
890 }
ee1ef76d7339 hg: have `updatetotally` more thoroughly check updatecheck argument (API)
Augie Fackler <augie@google.com>
parents: 42970
diff changeset
891
31166
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
892 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
893 """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
894
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
895 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
896
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
897 :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
898
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
899 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
900
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
901 :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
902 :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
903 :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
904 :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
905
42970
1ad3ebb39c61 merge: replace magic strings with NAMED_CONSTANTS (API)
Augie Fackler <augie@google.com>
parents: 42813
diff changeset
906 Valid values for updatecheck are the UPDATECHECK_* constants
1ad3ebb39c61 merge: replace magic strings with NAMED_CONSTANTS (API)
Augie Fackler <augie@google.com>
parents: 42813
diff changeset
907 defined in the merge module. Passing `None` will result in using the
1ad3ebb39c61 merge: replace magic strings with NAMED_CONSTANTS (API)
Augie Fackler <augie@google.com>
parents: 42813
diff changeset
908 configured default.
31166
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
909
42970
1ad3ebb39c61 merge: replace magic strings with NAMED_CONSTANTS (API)
Augie Fackler <augie@google.com>
parents: 42813
diff changeset
910 * ABORT: abort if the working directory is dirty
1ad3ebb39c61 merge: replace magic strings with NAMED_CONSTANTS (API)
Augie Fackler <augie@google.com>
parents: 42813
diff changeset
911 * NONE: don't check (merge working directory changes into destination)
1ad3ebb39c61 merge: replace magic strings with NAMED_CONSTANTS (API)
Augie Fackler <augie@google.com>
parents: 42813
diff changeset
912 * LINEAR: check that update is linear before merging working directory
31166
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
913 changes into destination
42970
1ad3ebb39c61 merge: replace magic strings with NAMED_CONSTANTS (API)
Augie Fackler <augie@google.com>
parents: 42813
diff changeset
914 * NO_CONFLICT: 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
915
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
916 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
917 """
31166
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
918 if updatecheck is None:
34705
23ed47a895d5 config: graduate experimental.updatecheck to commands.update.check
Augie Fackler <augie@google.com>
parents: 34131
diff changeset
919 updatecheck = ui.config('commands', 'update.check')
42971
ee1ef76d7339 hg: have `updatetotally` more thoroughly check updatecheck argument (API)
Augie Fackler <augie@google.com>
parents: 42970
diff changeset
920 if updatecheck not in _VALID_UPDATECHECKS:
31167
696e321b304d update: add experimental config for default way of handling dirty wdir
Martin von Zweigbergk <martinvonz@google.com>
parents: 31166
diff changeset
921 # If not configured, or invalid value configured
42970
1ad3ebb39c61 merge: replace magic strings with NAMED_CONSTANTS (API)
Augie Fackler <augie@google.com>
parents: 42813
diff changeset
922 updatecheck = mergemod.UPDATECHECK_LINEAR
42971
ee1ef76d7339 hg: have `updatetotally` more thoroughly check updatecheck argument (API)
Augie Fackler <augie@google.com>
parents: 42970
diff changeset
923 if updatecheck not in _VALID_UPDATECHECKS:
ee1ef76d7339 hg: have `updatetotally` more thoroughly check updatecheck argument (API)
Augie Fackler <augie@google.com>
parents: 42970
diff changeset
924 raise ValueError(r'Invalid updatecheck value %r (can accept %r)' % (
ee1ef76d7339 hg: have `updatetotally` more thoroughly check updatecheck argument (API)
Augie Fackler <augie@google.com>
parents: 42970
diff changeset
925 updatecheck, _VALID_UPDATECHECKS))
28503
138ec8835e63 hg: acquire wlock while updating the working directory via updatetotally
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28501
diff changeset
926 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
927 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
928 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
929 if checkout is None:
30962
11c253997b0e destutil: drop now-unused "check" parameter from destupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30062
diff changeset
930 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
931 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
932 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
933
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
934 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
935 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
936 else:
42970
1ad3ebb39c61 merge: replace magic strings with NAMED_CONSTANTS (API)
Augie Fackler <augie@google.com>
parents: 42813
diff changeset
937 if updatecheck == mergemod.UPDATECHECK_ABORT:
30963
7beb3ec34443 update: move check for dirty wdir into hg.updatetotally()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30962
diff changeset
938 cmdutil.bailifchanged(repo, merge=False)
42970
1ad3ebb39c61 merge: replace magic strings with NAMED_CONSTANTS (API)
Augie Fackler <augie@google.com>
parents: 42813
diff changeset
939 updatecheck = mergemod.UPDATECHECK_NONE
31166
fad5e299cfc7 update: accept --merge to allow merging across topo branches (issue5125)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31133
diff changeset
940 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
941
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
942 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
943 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
944 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
945 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
946 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
947 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
948 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
949 # 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
950 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
951 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
952 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
953 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
954 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
955 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
956 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
957 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
958 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
959 if repo._activebookmark:
29902
a77d48219edd update: label bookmark name in message
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29753
diff changeset
960 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
961 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
962 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
963
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
964 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
965 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
966
66513f6ca038 commands: centralize code to update with extra care for non-file components
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28324
diff changeset
967 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
968
35704
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
969 def merge(repo, node, force=None, remind=True, mergeforce=False, labels=None,
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
970 abort=False):
13162
115a9760c382 merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents: 13047
diff changeset
971 """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
972 unresolved conflicts."""
42600
3bc400ccbf99 abort: added support for merge
Taapas Agrawal <taapas2897@gmail.com>
parents: 42155
diff changeset
973 if abort:
42604
209f2b8a50dc abort: removed labels argument from abortmerge()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42600
diff changeset
974 return abortmerge(repo.ui, repo)
35704
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
975
42600
3bc400ccbf99 abort: added support for merge
Taapas Agrawal <taapas2897@gmail.com>
parents: 42155
diff changeset
976 stats = mergemod.update(repo, node, branchmerge=True, force=force,
3bc400ccbf99 abort: added support for merge
Taapas Agrawal <taapas2897@gmail.com>
parents: 42155
diff changeset
977 mergeforce=mergeforce, labels=labels)
3316
39fd6e82ea38 merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents: 3195
diff changeset
978 _showstats(repo, stats)
37125
6f570c501e3e merge: deprecate accessing update results by index
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37107
diff changeset
979 if stats.unresolvedcount:
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
980 repo.ui.status(_("use 'hg resolve' to retry unresolved file merges "
35704
41ef02ba329b merge: add `--abort` flag which can abort the merge
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35622
diff changeset
981 "or 'hg merge --abort' to abandon\n"))
42600
3bc400ccbf99 abort: added support for merge
Taapas Agrawal <taapas2897@gmail.com>
parents: 42155
diff changeset
982 elif remind:
3316
39fd6e82ea38 merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents: 3195
diff changeset
983 repo.ui.status(_("(branch merge, don't forget to commit)\n"))
37125
6f570c501e3e merge: deprecate accessing update results by index
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37107
diff changeset
984 return stats.unresolvedcount > 0
2808
30f59f4a327e Introduce update helper functions: update, merge, clean, and revert
Matt Mackall <mpm@selenic.com>
parents: 2778
diff changeset
985
42604
209f2b8a50dc abort: removed labels argument from abortmerge()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42600
diff changeset
986 def abortmerge(ui, repo):
42600
3bc400ccbf99 abort: added support for merge
Taapas Agrawal <taapas2897@gmail.com>
parents: 42155
diff changeset
987 ms = mergemod.mergestate.read(repo)
3bc400ccbf99 abort: added support for merge
Taapas Agrawal <taapas2897@gmail.com>
parents: 42155
diff changeset
988 if ms.active():
3bc400ccbf99 abort: added support for merge
Taapas Agrawal <taapas2897@gmail.com>
parents: 42155
diff changeset
989 # there were conflicts
3bc400ccbf99 abort: added support for merge
Taapas Agrawal <taapas2897@gmail.com>
parents: 42155
diff changeset
990 node = ms.localctx.hex()
3bc400ccbf99 abort: added support for merge
Taapas Agrawal <taapas2897@gmail.com>
parents: 42155
diff changeset
991 else:
3bc400ccbf99 abort: added support for merge
Taapas Agrawal <taapas2897@gmail.com>
parents: 42155
diff changeset
992 # there were no conficts, mergestate was not stored
3bc400ccbf99 abort: added support for merge
Taapas Agrawal <taapas2897@gmail.com>
parents: 42155
diff changeset
993 node = repo['.'].hex()
3bc400ccbf99 abort: added support for merge
Taapas Agrawal <taapas2897@gmail.com>
parents: 42155
diff changeset
994
3bc400ccbf99 abort: added support for merge
Taapas Agrawal <taapas2897@gmail.com>
parents: 42155
diff changeset
995 repo.ui.status(_("aborting the merge, updating back to"
3bc400ccbf99 abort: added support for merge
Taapas Agrawal <taapas2897@gmail.com>
parents: 42155
diff changeset
996 " %s\n") % node[:12])
42604
209f2b8a50dc abort: removed labels argument from abortmerge()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42600
diff changeset
997 stats = mergemod.update(repo, node, branchmerge=False, force=True)
42600
3bc400ccbf99 abort: added support for merge
Taapas Agrawal <taapas2897@gmail.com>
parents: 42155
diff changeset
998 _showstats(repo, stats)
3bc400ccbf99 abort: added support for merge
Taapas Agrawal <taapas2897@gmail.com>
parents: 42155
diff changeset
999 return stats.unresolvedcount > 0
3bc400ccbf99 abort: added support for merge
Taapas Agrawal <taapas2897@gmail.com>
parents: 42155
diff changeset
1000
12730
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
1001 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
1002 opts, buffered=False):
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
1003 """
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
1004 Helper for incoming / gincoming.
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
1005 displaychlist gets called with
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
1006 (remoterepo, incomingchangesetlist, displayer) parameters,
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
1007 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
1008 """
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
1009 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
1010 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
1011 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
1012 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
1013
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
1014 if revs:
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
1015 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
1016 other, chlist, cleanupfn = bundlerepo.getremotechanges(ui, repo, other,
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14156
diff changeset
1017 revs, opts["bundle"], opts["force"])
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14156
diff changeset
1018 try:
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14156
diff changeset
1019 if not chlist:
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14156
diff changeset
1020 ui.status(_("no changes found\n"))
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14156
diff changeset
1021 return subreporecurse()
31057
16d7db8f752c incoming: delay pager activation until right before printing changes
Augie Fackler <augie@google.com>
parents: 30963
diff changeset
1022 ui.pager('incoming')
36003
fcde8946c553 logcmdutil: hold makefilematcher/makehunksfilter() by changesetpriner (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35888
diff changeset
1023 displayer = logcmdutil.changesetdisplayer(ui, other, opts,
fcde8946c553 logcmdutil: hold makefilematcher/makehunksfilter() by changesetpriner (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35888
diff changeset
1024 buffered=buffered)
12730
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
1025 displaychlist(other, chlist, displayer)
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
1026 displayer.close()
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
1027 finally:
14161
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14156
diff changeset
1028 cleanupfn()
12730
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
1029 subreporecurse()
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
1030 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
1031
12273
e392d00ab5b0 incoming: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12271
diff changeset
1032 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
1033 def subreporecurse():
12400
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
1034 ret = 1
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
1035 if opts.get('subrepos'):
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
1036 ctx = repo[None]
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
1037 for subpath in sorted(ctx.substate):
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
1038 sub = ctx.sub(subpath)
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
1039 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
1040 return ret
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
1041
12730
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
1042 def display(other, chlist, displayer):
35888
c8e2d6ed1f9e cmdutil: drop aliases for logcmdutil functions (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35766
diff changeset
1043 limit = logcmdutil.getlimit(opts)
12273
e392d00ab5b0 incoming: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12271
diff changeset
1044 if opts.get('newest_first'):
12729
55f0648c7e2d incoming: rename variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12400
diff changeset
1045 chlist.reverse()
12273
e392d00ab5b0 incoming: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12271
diff changeset
1046 count = 0
12729
55f0648c7e2d incoming: rename variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12400
diff changeset
1047 for n in chlist:
12273
e392d00ab5b0 incoming: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12271
diff changeset
1048 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
1049 break
e392d00ab5b0 incoming: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12271
diff changeset
1050 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
1051 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
1052 continue
e392d00ab5b0 incoming: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12271
diff changeset
1053 count += 1
e392d00ab5b0 incoming: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12271
diff changeset
1054 displayer.show(other[n])
12730
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12729
diff changeset
1055 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
1056
12735
8888e56ac417 outgoing: unify common graphlog.outgoing and hg.outgoing code
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12734
diff changeset
1057 def _outgoing(ui, repo, dest, opts):
35438
0ebd94ac56d1 outgoing: respect ":pushurl" paths (issue5365)
Hollis Blanchard <hollis_blanchard@mentor.com>
parents: 35347
diff changeset
1058 path = ui.paths.getpath(dest, default=('default-push', 'default'))
0ebd94ac56d1 outgoing: respect ":pushurl" paths (issue5365)
Hollis Blanchard <hollis_blanchard@mentor.com>
parents: 35347
diff changeset
1059 if not path:
0ebd94ac56d1 outgoing: respect ":pushurl" paths (issue5365)
Hollis Blanchard <hollis_blanchard@mentor.com>
parents: 35347
diff changeset
1060 raise error.Abort(_('default repository not configured!'),
0ebd94ac56d1 outgoing: respect ":pushurl" paths (issue5365)
Hollis Blanchard <hollis_blanchard@mentor.com>
parents: 35347
diff changeset
1061 hint=_("see 'hg help config.paths'"))
0ebd94ac56d1 outgoing: respect ":pushurl" paths (issue5365)
Hollis Blanchard <hollis_blanchard@mentor.com>
parents: 35347
diff changeset
1062 dest = path.pushloc or path.loc
0ebd94ac56d1 outgoing: respect ":pushurl" paths (issue5365)
Hollis Blanchard <hollis_blanchard@mentor.com>
parents: 35347
diff changeset
1063 branches = path.branch, opts.get('branch') or []
0ebd94ac56d1 outgoing: respect ":pushurl" paths (issue5365)
Hollis Blanchard <hollis_blanchard@mentor.com>
parents: 35347
diff changeset
1064
14076
924c82157d46 url: move URL parsing functions into util to improve startup time
Brodie Rao <brodie@bitheap.org>
parents: 14073
diff changeset
1065 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
1066 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
1067 if revs:
37313
70c52800940b outgoing: avoid repo.lookup() for converting revnum to nodeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37262
diff changeset
1068 revs = [repo[rev].node() 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
1069
14556
517e1d88bf7e hg: change various repository() users to use peer() where appropriate
Matt Mackall <mpm@selenic.com>
parents: 14555
diff changeset
1070 other = peer(repo, opts, dest)
32172
448ed4d3ee90 outgoing: run on filtered repo
Martin von Zweigbergk <martinvonz@google.com>
parents: 31841
diff changeset
1071 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
1072 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
1073 o = outgoing.missing
12735
8888e56ac417 outgoing: unify common graphlog.outgoing and hg.outgoing code
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12734
diff changeset
1074 if not o:
17248
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17198
diff changeset
1075 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
1076 return o, other
12735
8888e56ac417 outgoing: unify common graphlog.outgoing and hg.outgoing code
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12734
diff changeset
1077
12271
01dc8ba3e032 outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12144
diff changeset
1078 def outgoing(ui, repo, dest, opts):
12400
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
1079 def recurse():
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
1080 ret = 1
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
1081 if opts.get('subrepos'):
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
1082 ctx = repo[None]
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
1083 for subpath in sorted(ctx.substate):
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
1084 sub = ctx.sub(subpath)
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
1085 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
1086 return ret
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
1087
35888
c8e2d6ed1f9e cmdutil: drop aliases for logcmdutil functions (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35766
diff changeset
1088 limit = logcmdutil.getlimit(opts)
21050
025ec0f08cb6 hg: make "_outgoing()" return peer object for remote repository
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21049
diff changeset
1089 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
1090 if not o:
21051
1004d3cd65fd outgoing: introduce "outgoinghooks" to avoid redundant outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21050
diff changeset
1091 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
1092 return recurse()
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
1093
12271
01dc8ba3e032 outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12144
diff changeset
1094 if opts.get('newest_first'):
01dc8ba3e032 outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12144
diff changeset
1095 o.reverse()
31058
d2ed0abce08e outgoing: avoid running pager until we're actually showing changes
Augie Fackler <augie@google.com>
parents: 31057
diff changeset
1096 ui.pager('outgoing')
35888
c8e2d6ed1f9e cmdutil: drop aliases for logcmdutil functions (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35766
diff changeset
1097 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
12271
01dc8ba3e032 outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12144
diff changeset
1098 count = 0
01dc8ba3e032 outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12144
diff changeset
1099 for n in o:
01dc8ba3e032 outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12144
diff changeset
1100 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
1101 break
01dc8ba3e032 outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12144
diff changeset
1102 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
1103 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
1104 continue
01dc8ba3e032 outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12144
diff changeset
1105 count += 1
01dc8ba3e032 outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12144
diff changeset
1106 displayer.show(repo[n])
01dc8ba3e032 outgoing: move code from commands to cmdutil
Martin Geisler <mg@lazybytes.net>
parents: 12144
diff changeset
1107 displayer.close()
21051
1004d3cd65fd outgoing: introduce "outgoinghooks" to avoid redundant outgoing check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21050
diff changeset
1108 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
1109 recurse()
40852b4b910c incoming/outgoing: Fix recursion on sub repositories
Erik Zielke <ez@aragost.com>
parents: 12314
diff changeset
1110 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
1111
42155
57539e5ea2e0 verify: introduce a notion of "level"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42109
diff changeset
1112 def verify(repo, level=None):
2778
fdc232d8a193 Move repo.verify
Matt Mackall <mpm@selenic.com>
parents: 2775
diff changeset
1113 """verify the consistency of a repository"""
42155
57539e5ea2e0 verify: introduce a notion of "level"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42109
diff changeset
1114 ret = verifymod.verify(repo, level=level)
25591
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1115
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1116 # 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
1117 # 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
1118 # concern.
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1119
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1120 # pathto() is needed for -R case
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1121 revs = repo.revs("filelog(%s)",
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1122 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
1123
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1124 if revs:
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1125 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
1126 for rev in revs:
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1127 ctx = repo[rev]
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1128 try:
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1129 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
1130 try:
92d37fb3f1aa verify: don't init subrepo when missing one is referenced (issue5128) (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 28655
diff changeset
1131 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
1132 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
1133 except error.RepoError as e:
37579
ce566e0f73d0 py3: use '%d' for integers instead of '%s'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 37481
diff changeset
1134 repo.ui.warn(('%d: %s\n') % (rev, e))
25591
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1135 except Exception:
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1136 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
1137 node.short(ctx.node()))
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1138
f1d46075b13a verify: check the subrepository references in .hgsubstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 25365
diff changeset
1139 return ret
11273
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1140
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1141 def remoteui(src, opts):
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1142 '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
1143 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
1144 dst = src.baseui.copy() # drop repo-specific config
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1145 src = src.ui # copy target options from repo
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1146 else: # assume it's a global ui object
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1147 dst = src.copy() # keep all global options
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1148
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1149 # copy ssh-specific options
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1150 for o in 'ssh', 'remotecmd':
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1151 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
1152 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
1153 dst.setconfig("ui", o, v, 'copied')
11273
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1154
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1155 # copy bundle-specific options
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1156 r = src.config('bundle', 'mainreporoot')
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1157 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
1158 dst.setconfig('bundle', 'mainreporoot', r, 'copied')
11273
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1159
13192
4d03707916d3 https: use web.cacerts configuration from local repo to validate remote repo
Mads Kiilerich <mads@kiilerich.com>
parents: 12735
diff changeset
1160 # 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
1161 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
1162 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
1163 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
1164 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
1165 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
1166 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
1167
d1908cb95a82 remoteui: move from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents: 11256
diff changeset
1168 return dst
26219
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1169
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1170 # Files of interest
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1171 # 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
1172 # these files.
26219
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1173 foi = [('spath', '00changelog.i'),
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1174 ('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
1175 ('spath', 'obsstore'),
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1176 ('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
1177 ]
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1178
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1179 class cachedlocalrepo(object):
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1180 """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
1181
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1182 def __init__(self, repo):
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1183 """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
1184
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1185 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
1186 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
1187 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
1188 """
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1189 assert isinstance(repo, localrepo.localrepository)
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1190 self._repo = repo
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1191 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
1192 self._filtername = repo.filtername
26219
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1193
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1194 def fetch(self):
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1195 """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
1196
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1197 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
1198 automatically and returned.
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1199
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1200 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
1201 repo instance was created.
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1202 """
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1203 # 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
1204 # 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
1205 # 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
1206 # 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
1207
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1208 state, mtime = self._repostate()
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1209 if state == self._state:
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1210 return self._repo, False
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1211
28119
91a827e760df hg: make cachedlocalrepo cache appropriate repoview object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28020
diff changeset
1212 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
1213 if self._filtername:
91a827e760df hg: make cachedlocalrepo cache appropriate repoview object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28020
diff changeset
1214 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
1215 else:
91a827e760df hg: make cachedlocalrepo cache appropriate repoview object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28020
diff changeset
1216 self._repo = repo.unfiltered()
26219
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1217 self._state = state
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1218 self.mtime = mtime
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1219
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1220 return self._repo, True
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1221
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1222 def _repostate(self):
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1223 state = []
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1224 maxmtime = -1
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1225 for attr, fname in foi:
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1226 prefix = getattr(self._repo, attr)
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1227 p = os.path.join(prefix, fname)
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1228 try:
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1229 st = os.stat(p)
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1230 except OSError:
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1231 st = os.stat(prefix)
36781
ffa3026d4196 cleanup: use stat_result[stat.ST_MTIME] instead of stat_result.st_mtime
Augie Fackler <augie@google.com>
parents: 36702
diff changeset
1232 state.append((st[stat.ST_MTIME], st.st_size))
ffa3026d4196 cleanup: use stat_result[stat.ST_MTIME] instead of stat_result.st_mtime
Augie Fackler <augie@google.com>
parents: 36702
diff changeset
1233 maxmtime = max(maxmtime, st[stat.ST_MTIME])
26219
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1234
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1235 return tuple(state), maxmtime
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1236
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1237 def copy(self):
26240
2b1434e5eaa0 hg: always create new localrepository instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26219
diff changeset
1238 """Obtain a copy of this class instance.
2b1434e5eaa0 hg: always create new localrepository instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26219
diff changeset
1239
2b1434e5eaa0 hg: always create new localrepository instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26219
diff changeset
1240 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
1241 completely independent of the original.
2b1434e5eaa0 hg: always create new localrepository instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26219
diff changeset
1242 """
2b1434e5eaa0 hg: always create new localrepository instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26219
diff changeset
1243 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
1244 if self._filtername:
91a827e760df hg: make cachedlocalrepo cache appropriate repoview object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28020
diff changeset
1245 repo = repo.filtered(self._filtername)
91a827e760df hg: make cachedlocalrepo cache appropriate repoview object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28020
diff changeset
1246 else:
91a827e760df hg: make cachedlocalrepo cache appropriate repoview object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28020
diff changeset
1247 repo = repo.unfiltered()
26240
2b1434e5eaa0 hg: always create new localrepository instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26219
diff changeset
1248 c = cachedlocalrepo(repo)
26219
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1249 c._state = self._state
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1250 c.mtime = self.mtime
ae33fff17c1e hg: establish a cache for localrepository instances
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26103
diff changeset
1251 return c