Mercurial > hg > mercurial-crew-with-dirclash
annotate mercurial/localrepo.py @ 5331:8ee5b8129e7b
hgweb: don't raise an exception when displying empty repos
The nullid node claims it's in the default branch, but the branch dict
is empty. This fixes the main symptom from issue696, but we may want
to set branchtags()['default'] = nullid somewhere for empty repos.
author | Alexis S. L. Carvalho <alexis@cecm.usp.br> |
---|---|
date | Mon, 24 Sep 2007 19:00:11 -0300 |
parents | ef65d6ec114e |
children | 46455285c6b5 |
rev | line source |
---|---|
1089 | 1 # localrepo.py - read/write repository class for mercurial |
0
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:
4633
diff
changeset
|
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com> |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
4 # |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
5 # This software may be used and distributed according to the terms |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
6 # of the GNU General Public License, incorporated herein by reference. |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
7 |
1100 | 8 from node import * |
3893 | 9 from i18n import _ |
4270
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
10 import repo, changegroup |
3886
abaee83ce0a6
Replace demandload with new demandimport
Matt Mackall <mpm@selenic.com>
parents:
3885
diff
changeset
|
11 import changelog, dirstate, filelog, manifest, context |
abaee83ce0a6
Replace demandload with new demandimport
Matt Mackall <mpm@selenic.com>
parents:
3885
diff
changeset
|
12 import re, lock, transaction, tempfile, stat, mdiff, errno, ui |
4623
fff50306e6dd
hooks: separate hook code into a separate module
Matt Mackall <mpm@selenic.com>
parents:
4620
diff
changeset
|
13 import os, revlog, time, util, extensions, hook |
499 | 14 |
2612
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2601
diff
changeset
|
15 class localrepository(repo.repository): |
3448
6ca49c5fe268
Stop erroring out pull -r and clone -r if repository isn't local.
Eric Hopper <hopper@omnifarious.org>
parents:
3443
diff
changeset
|
16 capabilities = ('lookup', 'changegroupsubset') |
3853
c0b449154a90
switch to the .hg/store layout, fix the tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3851
diff
changeset
|
17 supported = ('revlogv1', 'store') |
2439
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
18 |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
19 def __del__(self): |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
20 self.transhandle = None |
1839
876e4e6ad82b
Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1838
diff
changeset
|
21 def __init__(self, parentui, path=None, create=0): |
2612
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2601
diff
changeset
|
22 repo.repository.__init__(self) |
4555
1843d31bfdbf
localrepo: don't search from path
Matt Mackall <mpm@selenic.com>
parents:
4541
diff
changeset
|
23 self.path = path |
3850
a4457828ca1a
move code around
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3797
diff
changeset
|
24 self.root = os.path.realpath(path) |
4171
7b5723c95a82
Save an absolute path in repo.path
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4168
diff
changeset
|
25 self.path = os.path.join(self.root, ".hg") |
3850
a4457828ca1a
move code around
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3797
diff
changeset
|
26 self.origroot = path |
a4457828ca1a
move code around
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3797
diff
changeset
|
27 self.opener = util.opener(self.path) |
a4457828ca1a
move code around
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3797
diff
changeset
|
28 self.wopener = util.opener(self.root) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
29 |
3032
4d0e0f149581
localrepo: move the repo creation code, fail if the repo exists
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3016
diff
changeset
|
30 if not os.path.isdir(self.path): |
4d0e0f149581
localrepo: move the repo creation code, fail if the repo exists
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3016
diff
changeset
|
31 if create: |
4d0e0f149581
localrepo: move the repo creation code, fail if the repo exists
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3016
diff
changeset
|
32 if not os.path.exists(path): |
4d0e0f149581
localrepo: move the repo creation code, fail if the repo exists
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3016
diff
changeset
|
33 os.mkdir(path) |
4d0e0f149581
localrepo: move the repo creation code, fail if the repo exists
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3016
diff
changeset
|
34 os.mkdir(self.path) |
4166
c0271aba6abe
small fixes for the parent patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4164
diff
changeset
|
35 requirements = ["revlogv1"] |
c0271aba6abe
small fixes for the parent patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4164
diff
changeset
|
36 if parentui.configbool('format', 'usestore', True): |
4164
fe41d9a186ab
Allow disabling store format to work with absurdly long filenames
Matt Mackall <mpm@selenic.com>
parents:
4161
diff
changeset
|
37 os.mkdir(os.path.join(self.path, "store")) |
4166
c0271aba6abe
small fixes for the parent patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4164
diff
changeset
|
38 requirements.append("store") |
c0271aba6abe
small fixes for the parent patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4164
diff
changeset
|
39 # create an invalid changelog |
c0271aba6abe
small fixes for the parent patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4164
diff
changeset
|
40 self.opener("00changelog.i", "a").write( |
c0271aba6abe
small fixes for the parent patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4164
diff
changeset
|
41 '\0\0\0\2' # represents revlogv2 |
c0271aba6abe
small fixes for the parent patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4164
diff
changeset
|
42 ' dummy changelog to prevent using the old repo layout' |
c0271aba6abe
small fixes for the parent patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4164
diff
changeset
|
43 ) |
3851
8f18e31c4441
add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3850
diff
changeset
|
44 reqfile = self.opener("requires", "w") |
8f18e31c4441
add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3850
diff
changeset
|
45 for r in requirements: |
8f18e31c4441
add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3850
diff
changeset
|
46 reqfile.write("%s\n" % r) |
8f18e31c4441
add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3850
diff
changeset
|
47 reqfile.close() |
3032
4d0e0f149581
localrepo: move the repo creation code, fail if the repo exists
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3016
diff
changeset
|
48 else: |
4d0e0f149581
localrepo: move the repo creation code, fail if the repo exists
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3016
diff
changeset
|
49 raise repo.RepoError(_("repository %s not found") % path) |
4d0e0f149581
localrepo: move the repo creation code, fail if the repo exists
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3016
diff
changeset
|
50 elif create: |
4d0e0f149581
localrepo: move the repo creation code, fail if the repo exists
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3016
diff
changeset
|
51 raise repo.RepoError(_("repository %s already exists") % path) |
3851
8f18e31c4441
add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3850
diff
changeset
|
52 else: |
8f18e31c4441
add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3850
diff
changeset
|
53 # find requirements |
8f18e31c4441
add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3850
diff
changeset
|
54 try: |
8f18e31c4441
add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3850
diff
changeset
|
55 requirements = self.opener("requires").read().splitlines() |
8f18e31c4441
add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3850
diff
changeset
|
56 except IOError, inst: |
8f18e31c4441
add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3850
diff
changeset
|
57 if inst.errno != errno.ENOENT: |
8f18e31c4441
add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3850
diff
changeset
|
58 raise |
8f18e31c4441
add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3850
diff
changeset
|
59 requirements = [] |
8f18e31c4441
add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3850
diff
changeset
|
60 # check them |
8f18e31c4441
add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3850
diff
changeset
|
61 for r in requirements: |
8f18e31c4441
add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3850
diff
changeset
|
62 if r not in self.supported: |
8f18e31c4441
add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3850
diff
changeset
|
63 raise repo.RepoError(_("requirement '%s' not supported") % r) |
405 | 64 |
3850
a4457828ca1a
move code around
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3797
diff
changeset
|
65 # setup store |
3853
c0b449154a90
switch to the .hg/store layout, fix the tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3851
diff
changeset
|
66 if "store" in requirements: |
c0b449154a90
switch to the .hg/store layout, fix the tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3851
diff
changeset
|
67 self.encodefn = util.encodefilename |
c0b449154a90
switch to the .hg/store layout, fix the tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3851
diff
changeset
|
68 self.decodefn = util.decodefilename |
c0b449154a90
switch to the .hg/store layout, fix the tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3851
diff
changeset
|
69 self.spath = os.path.join(self.path, "store") |
c0b449154a90
switch to the .hg/store layout, fix the tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3851
diff
changeset
|
70 else: |
c0b449154a90
switch to the .hg/store layout, fix the tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3851
diff
changeset
|
71 self.encodefn = lambda x: x |
c0b449154a90
switch to the .hg/store layout, fix the tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3851
diff
changeset
|
72 self.decodefn = lambda x: x |
c0b449154a90
switch to the .hg/store layout, fix the tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3851
diff
changeset
|
73 self.spath = self.path |
c0b449154a90
switch to the .hg/store layout, fix the tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3851
diff
changeset
|
74 self.sopener = util.encodedopener(util.opener(self.spath), self.encodefn) |
3850
a4457828ca1a
move code around
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3797
diff
changeset
|
75 |
1839
876e4e6ad82b
Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1838
diff
changeset
|
76 self.ui = ui.ui(parentui=parentui) |
2072 | 77 try: |
78 self.ui.readconfig(self.join("hgrc"), self.root) | |
4619
7c8f8b736365
extensions: kill ui readhooks
Matt Mackall <mpm@selenic.com>
parents:
4614
diff
changeset
|
79 extensions.loadall(self.ui) |
2072 | 80 except IOError: |
81 pass | |
82 | |
343 | 83 self.tagscache = None |
3432
028fff46a4ac
Add branchtags function with cache
Matt Mackall <mpm@selenic.com>
parents:
3375
diff
changeset
|
84 self.branchcache = None |
343 | 85 self.nodetagscache = None |
4004
c83c35f2f4e2
unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents:
4003
diff
changeset
|
86 self.filterpats = {} |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
87 self.transhandle = None |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
88 |
4580
eda59019dc69
localrepo: demand-load changeset, manifest, and dirstate
Matt Mackall <mpm@selenic.com>
parents:
4556
diff
changeset
|
89 def __getattr__(self, name): |
eda59019dc69
localrepo: demand-load changeset, manifest, and dirstate
Matt Mackall <mpm@selenic.com>
parents:
4556
diff
changeset
|
90 if name == 'changelog': |
eda59019dc69
localrepo: demand-load changeset, manifest, and dirstate
Matt Mackall <mpm@selenic.com>
parents:
4556
diff
changeset
|
91 self.changelog = changelog.changelog(self.sopener) |
eda59019dc69
localrepo: demand-load changeset, manifest, and dirstate
Matt Mackall <mpm@selenic.com>
parents:
4556
diff
changeset
|
92 self.sopener.defversion = self.changelog.version |
eda59019dc69
localrepo: demand-load changeset, manifest, and dirstate
Matt Mackall <mpm@selenic.com>
parents:
4556
diff
changeset
|
93 return self.changelog |
eda59019dc69
localrepo: demand-load changeset, manifest, and dirstate
Matt Mackall <mpm@selenic.com>
parents:
4556
diff
changeset
|
94 if name == 'manifest': |
eda59019dc69
localrepo: demand-load changeset, manifest, and dirstate
Matt Mackall <mpm@selenic.com>
parents:
4556
diff
changeset
|
95 self.changelog |
eda59019dc69
localrepo: demand-load changeset, manifest, and dirstate
Matt Mackall <mpm@selenic.com>
parents:
4556
diff
changeset
|
96 self.manifest = manifest.manifest(self.sopener) |
eda59019dc69
localrepo: demand-load changeset, manifest, and dirstate
Matt Mackall <mpm@selenic.com>
parents:
4556
diff
changeset
|
97 return self.manifest |
eda59019dc69
localrepo: demand-load changeset, manifest, and dirstate
Matt Mackall <mpm@selenic.com>
parents:
4556
diff
changeset
|
98 if name == 'dirstate': |
eda59019dc69
localrepo: demand-load changeset, manifest, and dirstate
Matt Mackall <mpm@selenic.com>
parents:
4556
diff
changeset
|
99 self.dirstate = dirstate.dirstate(self.opener, self.ui, self.root) |
eda59019dc69
localrepo: demand-load changeset, manifest, and dirstate
Matt Mackall <mpm@selenic.com>
parents:
4556
diff
changeset
|
100 return self.dirstate |
eda59019dc69
localrepo: demand-load changeset, manifest, and dirstate
Matt Mackall <mpm@selenic.com>
parents:
4556
diff
changeset
|
101 else: |
eda59019dc69
localrepo: demand-load changeset, manifest, and dirstate
Matt Mackall <mpm@selenic.com>
parents:
4556
diff
changeset
|
102 raise AttributeError, name |
2155
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
103 |
2673
109a22f5434a
hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2661
diff
changeset
|
104 def url(self): |
109a22f5434a
hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2661
diff
changeset
|
105 return 'file:' + self.root |
109a22f5434a
hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2661
diff
changeset
|
106 |
1718
c1996b84d4f5
make hook code nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1717
diff
changeset
|
107 def hook(self, name, throw=False, **args): |
4623
fff50306e6dd
hooks: separate hook code into a separate module
Matt Mackall <mpm@selenic.com>
parents:
4620
diff
changeset
|
108 return hook.hook(self.ui, self, name, throw, **args) |
487 | 109 |
2601
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2581
diff
changeset
|
110 tag_disallowed = ':\r\n' |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2581
diff
changeset
|
111 |
4116
35b39097c3e6
Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents:
4070
diff
changeset
|
112 def _tag(self, name, node, message, local, user, date, parent=None): |
35b39097c3e6
Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents:
4070
diff
changeset
|
113 use_dirstate = parent is None |
35b39097c3e6
Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents:
4070
diff
changeset
|
114 |
35b39097c3e6
Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents:
4070
diff
changeset
|
115 for c in self.tag_disallowed: |
35b39097c3e6
Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents:
4070
diff
changeset
|
116 if c in name: |
35b39097c3e6
Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents:
4070
diff
changeset
|
117 raise util.Abort(_('%r cannot be used in a tag name') % c) |
35b39097c3e6
Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents:
4070
diff
changeset
|
118 |
35b39097c3e6
Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents:
4070
diff
changeset
|
119 self.hook('pretag', throw=True, node=hex(node), tag=name, local=local) |
35b39097c3e6
Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents:
4070
diff
changeset
|
120 |
4913
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
121 def writetag(fp, name, munge, prevtags): |
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
122 if prevtags and prevtags[-1] != '\n': |
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
123 fp.write('\n') |
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
124 fp.write('%s %s\n' % (hex(node), munge and munge(name) or name)) |
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
125 fp.close() |
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
126 self.hook('tag', node=hex(node), tag=name, local=local) |
5115
ea7b982b6c08
Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4913
diff
changeset
|
127 |
4913
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
128 prevtags = '' |
4116
35b39097c3e6
Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents:
4070
diff
changeset
|
129 if local: |
4913
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
130 try: |
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
131 fp = self.opener('localtags', 'r+') |
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
132 except IOError, err: |
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
133 fp = self.opener('localtags', 'a') |
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
134 else: |
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
135 prevtags = fp.read() |
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
136 |
4116
35b39097c3e6
Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents:
4070
diff
changeset
|
137 # local tags are stored in the current charset |
4913
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
138 writetag(fp, name, None, prevtags) |
4116
35b39097c3e6
Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents:
4070
diff
changeset
|
139 return |
35b39097c3e6
Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents:
4070
diff
changeset
|
140 |
4913
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
141 if use_dirstate: |
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
142 try: |
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
143 fp = self.wfile('.hgtags', 'rb+') |
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
144 except IOError, err: |
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
145 fp = self.wfile('.hgtags', 'ab') |
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
146 else: |
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
147 prevtags = fp.read() |
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
148 else: |
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
149 try: |
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
150 prevtags = self.filectx('.hgtags', parent).data() |
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
151 except revlog.LookupError: |
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
152 pass |
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
153 fp = self.wfile('.hgtags', 'wb') |
5211
bddb4ff134c0
Do not lose previous tags when adding a tag in raw mode
Brendan Cully <brendan@kublai.com>
parents:
5115
diff
changeset
|
154 if prevtags: |
bddb4ff134c0
Do not lose previous tags when adding a tag in raw mode
Brendan Cully <brendan@kublai.com>
parents:
5115
diff
changeset
|
155 fp.write(prevtags) |
4913
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
156 |
4116
35b39097c3e6
Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents:
4070
diff
changeset
|
157 # committed tags are stored in UTF-8 |
4913
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
158 writetag(fp, name, util.fromlocal, prevtags) |
f0c25ed40ec6
tag: handle .hgtags and .hg/localtags with missing final newline (issue 601)
Bryan O'Sullivan <bos@serpentine.com>
parents:
4910
diff
changeset
|
159 |
4116
35b39097c3e6
Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents:
4070
diff
changeset
|
160 if use_dirstate and self.dirstate.state('.hgtags') == '?': |
35b39097c3e6
Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents:
4070
diff
changeset
|
161 self.add(['.hgtags']) |
35b39097c3e6
Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents:
4070
diff
changeset
|
162 |
35b39097c3e6
Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents:
4070
diff
changeset
|
163 tagnode = self.commit(['.hgtags'], message, user, date, p1=parent) |
35b39097c3e6
Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents:
4070
diff
changeset
|
164 |
35b39097c3e6
Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents:
4070
diff
changeset
|
165 self.hook('tag', node=hex(node), tag=name, local=local) |
35b39097c3e6
Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents:
4070
diff
changeset
|
166 |
35b39097c3e6
Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents:
4070
diff
changeset
|
167 return tagnode |
35b39097c3e6
Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents:
4070
diff
changeset
|
168 |
2974
eef469259745
tag: shorten hash in default commit message
Matt Mackall <mpm@selenic.com>
parents:
2972
diff
changeset
|
169 def tag(self, name, node, message, local, user, date): |
2601
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2581
diff
changeset
|
170 '''tag a revision with a symbolic name. |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2581
diff
changeset
|
171 |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2581
diff
changeset
|
172 if local is True, the tag is stored in a per-repository file. |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2581
diff
changeset
|
173 otherwise, it is stored in the .hgtags file, and a new |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2581
diff
changeset
|
174 changeset is committed with the change. |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2581
diff
changeset
|
175 |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2581
diff
changeset
|
176 keyword arguments: |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2581
diff
changeset
|
177 |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2581
diff
changeset
|
178 local: whether to store tag in non-version-controlled file |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2581
diff
changeset
|
179 (default False) |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2581
diff
changeset
|
180 |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2581
diff
changeset
|
181 message: commit message to use if committing |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2581
diff
changeset
|
182 |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2581
diff
changeset
|
183 user: name of user to use if committing |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2581
diff
changeset
|
184 |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2581
diff
changeset
|
185 date: date tuple to use if committing''' |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2581
diff
changeset
|
186 |
2874
3d6efcbbd1c9
remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2858
diff
changeset
|
187 for x in self.status()[:5]: |
2601
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2581
diff
changeset
|
188 if '.hgtags' in x: |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2581
diff
changeset
|
189 raise util.Abort(_('working copy of .hgtags is changed ' |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2581
diff
changeset
|
190 '(please commit .hgtags manually)')) |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2581
diff
changeset
|
191 |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2581
diff
changeset
|
192 |
4116
35b39097c3e6
Break core of repo.tag into dirstate/hook-free repo._tag for convert-repo
Brendan Cully <brendan@kublai.com>
parents:
4070
diff
changeset
|
193 self._tag(name, node, message, local, user, date) |
2601
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2581
diff
changeset
|
194 |
343 | 195 def tags(self): |
196 '''return a mapping of tag to node''' | |
4214
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
197 if self.tagscache: |
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
198 return self.tagscache |
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
199 |
4215
e29f2db5ab18
Make the tags algorithm smarter
Matt Mackall <mpm@selenic.com>
parents:
4214
diff
changeset
|
200 globaltags = {} |
659 | 201 |
4214
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
202 def readtags(lines, fn): |
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
203 filetags = {} |
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
204 count = 0 |
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
205 |
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
206 def warn(msg): |
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
207 self.ui.warn(_("%s, line %s: %s\n") % (fn, count, msg)) |
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
208 |
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
209 for l in lines: |
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
210 count += 1 |
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
211 if not l: |
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
212 continue |
1986
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
213 s = l.split(" ", 1) |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
214 if len(s) != 2: |
4214
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
215 warn(_("cannot parse entry")) |
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
216 continue |
1986
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
217 node, key = s |
3773 | 218 key = util.tolocal(key.strip()) # stored in UTF-8 |
1986
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
219 try: |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
220 bin_n = bin(node) |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
221 except TypeError: |
4214
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
222 warn(_("node '%s' is not well formed") % node) |
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
223 continue |
1986
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
224 if bin_n not in self.changelog.nodemap: |
4214
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
225 warn(_("tag '%s' refers to unknown node") % key) |
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
226 continue |
4215
e29f2db5ab18
Make the tags algorithm smarter
Matt Mackall <mpm@selenic.com>
parents:
4214
diff
changeset
|
227 |
4272
fe7f38dda34b
tags: fix abababa case, with test case
Matt Mackall <mpm@selenic.com>
parents:
4229
diff
changeset
|
228 h = [] |
4215
e29f2db5ab18
Make the tags algorithm smarter
Matt Mackall <mpm@selenic.com>
parents:
4214
diff
changeset
|
229 if key in filetags: |
e29f2db5ab18
Make the tags algorithm smarter
Matt Mackall <mpm@selenic.com>
parents:
4214
diff
changeset
|
230 n, h = filetags[key] |
4272
fe7f38dda34b
tags: fix abababa case, with test case
Matt Mackall <mpm@selenic.com>
parents:
4229
diff
changeset
|
231 h.append(n) |
4215
e29f2db5ab18
Make the tags algorithm smarter
Matt Mackall <mpm@selenic.com>
parents:
4214
diff
changeset
|
232 filetags[key] = (bin_n, h) |
1986
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
233 |
4633
ff7253a0d1da
Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4623
diff
changeset
|
234 for k, nh in filetags.items(): |
4215
e29f2db5ab18
Make the tags algorithm smarter
Matt Mackall <mpm@selenic.com>
parents:
4214
diff
changeset
|
235 if k not in globaltags: |
e29f2db5ab18
Make the tags algorithm smarter
Matt Mackall <mpm@selenic.com>
parents:
4214
diff
changeset
|
236 globaltags[k] = nh |
e29f2db5ab18
Make the tags algorithm smarter
Matt Mackall <mpm@selenic.com>
parents:
4214
diff
changeset
|
237 continue |
e29f2db5ab18
Make the tags algorithm smarter
Matt Mackall <mpm@selenic.com>
parents:
4214
diff
changeset
|
238 # we prefer the global tag if: |
e29f2db5ab18
Make the tags algorithm smarter
Matt Mackall <mpm@selenic.com>
parents:
4214
diff
changeset
|
239 # it supercedes us OR |
e29f2db5ab18
Make the tags algorithm smarter
Matt Mackall <mpm@selenic.com>
parents:
4214
diff
changeset
|
240 # mutual supercedes and it has a higher rank |
e29f2db5ab18
Make the tags algorithm smarter
Matt Mackall <mpm@selenic.com>
parents:
4214
diff
changeset
|
241 # otherwise we win because we're tip-most |
e29f2db5ab18
Make the tags algorithm smarter
Matt Mackall <mpm@selenic.com>
parents:
4214
diff
changeset
|
242 an, ah = nh |
e29f2db5ab18
Make the tags algorithm smarter
Matt Mackall <mpm@selenic.com>
parents:
4214
diff
changeset
|
243 bn, bh = globaltags[k] |
4633
ff7253a0d1da
Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4623
diff
changeset
|
244 if (bn != an and an in bh and |
ff7253a0d1da
Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4623
diff
changeset
|
245 (bn not in ah or len(bh) > len(ah))): |
4215
e29f2db5ab18
Make the tags algorithm smarter
Matt Mackall <mpm@selenic.com>
parents:
4214
diff
changeset
|
246 an = bn |
4494
99f411ba0380
use .extend instead of .append in readtags
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4415
diff
changeset
|
247 ah.extend([n for n in bh if n not in ah]) |
4215
e29f2db5ab18
Make the tags algorithm smarter
Matt Mackall <mpm@selenic.com>
parents:
4214
diff
changeset
|
248 globaltags[k] = an, ah |
e29f2db5ab18
Make the tags algorithm smarter
Matt Mackall <mpm@selenic.com>
parents:
4214
diff
changeset
|
249 |
e29f2db5ab18
Make the tags algorithm smarter
Matt Mackall <mpm@selenic.com>
parents:
4214
diff
changeset
|
250 # read the tags file from each head, ending with the tip |
4214
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
251 f = None |
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
252 for rev, node, fnode in self._hgtagsnodes(): |
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
253 f = (f and f.filectx(fnode) or |
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
254 self.filectx('.hgtags', fileid=fnode)) |
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
255 readtags(f.data().splitlines(), f) |
3497 | 256 |
4214
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
257 try: |
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
258 data = util.fromlocal(self.opener("localtags").read()) |
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
259 # localtags are stored in the local character set |
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
260 # while the internal tag table is stored in UTF-8 |
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
261 readtags(data.splitlines(), "localtags") |
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
262 except IOError: |
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
263 pass |
659 | 264 |
4215
e29f2db5ab18
Make the tags algorithm smarter
Matt Mackall <mpm@selenic.com>
parents:
4214
diff
changeset
|
265 self.tagscache = {} |
e29f2db5ab18
Make the tags algorithm smarter
Matt Mackall <mpm@selenic.com>
parents:
4214
diff
changeset
|
266 for k,nh in globaltags.items(): |
e29f2db5ab18
Make the tags algorithm smarter
Matt Mackall <mpm@selenic.com>
parents:
4214
diff
changeset
|
267 n = nh[0] |
4217 | 268 if n != nullid: |
269 self.tagscache[k] = n | |
4214
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4206
diff
changeset
|
270 self.tagscache['tip'] = self.changelog.tip() |
659 | 271 |
343 | 272 return self.tagscache |
273 | |
3577
7f7425306925
Correct optimization from 3464f5e77f34; add a test.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3568
diff
changeset
|
274 def _hgtagsnodes(self): |
7f7425306925
Correct optimization from 3464f5e77f34; add a test.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3568
diff
changeset
|
275 heads = self.heads() |
7f7425306925
Correct optimization from 3464f5e77f34; add a test.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3568
diff
changeset
|
276 heads.reverse() |
7f7425306925
Correct optimization from 3464f5e77f34; add a test.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3568
diff
changeset
|
277 last = {} |
7f7425306925
Correct optimization from 3464f5e77f34; add a test.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3568
diff
changeset
|
278 ret = [] |
7f7425306925
Correct optimization from 3464f5e77f34; add a test.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3568
diff
changeset
|
279 for node in heads: |
7f7425306925
Correct optimization from 3464f5e77f34; add a test.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3568
diff
changeset
|
280 c = self.changectx(node) |
7f7425306925
Correct optimization from 3464f5e77f34; add a test.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3568
diff
changeset
|
281 rev = c.rev() |
7f7425306925
Correct optimization from 3464f5e77f34; add a test.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3568
diff
changeset
|
282 try: |
7f7425306925
Correct optimization from 3464f5e77f34; add a test.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3568
diff
changeset
|
283 fnode = c.filenode('.hgtags') |
3930
01d98d68d697
Add revlog.LookupError exception, and use it instead of RevlogError.
Brendan Cully <brendan@kublai.com>
parents:
3928
diff
changeset
|
284 except revlog.LookupError: |
3577
7f7425306925
Correct optimization from 3464f5e77f34; add a test.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3568
diff
changeset
|
285 continue |
7f7425306925
Correct optimization from 3464f5e77f34; add a test.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3568
diff
changeset
|
286 ret.append((rev, node, fnode)) |
7f7425306925
Correct optimization from 3464f5e77f34; add a test.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3568
diff
changeset
|
287 if fnode in last: |
7f7425306925
Correct optimization from 3464f5e77f34; add a test.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3568
diff
changeset
|
288 ret[last[fnode]] = None |
7f7425306925
Correct optimization from 3464f5e77f34; add a test.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3568
diff
changeset
|
289 last[fnode] = len(ret) - 1 |
7f7425306925
Correct optimization from 3464f5e77f34; add a test.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3568
diff
changeset
|
290 return [item for item in ret if item] |
7f7425306925
Correct optimization from 3464f5e77f34; add a test.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3568
diff
changeset
|
291 |
343 | 292 def tagslist(self): |
293 '''return a list of tags ordered by revision''' | |
294 l = [] | |
477
520540fd6b64
Handle errors in .hgtags or hgrc [tags] section more gracefully.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
471
diff
changeset
|
295 for t, n in self.tags().items(): |
343 | 296 try: |
297 r = self.changelog.rev(n) | |
298 except: | |
299 r = -2 # sort to the beginning of the list if unknown | |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
300 l.append((r, t, n)) |
343 | 301 l.sort() |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
302 return [(t, n) for r, t, n in l] |
343 | 303 |
304 def nodetags(self, node): | |
305 '''return the tags associated with a node''' | |
306 if not self.nodetagscache: | |
307 self.nodetagscache = {} | |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
308 for t, n in self.tags().items(): |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
309 self.nodetagscache.setdefault(n, []).append(t) |
343 | 310 return self.nodetagscache.get(node, []) |
311 | |
3823
b3b868113d24
fix encoding conversion of branch names when mq is loaded
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3797
diff
changeset
|
312 def _branchtags(self): |
3485
23cffef5d424
Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3468
diff
changeset
|
313 partial, last, lrev = self._readbranchcache() |
23cffef5d424
Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3468
diff
changeset
|
314 |
23cffef5d424
Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3468
diff
changeset
|
315 tiprev = self.changelog.count() - 1 |
23cffef5d424
Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3468
diff
changeset
|
316 if lrev != tiprev: |
23cffef5d424
Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3468
diff
changeset
|
317 self._updatebranchcache(partial, lrev+1, tiprev+1) |
23cffef5d424
Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3468
diff
changeset
|
318 self._writebranchcache(partial, self.changelog.tip(), tiprev) |
23cffef5d424
Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3468
diff
changeset
|
319 |
3823
b3b868113d24
fix encoding conversion of branch names when mq is loaded
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3797
diff
changeset
|
320 return partial |
b3b868113d24
fix encoding conversion of branch names when mq is loaded
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3797
diff
changeset
|
321 |
b3b868113d24
fix encoding conversion of branch names when mq is loaded
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3797
diff
changeset
|
322 def branchtags(self): |
b3b868113d24
fix encoding conversion of branch names when mq is loaded
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3797
diff
changeset
|
323 if self.branchcache is not None: |
b3b868113d24
fix encoding conversion of branch names when mq is loaded
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3797
diff
changeset
|
324 return self.branchcache |
b3b868113d24
fix encoding conversion of branch names when mq is loaded
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3797
diff
changeset
|
325 |
b3b868113d24
fix encoding conversion of branch names when mq is loaded
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3797
diff
changeset
|
326 self.branchcache = {} # avoid recursion in changectx |
b3b868113d24
fix encoding conversion of branch names when mq is loaded
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3797
diff
changeset
|
327 partial = self._branchtags() |
b3b868113d24
fix encoding conversion of branch names when mq is loaded
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3797
diff
changeset
|
328 |
3774
b1eeaeb936ae
Handle transcoding of branch names
Matt Mackall <mpm@selenic.com>
parents:
3773
diff
changeset
|
329 # the branch cache is stored on disk as UTF-8, but in the local |
b1eeaeb936ae
Handle transcoding of branch names
Matt Mackall <mpm@selenic.com>
parents:
3773
diff
changeset
|
330 # charset internally |
b1eeaeb936ae
Handle transcoding of branch names
Matt Mackall <mpm@selenic.com>
parents:
3773
diff
changeset
|
331 for k, v in partial.items(): |
b1eeaeb936ae
Handle transcoding of branch names
Matt Mackall <mpm@selenic.com>
parents:
3773
diff
changeset
|
332 self.branchcache[util.tolocal(k)] = v |
3485
23cffef5d424
Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3468
diff
changeset
|
333 return self.branchcache |
23cffef5d424
Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3468
diff
changeset
|
334 |
23cffef5d424
Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3468
diff
changeset
|
335 def _readbranchcache(self): |
23cffef5d424
Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3468
diff
changeset
|
336 partial = {} |
3432
028fff46a4ac
Add branchtags function with cache
Matt Mackall <mpm@selenic.com>
parents:
3375
diff
changeset
|
337 try: |
4205
a7af0eeae8a3
Move branches.cache to branch.cache
Matt Mackall <mpm@selenic.com>
parents:
4204
diff
changeset
|
338 f = self.opener("branch.cache") |
3650
6f6696962986
don't use readline() to read branches.cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3627
diff
changeset
|
339 lines = f.read().split('\n') |
6f6696962986
don't use readline() to read branches.cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3627
diff
changeset
|
340 f.close() |
4415
1a63b44f90c9
branch.cache: silently ignore I/O and OS errors
Matt Mackall <mpm@selenic.com>
parents:
4329
diff
changeset
|
341 except (IOError, OSError): |
1a63b44f90c9
branch.cache: silently ignore I/O and OS errors
Matt Mackall <mpm@selenic.com>
parents:
4329
diff
changeset
|
342 return {}, nullid, nullrev |
1a63b44f90c9
branch.cache: silently ignore I/O and OS errors
Matt Mackall <mpm@selenic.com>
parents:
4329
diff
changeset
|
343 |
1a63b44f90c9
branch.cache: silently ignore I/O and OS errors
Matt Mackall <mpm@selenic.com>
parents:
4329
diff
changeset
|
344 try: |
4167
4574a8cb080f
Store empty (default) branch in branch cache, too.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4128
diff
changeset
|
345 last, lrev = lines.pop(0).split(" ", 1) |
3432
028fff46a4ac
Add branchtags function with cache
Matt Mackall <mpm@selenic.com>
parents:
3375
diff
changeset
|
346 last, lrev = bin(last), int(lrev) |
3761
9433bdcaa9ae
Ignore all errors while parsing the branch cache.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3733
diff
changeset
|
347 if not (lrev < self.changelog.count() and |
9433bdcaa9ae
Ignore all errors while parsing the branch cache.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3733
diff
changeset
|
348 self.changelog.node(lrev) == last): # sanity check |
9433bdcaa9ae
Ignore all errors while parsing the branch cache.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3733
diff
changeset
|
349 # invalidate the cache |
9433bdcaa9ae
Ignore all errors while parsing the branch cache.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3733
diff
changeset
|
350 raise ValueError('Invalid branch cache: unknown tip') |
9433bdcaa9ae
Ignore all errors while parsing the branch cache.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3733
diff
changeset
|
351 for l in lines: |
9433bdcaa9ae
Ignore all errors while parsing the branch cache.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3733
diff
changeset
|
352 if not l: continue |
4167
4574a8cb080f
Store empty (default) branch in branch cache, too.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4128
diff
changeset
|
353 node, label = l.split(" ", 1) |
4574a8cb080f
Store empty (default) branch in branch cache, too.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4128
diff
changeset
|
354 partial[label.strip()] = bin(node) |
3761
9433bdcaa9ae
Ignore all errors while parsing the branch cache.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3733
diff
changeset
|
355 except (KeyboardInterrupt, util.SignalInterrupt): |
9433bdcaa9ae
Ignore all errors while parsing the branch cache.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3733
diff
changeset
|
356 raise |
9433bdcaa9ae
Ignore all errors while parsing the branch cache.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3733
diff
changeset
|
357 except Exception, inst: |
9433bdcaa9ae
Ignore all errors while parsing the branch cache.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3733
diff
changeset
|
358 if self.ui.debugflag: |
9433bdcaa9ae
Ignore all errors while parsing the branch cache.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3733
diff
changeset
|
359 self.ui.warn(str(inst), '\n') |
9433bdcaa9ae
Ignore all errors while parsing the branch cache.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3733
diff
changeset
|
360 partial, last, lrev = {}, nullid, nullrev |
3485
23cffef5d424
Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3468
diff
changeset
|
361 return partial, last, lrev |
3432
028fff46a4ac
Add branchtags function with cache
Matt Mackall <mpm@selenic.com>
parents:
3375
diff
changeset
|
362 |
3485
23cffef5d424
Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3468
diff
changeset
|
363 def _writebranchcache(self, branches, tip, tiprev): |
3452
fcf14d87e0a4
If we can't write the branch cache, fail quietly.
Matt Mackall <mpm@selenic.com>
parents:
3450
diff
changeset
|
364 try: |
4329
cea5ba038a1d
use atomictemp files to write branch.cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4272
diff
changeset
|
365 f = self.opener("branch.cache", "w", atomictemp=True) |
3485
23cffef5d424
Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3468
diff
changeset
|
366 f.write("%s %s\n" % (hex(tip), tiprev)) |
23cffef5d424
Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3468
diff
changeset
|
367 for label, node in branches.iteritems(): |
3452
fcf14d87e0a4
If we can't write the branch cache, fail quietly.
Matt Mackall <mpm@selenic.com>
parents:
3450
diff
changeset
|
368 f.write("%s %s\n" % (hex(node), label)) |
4329
cea5ba038a1d
use atomictemp files to write branch.cache
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4272
diff
changeset
|
369 f.rename() |
4415
1a63b44f90c9
branch.cache: silently ignore I/O and OS errors
Matt Mackall <mpm@selenic.com>
parents:
4329
diff
changeset
|
370 except (IOError, OSError): |
3452
fcf14d87e0a4
If we can't write the branch cache, fail quietly.
Matt Mackall <mpm@selenic.com>
parents:
3450
diff
changeset
|
371 pass |
3432
028fff46a4ac
Add branchtags function with cache
Matt Mackall <mpm@selenic.com>
parents:
3375
diff
changeset
|
372 |
3485
23cffef5d424
Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3468
diff
changeset
|
373 def _updatebranchcache(self, partial, start, end): |
23cffef5d424
Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3468
diff
changeset
|
374 for r in xrange(start, end): |
23cffef5d424
Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3468
diff
changeset
|
375 c = self.changectx(r) |
23cffef5d424
Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3468
diff
changeset
|
376 b = c.branch() |
4167
4574a8cb080f
Store empty (default) branch in branch cache, too.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4128
diff
changeset
|
377 partial[b] = c.node() |
3485
23cffef5d424
Split branchtags into two additional functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3468
diff
changeset
|
378 |
343 | 379 def lookup(self, key): |
3433
5436c8fe0ff5
Make lookup aware of branch labels
Matt Mackall <mpm@selenic.com>
parents:
3432
diff
changeset
|
380 if key == '.': |
4510
e0bc2c575044
Issue a warning if "-r ." is used with two working directory parents.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4497
diff
changeset
|
381 key, second = self.dirstate.parents() |
3433
5436c8fe0ff5
Make lookup aware of branch labels
Matt Mackall <mpm@selenic.com>
parents:
3432
diff
changeset
|
382 if key == nullid: |
5436c8fe0ff5
Make lookup aware of branch labels
Matt Mackall <mpm@selenic.com>
parents:
3432
diff
changeset
|
383 raise repo.RepoError(_("no revision checked out")) |
4510
e0bc2c575044
Issue a warning if "-r ." is used with two working directory parents.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4497
diff
changeset
|
384 if second != nullid: |
e0bc2c575044
Issue a warning if "-r ." is used with two working directory parents.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4497
diff
changeset
|
385 self.ui.warn(_("warning: working directory has two parents, " |
e0bc2c575044
Issue a warning if "-r ." is used with two working directory parents.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4497
diff
changeset
|
386 "tag '.' uses the first\n")) |
3795
bd7011246fab
Add "null" pseudo-tag pointing to nullid
Brendan Cully <brendan@kublai.com>
parents:
3791
diff
changeset
|
387 elif key == 'null': |
bd7011246fab
Add "null" pseudo-tag pointing to nullid
Brendan Cully <brendan@kublai.com>
parents:
3791
diff
changeset
|
388 return nullid |
3494
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3452
diff
changeset
|
389 n = self.changelog._match(key) |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3452
diff
changeset
|
390 if n: |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3452
diff
changeset
|
391 return n |
3433
5436c8fe0ff5
Make lookup aware of branch labels
Matt Mackall <mpm@selenic.com>
parents:
3432
diff
changeset
|
392 if key in self.tags(): |
343 | 393 return self.tags()[key] |
3433
5436c8fe0ff5
Make lookup aware of branch labels
Matt Mackall <mpm@selenic.com>
parents:
3432
diff
changeset
|
394 if key in self.branchtags(): |
5436c8fe0ff5
Make lookup aware of branch labels
Matt Mackall <mpm@selenic.com>
parents:
3432
diff
changeset
|
395 return self.branchtags()[key] |
3494
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3452
diff
changeset
|
396 n = self.changelog._partialmatch(key) |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3452
diff
changeset
|
397 if n: |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3452
diff
changeset
|
398 return n |
dba3cadef789
Only look up tags and branches as a last resort
Matt Mackall <mpm@selenic.com>
parents:
3452
diff
changeset
|
399 raise repo.RepoError(_("unknown revision '%s'") % key) |
67 | 400 |
634
da5378d39269
Add a repo method to report repo device
Matt Mackall <mpm@selenic.com>
parents:
627
diff
changeset
|
401 def dev(self): |
2448
b77a2ef61b81
replace os.stat with os.lstat in some where.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2439
diff
changeset
|
402 return os.lstat(self.path).st_dev |
634
da5378d39269
Add a repo method to report repo device
Matt Mackall <mpm@selenic.com>
parents:
627
diff
changeset
|
403 |
926 | 404 def local(self): |
1101 | 405 return True |
926 | 406 |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
407 def join(self, f): |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
408 return os.path.join(self.path, f) |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
409 |
3498
ff06fe0703ef
localrepo: add separate methods for manipulating repository data
Matt Mackall <mpm@selenic.com>
parents:
3497
diff
changeset
|
410 def sjoin(self, f): |
3853
c0b449154a90
switch to the .hg/store layout, fix the tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3851
diff
changeset
|
411 f = self.encodefn(f) |
3791
8643b9f90b51
introduce localrepo.spath for the store path, sopener fixes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3790
diff
changeset
|
412 return os.path.join(self.spath, f) |
3498
ff06fe0703ef
localrepo: add separate methods for manipulating repository data
Matt Mackall <mpm@selenic.com>
parents:
3497
diff
changeset
|
413 |
244 | 414 def wjoin(self, f): |
415 return os.path.join(self.root, f) | |
416 | |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
417 def file(self, f): |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
418 if f[0] == '/': |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
419 f = f[1:] |
4267
b11a2fb59cf5
revlog: simplify revlog version handling
Matt Mackall <mpm@selenic.com>
parents:
4232
diff
changeset
|
420 return filelog.filelog(self.sopener, f) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
421 |
3127
81da3c45aabd
Move defaultrev into changectx
Brendan Cully <brendan@kublai.com>
parents:
3076
diff
changeset
|
422 def changectx(self, changeid=None): |
2564
55e592041076
Add context helper functions to localrepo
Matt Mackall <mpm@selenic.com>
parents:
2491
diff
changeset
|
423 return context.changectx(self, changeid) |
55e592041076
Add context helper functions to localrepo
Matt Mackall <mpm@selenic.com>
parents:
2491
diff
changeset
|
424 |
3240
8d4855fd9d7b
merge: use new working context object in update
Matt Mackall <mpm@selenic.com>
parents:
3197
diff
changeset
|
425 def workingctx(self): |
8d4855fd9d7b
merge: use new working context object in update
Matt Mackall <mpm@selenic.com>
parents:
3197
diff
changeset
|
426 return context.workingctx(self) |
8d4855fd9d7b
merge: use new working context object in update
Matt Mackall <mpm@selenic.com>
parents:
3197
diff
changeset
|
427 |
3196
1605e336d229
Add localrepo.parents to get parent changectxs.
Matt Mackall <mpm@selenic.com>
parents:
3127
diff
changeset
|
428 def parents(self, changeid=None): |
1605e336d229
Add localrepo.parents to get parent changectxs.
Matt Mackall <mpm@selenic.com>
parents:
3127
diff
changeset
|
429 ''' |
1605e336d229
Add localrepo.parents to get parent changectxs.
Matt Mackall <mpm@selenic.com>
parents:
3127
diff
changeset
|
430 get list of changectxs for parents of changeid or working directory |
1605e336d229
Add localrepo.parents to get parent changectxs.
Matt Mackall <mpm@selenic.com>
parents:
3127
diff
changeset
|
431 ''' |
1605e336d229
Add localrepo.parents to get parent changectxs.
Matt Mackall <mpm@selenic.com>
parents:
3127
diff
changeset
|
432 if changeid is None: |
1605e336d229
Add localrepo.parents to get parent changectxs.
Matt Mackall <mpm@selenic.com>
parents:
3127
diff
changeset
|
433 pl = self.dirstate.parents() |
1605e336d229
Add localrepo.parents to get parent changectxs.
Matt Mackall <mpm@selenic.com>
parents:
3127
diff
changeset
|
434 else: |
1605e336d229
Add localrepo.parents to get parent changectxs.
Matt Mackall <mpm@selenic.com>
parents:
3127
diff
changeset
|
435 n = self.changelog.lookup(changeid) |
1605e336d229
Add localrepo.parents to get parent changectxs.
Matt Mackall <mpm@selenic.com>
parents:
3127
diff
changeset
|
436 pl = self.changelog.parents(n) |
3197
ff15ba23c1cf
localrepo.parents: return null context for no parents
Matt Mackall <mpm@selenic.com>
parents:
3196
diff
changeset
|
437 if pl[1] == nullid: |
ff15ba23c1cf
localrepo.parents: return null context for no parents
Matt Mackall <mpm@selenic.com>
parents:
3196
diff
changeset
|
438 return [self.changectx(pl[0])] |
ff15ba23c1cf
localrepo.parents: return null context for no parents
Matt Mackall <mpm@selenic.com>
parents:
3196
diff
changeset
|
439 return [self.changectx(pl[0]), self.changectx(pl[1])] |
3196
1605e336d229
Add localrepo.parents to get parent changectxs.
Matt Mackall <mpm@selenic.com>
parents:
3127
diff
changeset
|
440 |
2564
55e592041076
Add context helper functions to localrepo
Matt Mackall <mpm@selenic.com>
parents:
2491
diff
changeset
|
441 def filectx(self, path, changeid=None, fileid=None): |
55e592041076
Add context helper functions to localrepo
Matt Mackall <mpm@selenic.com>
parents:
2491
diff
changeset
|
442 """changeid can be a changeset revision, node, or tag. |
55e592041076
Add context helper functions to localrepo
Matt Mackall <mpm@selenic.com>
parents:
2491
diff
changeset
|
443 fileid can be a file revision or node.""" |
55e592041076
Add context helper functions to localrepo
Matt Mackall <mpm@selenic.com>
parents:
2491
diff
changeset
|
444 return context.filectx(self, path, changeid, fileid) |
55e592041076
Add context helper functions to localrepo
Matt Mackall <mpm@selenic.com>
parents:
2491
diff
changeset
|
445 |
627 | 446 def getcwd(self): |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
839
diff
changeset
|
447 return self.dirstate.getcwd() |
627 | 448 |
4525
78b6add1f966
Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4516
diff
changeset
|
449 def pathto(self, f, cwd=None): |
78b6add1f966
Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4516
diff
changeset
|
450 return self.dirstate.pathto(f, cwd) |
78b6add1f966
Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4516
diff
changeset
|
451 |
291
2c4f2be05587
Add wopener for opening files in the working directory
mpm@selenic.com
parents:
288
diff
changeset
|
452 def wfile(self, f, mode='r'): |
2c4f2be05587
Add wopener for opening files in the working directory
mpm@selenic.com
parents:
288
diff
changeset
|
453 return self.wopener(f, mode) |
2c4f2be05587
Add wopener for opening files in the working directory
mpm@selenic.com
parents:
288
diff
changeset
|
454 |
4265
81402b2b294d
use os.path.islink instead of util.is_link; remove util.is_link
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4263
diff
changeset
|
455 def _link(self, f): |
81402b2b294d
use os.path.islink instead of util.is_link; remove util.is_link
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4263
diff
changeset
|
456 return os.path.islink(self.wjoin(f)) |
81402b2b294d
use os.path.islink instead of util.is_link; remove util.is_link
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4263
diff
changeset
|
457 |
4004
c83c35f2f4e2
unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents:
4003
diff
changeset
|
458 def _filter(self, filter, filename, data): |
c83c35f2f4e2
unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents:
4003
diff
changeset
|
459 if filter not in self.filterpats: |
1258 | 460 l = [] |
4004
c83c35f2f4e2
unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents:
4003
diff
changeset
|
461 for pat, cmd in self.ui.configitems(filter): |
1947
65aff2ed61ae
fix the call to util.matcher (the args should be (reporoot, cwd, ...))
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1938
diff
changeset
|
462 mf = util.matcher(self.root, "", [pat], [], [])[1] |
1258 | 463 l.append((mf, cmd)) |
4004
c83c35f2f4e2
unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents:
4003
diff
changeset
|
464 self.filterpats[filter] = l |
1258 | 465 |
4004
c83c35f2f4e2
unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents:
4003
diff
changeset
|
466 for mf, cmd in self.filterpats[filter]: |
1258 | 467 if mf(filename): |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
468 self.ui.debug(_("filtering %s through %s\n") % (filename, cmd)) |
1258 | 469 data = util.filter(data, cmd) |
470 break | |
471 | |
472 return data | |
1019
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
473 |
4004
c83c35f2f4e2
unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents:
4003
diff
changeset
|
474 def wread(self, filename): |
c83c35f2f4e2
unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents:
4003
diff
changeset
|
475 if self._link(filename): |
c83c35f2f4e2
unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents:
4003
diff
changeset
|
476 data = os.readlink(self.wjoin(filename)) |
c83c35f2f4e2
unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents:
4003
diff
changeset
|
477 else: |
c83c35f2f4e2
unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents:
4003
diff
changeset
|
478 data = self.wopener(filename, 'r').read() |
c83c35f2f4e2
unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents:
4003
diff
changeset
|
479 return self._filter("encode", filename, data) |
1258 | 480 |
4006
67982d3ee76c
symlinks: add flags param to wwrite
Matt Mackall <mpm@selenic.com>
parents:
4005
diff
changeset
|
481 def wwrite(self, filename, data, flags): |
4004
c83c35f2f4e2
unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents:
4003
diff
changeset
|
482 data = self._filter("decode", filename, data) |
4006
67982d3ee76c
symlinks: add flags param to wwrite
Matt Mackall <mpm@selenic.com>
parents:
4005
diff
changeset
|
483 if "l" in flags: |
4860
0403b80352c9
localrepo.wwrite: use opener.symlink
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4648
diff
changeset
|
484 self.wopener.symlink(data, filename) |
4006
67982d3ee76c
symlinks: add flags param to wwrite
Matt Mackall <mpm@selenic.com>
parents:
4005
diff
changeset
|
485 else: |
67982d3ee76c
symlinks: add flags param to wwrite
Matt Mackall <mpm@selenic.com>
parents:
4005
diff
changeset
|
486 try: |
67982d3ee76c
symlinks: add flags param to wwrite
Matt Mackall <mpm@selenic.com>
parents:
4005
diff
changeset
|
487 if self._link(filename): |
67982d3ee76c
symlinks: add flags param to wwrite
Matt Mackall <mpm@selenic.com>
parents:
4005
diff
changeset
|
488 os.unlink(self.wjoin(filename)) |
67982d3ee76c
symlinks: add flags param to wwrite
Matt Mackall <mpm@selenic.com>
parents:
4005
diff
changeset
|
489 except OSError: |
67982d3ee76c
symlinks: add flags param to wwrite
Matt Mackall <mpm@selenic.com>
parents:
4005
diff
changeset
|
490 pass |
67982d3ee76c
symlinks: add flags param to wwrite
Matt Mackall <mpm@selenic.com>
parents:
4005
diff
changeset
|
491 self.wopener(filename, 'w').write(data) |
67982d3ee76c
symlinks: add flags param to wwrite
Matt Mackall <mpm@selenic.com>
parents:
4005
diff
changeset
|
492 util.set_exec(self.wjoin(filename), "x" in flags) |
1258 | 493 |
4005
656e06eebda7
replace filehandle version of wwrite with wwritedata
Matt Mackall <mpm@selenic.com>
parents:
4004
diff
changeset
|
494 def wwritedata(self, filename, data): |
656e06eebda7
replace filehandle version of wwrite with wwritedata
Matt Mackall <mpm@selenic.com>
parents:
4004
diff
changeset
|
495 return self._filter("decode", filename, data) |
1019
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
496 |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
497 def transaction(self): |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
498 tr = self.transhandle |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
499 if tr != None and tr.running(): |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
500 return tr.nest() |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
501 |
2362
482d3fb47d80
Renamed localrepo.undo() to rollback() and talk about "rollback information".
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2354
diff
changeset
|
502 # save dirstate for rollback |
263 | 503 try: |
504 ds = self.opener("dirstate").read() | |
505 except IOError: | |
506 ds = "" | |
785 | 507 self.opener("journal.dirstate", "w").write(ds) |
515 | 508 |
3790
f183c18568df
localrepo: change aftertrans to be independant of the store path
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3774
diff
changeset
|
509 renames = [(self.sjoin("journal"), self.sjoin("undo")), |
f183c18568df
localrepo: change aftertrans to be independant of the store path
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3774
diff
changeset
|
510 (self.join("journal.dirstate"), self.join("undo.dirstate"))] |
3498
ff06fe0703ef
localrepo: add separate methods for manipulating repository data
Matt Mackall <mpm@selenic.com>
parents:
3497
diff
changeset
|
511 tr = transaction.transaction(self.ui.warn, self.sopener, |
ff06fe0703ef
localrepo: add separate methods for manipulating repository data
Matt Mackall <mpm@selenic.com>
parents:
3497
diff
changeset
|
512 self.sjoin("journal"), |
3790
f183c18568df
localrepo: change aftertrans to be independant of the store path
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3774
diff
changeset
|
513 aftertrans(renames)) |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
514 self.transhandle = tr |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
515 return tr |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
516 |
210 | 517 def recover(self): |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
518 l = self.lock() |
3498
ff06fe0703ef
localrepo: add separate methods for manipulating repository data
Matt Mackall <mpm@selenic.com>
parents:
3497
diff
changeset
|
519 if os.path.exists(self.sjoin("journal")): |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
520 self.ui.status(_("rolling back interrupted transaction\n")) |
3498
ff06fe0703ef
localrepo: add separate methods for manipulating repository data
Matt Mackall <mpm@selenic.com>
parents:
3497
diff
changeset
|
521 transaction.rollback(self.sopener, self.sjoin("journal")) |
4614
3a645af7fb76
localrepo and dirstate: rename reload to invalidate
Matt Mackall <mpm@selenic.com>
parents:
4582
diff
changeset
|
522 self.invalidate() |
1516
0b1b029b4de3
Automatically run "verify" whenever we run "recover"
Matt Mackall <mpm@selenic.com>
parents:
1510
diff
changeset
|
523 return True |
210 | 524 else: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
525 self.ui.warn(_("no interrupted transaction available\n")) |
1516
0b1b029b4de3
Automatically run "verify" whenever we run "recover"
Matt Mackall <mpm@selenic.com>
parents:
1510
diff
changeset
|
526 return False |
210 | 527 |
4438
3900f684a150
Fix hg import --exact bug that hangs hg on failure.
Eric Hopper <hopper@omnifarious.org>
parents:
4417
diff
changeset
|
528 def rollback(self, wlock=None, lock=None): |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
529 if not wlock: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
530 wlock = self.wlock() |
4438
3900f684a150
Fix hg import --exact bug that hangs hg on failure.
Eric Hopper <hopper@omnifarious.org>
parents:
4417
diff
changeset
|
531 if not lock: |
3900f684a150
Fix hg import --exact bug that hangs hg on failure.
Eric Hopper <hopper@omnifarious.org>
parents:
4417
diff
changeset
|
532 lock = self.lock() |
3498
ff06fe0703ef
localrepo: add separate methods for manipulating repository data
Matt Mackall <mpm@selenic.com>
parents:
3497
diff
changeset
|
533 if os.path.exists(self.sjoin("undo")): |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
534 self.ui.status(_("rolling back last transaction\n")) |
3498
ff06fe0703ef
localrepo: add separate methods for manipulating repository data
Matt Mackall <mpm@selenic.com>
parents:
3497
diff
changeset
|
535 transaction.rollback(self.sopener, self.sjoin("undo")) |
421 | 536 util.rename(self.join("undo.dirstate"), self.join("dirstate")) |
4614
3a645af7fb76
localrepo and dirstate: rename reload to invalidate
Matt Mackall <mpm@selenic.com>
parents:
4582
diff
changeset
|
537 self.invalidate() |
3a645af7fb76
localrepo and dirstate: rename reload to invalidate
Matt Mackall <mpm@selenic.com>
parents:
4582
diff
changeset
|
538 self.dirstate.invalidate() |
163 | 539 else: |
2362
482d3fb47d80
Renamed localrepo.undo() to rollback() and talk about "rollback information".
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2354
diff
changeset
|
540 self.ui.warn(_("no rollback information available\n")) |
162 | 541 |
4614
3a645af7fb76
localrepo and dirstate: rename reload to invalidate
Matt Mackall <mpm@selenic.com>
parents:
4582
diff
changeset
|
542 def invalidate(self): |
3a645af7fb76
localrepo and dirstate: rename reload to invalidate
Matt Mackall <mpm@selenic.com>
parents:
4582
diff
changeset
|
543 for a in "changelog manifest".split(): |
3a645af7fb76
localrepo and dirstate: rename reload to invalidate
Matt Mackall <mpm@selenic.com>
parents:
4582
diff
changeset
|
544 if hasattr(self, a): |
3a645af7fb76
localrepo and dirstate: rename reload to invalidate
Matt Mackall <mpm@selenic.com>
parents:
4582
diff
changeset
|
545 self.__delattr__(a) |
1784
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
546 self.tagscache = None |
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
547 self.nodetagscache = None |
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
548 |
2016
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
549 def do_lock(self, lockname, wait, releasefn=None, acquirefn=None, |
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
550 desc=None): |
161 | 551 try: |
3498
ff06fe0703ef
localrepo: add separate methods for manipulating repository data
Matt Mackall <mpm@selenic.com>
parents:
3497
diff
changeset
|
552 l = lock.lock(lockname, 0, releasefn, desc=desc) |
1531
2ba8bf7defda
add localrepo.wlock for protecting the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1516
diff
changeset
|
553 except lock.LockHeld, inst: |
2ba8bf7defda
add localrepo.wlock for protecting the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1516
diff
changeset
|
554 if not wait: |
2016
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
555 raise |
3688
d92dad355000
Corrected "waiting for lock on repository FOO held by BAR" message.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3687
diff
changeset
|
556 self.ui.warn(_("waiting for lock on %s held by %r\n") % |
d92dad355000
Corrected "waiting for lock on repository FOO held by BAR" message.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3687
diff
changeset
|
557 (desc, inst.locker)) |
2016
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
558 # default to 600 seconds timeout |
3498
ff06fe0703ef
localrepo: add separate methods for manipulating repository data
Matt Mackall <mpm@selenic.com>
parents:
3497
diff
changeset
|
559 l = lock.lock(lockname, int(self.ui.config("ui", "timeout", "600")), |
2016
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
560 releasefn, desc=desc) |
1751
e9bf415a8ecb
localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
561 if acquirefn: |
e9bf415a8ecb
localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
562 acquirefn() |
e9bf415a8ecb
localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
563 return l |
e9bf415a8ecb
localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
564 |
e9bf415a8ecb
localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
565 def lock(self, wait=1): |
4614
3a645af7fb76
localrepo and dirstate: rename reload to invalidate
Matt Mackall <mpm@selenic.com>
parents:
4582
diff
changeset
|
566 return self.do_lock(self.sjoin("lock"), wait, |
3a645af7fb76
localrepo and dirstate: rename reload to invalidate
Matt Mackall <mpm@selenic.com>
parents:
4582
diff
changeset
|
567 acquirefn=self.invalidate, |
2016
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
568 desc=_('repository %s') % self.origroot) |
1751
e9bf415a8ecb
localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
569 |
e9bf415a8ecb
localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
570 def wlock(self, wait=1): |
3498
ff06fe0703ef
localrepo: add separate methods for manipulating repository data
Matt Mackall <mpm@selenic.com>
parents:
3497
diff
changeset
|
571 return self.do_lock(self.join("wlock"), wait, self.dirstate.write, |
4614
3a645af7fb76
localrepo and dirstate: rename reload to invalidate
Matt Mackall <mpm@selenic.com>
parents:
4582
diff
changeset
|
572 self.dirstate.invalidate, |
2016
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
573 desc=_('working directory of %s') % self.origroot) |
1531
2ba8bf7defda
add localrepo.wlock for protecting the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1516
diff
changeset
|
574 |
3300
a2d93b186a0e
commit: unify file-level commit code
Matt Mackall <mpm@selenic.com>
parents:
3296
diff
changeset
|
575 def filecommit(self, fn, manifest1, manifest2, linkrev, transaction, changelist): |
3295
764688cf51e5
merge: remember rename copies and parents properly on commit
Matt Mackall <mpm@selenic.com>
parents:
3241
diff
changeset
|
576 """ |
3300
a2d93b186a0e
commit: unify file-level commit code
Matt Mackall <mpm@selenic.com>
parents:
3296
diff
changeset
|
577 commit an individual file as part of a larger transaction |
a2d93b186a0e
commit: unify file-level commit code
Matt Mackall <mpm@selenic.com>
parents:
3296
diff
changeset
|
578 """ |
3295
764688cf51e5
merge: remember rename copies and parents properly on commit
Matt Mackall <mpm@selenic.com>
parents:
3241
diff
changeset
|
579 |
3300
a2d93b186a0e
commit: unify file-level commit code
Matt Mackall <mpm@selenic.com>
parents:
3296
diff
changeset
|
580 t = self.wread(fn) |
a2d93b186a0e
commit: unify file-level commit code
Matt Mackall <mpm@selenic.com>
parents:
3296
diff
changeset
|
581 fl = self.file(fn) |
a2d93b186a0e
commit: unify file-level commit code
Matt Mackall <mpm@selenic.com>
parents:
3296
diff
changeset
|
582 fp1 = manifest1.get(fn, nullid) |
a2d93b186a0e
commit: unify file-level commit code
Matt Mackall <mpm@selenic.com>
parents:
3296
diff
changeset
|
583 fp2 = manifest2.get(fn, nullid) |
1716
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
584 |
3295
764688cf51e5
merge: remember rename copies and parents properly on commit
Matt Mackall <mpm@selenic.com>
parents:
3241
diff
changeset
|
585 meta = {} |
3300
a2d93b186a0e
commit: unify file-level commit code
Matt Mackall <mpm@selenic.com>
parents:
3296
diff
changeset
|
586 cp = self.dirstate.copied(fn) |
3295
764688cf51e5
merge: remember rename copies and parents properly on commit
Matt Mackall <mpm@selenic.com>
parents:
3241
diff
changeset
|
587 if cp: |
4058
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3925
diff
changeset
|
588 # Mark the new revision of this file as a copy of another |
4516
96d8a56d4ef9
Removed trailing whitespace and tabs from python files
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4510
diff
changeset
|
589 # file. This copy data will effectively act as a parent |
96d8a56d4ef9
Removed trailing whitespace and tabs from python files
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4510
diff
changeset
|
590 # of this new revision. If this is a merge, the first |
4058
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3925
diff
changeset
|
591 # parent will be the nullid (meaning "look up the copy data") |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3925
diff
changeset
|
592 # and the second one will be the other parent. For example: |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3925
diff
changeset
|
593 # |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3925
diff
changeset
|
594 # 0 --- 1 --- 3 rev1 changes file foo |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3925
diff
changeset
|
595 # \ / rev2 renames foo to bar and changes it |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3925
diff
changeset
|
596 # \- 2 -/ rev3 should have bar with all changes and |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3925
diff
changeset
|
597 # should record that bar descends from |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3925
diff
changeset
|
598 # bar in rev2 and foo in rev1 |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3925
diff
changeset
|
599 # |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3925
diff
changeset
|
600 # this allows this merge to succeed: |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3925
diff
changeset
|
601 # |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3925
diff
changeset
|
602 # 0 --- 1 --- 3 rev4 reverts the content change from rev2 |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3925
diff
changeset
|
603 # \ / merging rev3 and rev4 should use bar@rev2 |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3925
diff
changeset
|
604 # \- 2 --- 4 as the merge base |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3925
diff
changeset
|
605 # |
3295
764688cf51e5
merge: remember rename copies and parents properly on commit
Matt Mackall <mpm@selenic.com>
parents:
3241
diff
changeset
|
606 meta["copy"] = cp |
764688cf51e5
merge: remember rename copies and parents properly on commit
Matt Mackall <mpm@selenic.com>
parents:
3241
diff
changeset
|
607 if not manifest2: # not a branch merge |
764688cf51e5
merge: remember rename copies and parents properly on commit
Matt Mackall <mpm@selenic.com>
parents:
3241
diff
changeset
|
608 meta["copyrev"] = hex(manifest1.get(cp, nullid)) |
764688cf51e5
merge: remember rename copies and parents properly on commit
Matt Mackall <mpm@selenic.com>
parents:
3241
diff
changeset
|
609 fp2 = nullid |
764688cf51e5
merge: remember rename copies and parents properly on commit
Matt Mackall <mpm@selenic.com>
parents:
3241
diff
changeset
|
610 elif fp2 != nullid: # copied on remote side |
764688cf51e5
merge: remember rename copies and parents properly on commit
Matt Mackall <mpm@selenic.com>
parents:
3241
diff
changeset
|
611 meta["copyrev"] = hex(manifest1.get(cp, nullid)) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3721
diff
changeset
|
612 elif fp1 != nullid: # copied on local side, reversed |
3295
764688cf51e5
merge: remember rename copies and parents properly on commit
Matt Mackall <mpm@selenic.com>
parents:
3241
diff
changeset
|
613 meta["copyrev"] = hex(manifest2.get(cp)) |
4058
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3925
diff
changeset
|
614 fp2 = fp1 |
5244
dee573ba79f1
correctly record file-level history when the local side renames a directory
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5243
diff
changeset
|
615 elif cp in manifest2: # directory rename on local side |
dee573ba79f1
correctly record file-level history when the local side renames a directory
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5243
diff
changeset
|
616 meta["copyrev"] = hex(manifest2[cp]) |
dee573ba79f1
correctly record file-level history when the local side renames a directory
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5243
diff
changeset
|
617 else: # directory rename on remote side |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3721
diff
changeset
|
618 meta["copyrev"] = hex(manifest1.get(cp, nullid)) |
3295
764688cf51e5
merge: remember rename copies and parents properly on commit
Matt Mackall <mpm@selenic.com>
parents:
3241
diff
changeset
|
619 self.ui.debug(_(" %s: copy %s:%s\n") % |
3300
a2d93b186a0e
commit: unify file-level commit code
Matt Mackall <mpm@selenic.com>
parents:
3296
diff
changeset
|
620 (fn, cp, meta["copyrev"])) |
3295
764688cf51e5
merge: remember rename copies and parents properly on commit
Matt Mackall <mpm@selenic.com>
parents:
3241
diff
changeset
|
621 fp1 = nullid |
764688cf51e5
merge: remember rename copies and parents properly on commit
Matt Mackall <mpm@selenic.com>
parents:
3241
diff
changeset
|
622 elif fp2 != nullid: |
1716
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
623 # is one parent an ancestor of the other? |
3300
a2d93b186a0e
commit: unify file-level commit code
Matt Mackall <mpm@selenic.com>
parents:
3296
diff
changeset
|
624 fpa = fl.ancestor(fp1, fp2) |
1716
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
625 if fpa == fp1: |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
626 fp1, fp2 = fp2, nullid |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
627 elif fpa == fp2: |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
628 fp2 = nullid |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
629 |
4531
b51a8138292a
Avoid extra filelogs entries.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4530
diff
changeset
|
630 # is the file unmodified from the parent? report existing entry |
5243
8050f13772f6
Fix theoretical issue in filecommit.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5242
diff
changeset
|
631 if fp2 == nullid and not fl.cmp(fp1, t) and not meta: |
4531
b51a8138292a
Avoid extra filelogs entries.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4530
diff
changeset
|
632 return fp1 |
1716
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
633 |
3300
a2d93b186a0e
commit: unify file-level commit code
Matt Mackall <mpm@selenic.com>
parents:
3296
diff
changeset
|
634 changelist.append(fn) |
a2d93b186a0e
commit: unify file-level commit code
Matt Mackall <mpm@selenic.com>
parents:
3296
diff
changeset
|
635 return fl.add(t, meta, transaction, linkrev, fp1, fp2) |
1716
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
636 |
3945
79cf097774ef
pass the extra dict in rawcommit
Edouard Gomez <ed.gomez@free.fr>
parents:
3930
diff
changeset
|
637 def rawcommit(self, files, text, user, date, p1=None, p2=None, wlock=None, extra={}): |
3619
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
638 if p1 is None: |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
639 p1, p2 = self.dirstate.parents() |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
640 return self.commit(files=files, text=text, user=user, date=date, |
3945
79cf097774ef
pass the extra dict in rawcommit
Edouard Gomez <ed.gomez@free.fr>
parents:
3930
diff
changeset
|
641 p1=p1, p2=p2, wlock=wlock, extra=extra) |
203 | 642 |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
643 def commit(self, files=None, text="", user=None, date=None, |
2267
d812d91c5a84
Force editor to appear for an 'hg backout' if a message or logfile aren't
john.levon@sun.com
parents:
2259
diff
changeset
|
644 match=util.always, force=False, lock=None, wlock=None, |
3627
cabe62800120
Export changelog dict in localrepo.commit
Brendan Cully <brendan@kublai.com>
parents:
3623
diff
changeset
|
645 force_editor=False, p1=None, p2=None, extra={}): |
3619
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
646 |
220 | 647 commit = [] |
648 remove = [] | |
992
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
649 changed = [] |
3619
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
650 use_dirstate = (p1 is None) # not rawcommit |
3627
cabe62800120
Export changelog dict in localrepo.commit
Brendan Cully <brendan@kublai.com>
parents:
3623
diff
changeset
|
651 extra = extra.copy() |
992
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
652 |
3619
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
653 if use_dirstate: |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
654 if files: |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
655 for f in files: |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
656 s = self.dirstate.state(f) |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
657 if s in 'nmai': |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
658 commit.append(f) |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
659 elif s == 'r': |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
660 remove.append(f) |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
661 else: |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
662 self.ui.warn(_("%s not tracked!\n") % f) |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
663 else: |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
664 changes = self.status(match=match)[:5] |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
665 modified, added, removed, deleted, unknown = changes |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
666 commit = modified + added |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
667 remove = removed |
220 | 668 else: |
3619
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
669 commit = files |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
670 |
3619
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
671 if use_dirstate: |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
672 p1, p2 = self.dirstate.parents() |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
673 update_dirstate = True |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
674 else: |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
675 p1, p2 = p1, p2 or nullid |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
676 update_dirstate = (self.dirstate.parents()[0] == p1) |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
677 |
990 | 678 c1 = self.changelog.read(p1) |
679 c2 = self.changelog.read(p2) | |
2852
046a8b03ea59
Change remaining users of manifest flags
Matt Mackall <mpm@selenic.com>
parents:
2848
diff
changeset
|
680 m1 = self.manifest.read(c1[0]).copy() |
990 | 681 m2 = self.manifest.read(c2[0]) |
682 | |
3619
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
683 if use_dirstate: |
3862
46abbed02b2d
Use UTF-8 in .hg/branch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3861
diff
changeset
|
684 branchname = self.workingctx().branch() |
46abbed02b2d
Use UTF-8 in .hg/branch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3861
diff
changeset
|
685 try: |
46abbed02b2d
Use UTF-8 in .hg/branch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3861
diff
changeset
|
686 branchname = branchname.decode('UTF-8').encode('UTF-8') |
46abbed02b2d
Use UTF-8 in .hg/branch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3861
diff
changeset
|
687 except UnicodeDecodeError: |
46abbed02b2d
Use UTF-8 in .hg/branch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3861
diff
changeset
|
688 raise util.Abort(_('branch name not in UTF-8!')) |
3619
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
689 else: |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
690 branchname = "" |
3434
d0459ec1455d
Add branch support to commit
Matt Mackall <mpm@selenic.com>
parents:
3433
diff
changeset
|
691 |
3619
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
692 if use_dirstate: |
4206
0b48e3985765
Minor default branch cleanups
Matt Mackall <mpm@selenic.com>
parents:
4205
diff
changeset
|
693 oldname = c1[5].get("branch") # stored in UTF-8 |
4633
ff7253a0d1da
Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4623
diff
changeset
|
694 if (not commit and not remove and not force and p2 == nullid |
ff7253a0d1da
Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4623
diff
changeset
|
695 and branchname == oldname): |
3619
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
696 self.ui.status(_("nothing changed\n")) |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
697 return None |
151 | 698 |
1721
801756d0ca84
add pretxncommit hook.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1719
diff
changeset
|
699 xp1 = hex(p1) |
801756d0ca84
add pretxncommit hook.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1719
diff
changeset
|
700 if p2 == nullid: xp2 = '' |
801756d0ca84
add pretxncommit hook.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1719
diff
changeset
|
701 else: xp2 = hex(p2) |
801756d0ca84
add pretxncommit hook.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1719
diff
changeset
|
702 |
1727
019e6a47a53e
fix names of parent changeset ids in hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1726
diff
changeset
|
703 self.hook("precommit", throw=True, parent1=xp1, parent2=xp2) |
487 | 704 |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
705 if not wlock: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
706 wlock = self.wlock() |
1807
f1f43ea22cbf
Allow repo lock to be passed in to localrepo.commit for performance
mason@suse.com
parents:
1806
diff
changeset
|
707 if not lock: |
f1f43ea22cbf
Allow repo lock to be passed in to localrepo.commit for performance
mason@suse.com
parents:
1806
diff
changeset
|
708 lock = self.lock() |
151 | 709 tr = self.transaction() |
710 | |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
711 # check in files |
3675
6990e499d71a
Revert almost all of 5be434785317; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3650
diff
changeset
|
712 new = {} |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
713 linkrev = self.changelog.count() |
220 | 714 commit.sort() |
3996
c190df14338c
exec: add execfunc to simplify exec flag support on non-exec filesystems
Matt Mackall <mpm@selenic.com>
parents:
3956
diff
changeset
|
715 is_exec = util.execfunc(self.root, m1.execf) |
4002
d7b9ec589546
symlinks: use is_link wherever is_exec is used
Matt Mackall <mpm@selenic.com>
parents:
3996
diff
changeset
|
716 is_link = util.linkfunc(self.root, m1.linkf) |
220 | 717 for f in commit: |
83 | 718 self.ui.note(f + "\n") |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
719 try: |
3675
6990e499d71a
Revert almost all of 5be434785317; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3650
diff
changeset
|
720 new[f] = self.filecommit(f, m1, m2, linkrev, tr, changed) |
4530
0ac7fee4f024
Make sure the changelog mentions files whose flags changed
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4525
diff
changeset
|
721 new_exec = is_exec(f) |
0ac7fee4f024
Make sure the changelog mentions files whose flags changed
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4525
diff
changeset
|
722 new_link = is_link(f) |
5242
466323968b23
Avoid adding to the changelog executable files added by the second parent.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5235
diff
changeset
|
723 if (not changed or changed[-1] != f) and m2.get(f) != new[f]: |
4530
0ac7fee4f024
Make sure the changelog mentions files whose flags changed
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4525
diff
changeset
|
724 # mention the file in the changelog if some flag changed, |
0ac7fee4f024
Make sure the changelog mentions files whose flags changed
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4525
diff
changeset
|
725 # even if there was no content change. |
0ac7fee4f024
Make sure the changelog mentions files whose flags changed
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4525
diff
changeset
|
726 old_exec = m1.execf(f) |
0ac7fee4f024
Make sure the changelog mentions files whose flags changed
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4525
diff
changeset
|
727 old_link = m1.linkf(f) |
0ac7fee4f024
Make sure the changelog mentions files whose flags changed
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4525
diff
changeset
|
728 if old_exec != new_exec or old_link != new_link: |
0ac7fee4f024
Make sure the changelog mentions files whose flags changed
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4525
diff
changeset
|
729 changed.append(f) |
0ac7fee4f024
Make sure the changelog mentions files whose flags changed
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4525
diff
changeset
|
730 m1.set(f, new_exec, new_link) |
4060
82eb0fafb56d
commit: catch IOError
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4059
diff
changeset
|
731 except (OSError, IOError): |
3619
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
732 if use_dirstate: |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
733 self.ui.warn(_("trouble committing %s!\n") % f) |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
734 raise |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
735 else: |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
736 remove.append(f) |
220 | 737 |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
738 # update manifest |
3675
6990e499d71a
Revert almost all of 5be434785317; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3650
diff
changeset
|
739 m1.update(new) |
3618
5be434785317
localrepo.commit: little cleanups
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3578
diff
changeset
|
740 remove.sort() |
3956
497c69726a04
Fix removed file cornercase for CVS convert-repo
Matt Mackall <mpm@selenic.com>
parents:
3945
diff
changeset
|
741 removed = [] |
3618
5be434785317
localrepo.commit: little cleanups
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3578
diff
changeset
|
742 |
416
5e9e8b8d2629
[PATCH] Removal of a file added by merging branches
mpm@selenic.com
parents:
415
diff
changeset
|
743 for f in remove: |
5e9e8b8d2629
[PATCH] Removal of a file added by merging branches
mpm@selenic.com
parents:
415
diff
changeset
|
744 if f in m1: |
5e9e8b8d2629
[PATCH] Removal of a file added by merging branches
mpm@selenic.com
parents:
415
diff
changeset
|
745 del m1[f] |
3956
497c69726a04
Fix removed file cornercase for CVS convert-repo
Matt Mackall <mpm@selenic.com>
parents:
3945
diff
changeset
|
746 removed.append(f) |
4536
720ae5085ee3
commit: fix bug where dirstate for removed file is confused
Matt Mackall <mpm@selenic.com>
parents:
4531
diff
changeset
|
747 elif f in m2: |
720ae5085ee3
commit: fix bug where dirstate for removed file is confused
Matt Mackall <mpm@selenic.com>
parents:
4531
diff
changeset
|
748 removed.append(f) |
3956
497c69726a04
Fix removed file cornercase for CVS convert-repo
Matt Mackall <mpm@selenic.com>
parents:
3945
diff
changeset
|
749 mn = self.manifest.add(m1, tr, linkrev, c1[0], c2[0], (new, removed)) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
750 |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
751 # add changeset |
3675
6990e499d71a
Revert almost all of 5be434785317; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3650
diff
changeset
|
752 new = new.keys() |
6990e499d71a
Revert almost all of 5be434785317; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3650
diff
changeset
|
753 new.sort() |
6990e499d71a
Revert almost all of 5be434785317; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3650
diff
changeset
|
754 |
1983
ae12a81549a7
Pass correct username as $HGUSER to hgeditor if "commit -u" is used.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1981
diff
changeset
|
755 user = user or self.ui.username() |
2267
d812d91c5a84
Force editor to appear for an 'hg backout' if a message or logfile aren't
john.levon@sun.com
parents:
2259
diff
changeset
|
756 if not text or force_editor: |
d812d91c5a84
Force editor to appear for an 'hg backout' if a message or logfile aren't
john.levon@sun.com
parents:
2259
diff
changeset
|
757 edittext = [] |
d812d91c5a84
Force editor to appear for an 'hg backout' if a message or logfile aren't
john.levon@sun.com
parents:
2259
diff
changeset
|
758 if text: |
d812d91c5a84
Force editor to appear for an 'hg backout' if a message or logfile aren't
john.levon@sun.com
parents:
2259
diff
changeset
|
759 edittext.append(text) |
d812d91c5a84
Force editor to appear for an 'hg backout' if a message or logfile aren't
john.levon@sun.com
parents:
2259
diff
changeset
|
760 edittext.append("") |
3721
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3720
diff
changeset
|
761 edittext.append("HG: user: %s" % user) |
992
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
762 if p2 != nullid: |
1709
069129d24b26
Create default commit message in a more pythonic way.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1708
diff
changeset
|
763 edittext.append("HG: branch merge") |
4020
dbf250b80cc2
Add branch name to editor text.
Simon 'corecode' Schubert <corecode@fs.ei.tum.de>
parents:
4019
diff
changeset
|
764 if branchname: |
4021
1590558e9f60
Use local encoding for "HG: branch" line in commit editor.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4020
diff
changeset
|
765 edittext.append("HG: branch %s" % util.tolocal(branchname)) |
1709
069129d24b26
Create default commit message in a more pythonic way.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1708
diff
changeset
|
766 edittext.extend(["HG: changed %s" % f for f in changed]) |
3956
497c69726a04
Fix removed file cornercase for CVS convert-repo
Matt Mackall <mpm@selenic.com>
parents:
3945
diff
changeset
|
767 edittext.extend(["HG: removed %s" % f for f in removed]) |
992
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
768 if not changed and not remove: |
1709
069129d24b26
Create default commit message in a more pythonic way.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1708
diff
changeset
|
769 edittext.append("HG: no files changed") |
069129d24b26
Create default commit message in a more pythonic way.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1708
diff
changeset
|
770 edittext.append("") |
1706
20b621154e17
Run commit message editor in the repo root (like hooks).
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1680
diff
changeset
|
771 # run editor in the repository root |
20b621154e17
Run commit message editor in the repo root (like hooks).
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1680
diff
changeset
|
772 olddir = os.getcwd() |
20b621154e17
Run commit message editor in the repo root (like hooks).
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1680
diff
changeset
|
773 os.chdir(self.root) |
2301
7c2623aedeb4
Strip empty lines and trailing spaces around commit messages.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2288
diff
changeset
|
774 text = self.ui.edit("\n".join(edittext), user) |
1706
20b621154e17
Run commit message editor in the repo root (like hooks).
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1680
diff
changeset
|
775 os.chdir(olddir) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
776 |
2301
7c2623aedeb4
Strip empty lines and trailing spaces around commit messages.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2288
diff
changeset
|
777 lines = [line.rstrip() for line in text.rstrip().splitlines()] |
7c2623aedeb4
Strip empty lines and trailing spaces around commit messages.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2288
diff
changeset
|
778 while lines and not lines[0]: |
7c2623aedeb4
Strip empty lines and trailing spaces around commit messages.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2288
diff
changeset
|
779 del lines[0] |
7c2623aedeb4
Strip empty lines and trailing spaces around commit messages.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2288
diff
changeset
|
780 if not lines: |
7c2623aedeb4
Strip empty lines and trailing spaces around commit messages.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2288
diff
changeset
|
781 return None |
7c2623aedeb4
Strip empty lines and trailing spaces around commit messages.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2288
diff
changeset
|
782 text = '\n'.join(lines) |
3434
d0459ec1455d
Add branch support to commit
Matt Mackall <mpm@selenic.com>
parents:
3433
diff
changeset
|
783 if branchname: |
d0459ec1455d
Add branch support to commit
Matt Mackall <mpm@selenic.com>
parents:
3433
diff
changeset
|
784 extra["branch"] = branchname |
3956
497c69726a04
Fix removed file cornercase for CVS convert-repo
Matt Mackall <mpm@selenic.com>
parents:
3945
diff
changeset
|
785 n = self.changelog.add(mn, changed + removed, text, tr, p1, p2, |
3434
d0459ec1455d
Add branch support to commit
Matt Mackall <mpm@selenic.com>
parents:
3433
diff
changeset
|
786 user, date, extra) |
1727
019e6a47a53e
fix names of parent changeset ids in hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1726
diff
changeset
|
787 self.hook('pretxncommit', throw=True, node=hex(n), parent1=xp1, |
019e6a47a53e
fix names of parent changeset ids in hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1726
diff
changeset
|
788 parent2=xp2) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
789 tr.close() |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
790 |
4019
c3864dfb7812
When committing, record the changeset in the branchcache.
Simon 'corecode' Schubert <corecode@fs.ei.tum.de>
parents:
4007
diff
changeset
|
791 if self.branchcache and "branch" in extra: |
c3864dfb7812
When committing, record the changeset in the branchcache.
Simon 'corecode' Schubert <corecode@fs.ei.tum.de>
parents:
4007
diff
changeset
|
792 self.branchcache[util.tolocal(extra["branch"])] = n |
c3864dfb7812
When committing, record the changeset in the branchcache.
Simon 'corecode' Schubert <corecode@fs.ei.tum.de>
parents:
4007
diff
changeset
|
793 |
3619
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
794 if use_dirstate or update_dirstate: |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
795 self.dirstate.setparents(n) |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
796 if use_dirstate: |
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3618
diff
changeset
|
797 self.dirstate.update(new, "n") |
3956
497c69726a04
Fix removed file cornercase for CVS convert-repo
Matt Mackall <mpm@selenic.com>
parents:
3945
diff
changeset
|
798 self.dirstate.forget(removed) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
799 |
1727
019e6a47a53e
fix names of parent changeset ids in hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1726
diff
changeset
|
800 self.hook("commit", node=hex(n), parent1=xp1, parent2=xp2) |
901
120cba94d5aa
Change repo.comit to return None on error or the new revision number on
mason@suse.com
parents:
900
diff
changeset
|
801 return n |
660
2c83350784c3
Move commit hook after commit completes
Matt Mackall <mpm@selenic.com>
parents:
659
diff
changeset
|
802 |
2029
d436b21b20dc
rewrite revert command. fix issues 93, 123, 147.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
803 def walk(self, node=None, files=[], match=util.always, badmatch=None): |
3563 | 804 ''' |
805 walk recursively through the directory tree or a given | |
806 changeset, finding all files matched by the match | |
807 function | |
808 | |
809 results are yielded in a tuple (src, filename), where src | |
810 is one of: | |
811 'f' the file was found in the directory tree | |
812 'm' the file was only in the dirstate and not in the tree | |
813 'b' file was not found and matched badmatch | |
814 ''' | |
815 | |
724
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
723
diff
changeset
|
816 if node: |
1582
63799b01985c
fix the cat command
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
817 fdict = dict.fromkeys(files) |
4190
e8ee8fdeddb1
change locate to use relglobs by default
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4189
diff
changeset
|
818 # for dirstate.walk, files=['.'] means "walk the whole tree". |
e8ee8fdeddb1
change locate to use relglobs by default
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4189
diff
changeset
|
819 # follow that here, too |
e8ee8fdeddb1
change locate to use relglobs by default
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4189
diff
changeset
|
820 fdict.pop('.', None) |
4189
8e947b0e53cc
localrepo.walk: if we're walking a specific revision, sort the files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4171
diff
changeset
|
821 mdict = self.manifest.read(self.changelog.read(node)[0]) |
8e947b0e53cc
localrepo.walk: if we're walking a specific revision, sort the files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4171
diff
changeset
|
822 mfiles = mdict.keys() |
8e947b0e53cc
localrepo.walk: if we're walking a specific revision, sort the files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4171
diff
changeset
|
823 mfiles.sort() |
8e947b0e53cc
localrepo.walk: if we're walking a specific revision, sort the files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4171
diff
changeset
|
824 for fn in mfiles: |
3016
aebc3f64b20f
fix incorrect warning when walking on a particular rev
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2974
diff
changeset
|
825 for ffn in fdict: |
aebc3f64b20f
fix incorrect warning when walking on a particular rev
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2974
diff
changeset
|
826 # match if the file is the exact name or a directory |
aebc3f64b20f
fix incorrect warning when walking on a particular rev
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2974
diff
changeset
|
827 if ffn == fn or fn.startswith("%s/" % ffn): |
aebc3f64b20f
fix incorrect warning when walking on a particular rev
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2974
diff
changeset
|
828 del fdict[ffn] |
aebc3f64b20f
fix incorrect warning when walking on a particular rev
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2974
diff
changeset
|
829 break |
1582
63799b01985c
fix the cat command
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
830 if match(fn): |
63799b01985c
fix the cat command
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
831 yield 'm', fn |
4189
8e947b0e53cc
localrepo.walk: if we're walking a specific revision, sort the files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4171
diff
changeset
|
832 ffiles = fdict.keys() |
8e947b0e53cc
localrepo.walk: if we're walking a specific revision, sort the files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4171
diff
changeset
|
833 ffiles.sort() |
8e947b0e53cc
localrepo.walk: if we're walking a specific revision, sort the files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4171
diff
changeset
|
834 for fn in ffiles: |
2029
d436b21b20dc
rewrite revert command. fix issues 93, 123, 147.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
835 if badmatch and badmatch(fn): |
d436b21b20dc
rewrite revert command. fix issues 93, 123, 147.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
836 if match(fn): |
d436b21b20dc
rewrite revert command. fix issues 93, 123, 147.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
837 yield 'b', fn |
d436b21b20dc
rewrite revert command. fix issues 93, 123, 147.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
838 else: |
4525
78b6add1f966
Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4516
diff
changeset
|
839 self.ui.warn(_('%s: No such file in rev %s\n') |
78b6add1f966
Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4516
diff
changeset
|
840 % (self.pathto(fn), short(node))) |
724
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
723
diff
changeset
|
841 else: |
2042
a514c7509fa9
small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2038
diff
changeset
|
842 for src, fn in self.dirstate.walk(files, match, badmatch=badmatch): |
726
809a870a0e73
Add a source designator to the walk methods.
Bryan O'Sullivan <bos@serpentine.com>
parents:
725
diff
changeset
|
843 yield src, fn |
723 | 844 |
2661
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2621
diff
changeset
|
845 def status(self, node1=None, node2=None, files=[], match=util.always, |
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2621
diff
changeset
|
846 wlock=None, list_ignored=False, list_clean=False): |
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2621
diff
changeset
|
847 """return status of files between two nodes or node and working directory |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
848 |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
849 If node1 is None, use the first dirstate parent instead. |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
850 If node2 is None, compare node1 with working directory. |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
851 """ |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
852 |
4160
b4bd2f3ea347
localrepo.status: fcmp gets a getnode function instead of the manifest
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4137
diff
changeset
|
853 def fcmp(fn, getnode): |
1019
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
854 t1 = self.wread(fn) |
4160
b4bd2f3ea347
localrepo.status: fcmp gets a getnode function instead of the manifest
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4137
diff
changeset
|
855 return self.file(fn).cmp(getnode(fn), t1) |
29 | 856 |
723 | 857 def mfmatches(node): |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
858 change = self.changelog.read(node) |
3299
a1aad25ccc3e
fix localrepo.status when dealing with x-bit changes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3296
diff
changeset
|
859 mf = self.manifest.read(change[0]).copy() |
723 | 860 for fn in mf.keys(): |
861 if not match(fn): | |
862 del mf[fn] | |
863 return mf | |
741 | 864 |
2661
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2621
diff
changeset
|
865 modified, added, removed, deleted, unknown = [], [], [], [], [] |
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2621
diff
changeset
|
866 ignored, clean = [], [] |
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2621
diff
changeset
|
867 |
2474
1e32e2fe8a67
Fix cold cache diff performance
Chris Mason <mason@suse.com>
parents:
2463
diff
changeset
|
868 compareworking = False |
2491
ffde9eb23f59
Fix localrepo.changes() Correctly decide if we are diffing the working dir
Chris Mason <mason@suse.com>
parents:
2478
diff
changeset
|
869 if not node1 or (not node2 and node1 == self.dirstate.parents()[0]): |
2474
1e32e2fe8a67
Fix cold cache diff performance
Chris Mason <mason@suse.com>
parents:
2463
diff
changeset
|
870 compareworking = True |
1e32e2fe8a67
Fix cold cache diff performance
Chris Mason <mason@suse.com>
parents:
2463
diff
changeset
|
871 |
1e32e2fe8a67
Fix cold cache diff performance
Chris Mason <mason@suse.com>
parents:
2463
diff
changeset
|
872 if not compareworking: |
1802
8a7a24b96697
speed up hg log --debug
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
1789
diff
changeset
|
873 # read the manifest from node1 before the manifest from node2, |
8a7a24b96697
speed up hg log --debug
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
1789
diff
changeset
|
874 # so that we'll hit the manifest cache if we're going through |
8a7a24b96697
speed up hg log --debug
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
1789
diff
changeset
|
875 # all the revisions in parent->child order. |
8a7a24b96697
speed up hg log --debug
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
1789
diff
changeset
|
876 mf1 = mfmatches(node1) |
8a7a24b96697
speed up hg log --debug
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
1789
diff
changeset
|
877 |
4370
4ddc6d374265
localrepository.status: only acquire wlock if actually needed.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4334
diff
changeset
|
878 mywlock = False |
4ddc6d374265
localrepository.status: only acquire wlock if actually needed.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4334
diff
changeset
|
879 |
536 | 880 # are we comparing the working directory? |
561 | 881 if not node2: |
2661
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2621
diff
changeset
|
882 (lookup, modified, added, removed, deleted, unknown, |
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2621
diff
changeset
|
883 ignored, clean) = self.dirstate.status(files, match, |
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2621
diff
changeset
|
884 list_ignored, list_clean) |
536 | 885 |
886 # are we comparing working dir against its parent? | |
2474
1e32e2fe8a67
Fix cold cache diff performance
Chris Mason <mason@suse.com>
parents:
2463
diff
changeset
|
887 if compareworking: |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
888 if lookup: |
536 | 889 # do a full compare of any files that might have changed |
4161
939de0d20a67
localrepo.status: use manifest.find on "lookup" files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4160
diff
changeset
|
890 mnode = self.changelog.read(self.dirstate.parents()[0])[0] |
939de0d20a67
localrepo.status: use manifest.find on "lookup" files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4160
diff
changeset
|
891 getnode = lambda fn: (self.manifest.find(mnode, fn)[0] or |
939de0d20a67
localrepo.status: use manifest.find on "lookup" files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4160
diff
changeset
|
892 nullid) |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
893 for f in lookup: |
4160
b4bd2f3ea347
localrepo.status: fcmp gets a getnode function instead of the manifest
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4137
diff
changeset
|
894 if fcmp(f, getnode): |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
895 modified.append(f) |
2961
5bb65c3945a3
localrepo.status: detect clean files even when the mtime has changed
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
2900
diff
changeset
|
896 else: |
4577
e7d4ed543de5
localrepo.status: only append stuff to the clean list if list_clean is true
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4573
diff
changeset
|
897 if list_clean: |
e7d4ed543de5
localrepo.status: only append stuff to the clean list if list_clean is true
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4573
diff
changeset
|
898 clean.append(f) |
4370
4ddc6d374265
localrepository.status: only acquire wlock if actually needed.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4334
diff
changeset
|
899 if not wlock and not mywlock: |
4ddc6d374265
localrepository.status: only acquire wlock if actually needed.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4334
diff
changeset
|
900 mywlock = True |
4ddc6d374265
localrepository.status: only acquire wlock if actually needed.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4334
diff
changeset
|
901 try: |
4ddc6d374265
localrepository.status: only acquire wlock if actually needed.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4334
diff
changeset
|
902 wlock = self.wlock(wait=0) |
4ddc6d374265
localrepository.status: only acquire wlock if actually needed.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4334
diff
changeset
|
903 except lock.LockException: |
4ddc6d374265
localrepository.status: only acquire wlock if actually needed.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4334
diff
changeset
|
904 pass |
4ddc6d374265
localrepository.status: only acquire wlock if actually needed.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4334
diff
changeset
|
905 if wlock: |
2961
5bb65c3945a3
localrepo.status: detect clean files even when the mtime has changed
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
2900
diff
changeset
|
906 self.dirstate.update([f], "n") |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
907 else: |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
908 # we are comparing working dir against non-parent |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
909 # generate a pseudo-manifest for the working dir |
3299
a1aad25ccc3e
fix localrepo.status when dealing with x-bit changes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3296
diff
changeset
|
910 # XXX: create it in dirstate.py ? |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
911 mf2 = mfmatches(self.dirstate.parents()[0]) |
3996
c190df14338c
exec: add execfunc to simplify exec flag support on non-exec filesystems
Matt Mackall <mpm@selenic.com>
parents:
3956
diff
changeset
|
912 is_exec = util.execfunc(self.root, mf2.execf) |
4002
d7b9ec589546
symlinks: use is_link wherever is_exec is used
Matt Mackall <mpm@selenic.com>
parents:
3996
diff
changeset
|
913 is_link = util.linkfunc(self.root, mf2.linkf) |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
914 for f in lookup + modified + added: |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
915 mf2[f] = "" |
4002
d7b9ec589546
symlinks: use is_link wherever is_exec is used
Matt Mackall <mpm@selenic.com>
parents:
3996
diff
changeset
|
916 mf2.set(f, is_exec(f), is_link(f)) |
1617
ece5d785e87a
Make localrepo.changes() internally distinguish between removed and deleted.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1616
diff
changeset
|
917 for f in removed: |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
918 if f in mf2: |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
919 del mf2[f] |
4370
4ddc6d374265
localrepository.status: only acquire wlock if actually needed.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4334
diff
changeset
|
920 |
4ddc6d374265
localrepository.status: only acquire wlock if actually needed.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4334
diff
changeset
|
921 if mywlock and wlock: |
4ddc6d374265
localrepository.status: only acquire wlock if actually needed.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4334
diff
changeset
|
922 wlock.release() |
536 | 923 else: |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
924 # we are comparing two revisions |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
925 mf2 = mfmatches(node2) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
926 |
2474
1e32e2fe8a67
Fix cold cache diff performance
Chris Mason <mason@suse.com>
parents:
2463
diff
changeset
|
927 if not compareworking: |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
928 # flush lists from dirstate before comparing manifests |
2661
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2621
diff
changeset
|
929 modified, added, clean = [], [], [] |
566 | 930 |
2474
1e32e2fe8a67
Fix cold cache diff performance
Chris Mason <mason@suse.com>
parents:
2463
diff
changeset
|
931 # make sure to sort the files so we talk to the disk in a |
1e32e2fe8a67
Fix cold cache diff performance
Chris Mason <mason@suse.com>
parents:
2463
diff
changeset
|
932 # reasonable order |
1e32e2fe8a67
Fix cold cache diff performance
Chris Mason <mason@suse.com>
parents:
2463
diff
changeset
|
933 mf2keys = mf2.keys() |
1e32e2fe8a67
Fix cold cache diff performance
Chris Mason <mason@suse.com>
parents:
2463
diff
changeset
|
934 mf2keys.sort() |
4160
b4bd2f3ea347
localrepo.status: fcmp gets a getnode function instead of the manifest
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4137
diff
changeset
|
935 getnode = lambda fn: mf1.get(fn, nullid) |
2474
1e32e2fe8a67
Fix cold cache diff performance
Chris Mason <mason@suse.com>
parents:
2463
diff
changeset
|
936 for fn in mf2keys: |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
937 if mf1.has_key(fn): |
4633
ff7253a0d1da
Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4623
diff
changeset
|
938 if (mf1.flags(fn) != mf2.flags(fn) or |
ff7253a0d1da
Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4623
diff
changeset
|
939 (mf1[fn] != mf2[fn] and |
ff7253a0d1da
Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4623
diff
changeset
|
940 (mf2[fn] != "" or fcmp(fn, getnode)))): |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
941 modified.append(fn) |
2661
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2621
diff
changeset
|
942 elif list_clean: |
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2621
diff
changeset
|
943 clean.append(fn) |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
944 del mf1[fn] |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
945 else: |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
946 added.append(fn) |
515 | 947 |
1617
ece5d785e87a
Make localrepo.changes() internally distinguish between removed and deleted.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1616
diff
changeset
|
948 removed = mf1.keys() |
ece5d785e87a
Make localrepo.changes() internally distinguish between removed and deleted.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1616
diff
changeset
|
949 |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
950 # sort and return results: |
2661
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2621
diff
changeset
|
951 for l in modified, added, removed, deleted, unknown, ignored, clean: |
561 | 952 l.sort() |
2661
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2621
diff
changeset
|
953 return (modified, added, removed, deleted, unknown, ignored, clean) |
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2621
diff
changeset
|
954 |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
955 def add(self, list, wlock=None): |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
956 if not wlock: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
957 wlock = self.wlock() |
220 | 958 for f in list: |
244 | 959 p = self.wjoin(f) |
4573
d092e962c4f8
localrepo.add: avoid some stats
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4556
diff
changeset
|
960 try: |
d092e962c4f8
localrepo.add: avoid some stats
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4556
diff
changeset
|
961 st = os.lstat(p) |
d092e962c4f8
localrepo.add: avoid some stats
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4556
diff
changeset
|
962 except: |
d092e962c4f8
localrepo.add: avoid some stats
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4556
diff
changeset
|
963 self.ui.warn(_("%s does not exist!\n") % f) |
d092e962c4f8
localrepo.add: avoid some stats
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4556
diff
changeset
|
964 continue |
d092e962c4f8
localrepo.add: avoid some stats
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4556
diff
changeset
|
965 if st.st_size > 10000000: |
4475
e8a584067825
Warn about large files on hg add
Matt Mackall <mpm@selenic.com>
parents:
4438
diff
changeset
|
966 self.ui.warn(_("%s: files over 10MB may cause memory and" |
e8a584067825
Warn about large files on hg add
Matt Mackall <mpm@selenic.com>
parents:
4438
diff
changeset
|
967 " performance problems\n" |
e8a584067825
Warn about large files on hg add
Matt Mackall <mpm@selenic.com>
parents:
4438
diff
changeset
|
968 "(use 'hg revert %s' to unadd the file)\n") |
e8a584067825
Warn about large files on hg add
Matt Mackall <mpm@selenic.com>
parents:
4438
diff
changeset
|
969 % (f, f)) |
4573
d092e962c4f8
localrepo.add: avoid some stats
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4556
diff
changeset
|
970 if not (stat.S_ISREG(st.st_mode) or stat.S_ISLNK(st.st_mode)): |
4018
dfe87137ed14
Allow adding symlinks that don't point to files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4007
diff
changeset
|
971 self.ui.warn(_("%s not added: only files and symlinks " |
dfe87137ed14
Allow adding symlinks that don't point to files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4007
diff
changeset
|
972 "supported currently\n") % f) |
724
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
723
diff
changeset
|
973 elif self.dirstate.state(f) in 'an': |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
974 self.ui.warn(_("%s already tracked!\n") % f) |
220 | 975 else: |
976 self.dirstate.update([f], "a") | |
977 | |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
978 def forget(self, list, wlock=None): |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
979 if not wlock: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
980 wlock = self.wlock() |
220 | 981 for f in list: |
982 if self.dirstate.state(f) not in 'ai': | |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
983 self.ui.warn(_("%s not added!\n") % f) |
220 | 984 else: |
985 self.dirstate.forget([f]) | |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
986 |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
987 def remove(self, list, unlink=False, wlock=None): |
1415
c6e6ca96a033
refactor some unlink/remove code and make sure we prune empty dir
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
988 if unlink: |
c6e6ca96a033
refactor some unlink/remove code and make sure we prune empty dir
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
989 for f in list: |
c6e6ca96a033
refactor some unlink/remove code and make sure we prune empty dir
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
990 try: |
c6e6ca96a033
refactor some unlink/remove code and make sure we prune empty dir
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
991 util.unlink(self.wjoin(f)) |
c6e6ca96a033
refactor some unlink/remove code and make sure we prune empty dir
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
992 except OSError, inst: |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
993 if inst.errno != errno.ENOENT: |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
994 raise |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
995 if not wlock: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
996 wlock = self.wlock() |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
997 for f in list: |
4392
9770d260a405
Make rm --after simply mark files as removed, unless --force is also given
Brendan Cully <brendan@kublai.com>
parents:
4373
diff
changeset
|
998 if unlink and os.path.exists(self.wjoin(f)): |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
999 self.ui.warn(_("%s still exists!\n") % f) |
402 | 1000 elif self.dirstate.state(f) == 'a': |
657
22bc6fb9aefc
dirstate.forget() takes a list
Matt Mackall <mpm@selenic.com>
parents:
656
diff
changeset
|
1001 self.dirstate.forget([f]) |
220 | 1002 elif f not in self.dirstate: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1003 self.ui.warn(_("%s not tracked!\n") % f) |
220 | 1004 else: |
1005 self.dirstate.update([f], "r") | |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
1006 |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
1007 def undelete(self, list, wlock=None): |
5317
ef65d6ec114e
localrepo: fix undelete() on merge working directory (issue 746)
Patrick Mezard <pmezard@gmail.com>
parents:
5244
diff
changeset
|
1008 manifests = [self.manifest.read(self.changelog.read(p)[0]) |
ef65d6ec114e
localrepo: fix undelete() on merge working directory (issue 746)
Patrick Mezard <pmezard@gmail.com>
parents:
5244
diff
changeset
|
1009 for p in self.dirstate.parents() if p != nullid] |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
1010 if not wlock: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
1011 wlock = self.wlock() |
1447
508a3f559553
revert added and removed files to their normal state before reverting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1427
diff
changeset
|
1012 for f in list: |
508a3f559553
revert added and removed files to their normal state before reverting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1427
diff
changeset
|
1013 if self.dirstate.state(f) not in "r": |
508a3f559553
revert added and removed files to their normal state before reverting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1427
diff
changeset
|
1014 self.ui.warn("%s not removed!\n" % f) |
508a3f559553
revert added and removed files to their normal state before reverting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1427
diff
changeset
|
1015 else: |
5317
ef65d6ec114e
localrepo: fix undelete() on merge working directory (issue 746)
Patrick Mezard <pmezard@gmail.com>
parents:
5244
diff
changeset
|
1016 m = f in manifests[0] and manifests[0] or manifests[1] |
1447
508a3f559553
revert added and removed files to their normal state before reverting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1427
diff
changeset
|
1017 t = self.file(f).read(m[f]) |
4006
67982d3ee76c
symlinks: add flags param to wwrite
Matt Mackall <mpm@selenic.com>
parents:
4005
diff
changeset
|
1018 self.wwrite(f, t, m.flags(f)) |
1447
508a3f559553
revert added and removed files to their normal state before reverting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1427
diff
changeset
|
1019 self.dirstate.update([f], "n") |
508a3f559553
revert added and removed files to their normal state before reverting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1427
diff
changeset
|
1020 |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
1021 def copy(self, source, dest, wlock=None): |
363 | 1022 p = self.wjoin(dest) |
4263
4a1504264261
Fix localrepo.copy to deal with symbolic links.
Eric St-Jean <esj@wwd.ca>
parents:
4232
diff
changeset
|
1023 if not (os.path.exists(p) or os.path.islink(p)): |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1024 self.ui.warn(_("%s does not exist!\n") % dest) |
4263
4a1504264261
Fix localrepo.copy to deal with symbolic links.
Eric St-Jean <esj@wwd.ca>
parents:
4232
diff
changeset
|
1025 elif not (os.path.isfile(p) or os.path.islink(p)): |
4a1504264261
Fix localrepo.copy to deal with symbolic links.
Eric St-Jean <esj@wwd.ca>
parents:
4232
diff
changeset
|
1026 self.ui.warn(_("copy failed: %s is not a file or a " |
4a1504264261
Fix localrepo.copy to deal with symbolic links.
Eric St-Jean <esj@wwd.ca>
parents:
4232
diff
changeset
|
1027 "symbolic link\n") % dest) |
363 | 1028 else: |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
1029 if not wlock: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
1030 wlock = self.wlock() |
363 | 1031 if self.dirstate.state(dest) == '?': |
1032 self.dirstate.update([dest], "a") | |
1033 self.dirstate.copy(source, dest) | |
1034 | |
1551
e793cbc8be00
Fixes to "hg heads -r FOO":
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1550
diff
changeset
|
1035 def heads(self, start=None): |
1550
ccb9b62de892
add a -r/--rev option to heads to show only heads descendant from rev
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1532
diff
changeset
|
1036 heads = self.changelog.heads(start) |
ccb9b62de892
add a -r/--rev option to heads to show only heads descendant from rev
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1532
diff
changeset
|
1037 # sort the output in rev descending order |
ccb9b62de892
add a -r/--rev option to heads to show only heads descendant from rev
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1532
diff
changeset
|
1038 heads = [(-self.changelog.rev(h), h) for h in heads] |
ccb9b62de892
add a -r/--rev option to heads to show only heads descendant from rev
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1532
diff
changeset
|
1039 heads.sort() |
ccb9b62de892
add a -r/--rev option to heads to show only heads descendant from rev
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1532
diff
changeset
|
1040 return [n for (r, n) in heads] |
222 | 1041 |
4648
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1042 def branchheads(self, branch, start=None): |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1043 branches = self.branchtags() |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1044 if branch not in branches: |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1045 return [] |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1046 # The basic algorithm is this: |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1047 # |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1048 # Start from the branch tip since there are no later revisions that can |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1049 # possibly be in this branch, and the tip is a guaranteed head. |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1050 # |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1051 # Remember the tip's parents as the first ancestors, since these by |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1052 # definition are not heads. |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1053 # |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1054 # Step backwards from the brach tip through all the revisions. We are |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1055 # guaranteed by the rules of Mercurial that we will now be visiting the |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1056 # nodes in reverse topological order (children before parents). |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1057 # |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1058 # If a revision is one of the ancestors of a head then we can toss it |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1059 # out of the ancestors set (we've already found it and won't be |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1060 # visiting it again) and put its parents in the ancestors set. |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1061 # |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1062 # Otherwise, if a revision is in the branch it's another head, since it |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1063 # wasn't in the ancestor list of an existing head. So add it to the |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1064 # head list, and add its parents to the ancestor list. |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1065 # |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1066 # If it is not in the branch ignore it. |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1067 # |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1068 # Once we have a list of heads, use nodesbetween to filter out all the |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1069 # heads that cannot be reached from startrev. There may be a more |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1070 # efficient way to do this as part of the previous algorithm. |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1071 |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1072 set = util.set |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1073 heads = [self.changelog.rev(branches[branch])] |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1074 # Don't care if ancestors contains nullrev or not. |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1075 ancestors = set(self.changelog.parentrevs(heads[0])) |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1076 for rev in xrange(heads[0] - 1, nullrev, -1): |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1077 if rev in ancestors: |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1078 ancestors.update(self.changelog.parentrevs(rev)) |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1079 ancestors.remove(rev) |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1080 elif self.changectx(rev).branch() == branch: |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1081 heads.append(rev) |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1082 ancestors.update(self.changelog.parentrevs(rev)) |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1083 heads = [self.changelog.node(rev) for rev in heads] |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1084 if start is not None: |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1085 heads = self.changelog.nodesbetween([start], heads)[2] |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1086 return heads |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
1087 |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1088 def branches(self, nodes): |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1089 if not nodes: |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1090 nodes = [self.changelog.tip()] |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1091 b = [] |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1092 for n in nodes: |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1093 t = n |
2345
4f7745fc9823
n is always 'True', we can only stop the loop with the break statement
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2320
diff
changeset
|
1094 while 1: |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1095 p = self.changelog.parents(n) |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1096 if p[1] != nullid or p[0] == nullid: |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1097 b.append((t, n, p[0], p[1])) |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1098 break |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1099 n = p[0] |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1100 return b |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1101 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1102 def between(self, pairs): |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1103 r = [] |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1104 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1105 for top, bottom in pairs: |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1106 n, l, i = top, [], 0 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1107 f = 1 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1108 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1109 while n != bottom: |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1110 p = self.changelog.parents(n)[0] |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1111 if i == f: |
575 | 1112 l.append(n) |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1113 f = f * 2 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1114 n = p |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1115 i += 1 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1116 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1117 r.append(l) |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1118 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1119 return r |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1120 |
1959
d53a18f592be
add -f/--force to pull, incoming, outgoing, to work on unrelated repo.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1947
diff
changeset
|
1121 def findincoming(self, remote, base=None, heads=None, force=False): |
2339
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1122 """Return list of roots of the subsets of missing nodes from remote |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1123 |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1124 If base dict is specified, assume that these nodes and their parents |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1125 exist on the remote side and that no child of a node of base exists |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1126 in both remote and self. |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1127 Furthermore base will be updated to include the nodes that exists |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1128 in self and remote but no children exists in self and remote. |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1129 If a list of heads is specified, return only nodes which are heads |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1130 or ancestors of these heads. |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1131 |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1132 All the ancestors of base are in self and in remote. |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1133 All the descendants of the list returned are missing in self. |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1134 (and so we know that the rest of the nodes are missing in remote, see |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1135 outgoing) |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1136 """ |
65
d40cc5aacc31
Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents:
64
diff
changeset
|
1137 m = self.changelog.nodemap |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1138 search = [] |
1072 | 1139 fetch = {} |
148
c32286d0a665
Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents:
146
diff
changeset
|
1140 seen = {} |
c32286d0a665
Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents:
146
diff
changeset
|
1141 seenbranch = {} |
816
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
1142 if base == None: |
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
1143 base = {} |
192 | 1144 |
2108
30c7564f6dfc
Move empty local repo logic for pull into findincoming
Matt Mackall <mpm@selenic.com>
parents:
2107
diff
changeset
|
1145 if not heads: |
30c7564f6dfc
Move empty local repo logic for pull into findincoming
Matt Mackall <mpm@selenic.com>
parents:
2107
diff
changeset
|
1146 heads = remote.heads() |
30c7564f6dfc
Move empty local repo logic for pull into findincoming
Matt Mackall <mpm@selenic.com>
parents:
2107
diff
changeset
|
1147 |
30c7564f6dfc
Move empty local repo logic for pull into findincoming
Matt Mackall <mpm@selenic.com>
parents:
2107
diff
changeset
|
1148 if self.changelog.tip() == nullid: |
2339
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1149 base[nullid] = 1 |
2108
30c7564f6dfc
Move empty local repo logic for pull into findincoming
Matt Mackall <mpm@selenic.com>
parents:
2107
diff
changeset
|
1150 if heads != [nullid]: |
30c7564f6dfc
Move empty local repo logic for pull into findincoming
Matt Mackall <mpm@selenic.com>
parents:
2107
diff
changeset
|
1151 return [nullid] |
30c7564f6dfc
Move empty local repo logic for pull into findincoming
Matt Mackall <mpm@selenic.com>
parents:
2107
diff
changeset
|
1152 return [] |
30c7564f6dfc
Move empty local repo logic for pull into findincoming
Matt Mackall <mpm@selenic.com>
parents:
2107
diff
changeset
|
1153 |
636
ac0ec421e3a5
Move the empty changeset detection out of findincoming to pull
Matt Mackall <mpm@selenic.com>
parents:
635
diff
changeset
|
1154 # assume we're closer to the tip than the root |
579
ffeb2c3a1966
Actually warn on pulling from an unrelated repository
mpm@selenic.com
parents:
578
diff
changeset
|
1155 # and start by examining the heads |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1156 self.ui.status(_("searching for changes\n")) |
816
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
1157 |
222 | 1158 unknown = [] |
1159 for h in heads: | |
1160 if h not in m: | |
1161 unknown.append(h) | |
621
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1162 else: |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1163 base[h] = 1 |
46 | 1164 |
222 | 1165 if not unknown: |
1895
d7c038e805e9
findincoming should return an iterable
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1893
diff
changeset
|
1166 return [] |
324 | 1167 |
2339
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1168 req = dict.fromkeys(unknown) |
324 | 1169 reqcnt = 0 |
515 | 1170 |
579
ffeb2c3a1966
Actually warn on pulling from an unrelated repository
mpm@selenic.com
parents:
578
diff
changeset
|
1171 # search through remote branches |
ffeb2c3a1966
Actually warn on pulling from an unrelated repository
mpm@selenic.com
parents:
578
diff
changeset
|
1172 # a 'branch' here is a linear segment of history, with four parts: |
ffeb2c3a1966
Actually warn on pulling from an unrelated repository
mpm@selenic.com
parents:
578
diff
changeset
|
1173 # head, root, first parent, second parent |
ffeb2c3a1966
Actually warn on pulling from an unrelated repository
mpm@selenic.com
parents:
578
diff
changeset
|
1174 # (a branch always has two parents (or none) by definition) |
222 | 1175 unknown = remote.branches(unknown) |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1176 while unknown: |
324 | 1177 r = [] |
1178 while unknown: | |
1179 n = unknown.pop(0) | |
1180 if n[0] in seen: | |
1181 continue | |
148
c32286d0a665
Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents:
146
diff
changeset
|
1182 |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1183 self.ui.debug(_("examining %s:%s\n") |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1184 % (short(n[0]), short(n[1]))) |
2339
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1185 if n[0] == nullid: # found the end of the branch |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1186 pass |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1187 elif n in seenbranch: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1188 self.ui.debug(_("branch already found\n")) |
324 | 1189 continue |
2339
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1190 elif n[1] and n[1] in m: # do we know the base? |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1191 self.ui.debug(_("found incomplete branch %s:%s\n") |
324 | 1192 % (short(n[0]), short(n[1]))) |
1193 search.append(n) # schedule branch range for scanning | |
328 | 1194 seenbranch[n] = 1 |
324 | 1195 else: |
1196 if n[1] not in seen and n[1] not in fetch: | |
1197 if n[2] in m and n[3] in m: | |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1198 self.ui.debug(_("found new changeset %s\n") % |
324 | 1199 short(n[1])) |
1072 | 1200 fetch[n[1]] = 1 # earliest unknown |
2339
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1201 for p in n[2:4]: |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1202 if p in m: |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1203 base[p] = 1 # latest known |
324 | 1204 |
2339
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1205 for p in n[2:4]: |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1206 if p not in req and p not in m: |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1207 r.append(p) |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1208 req[p] = 1 |
328 | 1209 seen[n[0]] = 1 |
1210 | |
324 | 1211 if r: |
1212 reqcnt += 1 | |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1213 self.ui.debug(_("request %d: %s\n") % |
324 | 1214 (reqcnt, " ".join(map(short, r)))) |
3468
0e68608bd11d
use xrange instead of range
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3452
diff
changeset
|
1215 for p in xrange(0, len(r), 10): |
324 | 1216 for b in remote.branches(r[p:p+10]): |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1217 self.ui.debug(_("received %s:%s\n") % |
148
c32286d0a665
Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents:
146
diff
changeset
|
1218 (short(b[0]), short(b[1]))) |
2339
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1219 unknown.append(b) |
515 | 1220 |
579
ffeb2c3a1966
Actually warn on pulling from an unrelated repository
mpm@selenic.com
parents:
578
diff
changeset
|
1221 # do binary search on the branches we found |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1222 while search: |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1223 n = search.pop(0) |
324 | 1224 reqcnt += 1 |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1225 l = remote.between([(n[0], n[1])])[0] |
328 | 1226 l.append(n[1]) |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1227 p = n[0] |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1228 f = 1 |
328 | 1229 for i in l: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1230 self.ui.debug(_("narrowing %d:%d %s\n") % (f, len(l), short(i))) |
65
d40cc5aacc31
Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents:
64
diff
changeset
|
1231 if i in m: |
85 | 1232 if f <= 2: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1233 self.ui.debug(_("found new branch changeset %s\n") % |
83 | 1234 short(p)) |
1072 | 1235 fetch[p] = 1 |
579
ffeb2c3a1966
Actually warn on pulling from an unrelated repository
mpm@selenic.com
parents:
578
diff
changeset
|
1236 base[i] = 1 |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1237 else: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1238 self.ui.debug(_("narrowed branch search to %s:%s\n") |
83 | 1239 % (short(p), short(i))) |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1240 search.append((p, i)) |
65
d40cc5aacc31
Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents:
64
diff
changeset
|
1241 break |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1242 p, f = i, f * 2 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1243 |
579
ffeb2c3a1966
Actually warn on pulling from an unrelated repository
mpm@selenic.com
parents:
578
diff
changeset
|
1244 # sanity check our fetch list |
1072 | 1245 for f in fetch.keys(): |
65
d40cc5aacc31
Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents:
64
diff
changeset
|
1246 if f in m: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1247 raise repo.RepoError(_("already have changeset ") + short(f[:4])) |
83 | 1248 |
579
ffeb2c3a1966
Actually warn on pulling from an unrelated repository
mpm@selenic.com
parents:
578
diff
changeset
|
1249 if base.keys() == [nullid]: |
1959
d53a18f592be
add -f/--force to pull, incoming, outgoing, to work on unrelated repo.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1947
diff
changeset
|
1250 if force: |
d53a18f592be
add -f/--force to pull, incoming, outgoing, to work on unrelated repo.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1947
diff
changeset
|
1251 self.ui.warn(_("warning: repository is unrelated\n")) |
d53a18f592be
add -f/--force to pull, incoming, outgoing, to work on unrelated repo.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1947
diff
changeset
|
1252 else: |
d53a18f592be
add -f/--force to pull, incoming, outgoing, to work on unrelated repo.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1947
diff
changeset
|
1253 raise util.Abort(_("repository is unrelated")) |
511 | 1254 |
2972
96d034d02d61
Demote a pull note to a debug message
Matt Mackall <mpm@selenic.com>
parents:
2961
diff
changeset
|
1255 self.ui.debug(_("found new changesets starting at ") + |
83 | 1256 " ".join([short(f) for f in fetch]) + "\n") |
65
d40cc5aacc31
Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents:
64
diff
changeset
|
1257 |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1258 self.ui.debug(_("%d total queries\n") % reqcnt) |
324 | 1259 |
1072 | 1260 return fetch.keys() |
516 | 1261 |
1959
d53a18f592be
add -f/--force to pull, incoming, outgoing, to work on unrelated repo.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1947
diff
changeset
|
1262 def findoutgoing(self, remote, base=None, heads=None, force=False): |
2021
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1263 """Return list of nodes that are roots of subsets not in remote |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1264 |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1265 If base dict is specified, assume that these nodes and their parents |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1266 exist on the remote side. |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1267 If a list of heads is specified, return only nodes which are heads |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1268 or ancestors of these heads, and return a second element which |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1269 contains all remote heads which get new children. |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1270 """ |
816
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
1271 if base == None: |
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
1272 base = {} |
1959
d53a18f592be
add -f/--force to pull, incoming, outgoing, to work on unrelated repo.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1947
diff
changeset
|
1273 self.findincoming(remote, base, heads, force=force) |
816
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
1274 |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1275 self.ui.debug(_("common changesets up to ") |
1072 | 1276 + " ".join(map(short, base.keys())) + "\n") |
1277 | |
621
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1278 remain = dict.fromkeys(self.changelog.nodemap) |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1279 |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1280 # prune everything remote has from the tree |
637
31e090c34d3b
Fix up the broken bits in findoutgoing
Matt Mackall <mpm@selenic.com>
parents:
636
diff
changeset
|
1281 del remain[nullid] |
621
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1282 remove = base.keys() |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1283 while remove: |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1284 n = remove.pop(0) |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1285 if n in remain: |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1286 del remain[n] |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1287 for p in self.changelog.parents(n): |
637
31e090c34d3b
Fix up the broken bits in findoutgoing
Matt Mackall <mpm@selenic.com>
parents:
636
diff
changeset
|
1288 remove.append(p) |
621
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1289 |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1290 # find every node whose parents have been pruned |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1291 subset = [] |
2021
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1292 # find every remote head that will get new children |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1293 updated_heads = {} |
621
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1294 for n in remain: |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1295 p1, p2 = self.changelog.parents(n) |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1296 if p1 not in remain and p2 not in remain: |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1297 subset.append(n) |
2021
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1298 if heads: |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1299 if p1 in heads: |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1300 updated_heads[p1] = True |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1301 if p2 in heads: |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1302 updated_heads[p2] = True |
621
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1303 |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1304 # this is the set of all roots we have to push |
2021
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1305 if heads: |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1306 return subset, updated_heads.keys() |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1307 else: |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1308 return subset |
621
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1309 |
2816
2a0c599f7bb0
fetch: hold lock and wlock across all operations
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2803
diff
changeset
|
1310 def pull(self, remote, heads=None, force=False, lock=None): |
2a0c599f7bb0
fetch: hold lock and wlock across all operations
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2803
diff
changeset
|
1311 mylock = False |
2a0c599f7bb0
fetch: hold lock and wlock across all operations
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2803
diff
changeset
|
1312 if not lock: |
2a0c599f7bb0
fetch: hold lock and wlock across all operations
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2803
diff
changeset
|
1313 lock = self.lock() |
2a0c599f7bb0
fetch: hold lock and wlock across all operations
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2803
diff
changeset
|
1314 mylock = True |
636
ac0ec421e3a5
Move the empty changeset detection out of findincoming to pull
Matt Mackall <mpm@selenic.com>
parents:
635
diff
changeset
|
1315 |
2816
2a0c599f7bb0
fetch: hold lock and wlock across all operations
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2803
diff
changeset
|
1316 try: |
5235
8ede77c2d008
pull -r: pass the revisions as the heads argument of findincoming
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5211
diff
changeset
|
1317 fetch = self.findincoming(remote, heads=heads, force=force) |
2816
2a0c599f7bb0
fetch: hold lock and wlock across all operations
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2803
diff
changeset
|
1318 if fetch == [nullid]: |
2a0c599f7bb0
fetch: hold lock and wlock across all operations
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2803
diff
changeset
|
1319 self.ui.status(_("requesting all changes\n")) |
636
ac0ec421e3a5
Move the empty changeset detection out of findincoming to pull
Matt Mackall <mpm@selenic.com>
parents:
635
diff
changeset
|
1320 |
2816
2a0c599f7bb0
fetch: hold lock and wlock across all operations
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2803
diff
changeset
|
1321 if not fetch: |
2a0c599f7bb0
fetch: hold lock and wlock across all operations
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2803
diff
changeset
|
1322 self.ui.status(_("no changes found\n")) |
2a0c599f7bb0
fetch: hold lock and wlock across all operations
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2803
diff
changeset
|
1323 return 0 |
622
e9fe5d5e67f7
Add generic repo commands for pull and push
Matt Mackall <mpm@selenic.com>
parents:
621
diff
changeset
|
1324 |
2816
2a0c599f7bb0
fetch: hold lock and wlock across all operations
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2803
diff
changeset
|
1325 if heads is None: |
2a0c599f7bb0
fetch: hold lock and wlock across all operations
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2803
diff
changeset
|
1326 cg = remote.changegroup(fetch, 'pull') |
2a0c599f7bb0
fetch: hold lock and wlock across all operations
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2803
diff
changeset
|
1327 else: |
3448
6ca49c5fe268
Stop erroring out pull -r and clone -r if repository isn't local.
Eric Hopper <hopper@omnifarious.org>
parents:
3443
diff
changeset
|
1328 if 'changegroupsubset' not in remote.capabilities: |
6ca49c5fe268
Stop erroring out pull -r and clone -r if repository isn't local.
Eric Hopper <hopper@omnifarious.org>
parents:
3443
diff
changeset
|
1329 raise util.Abort(_("Partial pull cannot be done because other repository doesn't support changegroupsubset.")) |
2816
2a0c599f7bb0
fetch: hold lock and wlock across all operations
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2803
diff
changeset
|
1330 cg = remote.changegroupsubset(fetch, heads, 'pull') |
2a0c599f7bb0
fetch: hold lock and wlock across all operations
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2803
diff
changeset
|
1331 return self.addchangegroup(cg, 'pull', remote.url()) |
2a0c599f7bb0
fetch: hold lock and wlock across all operations
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2803
diff
changeset
|
1332 finally: |
2a0c599f7bb0
fetch: hold lock and wlock across all operations
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2803
diff
changeset
|
1333 if mylock: |
2a0c599f7bb0
fetch: hold lock and wlock across all operations
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2803
diff
changeset
|
1334 lock.release() |
622
e9fe5d5e67f7
Add generic repo commands for pull and push
Matt Mackall <mpm@selenic.com>
parents:
621
diff
changeset
|
1335 |
1781
284fc722c342
add an optional argument to push only the specified revisions (push -r)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1713
diff
changeset
|
1336 def push(self, remote, force=False, revs=None): |
2439
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1337 # there are two ways to push to remote repo: |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1338 # |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1339 # addchangegroup assumes local user can lock remote |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1340 # repo (local filesystem, old ssh servers). |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1341 # |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1342 # unbundle assumes local user cannot lock remote repo (new ssh |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1343 # servers, http servers). |
816
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
1344 |
2612
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2601
diff
changeset
|
1345 if remote.capable('unbundle'): |
2463
6ab016edd5c4
localrepository.push: propagate return value
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1346 return self.push_unbundle(remote, force, revs) |
6ab016edd5c4
localrepository.push: propagate return value
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1347 return self.push_addchangegroup(remote, force, revs) |
2439
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1348 |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1349 def prepush(self, remote, force, revs): |
816
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
1350 base = {} |
2021
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1351 remote_heads = remote.heads() |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1352 inc = self.findincoming(remote, base, remote_heads, force=force) |
816
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
1353 |
2021
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1354 update, updated_heads = self.findoutgoing(remote, base, remote_heads) |
1781
284fc722c342
add an optional argument to push only the specified revisions (push -r)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1713
diff
changeset
|
1355 if revs is not None: |
284fc722c342
add an optional argument to push only the specified revisions (push -r)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1713
diff
changeset
|
1356 msng_cl, bases, heads = self.changelog.nodesbetween(update, revs) |
284fc722c342
add an optional argument to push only the specified revisions (push -r)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1713
diff
changeset
|
1357 else: |
284fc722c342
add an optional argument to push only the specified revisions (push -r)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1713
diff
changeset
|
1358 bases, heads = update, self.changelog.heads() |
284fc722c342
add an optional argument to push only the specified revisions (push -r)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1713
diff
changeset
|
1359 |
284fc722c342
add an optional argument to push only the specified revisions (push -r)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1713
diff
changeset
|
1360 if not bases: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1361 self.ui.status(_("no changes found\n")) |
2439
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1362 return None, 1 |
816
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
1363 elif not force: |
3684
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1364 # check if we're creating new remote heads |
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1365 # to be a remote head after push, node must be either |
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1366 # - unknown locally |
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1367 # - a local outgoing head descended from update |
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1368 # - a remote head that's known locally and not |
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1369 # ancestral to an outgoing head |
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1370 |
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1371 warn = 0 |
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1372 |
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1373 if remote_heads == [nullid]: |
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1374 warn = 0 |
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1375 elif not revs and len(heads) > len(remote_heads): |
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1376 warn = 1 |
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1377 else: |
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1378 newheads = list(heads) |
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1379 for r in remote_heads: |
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1380 if r in self.changelog.nodemap: |
3925
27230c29bfec
fix calculation of new heads added during push with -r
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3862
diff
changeset
|
1381 desc = self.changelog.heads(r, heads) |
3684
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1382 l = [h for h in heads if h in desc] |
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1383 if not l: |
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1384 newheads.append(r) |
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1385 else: |
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1386 newheads.append(r) |
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1387 if len(newheads) > len(remote_heads): |
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1388 warn = 1 |
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1389 |
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1390 if warn: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1391 self.ui.warn(_("abort: push creates new remote branches!\n")) |
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1392 self.ui.status(_("(did you forget to merge?" |
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1393 " use push -f to force)\n")) |
2439
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1394 return None, 1 |
3684
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1395 elif inc: |
975c2469c316
correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents:
3682
diff
changeset
|
1396 self.ui.warn(_("note: unsynced remote changes!\n")) |
622
e9fe5d5e67f7
Add generic repo commands for pull and push
Matt Mackall <mpm@selenic.com>
parents:
621
diff
changeset
|
1397 |
3682 | 1398 |
1781
284fc722c342
add an optional argument to push only the specified revisions (push -r)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1713
diff
changeset
|
1399 if revs is None: |
1782 | 1400 cg = self.changegroup(update, 'push') |
1781
284fc722c342
add an optional argument to push only the specified revisions (push -r)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1713
diff
changeset
|
1401 else: |
1782 | 1402 cg = self.changegroupsubset(update, revs, 'push') |
2439
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1403 return cg, remote_heads |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1404 |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1405 def push_addchangegroup(self, remote, force, revs): |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1406 lock = remote.lock() |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1407 |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1408 ret = self.prepush(remote, force, revs) |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1409 if ret[0] is not None: |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1410 cg, remote_heads = ret |
2673
109a22f5434a
hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2661
diff
changeset
|
1411 return remote.addchangegroup(cg, 'push', self.url()) |
2439
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1412 return ret[1] |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1413 |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1414 def push_unbundle(self, remote, force, revs): |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1415 # local repo finds heads on server, finds out what revs it |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1416 # must push. once revs transferred, if server finds it has |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1417 # different heads (someone else won commit/push race), server |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1418 # aborts. |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1419 |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1420 ret = self.prepush(remote, force, revs) |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1421 if ret[0] is not None: |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1422 cg, remote_heads = ret |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1423 if force: remote_heads = ['force'] |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1424 return remote.unbundle(cg, remote_heads, 'push') |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1425 return ret[1] |
622
e9fe5d5e67f7
Add generic repo commands for pull and push
Matt Mackall <mpm@selenic.com>
parents:
621
diff
changeset
|
1426 |
3510
9383af6f236d
Show number (-v) and list (--debug) of changesets with bundle/pull/push etc.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3500
diff
changeset
|
1427 def changegroupinfo(self, nodes): |
9383af6f236d
Show number (-v) and list (--debug) of changesets with bundle/pull/push etc.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3500
diff
changeset
|
1428 self.ui.note(_("%d changesets found\n") % len(nodes)) |
9383af6f236d
Show number (-v) and list (--debug) of changesets with bundle/pull/push etc.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3500
diff
changeset
|
1429 if self.ui.debugflag: |
9383af6f236d
Show number (-v) and list (--debug) of changesets with bundle/pull/push etc.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3500
diff
changeset
|
1430 self.ui.debug(_("List of changesets:\n")) |
9383af6f236d
Show number (-v) and list (--debug) of changesets with bundle/pull/push etc.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3500
diff
changeset
|
1431 for node in nodes: |
9383af6f236d
Show number (-v) and list (--debug) of changesets with bundle/pull/push etc.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3500
diff
changeset
|
1432 self.ui.debug("%s\n" % hex(node)) |
9383af6f236d
Show number (-v) and list (--debug) of changesets with bundle/pull/push etc.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3500
diff
changeset
|
1433 |
1736
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1434 def changegroupsubset(self, bases, heads, source): |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1435 """This function generates a changegroup consisting of all the nodes |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1436 that are descendents of any of the bases, and ancestors of any of |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1437 the heads. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1438 |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1439 It is fairly complex as determining which filenodes and which |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1440 manifest nodes need to be included for the changeset to be complete |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1441 is non-trivial. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1442 |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1443 Another wrinkle is doing the reverse, figuring out which changeset in |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1444 the changegroup a particular filenode or manifestnode belongs to.""" |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1445 |
1736
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1446 self.hook('preoutgoing', throw=True, source=source) |
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1447 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1448 # Set up some initial variables |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1449 # Make it easy to refer to self.changelog |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1450 cl = self.changelog |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1451 # msng is short for missing - compute the list of changesets in this |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1452 # changegroup. |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1453 msng_cl_lst, bases, heads = cl.nodesbetween(bases, heads) |
3510
9383af6f236d
Show number (-v) and list (--debug) of changesets with bundle/pull/push etc.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3500
diff
changeset
|
1454 self.changegroupinfo(msng_cl_lst) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1455 # Some bases may turn out to be superfluous, and some heads may be |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1456 # too. nodesbetween will return the minimal set of bases and heads |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1457 # necessary to re-create the changegroup. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1458 |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1459 # Known heads are the list of heads that it is assumed the recipient |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1460 # of this changegroup will know about. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1461 knownheads = {} |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1462 # We assume that all parents of bases are known heads. |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1463 for n in bases: |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1464 for p in cl.parents(n): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1465 if p != nullid: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1466 knownheads[p] = 1 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1467 knownheads = knownheads.keys() |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1468 if knownheads: |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1469 # Now that we know what heads are known, we can compute which |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1470 # changesets are known. The recipient must know about all |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1471 # changesets required to reach the known heads from the null |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1472 # changeset. |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1473 has_cl_set, junk, junk = cl.nodesbetween(None, knownheads) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1474 junk = None |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1475 # Transform the list into an ersatz set. |
1464
00117edce2dd
Fixed silly bug involving a non-existent variable.
Eric Hopper <hopper@omnifarious.org>
parents:
1462
diff
changeset
|
1476 has_cl_set = dict.fromkeys(has_cl_set) |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1477 else: |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1478 # If there were no known heads, the recipient cannot be assumed to |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1479 # know about any changesets. |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1480 has_cl_set = {} |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1481 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1482 # Make it easy to refer to self.manifest |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1483 mnfst = self.manifest |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1484 # We don't know which manifests are missing yet |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1485 msng_mnfst_set = {} |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1486 # Nor do we know which filenodes are missing. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1487 msng_filenode_set = {} |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1488 |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1489 junk = mnfst.index[mnfst.count() - 1] # Get around a bug in lazyindex |
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1490 junk = None |
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1491 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1492 # A changeset always belongs to itself, so the changenode lookup |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1493 # function for a changenode is identity. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1494 def identity(x): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1495 return x |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1496 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1497 # A function generating function. Sets up an environment for the |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1498 # inner function. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1499 def cmp_by_rev_func(revlog): |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1500 # Compare two nodes by their revision number in the environment's |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1501 # revision history. Since the revision number both represents the |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1502 # most efficient order to read the nodes in, and represents a |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1503 # topological sorting of the nodes, this function is often useful. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1504 def cmp_by_rev(a, b): |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1505 return cmp(revlog.rev(a), revlog.rev(b)) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1506 return cmp_by_rev |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1507 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1508 # If we determine that a particular file or manifest node must be a |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1509 # node that the recipient of the changegroup will already have, we can |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1510 # also assume the recipient will have all the parents. This function |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1511 # prunes them from the set of missing nodes. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1512 def prune_parents(revlog, hasset, msngset): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1513 haslst = hasset.keys() |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1514 haslst.sort(cmp_by_rev_func(revlog)) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1515 for node in haslst: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1516 parentlst = [p for p in revlog.parents(node) if p != nullid] |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1517 while parentlst: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1518 n = parentlst.pop() |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1519 if n not in hasset: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1520 hasset[n] = 1 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1521 p = [p for p in revlog.parents(n) if p != nullid] |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1522 parentlst.extend(p) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1523 for n in hasset: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1524 msngset.pop(n, None) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1525 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1526 # This is a function generating function used to set up an environment |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1527 # for the inner function to execute in. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1528 def manifest_and_file_collector(changedfileset): |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1529 # This is an information gathering function that gathers |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1530 # information from each changeset node that goes out as part of |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1531 # the changegroup. The information gathered is a list of which |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1532 # manifest nodes are potentially required (the recipient may |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1533 # already have them) and total list of all files which were |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1534 # changed in any changeset in the changegroup. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1535 # |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1536 # We also remember the first changenode we saw any manifest |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1537 # referenced by so we can later determine which changenode 'owns' |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1538 # the manifest. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1539 def collect_manifests_and_files(clnode): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1540 c = cl.read(clnode) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1541 for f in c[3]: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1542 # This is to make sure we only have one instance of each |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1543 # filename string for each filename. |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1544 changedfileset.setdefault(f, f) |
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1545 msng_mnfst_set.setdefault(c[0], clnode) |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1546 return collect_manifests_and_files |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1547 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1548 # Figure out which manifest nodes (of the ones we think might be part |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1549 # of the changegroup) the recipient must know about and remove them |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1550 # from the changegroup. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1551 def prune_manifests(): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1552 has_mnfst_set = {} |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1553 for n in msng_mnfst_set: |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1554 # If a 'missing' manifest thinks it belongs to a changenode |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1555 # the recipient is assumed to have, obviously the recipient |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1556 # must have that manifest. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1557 linknode = cl.node(mnfst.linkrev(n)) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1558 if linknode in has_cl_set: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1559 has_mnfst_set[n] = 1 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1560 prune_parents(mnfst, has_mnfst_set, msng_mnfst_set) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1561 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1562 # Use the information collected in collect_manifests_and_files to say |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1563 # which changenode any manifestnode belongs to. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1564 def lookup_manifest_link(mnfstnode): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1565 return msng_mnfst_set[mnfstnode] |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1566 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1567 # A function generating function that sets up the initial environment |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1568 # the inner function. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1569 def filenode_collector(changedfiles): |
1462
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1570 next_rev = [0] |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1571 # This gathers information from each manifestnode included in the |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1572 # changegroup about which filenodes the manifest node references |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1573 # so we can include those in the changegroup too. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1574 # |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1575 # It also remembers which changenode each filenode belongs to. It |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1576 # does this by assuming the a filenode belongs to the changenode |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1577 # the first manifest that references it belongs to. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1578 def collect_msng_filenodes(mnfstnode): |
1462
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1579 r = mnfst.rev(mnfstnode) |
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1580 if r == next_rev[0]: |
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1581 # If the last rev we looked at was the one just previous, |
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1582 # we only need to see a diff. |
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1583 delta = mdiff.patchtext(mnfst.delta(mnfstnode)) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1584 # For each line in the delta |
1462
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1585 for dline in delta.splitlines(): |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1586 # get the filename and filenode for that line |
1462
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1587 f, fnode = dline.split('\0') |
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1588 fnode = bin(fnode[:40]) |
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1589 f = changedfiles.get(f, None) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1590 # And if the file is in the list of files we care |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1591 # about. |
1462
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1592 if f is not None: |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1593 # Get the changenode this manifest belongs to |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1594 clnode = msng_mnfst_set[mnfstnode] |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1595 # Create the set of filenodes for the file if |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1596 # there isn't one already. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1597 ndset = msng_filenode_set.setdefault(f, {}) |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1598 # And set the filenode's changelog node to the |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1599 # manifest's if it hasn't been set already. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1600 ndset.setdefault(fnode, clnode) |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1601 else: |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1602 # Otherwise we need a full manifest. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1603 m = mnfst.read(mnfstnode) |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1604 # For every file in we care about. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1605 for f in changedfiles: |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1606 fnode = m.get(f, None) |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1607 # If it's in the manifest |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1608 if fnode is not None: |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1609 # See comments above. |
1462
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1610 clnode = msng_mnfst_set[mnfstnode] |
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1611 ndset = msng_filenode_set.setdefault(f, {}) |
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1612 ndset.setdefault(fnode, clnode) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1613 # Remember the revision we hope to see next. |
1462
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1614 next_rev[0] = r + 1 |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1615 return collect_msng_filenodes |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1616 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1617 # We have a list of filenodes we think we need for a file, lets remove |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1618 # all those we now the recipient must have. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1619 def prune_filenodes(f, filerevlog): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1620 msngset = msng_filenode_set[f] |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1621 hasset = {} |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1622 # If a 'missing' filenode thinks it belongs to a changenode we |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1623 # assume the recipient must have, then the recipient must have |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1624 # that filenode. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1625 for n in msngset: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1626 clnode = cl.node(filerevlog.linkrev(n)) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1627 if clnode in has_cl_set: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1628 hasset[n] = 1 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1629 prune_parents(filerevlog, hasset, msngset) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1630 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1631 # A function generator function that sets up the a context for the |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1632 # inner function. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1633 def lookup_filenode_link_func(fname): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1634 msngset = msng_filenode_set[fname] |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1635 # Lookup the changenode the filenode belongs to. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1636 def lookup_filenode_link(fnode): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1637 return msngset[fnode] |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1638 return lookup_filenode_link |
515 | 1639 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1640 # Now that we have all theses utility functions to help out and |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1641 # logically divide up the task, generate the group. |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1642 def gengroup(): |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1643 # The set of changed files starts empty. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1644 changedfiles = {} |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1645 # Create a changenode group generator that will call our functions |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1646 # back to lookup the owning changenode and collect information. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1647 group = cl.group(msng_cl_lst, identity, |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1648 manifest_and_file_collector(changedfiles)) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1649 for chnk in group: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1650 yield chnk |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1651 |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1652 # The list of manifests has been collected by the generator |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1653 # calling our functions back. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1654 prune_manifests() |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1655 msng_mnfst_lst = msng_mnfst_set.keys() |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1656 # Sort the manifestnodes by revision number. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1657 msng_mnfst_lst.sort(cmp_by_rev_func(mnfst)) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1658 # Create a generator for the manifestnodes that calls our lookup |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1659 # and data collection functions back. |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1660 group = mnfst.group(msng_mnfst_lst, lookup_manifest_link, |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1661 filenode_collector(changedfiles)) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1662 for chnk in group: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1663 yield chnk |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1664 |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1665 # These are no longer needed, dereference and toss the memory for |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1666 # them. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1667 msng_mnfst_lst = None |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1668 msng_mnfst_set.clear() |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1669 |
1462
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1670 changedfiles = changedfiles.keys() |
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1671 changedfiles.sort() |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1672 # Go through all our files in order sorted by name. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1673 for fname in changedfiles: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1674 filerevlog = self.file(fname) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1675 # Toss out the filenodes that the recipient isn't really |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1676 # missing. |
1630
5ecf05541e11
This fixes a bug that Chris Mason found. As for a test case, I can't
Eric Hopper <hopper@omnifarious.org>
parents:
1621
diff
changeset
|
1677 if msng_filenode_set.has_key(fname): |
5ecf05541e11
This fixes a bug that Chris Mason found. As for a test case, I can't
Eric Hopper <hopper@omnifarious.org>
parents:
1621
diff
changeset
|
1678 prune_filenodes(fname, filerevlog) |
5ecf05541e11
This fixes a bug that Chris Mason found. As for a test case, I can't
Eric Hopper <hopper@omnifarious.org>
parents:
1621
diff
changeset
|
1679 msng_filenode_lst = msng_filenode_set[fname].keys() |
5ecf05541e11
This fixes a bug that Chris Mason found. As for a test case, I can't
Eric Hopper <hopper@omnifarious.org>
parents:
1621
diff
changeset
|
1680 else: |
5ecf05541e11
This fixes a bug that Chris Mason found. As for a test case, I can't
Eric Hopper <hopper@omnifarious.org>
parents:
1621
diff
changeset
|
1681 msng_filenode_lst = [] |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1682 # If any filenodes are left, generate the group for them, |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1683 # otherwise don't bother. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1684 if len(msng_filenode_lst) > 0: |
1981
736b6c96bbbc
make incoming work via ssh (issue139); move chunk code into separate module.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1967
diff
changeset
|
1685 yield changegroup.genchunk(fname) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1686 # Sort the filenodes by their revision # |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1687 msng_filenode_lst.sort(cmp_by_rev_func(filerevlog)) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1688 # Create a group generator and only pass in a changenode |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1689 # lookup function as we need to collect no information |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1690 # from filenodes. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1691 group = filerevlog.group(msng_filenode_lst, |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1692 lookup_filenode_link_func(fname)) |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1693 for chnk in group: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1694 yield chnk |
1630
5ecf05541e11
This fixes a bug that Chris Mason found. As for a test case, I can't
Eric Hopper <hopper@omnifarious.org>
parents:
1621
diff
changeset
|
1695 if msng_filenode_set.has_key(fname): |
5ecf05541e11
This fixes a bug that Chris Mason found. As for a test case, I can't
Eric Hopper <hopper@omnifarious.org>
parents:
1621
diff
changeset
|
1696 # Don't need this anymore, toss it to free memory. |
5ecf05541e11
This fixes a bug that Chris Mason found. As for a test case, I can't
Eric Hopper <hopper@omnifarious.org>
parents:
1621
diff
changeset
|
1697 del msng_filenode_set[fname] |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1698 # Signal that no more groups are left. |
1981
736b6c96bbbc
make incoming work via ssh (issue139); move chunk code into separate module.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1967
diff
changeset
|
1699 yield changegroup.closechunk() |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1700 |
2150
f15c6394d90d
fix a NameError in changegroupsubset
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2149
diff
changeset
|
1701 if msng_cl_lst: |
2149
43ce1c17e644
allow to pull from an empty repo without getting a backtrace
Vincent Danjean <vdanjean@free.fr>
parents:
2143
diff
changeset
|
1702 self.hook('outgoing', node=hex(msng_cl_lst[0]), source=source) |
1736
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1703 |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1704 return util.chunkbuffer(gengroup()) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1705 |
1736
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1706 def changegroup(self, basenodes, source): |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1707 """Generate a changegroup of all nodes that we have that a recipient |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1708 doesn't. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1709 |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1710 This is much easier than the previous function as we can assume that |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1711 the recipient has any changenode we aren't sending them.""" |
1736
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1712 |
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1713 self.hook('preoutgoing', throw=True, source=source) |
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1714 |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1715 cl = self.changelog |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1716 nodes = cl.nodesbetween(basenodes, None)[0] |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1717 revset = dict.fromkeys([cl.rev(n) for n in nodes]) |
3510
9383af6f236d
Show number (-v) and list (--debug) of changesets with bundle/pull/push etc.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3500
diff
changeset
|
1718 self.changegroupinfo(nodes) |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1719 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1720 def identity(x): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1721 return x |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1722 |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1723 def gennodelst(revlog): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1724 for r in xrange(0, revlog.count()): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1725 n = revlog.node(r) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1726 if revlog.linkrev(n) in revset: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1727 yield n |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1728 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1729 def changed_file_collector(changedfileset): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1730 def collect_changed_files(clnode): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1731 c = cl.read(clnode) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1732 for fname in c[3]: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1733 changedfileset[fname] = 1 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1734 return collect_changed_files |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1735 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1736 def lookuprevlink_func(revlog): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1737 def lookuprevlink(n): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1738 return cl.node(revlog.linkrev(n)) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1739 return lookuprevlink |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1740 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1741 def gengroup(): |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1742 # construct a list of all changed files |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1743 changedfiles = {} |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1744 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1745 for chnk in cl.group(nodes, identity, |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1746 changed_file_collector(changedfiles)): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1747 yield chnk |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1748 changedfiles = changedfiles.keys() |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1749 changedfiles.sort() |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1750 |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1751 mnfst = self.manifest |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1752 nodeiter = gennodelst(mnfst) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1753 for chnk in mnfst.group(nodeiter, lookuprevlink_func(mnfst)): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1754 yield chnk |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1755 |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1756 for fname in changedfiles: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1757 filerevlog = self.file(fname) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1758 nodeiter = gennodelst(filerevlog) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1759 nodeiter = list(nodeiter) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1760 if nodeiter: |
1981
736b6c96bbbc
make incoming work via ssh (issue139); move chunk code into separate module.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1967
diff
changeset
|
1761 yield changegroup.genchunk(fname) |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1762 lookup = lookuprevlink_func(filerevlog) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1763 for chnk in filerevlog.group(nodeiter, lookup): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1764 yield chnk |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1765 |
1981
736b6c96bbbc
make incoming work via ssh (issue139); move chunk code into separate module.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1967
diff
changeset
|
1766 yield changegroup.closechunk() |
2107
7ff92c04f8e5
Don't die calling outgoing hook if we have no changesets
Matt Mackall <mpm@selenic.com>
parents:
2098
diff
changeset
|
1767 |
7ff92c04f8e5
Don't die calling outgoing hook if we have no changesets
Matt Mackall <mpm@selenic.com>
parents:
2098
diff
changeset
|
1768 if nodes: |
7ff92c04f8e5
Don't die calling outgoing hook if we have no changesets
Matt Mackall <mpm@selenic.com>
parents:
2098
diff
changeset
|
1769 self.hook('outgoing', node=hex(nodes[0]), source=source) |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1770 |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1771 return util.chunkbuffer(gengroup()) |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1772 |
2673
109a22f5434a
hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2661
diff
changeset
|
1773 def addchangegroup(self, source, srctype, url): |
2019
ced2d3620f95
add merge command. means same thing as "update -m".
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
1774 """add changegroup to repo. |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1775 |
3797
2aef481ac73c
Don't report an error when closing heads during local push (issue387)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3795
diff
changeset
|
1776 return values: |
2aef481ac73c
Don't report an error when closing heads during local push (issue387)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3795
diff
changeset
|
1777 - nothing changed or no source: 0 |
2aef481ac73c
Don't report an error when closing heads during local push (issue387)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3795
diff
changeset
|
1778 - more heads than before: 1+added heads (2..n) |
2aef481ac73c
Don't report an error when closing heads during local push (issue387)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3795
diff
changeset
|
1779 - less heads than before: -1-removed heads (-2..-n) |
2aef481ac73c
Don't report an error when closing heads during local push (issue387)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3795
diff
changeset
|
1780 - number of heads stays the same: 1 |
2aef481ac73c
Don't report an error when closing heads during local push (issue387)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3795
diff
changeset
|
1781 """ |
222 | 1782 def csmap(x): |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1783 self.ui.debug(_("add changeset %s\n") % short(x)) |
1998
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1784 return cl.count() |
222 | 1785 |
1786 def revmap(x): | |
1998
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1787 return cl.rev(x) |
222 | 1788 |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1789 if not source: |
2019
ced2d3620f95
add merge command. means same thing as "update -m".
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
1790 return 0 |
1730
0f1d2c75db5e
add prechangegroup and pretxnchangegroup hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1721
diff
changeset
|
1791 |
2673
109a22f5434a
hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2661
diff
changeset
|
1792 self.hook('prechangegroup', throw=True, source=srctype, url=url) |
1730
0f1d2c75db5e
add prechangegroup and pretxnchangegroup hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1721
diff
changeset
|
1793 |
222 | 1794 changesets = files = revisions = 0 |
225 | 1795 |
222 | 1796 tr = self.transaction() |
1797 | |
2395
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1798 # write changelog data to temp files so concurrent readers will not see |
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1799 # inconsistent view |
4270
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1800 cl = self.changelog |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1801 cl.delayupdate() |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1802 oldheads = len(cl.heads()) |
1998
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1803 |
4270
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1804 # pull off the changeset group |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1805 self.ui.status(_("adding changesets\n")) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1806 cor = cl.count() - 1 |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1807 chunkiter = changegroup.chunkiter(source) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1808 if cl.addgroup(chunkiter, csmap, tr, 1) is None: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1809 raise util.Abort(_("received changelog group is empty")) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1810 cnr = cl.count() - 1 |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1811 changesets = cnr - cor |
1040
35e883d1ff9b
Show number of new heads when doing a pull
mpm@selenic.com
parents:
1019
diff
changeset
|
1812 |
4270
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1813 # pull off the manifest group |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1814 self.ui.status(_("adding manifests\n")) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1815 chunkiter = changegroup.chunkiter(source) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1816 # no need to check for empty manifest group here: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1817 # if the result of the merge of 1 and 2 is the same in 3 and 4, |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1818 # no new manifest will be created and the manifest group will |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1819 # be empty during the pull |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1820 self.manifest.addgroup(chunkiter, revmap, tr) |
222 | 1821 |
4270
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1822 # process the files |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1823 self.ui.status(_("adding file changes\n")) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1824 while 1: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1825 f = changegroup.getchunk(source) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1826 if not f: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1827 break |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1828 self.ui.debug(_("adding %s revisions\n") % f) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1829 fl = self.file(f) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1830 o = fl.count() |
2395
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1831 chunkiter = changegroup.chunkiter(source) |
4270
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1832 if fl.addgroup(chunkiter, revmap, tr) is None: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1833 raise util.Abort(_("received file revlog group is empty")) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1834 revisions += fl.count() - o |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1835 files += 1 |
1998
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1836 |
2395
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1837 # make changelog see real files again |
4270
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4267
diff
changeset
|
1838 cl.finalize(tr) |
1998
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1839 |
1040
35e883d1ff9b
Show number of new heads when doing a pull
mpm@selenic.com
parents:
1019
diff
changeset
|
1840 newheads = len(self.changelog.heads()) |
35e883d1ff9b
Show number of new heads when doing a pull
mpm@selenic.com
parents:
1019
diff
changeset
|
1841 heads = "" |
2424
092039246d73
Report on push/pull if heads are merged, too, like for new heads.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2395
diff
changeset
|
1842 if oldheads and newheads != oldheads: |
092039246d73
Report on push/pull if heads are merged, too, like for new heads.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2395
diff
changeset
|
1843 heads = _(" (%+d heads)") % (newheads - oldheads) |
1040
35e883d1ff9b
Show number of new heads when doing a pull
mpm@selenic.com
parents:
1019
diff
changeset
|
1844 |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1845 self.ui.status(_("added %d changesets" |
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1846 " with %d changes to %d files%s\n") |
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1847 % (changesets, revisions, files, heads)) |
222 | 1848 |
2259
181b0643ffb1
fix a traceback when unbundling does not add any changesets
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2232
diff
changeset
|
1849 if changesets > 0: |
181b0643ffb1
fix a traceback when unbundling does not add any changesets
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2232
diff
changeset
|
1850 self.hook('pretxnchangegroup', throw=True, |
2673
109a22f5434a
hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2661
diff
changeset
|
1851 node=hex(self.changelog.node(cor+1)), source=srctype, |
109a22f5434a
hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2661
diff
changeset
|
1852 url=url) |
1730
0f1d2c75db5e
add prechangegroup and pretxnchangegroup hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1721
diff
changeset
|
1853 |
222 | 1854 tr.close() |
780 | 1855 |
1375
f2b00be33e2c
Fix traceback when nothing was added during unbundle
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1353
diff
changeset
|
1856 if changesets > 0: |
2229
0ff326c2b286
changegroup hooks: add source to hook parameters
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2222
diff
changeset
|
1857 self.hook("changegroup", node=hex(self.changelog.node(cor+1)), |
2673
109a22f5434a
hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2661
diff
changeset
|
1858 source=srctype, url=url) |
780 | 1859 |
3468
0e68608bd11d
use xrange instead of range
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3452
diff
changeset
|
1860 for i in xrange(cor + 1, cnr + 1): |
2229
0ff326c2b286
changegroup hooks: add source to hook parameters
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2222
diff
changeset
|
1861 self.hook("incoming", node=hex(self.changelog.node(i)), |
2673
109a22f5434a
hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2661
diff
changeset
|
1862 source=srctype, url=url) |
1316 | 1863 |
3797
2aef481ac73c
Don't report an error when closing heads during local push (issue387)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3795
diff
changeset
|
1864 # never return 0 here: |
2aef481ac73c
Don't report an error when closing heads during local push (issue387)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3795
diff
changeset
|
1865 if newheads < oldheads: |
2aef481ac73c
Don't report an error when closing heads during local push (issue387)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3795
diff
changeset
|
1866 return newheads - oldheads - 1 |
2aef481ac73c
Don't report an error when closing heads during local push (issue387)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3795
diff
changeset
|
1867 else: |
2aef481ac73c
Don't report an error when closing heads during local push (issue387)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3795
diff
changeset
|
1868 return newheads - oldheads + 1 |
2019
ced2d3620f95
add merge command. means same thing as "update -m".
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
1869 |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1870 |
2612
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2601
diff
changeset
|
1871 def stream_in(self, remote): |
2621
5a5852a417b1
clone: disable stream support on server side by default.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2613
diff
changeset
|
1872 fp = remote.stream_out() |
3550
eda9e7c9300d
New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3510
diff
changeset
|
1873 l = fp.readline() |
eda9e7c9300d
New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3510
diff
changeset
|
1874 try: |
eda9e7c9300d
New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3510
diff
changeset
|
1875 resp = int(l) |
eda9e7c9300d
New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3510
diff
changeset
|
1876 except ValueError: |
eda9e7c9300d
New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3510
diff
changeset
|
1877 raise util.UnexpectedOutput( |
eda9e7c9300d
New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3510
diff
changeset
|
1878 _('Unexpected response from remote server:'), l) |
3687
d5dd0a2a44bc
Handle locking exceptions if streaming clone can't lock the repo. (Issue324)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3684
diff
changeset
|
1879 if resp == 1: |
2621
5a5852a417b1
clone: disable stream support on server side by default.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2613
diff
changeset
|
1880 raise util.Abort(_('operation forbidden by server')) |
3687
d5dd0a2a44bc
Handle locking exceptions if streaming clone can't lock the repo. (Issue324)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3684
diff
changeset
|
1881 elif resp == 2: |
d5dd0a2a44bc
Handle locking exceptions if streaming clone can't lock the repo. (Issue324)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3684
diff
changeset
|
1882 raise util.Abort(_('locking the remote repository failed')) |
d5dd0a2a44bc
Handle locking exceptions if streaming clone can't lock the repo. (Issue324)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3684
diff
changeset
|
1883 elif resp != 0: |
d5dd0a2a44bc
Handle locking exceptions if streaming clone can't lock the repo. (Issue324)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3684
diff
changeset
|
1884 raise util.Abort(_('the server sent an unknown error code')) |
2612
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2601
diff
changeset
|
1885 self.ui.status(_('streaming all changes\n')) |
3550
eda9e7c9300d
New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3510
diff
changeset
|
1886 l = fp.readline() |
eda9e7c9300d
New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3510
diff
changeset
|
1887 try: |
eda9e7c9300d
New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3510
diff
changeset
|
1888 total_files, total_bytes = map(int, l.split(' ', 1)) |
eda9e7c9300d
New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3510
diff
changeset
|
1889 except ValueError, TypeError: |
eda9e7c9300d
New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3510
diff
changeset
|
1890 raise util.UnexpectedOutput( |
eda9e7c9300d
New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3510
diff
changeset
|
1891 _('Unexpected response from remote server:'), l) |
2612
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2601
diff
changeset
|
1892 self.ui.status(_('%d files to transfer, %s of data\n') % |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2601
diff
changeset
|
1893 (total_files, util.bytecount(total_bytes))) |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2601
diff
changeset
|
1894 start = time.time() |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2601
diff
changeset
|
1895 for i in xrange(total_files): |
3720
5cc99f4b5041
add a comment about '\n' and '\r' and streaming clone
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3713
diff
changeset
|
1896 # XXX doesn't support '\n' or '\r' in filenames |
3550
eda9e7c9300d
New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3510
diff
changeset
|
1897 l = fp.readline() |
eda9e7c9300d
New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3510
diff
changeset
|
1898 try: |
eda9e7c9300d
New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3510
diff
changeset
|
1899 name, size = l.split('\0', 1) |
eda9e7c9300d
New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3510
diff
changeset
|
1900 size = int(size) |
eda9e7c9300d
New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3510
diff
changeset
|
1901 except ValueError, TypeError: |
eda9e7c9300d
New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3510
diff
changeset
|
1902 raise util.UnexpectedOutput( |
eda9e7c9300d
New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3510
diff
changeset
|
1903 _('Unexpected response from remote server:'), l) |
2612
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2601
diff
changeset
|
1904 self.ui.debug('adding %s (%s)\n' % (name, util.bytecount(size))) |
3498
ff06fe0703ef
localrepo: add separate methods for manipulating repository data
Matt Mackall <mpm@selenic.com>
parents:
3497
diff
changeset
|
1905 ofp = self.sopener(name, 'w') |
2612
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2601
diff
changeset
|
1906 for chunk in util.filechunkiter(fp, limit=size): |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2601
diff
changeset
|
1907 ofp.write(chunk) |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2601
diff
changeset
|
1908 ofp.close() |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2601
diff
changeset
|
1909 elapsed = time.time() - start |
4128
43d8f7466920
localrepo: stream_in may raise ZeroDivisionError with nul float elapsed argument.
Patrick Mezard <pmezard@gmail.com>
parents:
4058
diff
changeset
|
1910 if elapsed <= 0: |
43d8f7466920
localrepo: stream_in may raise ZeroDivisionError with nul float elapsed argument.
Patrick Mezard <pmezard@gmail.com>
parents:
4058
diff
changeset
|
1911 elapsed = 0.001 |
2612
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2601
diff
changeset
|
1912 self.ui.status(_('transferred %s in %.1f seconds (%s/sec)\n') % |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2601
diff
changeset
|
1913 (util.bytecount(total_bytes), elapsed, |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2601
diff
changeset
|
1914 util.bytecount(total_bytes / elapsed))) |
4614
3a645af7fb76
localrepo and dirstate: rename reload to invalidate
Matt Mackall <mpm@selenic.com>
parents:
4582
diff
changeset
|
1915 self.invalidate() |
2612
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2601
diff
changeset
|
1916 return len(self.heads()) + 1 |
515 | 1917 |
2613
479e26afa10f
clone: do not make streaming default. add --stream option instead.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2612
diff
changeset
|
1918 def clone(self, remote, heads=[], stream=False): |
2612
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2601
diff
changeset
|
1919 '''clone remote repository. |
1382
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
1920 |
2612
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2601
diff
changeset
|
1921 keyword arguments: |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2601
diff
changeset
|
1922 heads: list of revs to clone (forces use of pull) |
2621
5a5852a417b1
clone: disable stream support on server side by default.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2613
diff
changeset
|
1923 stream: use streaming clone if possible''' |
247 | 1924 |
2621
5a5852a417b1
clone: disable stream support on server side by default.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2613
diff
changeset
|
1925 # now, all clients that can request uncompressed clones can |
5a5852a417b1
clone: disable stream support on server side by default.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2613
diff
changeset
|
1926 # read repo formats supported by all servers that can serve |
5a5852a417b1
clone: disable stream support on server side by default.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2613
diff
changeset
|
1927 # them. |
247 | 1928 |
2612
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2601
diff
changeset
|
1929 # if revlog format changes, client will have to check version |
2621
5a5852a417b1
clone: disable stream support on server side by default.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2613
diff
changeset
|
1930 # and format flags on "stream" capability, and use |
5a5852a417b1
clone: disable stream support on server side by default.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2613
diff
changeset
|
1931 # uncompressed only if compatible. |
247 | 1932 |
2613
479e26afa10f
clone: do not make streaming default. add --stream option instead.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2612
diff
changeset
|
1933 if stream and not heads and remote.capable('stream'): |
2612
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2601
diff
changeset
|
1934 return self.stream_in(remote) |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2601
diff
changeset
|
1935 return self.pull(remote, heads) |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
1936 |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
1937 # used to avoid circular references so destructors work |
3790
f183c18568df
localrepo: change aftertrans to be independant of the store path
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3774
diff
changeset
|
1938 def aftertrans(files): |
f183c18568df
localrepo: change aftertrans to be independant of the store path
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3774
diff
changeset
|
1939 renamefiles = [tuple(t) for t in files] |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
1940 def a(): |
3790
f183c18568df
localrepo: change aftertrans to be independant of the store path
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3774
diff
changeset
|
1941 for src, dest in renamefiles: |
f183c18568df
localrepo: change aftertrans to be independant of the store path
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3774
diff
changeset
|
1942 util.rename(src, dest) |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
1943 return a |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
1944 |
2740
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2673
diff
changeset
|
1945 def instance(ui, path, create): |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2673
diff
changeset
|
1946 return localrepository(ui, util.drop_scheme('file', path), create) |
3215
53e843840349
Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3197
diff
changeset
|
1947 |
2740
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2673
diff
changeset
|
1948 def islocal(path): |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2673
diff
changeset
|
1949 return True |