Mercurial > hg
annotate mercurial/hg.py @ 9469:7f0f882af23d
config: abort on indented non-continuation lines (issue1829)
Previously, as soon as a continuation would be met, "cont" would stay
forever set to True, but "item" was set back to "None".
This caused the continuation code bits to run every time, until the next
"self.get(section, item) + '\n'" which would crash.
author | Nicolas Dumazet <nicdumz.commits@gmail.com> |
---|---|
date | Sat, 12 Sep 2009 11:17:07 +0200 |
parents | 1444a42f6052 |
children | 6cfea6e4c892 |
rev | line source |
---|---|
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
1 # hg.py - repository classes for mercurial |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
2 # |
4635
63b9d2deed48
Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4478
diff
changeset
|
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com> |
2859 | 4 # Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com> |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
5 # |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8179
diff
changeset
|
6 # This software may be used and distributed according to the terms of the |
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8179
diff
changeset
|
7 # GNU General Public License version 2, incorporated herein by reference. |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
8 |
3891 | 9 from i18n import _ |
8109
496ae1ea4698
switch lock releasing in the core from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
7935
diff
changeset
|
10 from lock import release |
3877
abaee83ce0a6
Replace demandload with new demandimport
Matt Mackall <mpm@selenic.com>
parents:
3869
diff
changeset
|
11 import localrepo, bundlerepo, httprepo, sshrepo, statichttprepo |
8312
b87a50b7125c
separate import lines from mercurial and general python modules
Simon Heimberg <simohe@besonet.ch>
parents:
8225
diff
changeset
|
12 import lock, util, extensions, error |
3877
abaee83ce0a6
Replace demandload with new demandimport
Matt Mackall <mpm@selenic.com>
parents:
3869
diff
changeset
|
13 import merge as _merge |
abaee83ce0a6
Replace demandload with new demandimport
Matt Mackall <mpm@selenic.com>
parents:
3869
diff
changeset
|
14 import verify as _verify |
8312
b87a50b7125c
separate import lines from mercurial and general python modules
Simon Heimberg <simohe@besonet.ch>
parents:
8225
diff
changeset
|
15 import errno, os, shutil |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
16 |
2740
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2738
diff
changeset
|
17 def _local(path): |
3195
705e30c0a230
Make hg.repository work with no path argument
Brendan Cully <brendan@kublai.com>
parents:
3072
diff
changeset
|
18 return (os.path.isfile(util.drop_scheme('file', path)) and |
2768
b1b1aa6f275c
allow None for path of hg.repository
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2740
diff
changeset
|
19 bundlerepo or localrepo) |
2469
2e91ba371c4c
hg.repository: make protocol table driven.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2431
diff
changeset
|
20 |
6525
a020247d75e5
parseurl: make revs optional
Bryan O'Sullivan <bos@serpentine.com>
parents:
6524
diff
changeset
|
21 def parseurl(url, revs=[]): |
5177
92236732d5a1
move parseurl from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents:
4917
diff
changeset
|
22 '''parse url#branch, returning url, branch + revs''' |
92236732d5a1
move parseurl from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents:
4917
diff
changeset
|
23 |
92236732d5a1
move parseurl from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents:
4917
diff
changeset
|
24 if '#' not in url: |
7045
f82938c87b92
clone: honor -r even when pulling named branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7044
diff
changeset
|
25 return url, (revs or None), revs and revs[-1] or None |
5177
92236732d5a1
move parseurl from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents:
4917
diff
changeset
|
26 |
7045
f82938c87b92
clone: honor -r even when pulling named branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7044
diff
changeset
|
27 url, branch = url.split('#', 1) |
f82938c87b92
clone: honor -r even when pulling named branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7044
diff
changeset
|
28 checkout = revs and revs[-1] or branch |
8174
29bc5d18714a
hg: allow hg.parseurl(url, None)
Martijn Pieters <mj@zopatista.com>
parents:
8110
diff
changeset
|
29 return url, (revs or []) + [branch], checkout |
5177
92236732d5a1
move parseurl from cmdutil to hg
Matt Mackall <mpm@selenic.com>
parents:
4917
diff
changeset
|
30 |
2472
e6ec81a8feea
make repo scheme table driven.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2431
diff
changeset
|
31 schemes = { |
2740
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2738
diff
changeset
|
32 'bundle': bundlerepo, |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2738
diff
changeset
|
33 'file': _local, |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2738
diff
changeset
|
34 'http': httprepo, |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2738
diff
changeset
|
35 'https': httprepo, |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2738
diff
changeset
|
36 'ssh': sshrepo, |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2738
diff
changeset
|
37 'static-http': statichttprepo, |
4853
bf10a03a6b24
Removed deprecated hg:// and old-http:// protocols (issue406)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4818
diff
changeset
|
38 } |
2469
2e91ba371c4c
hg.repository: make protocol table driven.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2431
diff
changeset
|
39 |
2740
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2738
diff
changeset
|
40 def _lookup(path): |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2738
diff
changeset
|
41 scheme = 'file' |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2738
diff
changeset
|
42 if path: |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2738
diff
changeset
|
43 c = path.find(':') |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2738
diff
changeset
|
44 if c > 0: |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2738
diff
changeset
|
45 scheme = path[:c] |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2738
diff
changeset
|
46 thing = schemes.get(scheme) or schemes['file'] |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2738
diff
changeset
|
47 try: |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2738
diff
changeset
|
48 return thing(path) |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2738
diff
changeset
|
49 except TypeError: |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2738
diff
changeset
|
50 return thing |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
2774
diff
changeset
|
51 |
2719
532809ba1db5
hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2631
diff
changeset
|
52 def islocal(repo): |
532809ba1db5
hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2631
diff
changeset
|
53 '''return true if repo or path is local''' |
532809ba1db5
hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2631
diff
changeset
|
54 if isinstance(repo, str): |
2740
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2738
diff
changeset
|
55 try: |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2738
diff
changeset
|
56 return _lookup(repo).islocal(repo) |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2738
diff
changeset
|
57 except AttributeError: |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2738
diff
changeset
|
58 return False |
2719
532809ba1db5
hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2631
diff
changeset
|
59 return repo.local() |
532809ba1db5
hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2631
diff
changeset
|
60 |
3195
705e30c0a230
Make hg.repository work with no path argument
Brendan Cully <brendan@kublai.com>
parents:
3072
diff
changeset
|
61 def repository(ui, path='', create=False): |
2774 | 62 """return a repository object for the specified path""" |
2847
2ff57e3113a4
call reposetup functions of extension modules whenever repo created
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2830
diff
changeset
|
63 repo = _lookup(path).instance(ui, path, create) |
4074
0f9381cf9723
Try to pass repo.ui to reposetup hooks
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3869
diff
changeset
|
64 ui = getattr(repo, "ui", ui) |
5192
60acf1432ee0
Move cmdtable and reposetup handling out of extensions.py
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5187
diff
changeset
|
65 for name, module in extensions.extensions(): |
60acf1432ee0
Move cmdtable and reposetup handling out of extensions.py
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5187
diff
changeset
|
66 hook = getattr(module, 'reposetup', None) |
60acf1432ee0
Move cmdtable and reposetup handling out of extensions.py
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5187
diff
changeset
|
67 if hook: |
60acf1432ee0
Move cmdtable and reposetup handling out of extensions.py
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5187
diff
changeset
|
68 hook(ui, repo) |
2847
2ff57e3113a4
call reposetup functions of extension modules whenever repo created
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2830
diff
changeset
|
69 return repo |
2597
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
70 |
2719
532809ba1db5
hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2631
diff
changeset
|
71 def defaultdest(source): |
532809ba1db5
hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2631
diff
changeset
|
72 '''return default destination of clone if none is given''' |
532809ba1db5
hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2631
diff
changeset
|
73 return os.path.basename(os.path.normpath(source)) |
2774 | 74 |
6524
23ef198efce9
Hoist localpath to the top level
Bryan O'Sullivan <bos@serpentine.com>
parents:
6518
diff
changeset
|
75 def localpath(path): |
23ef198efce9
Hoist localpath to the top level
Bryan O'Sullivan <bos@serpentine.com>
parents:
6518
diff
changeset
|
76 if path.startswith('file://localhost/'): |
23ef198efce9
Hoist localpath to the top level
Bryan O'Sullivan <bos@serpentine.com>
parents:
6518
diff
changeset
|
77 return path[16:] |
23ef198efce9
Hoist localpath to the top level
Bryan O'Sullivan <bos@serpentine.com>
parents:
6518
diff
changeset
|
78 if path.startswith('file://'): |
23ef198efce9
Hoist localpath to the top level
Bryan O'Sullivan <bos@serpentine.com>
parents:
6518
diff
changeset
|
79 return path[7:] |
23ef198efce9
Hoist localpath to the top level
Bryan O'Sullivan <bos@serpentine.com>
parents:
6518
diff
changeset
|
80 if path.startswith('file:'): |
23ef198efce9
Hoist localpath to the top level
Bryan O'Sullivan <bos@serpentine.com>
parents:
6518
diff
changeset
|
81 return path[5:] |
23ef198efce9
Hoist localpath to the top level
Bryan O'Sullivan <bos@serpentine.com>
parents:
6518
diff
changeset
|
82 return path |
23ef198efce9
Hoist localpath to the top level
Bryan O'Sullivan <bos@serpentine.com>
parents:
6518
diff
changeset
|
83 |
8807
8bf6eb68ddaf
share: allow dest to default to the basename of source
Matt Mackall <mpm@selenic.com>
parents:
8800
diff
changeset
|
84 def share(ui, source, dest=None, update=True): |
8800
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
85 '''create a shared repository''' |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
86 |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
87 if not islocal(source): |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
88 raise util.Abort(_('can only share local repositories')) |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
89 |
8807
8bf6eb68ddaf
share: allow dest to default to the basename of source
Matt Mackall <mpm@selenic.com>
parents:
8800
diff
changeset
|
90 if not dest: |
8bf6eb68ddaf
share: allow dest to default to the basename of source
Matt Mackall <mpm@selenic.com>
parents:
8800
diff
changeset
|
91 dest = os.path.basename(source) |
9344 | 92 else: |
93 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
|
94 |
8800
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
95 if isinstance(source, str): |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
96 origsource = ui.expandpath(source) |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
97 source, rev, checkout = parseurl(origsource, '') |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
98 srcrepo = repository(ui, source) |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
99 else: |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
100 srcrepo = source |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
101 origsource = source = srcrepo.url() |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
102 checkout = None |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
103 |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
104 sharedpath = srcrepo.sharedpath # if our source is already sharing |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
105 |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
106 root = os.path.realpath(dest) |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
107 roothg = os.path.join(root, '.hg') |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
108 |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
109 if os.path.exists(roothg): |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
110 raise util.Abort(_('destination already exists')) |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
111 |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
112 if not os.path.isdir(root): |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
113 os.mkdir(root) |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
114 os.mkdir(roothg) |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
115 |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
116 requirements = '' |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
117 try: |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
118 requirements = srcrepo.opener('requires').read() |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
119 except IOError, inst: |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
120 if inst.errno != errno.ENOENT: |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
121 raise |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
122 |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
123 requirements += 'shared\n' |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
124 file(os.path.join(roothg, 'requires'), 'w').write(requirements) |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
125 file(os.path.join(roothg, 'sharedpath'), 'w').write(sharedpath) |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
126 |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
127 default = srcrepo.ui.config('paths', 'default') |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
128 if default: |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
129 f = file(os.path.join(roothg, 'hgrc'), 'w') |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
130 f.write('[paths]\ndefault = %s\n' % default) |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
131 f.close() |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
132 |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
133 r = repository(ui, root) |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
134 |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
135 if update: |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
136 r.ui.status(_("updating working directory\n")) |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
137 if update is not True: |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
138 checkout = update |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
139 for test in (checkout, 'default', 'tip'): |
9423
1444a42f6052
Make distinct lookup error for localrepo.lookup
Matt Mackall <mpm@selenic.com>
parents:
9344
diff
changeset
|
140 if test is None: |
1444a42f6052
Make distinct lookup error for localrepo.lookup
Matt Mackall <mpm@selenic.com>
parents:
9344
diff
changeset
|
141 continue |
8800
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
142 try: |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
143 uprev = r.lookup(test) |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
144 break |
9423
1444a42f6052
Make distinct lookup error for localrepo.lookup
Matt Mackall <mpm@selenic.com>
parents:
9344
diff
changeset
|
145 except error.RepoLookupError: |
8800
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
146 continue |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
147 _update(r, uprev) |
971e38a9344b
add helper function to create shared repos
Matt Mackall <mpm@selenic.com>
parents:
8649
diff
changeset
|
148 |
2613
479e26afa10f
clone: do not make streaming default. add --stream option instead.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2612
diff
changeset
|
149 def clone(ui, source, dest=None, pull=False, rev=None, update=True, |
479e26afa10f
clone: do not make streaming default. add --stream option instead.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2612
diff
changeset
|
150 stream=False): |
2597
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
151 """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
|
152 |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
153 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
|
154 source and destination are URLs, as passed to the repository |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
155 function. Returns a pair of repository objects, the source and |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
156 newly created destination. |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
157 |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
158 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
|
159 .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
|
160 pushes. |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
161 |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
162 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
|
163 repository will be deleted. |
2600
c4325f0a9b91
clean up trailing white space.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2597
diff
changeset
|
164 |
2719
532809ba1db5
hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2631
diff
changeset
|
165 Arguments: |
532809ba1db5
hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2631
diff
changeset
|
166 |
532809ba1db5
hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2631
diff
changeset
|
167 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
|
168 |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
169 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
|
170 name of source repository) |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
171 |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
172 pull: always pull from source repository, even in local case |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
173 |
2621
5a5852a417b1
clone: disable stream support on server side by default.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2613
diff
changeset
|
174 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
|
175 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
|
176 |
2597
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
177 rev: revision to clone up to (implies pull=True) |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
178 |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
179 update: update working directory after clone completes, if |
6526
cfeeac24fc1e
repo: add rjoin method
Bryan O'Sullivan <bos@serpentine.com>
parents:
6525
diff
changeset
|
180 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
|
181 anything else is treated as a revision) |
2597
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
182 """ |
4478
b2b55acbacdd
Add support for url#id syntax
Matt Mackall <mpm@selenic.com>
parents:
4477
diff
changeset
|
183 |
2719
532809ba1db5
hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2631
diff
changeset
|
184 if isinstance(source, str): |
6089
28054773438c
clone: make things work when source is a repo object
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6088
diff
changeset
|
185 origsource = ui.expandpath(source) |
28054773438c
clone: make things work when source is a repo object
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6088
diff
changeset
|
186 source, rev, checkout = parseurl(origsource, rev) |
2719
532809ba1db5
hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2631
diff
changeset
|
187 src_repo = repository(ui, source) |
532809ba1db5
hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2631
diff
changeset
|
188 else: |
532809ba1db5
hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2631
diff
changeset
|
189 src_repo = source |
6089
28054773438c
clone: make things work when source is a repo object
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6088
diff
changeset
|
190 origsource = source = src_repo.url() |
7045
f82938c87b92
clone: honor -r even when pulling named branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7044
diff
changeset
|
191 checkout = rev and rev[-1] or None |
2719
532809ba1db5
hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2631
diff
changeset
|
192 |
2597
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
193 if dest is None: |
2719
532809ba1db5
hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2631
diff
changeset
|
194 dest = defaultdest(source) |
3841
aaeb7f5d1052
Show the destionation for clone if not specified manually.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3791
diff
changeset
|
195 ui.status(_("destination directory: %s\n") % dest) |
9344 | 196 else: |
197 dest = ui.expandpath(dest) | |
2719
532809ba1db5
hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2631
diff
changeset
|
198 |
532809ba1db5
hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2631
diff
changeset
|
199 dest = localpath(dest) |
532809ba1db5
hg.py: add islocal() and defaultdest() functions, refactor
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2631
diff
changeset
|
200 source = localpath(source) |
2597
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
201 |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
202 if os.path.exists(dest): |
7927
a218ba5f60df
allow clone into existing but empty directories
Steve Borho <steve@borho.org>
parents:
7821
diff
changeset
|
203 if not os.path.isdir(dest): |
a218ba5f60df
allow clone into existing but empty directories
Steve Borho <steve@borho.org>
parents:
7821
diff
changeset
|
204 raise util.Abort(_("destination '%s' already exists") % dest) |
a218ba5f60df
allow clone into existing but empty directories
Steve Borho <steve@borho.org>
parents:
7821
diff
changeset
|
205 elif os.listdir(dest): |
a218ba5f60df
allow clone into existing but empty directories
Steve Borho <steve@borho.org>
parents:
7821
diff
changeset
|
206 raise util.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
|
207 |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
208 class DirCleanup(object): |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
209 def __init__(self, dir_): |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
210 self.rmtree = shutil.rmtree |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
211 self.dir_ = dir_ |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
212 def close(self): |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
213 self.dir_ = None |
8110
b616f328af9f
switch dircleanup in mercurial.hg.clone from gc based to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
8109
diff
changeset
|
214 def cleanup(self): |
2597
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
215 if self.dir_: |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
216 self.rmtree(self.dir_, True) |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
217 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
218 src_lock = dest_lock = dir_cleanup = None |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
219 try: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
220 if islocal(dest): |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
221 dir_cleanup = DirCleanup(dest) |
2597
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
222 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
223 abspath = origsource |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
224 copy = False |
6315 | 225 if src_repo.cancopy() and islocal(dest): |
5248 | 226 abspath = os.path.abspath(util.drop_scheme('file', origsource)) |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
227 copy = not pull and not rev |
2597
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
228 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
229 if copy: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
230 try: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
231 # 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
|
232 # 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
|
233 # 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
|
234 # fail |
8649
2c097e22492c
clone: fall back to pull source repo cannot be locked, 937ee88da3ef was a noop
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8417
diff
changeset
|
235 src_lock = src_repo.lock(wait=False) |
7640 | 236 except error.LockError: |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
237 copy = False |
2597
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
238 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
239 if copy: |
8907
e9ef409e6399
Add (pre)outgoing hooks for local clones.
Fred Wulff <frew@cs.stanford.edu>
parents:
8814
diff
changeset
|
240 src_repo.hook('preoutgoing', throw=True, source='clone') |
7935
39566bb99a9c
on clone failure, only remove directories we created
Steve Borho <steve@borho.org>
parents:
7927
diff
changeset
|
241 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
|
242 if not os.path.exists(dest): |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
243 os.mkdir(dest) |
7935
39566bb99a9c
on clone failure, only remove directories we created
Steve Borho <steve@borho.org>
parents:
7927
diff
changeset
|
244 else: |
39566bb99a9c
on clone failure, only remove directories we created
Steve Borho <steve@borho.org>
parents:
7927
diff
changeset
|
245 # only clean up directories we create ourselves |
39566bb99a9c
on clone failure, only remove directories we created
Steve Borho <steve@borho.org>
parents:
7927
diff
changeset
|
246 dir_cleanup.dir_ = hgdir |
5569
9e209193f18d
clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents:
5277
diff
changeset
|
247 try: |
7935
39566bb99a9c
on clone failure, only remove directories we created
Steve Borho <steve@borho.org>
parents:
7927
diff
changeset
|
248 dest_path = hgdir |
5569
9e209193f18d
clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents:
5277
diff
changeset
|
249 os.mkdir(dest_path) |
9e209193f18d
clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents:
5277
diff
changeset
|
250 except OSError, inst: |
9e209193f18d
clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents:
5277
diff
changeset
|
251 if inst.errno == errno.EEXIST: |
9e209193f18d
clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents:
5277
diff
changeset
|
252 dir_cleanup.close() |
9e209193f18d
clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents:
5277
diff
changeset
|
253 raise util.Abort(_("destination '%s' already exists") |
9e209193f18d
clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents:
5277
diff
changeset
|
254 % dest) |
9e209193f18d
clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents:
5277
diff
changeset
|
255 raise |
2597
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
256 |
6903
0642d9d7ec80
clone: get a list of files to clone from store
Matt Mackall <mpm@selenic.com>
parents:
6526
diff
changeset
|
257 for f in src_repo.store.copylist(): |
0642d9d7ec80
clone: get a list of files to clone from store
Matt Mackall <mpm@selenic.com>
parents:
6526
diff
changeset
|
258 src = os.path.join(src_repo.path, f) |
6944
7e5f3480c45b
fix regression on empty repo cloning introduced by 0642d9d7ec80
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6903
diff
changeset
|
259 dst = os.path.join(dest_path, f) |
7e5f3480c45b
fix regression on empty repo cloning introduced by 0642d9d7ec80
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6903
diff
changeset
|
260 dstbase = os.path.dirname(dst) |
7e5f3480c45b
fix regression on empty repo cloning introduced by 0642d9d7ec80
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6903
diff
changeset
|
261 if dstbase and not os.path.exists(dstbase): |
7e5f3480c45b
fix regression on empty repo cloning introduced by 0642d9d7ec80
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6903
diff
changeset
|
262 os.mkdir(dstbase) |
6903
0642d9d7ec80
clone: get a list of files to clone from store
Matt Mackall <mpm@selenic.com>
parents:
6526
diff
changeset
|
263 if os.path.exists(src): |
0642d9d7ec80
clone: get a list of files to clone from store
Matt Mackall <mpm@selenic.com>
parents:
6526
diff
changeset
|
264 if dst.endswith('data'): |
0642d9d7ec80
clone: get a list of files to clone from store
Matt Mackall <mpm@selenic.com>
parents:
6526
diff
changeset
|
265 # lock to avoid premature writing to the target |
0642d9d7ec80
clone: get a list of files to clone from store
Matt Mackall <mpm@selenic.com>
parents:
6526
diff
changeset
|
266 dest_lock = lock.lock(os.path.join(dstbase, "lock")) |
0642d9d7ec80
clone: get a list of files to clone from store
Matt Mackall <mpm@selenic.com>
parents:
6526
diff
changeset
|
267 util.copyfiles(src, dst) |
2597
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
268 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
269 # 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
|
270 # into it |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
271 dest_repo = repository(ui, dest) |
8907
e9ef409e6399
Add (pre)outgoing hooks for local clones.
Fred Wulff <frew@cs.stanford.edu>
parents:
8814
diff
changeset
|
272 src_repo.hook('outgoing', source='clone', node='0'*40) |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
273 else: |
5569
9e209193f18d
clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents:
5277
diff
changeset
|
274 try: |
9e209193f18d
clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents:
5277
diff
changeset
|
275 dest_repo = repository(ui, dest, create=True) |
9e209193f18d
clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents:
5277
diff
changeset
|
276 except OSError, inst: |
9e209193f18d
clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents:
5277
diff
changeset
|
277 if inst.errno == errno.EEXIST: |
9e209193f18d
clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents:
5277
diff
changeset
|
278 dir_cleanup.close() |
9e209193f18d
clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents:
5277
diff
changeset
|
279 raise util.Abort(_("destination '%s' already exists") |
9e209193f18d
clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents:
5277
diff
changeset
|
280 % dest) |
9e209193f18d
clone: fix race with same target directory (issue716)
Matt Mackall <mpm@selenic.com>
parents:
5277
diff
changeset
|
281 raise |
2597
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
282 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
283 revs = None |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
284 if rev: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
285 if 'lookup' not in src_repo.capabilities: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
286 raise util.Abort(_("src repository does not support revision " |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
287 "lookup and so doesn't support clone by " |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
288 "revision")) |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
289 revs = [src_repo.lookup(r) for r in rev] |
8417
39cf453da958
clone: try updating to the actual changeset specified in options
Brett Carter <brett@rdnzl.net>
parents:
8312
diff
changeset
|
290 checkout = revs[0] |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
291 if dest_repo.local(): |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
292 dest_repo.clone(src_repo, heads=revs, stream=stream) |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
293 elif src_repo.local(): |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
294 src_repo.push(dest_repo, revs=revs) |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
295 else: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
296 raise util.Abort(_("clone from remote to remote not supported")) |
2597
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
297 |
5186 | 298 if dir_cleanup: |
299 dir_cleanup.close() | |
2597
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
300 |
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
301 if dest_repo.local(): |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
302 fp = dest_repo.opener("hgrc", "w", text=True) |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
303 fp.write("[paths]\n") |
8179
0f3b8404051b
clone: config escaping no longer needed
Matt Mackall <mpm@selenic.com>
parents:
8174
diff
changeset
|
304 fp.write("default = %s\n" % abspath) |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
305 fp.close() |
5185
156f4c8a12aa
clone: do not delete the target if only the update fails
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
4635
diff
changeset
|
306 |
8814
ab668c92a036
subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents:
8807
diff
changeset
|
307 dest_repo.ui.setconfig('paths', 'default', abspath) |
ab668c92a036
subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents:
8807
diff
changeset
|
308 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
309 if update: |
6338
0750f11152fe
clone: print "updating working directory" status message
Adrian Buehlmann <adrian@cadifra.com>
parents:
6315
diff
changeset
|
310 dest_repo.ui.status(_("updating working directory\n")) |
6526
cfeeac24fc1e
repo: add rjoin method
Bryan O'Sullivan <bos@serpentine.com>
parents:
6525
diff
changeset
|
311 if update is not True: |
cfeeac24fc1e
repo: add rjoin method
Bryan O'Sullivan <bos@serpentine.com>
parents:
6525
diff
changeset
|
312 checkout = update |
7045
f82938c87b92
clone: honor -r even when pulling named branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7044
diff
changeset
|
313 for test in (checkout, 'default', 'tip'): |
9423
1444a42f6052
Make distinct lookup error for localrepo.lookup
Matt Mackall <mpm@selenic.com>
parents:
9344
diff
changeset
|
314 if test is None: |
1444a42f6052
Make distinct lookup error for localrepo.lookup
Matt Mackall <mpm@selenic.com>
parents:
9344
diff
changeset
|
315 continue |
5248 | 316 try: |
7045
f82938c87b92
clone: honor -r even when pulling named branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7044
diff
changeset
|
317 uprev = dest_repo.lookup(test) |
f82938c87b92
clone: honor -r even when pulling named branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7044
diff
changeset
|
318 break |
9423
1444a42f6052
Make distinct lookup error for localrepo.lookup
Matt Mackall <mpm@selenic.com>
parents:
9344
diff
changeset
|
319 except error.RepoLookupError: |
7045
f82938c87b92
clone: honor -r even when pulling named branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7044
diff
changeset
|
320 continue |
f82938c87b92
clone: honor -r even when pulling named branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7044
diff
changeset
|
321 _update(dest_repo, uprev) |
2597
5ba8be56fa8f
clone: move code into hg module. make doc better.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2595
diff
changeset
|
322 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
323 return src_repo, dest_repo |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4853
diff
changeset
|
324 finally: |
8109
496ae1ea4698
switch lock releasing in the core from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
7935
diff
changeset
|
325 release(src_lock, dest_lock) |
8110
b616f328af9f
switch dircleanup in mercurial.hg.clone from gc based to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
8109
diff
changeset
|
326 if dir_cleanup is not None: |
b616f328af9f
switch dircleanup in mercurial.hg.clone from gc based to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
8109
diff
changeset
|
327 dir_cleanup.cleanup() |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
2774
diff
changeset
|
328 |
3316
39fd6e82ea38
merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents:
3195
diff
changeset
|
329 def _showstats(repo, stats): |
39fd6e82ea38
merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents:
3195
diff
changeset
|
330 stats = ((stats[0], _("updated")), |
39fd6e82ea38
merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents:
3195
diff
changeset
|
331 (stats[1], _("merged")), |
39fd6e82ea38
merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents:
3195
diff
changeset
|
332 (stats[2], _("removed")), |
39fd6e82ea38
merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents:
3195
diff
changeset
|
333 (stats[3], _("unresolved"))) |
39fd6e82ea38
merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents:
3195
diff
changeset
|
334 note = ", ".join([_("%d files %s") % s for s in stats]) |
39fd6e82ea38
merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents:
3195
diff
changeset
|
335 repo.ui.status("%s\n" % note) |
39fd6e82ea38
merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents:
3195
diff
changeset
|
336 |
2808
30f59f4a327e
Introduce update helper functions: update, merge, clean, and revert
Matt Mackall <mpm@selenic.com>
parents:
2778
diff
changeset
|
337 def update(repo, node): |
30f59f4a327e
Introduce update helper functions: update, merge, clean, and revert
Matt Mackall <mpm@selenic.com>
parents:
2778
diff
changeset
|
338 """update the working directory to node, merging linear changes""" |
4917
126f527b3ba3
Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents:
4915
diff
changeset
|
339 stats = _merge.update(repo, node, False, False, None) |
3316
39fd6e82ea38
merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents:
3195
diff
changeset
|
340 _showstats(repo, stats) |
39fd6e82ea38
merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents:
3195
diff
changeset
|
341 if stats[3]: |
6518 | 342 repo.ui.status(_("use 'hg resolve' to retry unresolved file merges\n")) |
5635
0c608a8d9c5f
merge: make return codes more sensible
Matt Mackall <mpm@selenic.com>
parents:
5569
diff
changeset
|
343 return stats[3] > 0 |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
2774
diff
changeset
|
344 |
7546
c7f48414f3ad
add a comment about the need of hg._update()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7280
diff
changeset
|
345 # 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
|
346 _update = update |
c7f48414f3ad
add a comment about the need of hg._update()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7280
diff
changeset
|
347 |
4917
126f527b3ba3
Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents:
4915
diff
changeset
|
348 def clean(repo, node, show_stats=True): |
2808
30f59f4a327e
Introduce update helper functions: update, merge, clean, and revert
Matt Mackall <mpm@selenic.com>
parents:
2778
diff
changeset
|
349 """forcibly switch the working directory to node, clobbering changes""" |
4917
126f527b3ba3
Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents:
4915
diff
changeset
|
350 stats = _merge.update(repo, node, False, True, None) |
3316
39fd6e82ea38
merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents:
3195
diff
changeset
|
351 if show_stats: _showstats(repo, stats) |
5635
0c608a8d9c5f
merge: make return codes more sensible
Matt Mackall <mpm@selenic.com>
parents:
5569
diff
changeset
|
352 return stats[3] > 0 |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
2774
diff
changeset
|
353 |
4917
126f527b3ba3
Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents:
4915
diff
changeset
|
354 def merge(repo, node, force=None, remind=True): |
2808
30f59f4a327e
Introduce update helper functions: update, merge, clean, and revert
Matt Mackall <mpm@selenic.com>
parents:
2778
diff
changeset
|
355 """branch merge with node, resolving changes""" |
4917
126f527b3ba3
Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents:
4915
diff
changeset
|
356 stats = _merge.update(repo, node, True, force, False) |
3316
39fd6e82ea38
merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents:
3195
diff
changeset
|
357 _showstats(repo, stats) |
39fd6e82ea38
merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents:
3195
diff
changeset
|
358 if stats[3]: |
7821
9fe7e6acf525
merge: better error messages to lead users to hg update --clean to abandon merges.
Augie Fackler <durin42@gmail.com>
parents:
7640
diff
changeset
|
359 repo.ui.status(_("use 'hg resolve' to retry unresolved file merges " |
9fe7e6acf525
merge: better error messages to lead users to hg update --clean to abandon merges.
Augie Fackler <durin42@gmail.com>
parents:
7640
diff
changeset
|
360 "or 'hg up --clean' to abandon\n")) |
3316
39fd6e82ea38
merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents:
3195
diff
changeset
|
361 elif remind: |
39fd6e82ea38
merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents:
3195
diff
changeset
|
362 repo.ui.status(_("(branch merge, don't forget to commit)\n")) |
5635
0c608a8d9c5f
merge: make return codes more sensible
Matt Mackall <mpm@selenic.com>
parents:
5569
diff
changeset
|
363 return stats[3] > 0 |
2808
30f59f4a327e
Introduce update helper functions: update, merge, clean, and revert
Matt Mackall <mpm@selenic.com>
parents:
2778
diff
changeset
|
364 |
4917
126f527b3ba3
Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents:
4915
diff
changeset
|
365 def revert(repo, node, choose): |
2808
30f59f4a327e
Introduce update helper functions: update, merge, clean, and revert
Matt Mackall <mpm@selenic.com>
parents:
2778
diff
changeset
|
366 """revert changes to revision in node without updating dirstate""" |
5635
0c608a8d9c5f
merge: make return codes more sensible
Matt Mackall <mpm@selenic.com>
parents:
5569
diff
changeset
|
367 return _merge.update(repo, node, False, True, choose)[3] > 0 |
2778 | 368 |
369 def verify(repo): | |
370 """verify the consistency of a repository""" | |
371 return _verify.verify(repo) |