Mercurial > public > mercurial-scm > hg-stable
annotate mercurial/localrepo.py @ 2073:1e6745f78989
Implement data inlined with the index file
This patch allows you to optionally inline data bytes with the
revlog index file. It saves considerable space and checkout
time by reducing the number of inodes, wasted partial blocks and
system calls.
To use the inline data add this to your .hgrc
[revlog]
# inline data only works with revlogng
format=1
# inline is the only valid flag right now.
flags=inline
author | mason@suse.com |
---|---|
date | Tue, 04 Apr 2006 16:38:43 -0400 |
parents | 74d3f5336b66 |
children | 343aeefb553b |
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 # |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
3 # Copyright 2005 Matt Mackall <mpm@selenic.com> |
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 |
1981
736b6c96bbbc
make incoming work via ssh (issue139); move chunk code into separate module.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1967
diff
changeset
|
8 import os, util |
1100 | 9 import filelog, manifest, changelog, dirstate, repo |
1089 | 10 from node import * |
1400
cf9a1233738a
i18n first part: make '_' available for files who need it
Benoit Boissinot <benoit.boissinot@ens-lyon.org
parents:
1398
diff
changeset
|
11 from i18n import gettext as _ |
262 | 12 from demandload import * |
1998
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
13 demandload(globals(), "appendfile changegroup") |
2072 | 14 demandload(globals(), "re lock transaction tempfile stat mdiff errno ui revlog") |
499 | 15 |
1559
59b3639df0a9
Convert all classes to new-style classes by deriving them from object.
Eric Hopper <hopper@omnifarious.org>
parents:
1551
diff
changeset
|
16 class localrepository(object): |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
17 def __del__(self): |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
18 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
|
19 def __init__(self, parentui, path=None, create=0): |
1101 | 20 if not path: |
21 p = os.getcwd() | |
22 while not os.path.isdir(os.path.join(p, ".hg")): | |
23 oldp = p | |
24 p = os.path.dirname(p) | |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
25 if p == oldp: |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
26 raise repo.RepoError(_("no repo found")) |
1101 | 27 path = p |
28 self.path = os.path.join(path, ".hg") | |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
29 |
1101 | 30 if not create and not os.path.isdir(self.path): |
1588
a679a364436a
Better error message (without /.hg appended) when repository is not found.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1586
diff
changeset
|
31 raise repo.RepoError(_("repository %s not found") % path) |
405 | 32 |
933
9c43d68ad59f
Fixed --repository option when handling relative path
tksoh@users.sf.net
parents:
926
diff
changeset
|
33 self.root = os.path.abspath(path) |
2016
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
34 self.origroot = path |
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
|
35 self.ui = ui.ui(parentui=parentui) |
1102 | 36 self.opener = util.opener(self.path) |
37 self.wopener = util.opener(self.root) | |
2072 | 38 |
39 try: | |
40 self.ui.readconfig(self.join("hgrc"), self.root) | |
41 except IOError: | |
42 pass | |
43 | |
44 v = self.ui.revlogopts | |
45 self.revlogversion = int(v.get('format', 0)) | |
2073 | 46 flags = 0 |
2072 | 47 for x in v.get('flags', "").split(): |
2073 | 48 flags |= revlog.flagstr(x) |
49 | |
50 v = self.revlogversion | flags | |
51 self.manifest = manifest.manifest(self.opener, v) | |
52 self.changelog = changelog.changelog(self.opener, v) | |
2072 | 53 |
2073 | 54 # the changelog might not have the inline index flag |
55 # on. If the format of the changelog is the same as found in | |
56 # .hgrc, apply any flags found in the .hgrc as well. | |
57 # Otherwise, just version from the changelog | |
58 v = self.changelog.version | |
59 if v == self.revlogversion: | |
60 v |= flags | |
61 self.revlogversion = v | |
62 | |
343 | 63 self.tagscache = None |
64 self.nodetagscache = None | |
1258 | 65 self.encodepats = None |
66 self.decodepats = None | |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
67 self.transhandle = None |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
68 |
1133
899b619a7eb2
Create [web] section with short username as contact on hg init and hg clone.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1117
diff
changeset
|
69 if create: |
899b619a7eb2
Create [web] section with short username as contact on hg init and hg clone.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1117
diff
changeset
|
70 os.mkdir(self.path) |
899b619a7eb2
Create [web] section with short username as contact on hg init and hg clone.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1117
diff
changeset
|
71 os.mkdir(self.join("data")) |
899b619a7eb2
Create [web] section with short username as contact on hg init and hg clone.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1117
diff
changeset
|
72 |
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
|
73 self.dirstate = dirstate.dirstate(self.opener, self.ui, self.root) |
1718
c1996b84d4f5
make hook code nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1717
diff
changeset
|
74 def hook(self, name, throw=False, **args): |
1480
ae0d8d632b83
allow multiples hook
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1477
diff
changeset
|
75 def runhook(name, cmd): |
ae0d8d632b83
allow multiples hook
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1477
diff
changeset
|
76 self.ui.note(_("running hook %s: %s\n") % (name, cmd)) |
1967
72f7a335b955
still use old variable names when running hooks. dropped by accident.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1959
diff
changeset
|
77 env = dict([('HG_' + k.upper(), v) for k, v in args.iteritems()] + |
72f7a335b955
still use old variable names when running hooks. dropped by accident.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1959
diff
changeset
|
78 [(k.upper(), v) for k, v in args.iteritems()]) |
1882
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
79 r = util.system(cmd, environ=env, cwd=self.root) |
487 | 80 if r: |
1718
c1996b84d4f5
make hook code nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1717
diff
changeset
|
81 desc, r = util.explain_exit(r) |
c1996b84d4f5
make hook code nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1717
diff
changeset
|
82 if throw: |
c1996b84d4f5
make hook code nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1717
diff
changeset
|
83 raise util.Abort(_('%s hook %s') % (name, desc)) |
c1996b84d4f5
make hook code nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1717
diff
changeset
|
84 self.ui.warn(_('error: %s hook %s\n') % (name, desc)) |
487 | 85 return False |
1480
ae0d8d632b83
allow multiples hook
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1477
diff
changeset
|
86 return True |
ae0d8d632b83
allow multiples hook
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1477
diff
changeset
|
87 |
ae0d8d632b83
allow multiples hook
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1477
diff
changeset
|
88 r = True |
1838
429bf036f2cb
Call hooks in alphabetical (=defined) order, of course still grouped by type.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1835
diff
changeset
|
89 hooks = [(hname, cmd) for hname, cmd in self.ui.configitems("hooks") |
429bf036f2cb
Call hooks in alphabetical (=defined) order, of course still grouped by type.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1835
diff
changeset
|
90 if hname.split(".", 1)[0] == name and cmd] |
429bf036f2cb
Call hooks in alphabetical (=defined) order, of course still grouped by type.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1835
diff
changeset
|
91 hooks.sort() |
429bf036f2cb
Call hooks in alphabetical (=defined) order, of course still grouped by type.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1835
diff
changeset
|
92 for hname, cmd in hooks: |
429bf036f2cb
Call hooks in alphabetical (=defined) order, of course still grouped by type.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1835
diff
changeset
|
93 r = runhook(hname, cmd) and r |
1480
ae0d8d632b83
allow multiples hook
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1477
diff
changeset
|
94 return r |
487 | 95 |
343 | 96 def tags(self): |
97 '''return a mapping of tag to node''' | |
477
520540fd6b64
Handle errors in .hgtags or hgrc [tags] section more gracefully.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
471
diff
changeset
|
98 if not self.tagscache: |
343 | 99 self.tagscache = {} |
659 | 100 |
1986
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
101 def parsetag(line, context): |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
102 if not line: |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
103 return |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
104 s = l.split(" ", 1) |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
105 if len(s) != 2: |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
106 self.ui.warn(_("%s: ignoring invalid tag\n") % context) |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
107 return |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
108 node, key = s |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
109 try: |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
110 bin_n = bin(node) |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
111 except TypeError: |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
112 self.ui.warn(_("%s: ignoring invalid tag\n") % context) |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
113 return |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
114 if bin_n not in self.changelog.nodemap: |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
115 self.ui.warn(_("%s: ignoring invalid tag\n") % context) |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
116 return |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
117 self.tagscache[key.strip()] = bin_n |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
118 |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
119 # read each head of the tags file, ending with the tip |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
120 # and add each tag found to the map, with "newer" ones |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
121 # taking precedence |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
122 fl = self.file(".hgtags") |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
123 h = fl.heads() |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
124 h.reverse() |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
125 for r in h: |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
126 count = 0 |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
127 for l in fl.read(r).splitlines(): |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
128 count += 1 |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
129 parsetag(l, ".hgtags:%d" % count) |
659 | 130 |
609
2acf1f5df2e6
[PATCH] hg tag: local tag support in file .hg/localtags
Matt Mackall <mpm@selenic.com>
parents:
608
diff
changeset
|
131 try: |
2acf1f5df2e6
[PATCH] hg tag: local tag support in file .hg/localtags
Matt Mackall <mpm@selenic.com>
parents:
608
diff
changeset
|
132 f = self.opener("localtags") |
1986
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
133 count = 0 |
609
2acf1f5df2e6
[PATCH] hg tag: local tag support in file .hg/localtags
Matt Mackall <mpm@selenic.com>
parents:
608
diff
changeset
|
134 for l in f: |
1986
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
135 count += 1 |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
136 parsetag(l, "localtags:%d" % count) |
609
2acf1f5df2e6
[PATCH] hg tag: local tag support in file .hg/localtags
Matt Mackall <mpm@selenic.com>
parents:
608
diff
changeset
|
137 except IOError: |
2acf1f5df2e6
[PATCH] hg tag: local tag support in file .hg/localtags
Matt Mackall <mpm@selenic.com>
parents:
608
diff
changeset
|
138 pass |
659 | 139 |
343 | 140 self.tagscache['tip'] = self.changelog.tip() |
659 | 141 |
343 | 142 return self.tagscache |
143 | |
144 def tagslist(self): | |
145 '''return a list of tags ordered by revision''' | |
146 l = [] | |
477
520540fd6b64
Handle errors in .hgtags or hgrc [tags] section more gracefully.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
471
diff
changeset
|
147 for t, n in self.tags().items(): |
343 | 148 try: |
149 r = self.changelog.rev(n) | |
150 except: | |
151 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
|
152 l.append((r, t, n)) |
343 | 153 l.sort() |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
154 return [(t, n) for r, t, n in l] |
343 | 155 |
156 def nodetags(self, node): | |
157 '''return the tags associated with a node''' | |
158 if not self.nodetagscache: | |
159 self.nodetagscache = {} | |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
160 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
|
161 self.nodetagscache.setdefault(n, []).append(t) |
343 | 162 return self.nodetagscache.get(node, []) |
163 | |
164 def lookup(self, key): | |
67 | 165 try: |
343 | 166 return self.tags()[key] |
67 | 167 except KeyError: |
658
f8098ae9f5b6
Generate a friendlier except for failed lookups
Matt Mackall <mpm@selenic.com>
parents:
657
diff
changeset
|
168 try: |
f8098ae9f5b6
Generate a friendlier except for failed lookups
Matt Mackall <mpm@selenic.com>
parents:
657
diff
changeset
|
169 return self.changelog.lookup(key) |
f8098ae9f5b6
Generate a friendlier except for failed lookups
Matt Mackall <mpm@selenic.com>
parents:
657
diff
changeset
|
170 except: |
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
|
171 raise repo.RepoError(_("unknown revision '%s'") % key) |
67 | 172 |
634
da5378d39269
Add a repo method to report repo device
Matt Mackall <mpm@selenic.com>
parents:
627
diff
changeset
|
173 def dev(self): |
da5378d39269
Add a repo method to report repo device
Matt Mackall <mpm@selenic.com>
parents:
627
diff
changeset
|
174 return os.stat(self.path).st_dev |
da5378d39269
Add a repo method to report repo device
Matt Mackall <mpm@selenic.com>
parents:
627
diff
changeset
|
175 |
926 | 176 def local(self): |
1101 | 177 return True |
926 | 178 |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
179 def join(self, f): |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
180 return os.path.join(self.path, f) |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
181 |
244 | 182 def wjoin(self, f): |
183 return os.path.join(self.root, f) | |
184 | |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
185 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
|
186 if f[0] == '/': |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
187 f = f[1:] |
2072 | 188 return filelog.filelog(self.opener, f, self.revlogversion) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
189 |
627 | 190 def getcwd(self): |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
839
diff
changeset
|
191 return self.dirstate.getcwd() |
627 | 192 |
291
2c4f2be05587
Add wopener for opening files in the working directory
mpm@selenic.com
parents:
288
diff
changeset
|
193 def wfile(self, f, mode='r'): |
2c4f2be05587
Add wopener for opening files in the working directory
mpm@selenic.com
parents:
288
diff
changeset
|
194 return self.wopener(f, mode) |
2c4f2be05587
Add wopener for opening files in the working directory
mpm@selenic.com
parents:
288
diff
changeset
|
195 |
1019
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
196 def wread(self, filename): |
1258 | 197 if self.encodepats == None: |
198 l = [] | |
199 for pat, cmd in self.ui.configitems("encode"): | |
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
|
200 mf = util.matcher(self.root, "", [pat], [], [])[1] |
1258 | 201 l.append((mf, cmd)) |
202 self.encodepats = l | |
203 | |
204 data = self.wopener(filename, 'r').read() | |
205 | |
206 for mf, cmd in self.encodepats: | |
207 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
|
208 self.ui.debug(_("filtering %s through %s\n") % (filename, cmd)) |
1258 | 209 data = util.filter(data, cmd) |
210 break | |
211 | |
212 return data | |
1019
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
213 |
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
214 def wwrite(self, filename, data, fd=None): |
1258 | 215 if self.decodepats == None: |
216 l = [] | |
217 for pat, cmd in self.ui.configitems("decode"): | |
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
|
218 mf = util.matcher(self.root, "", [pat], [], [])[1] |
1258 | 219 l.append((mf, cmd)) |
220 self.decodepats = l | |
221 | |
222 for mf, cmd in self.decodepats: | |
223 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
|
224 self.ui.debug(_("filtering %s through %s\n") % (filename, cmd)) |
1258 | 225 data = util.filter(data, cmd) |
226 break | |
227 | |
1019
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
228 if fd: |
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
229 return fd.write(data) |
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
230 return self.wopener(filename, 'w').write(data) |
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
231 |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
232 def transaction(self): |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
233 tr = self.transhandle |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
234 if tr != None and tr.running(): |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
235 return tr.nest() |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
236 |
251 | 237 # save dirstate for undo |
263 | 238 try: |
239 ds = self.opener("dirstate").read() | |
240 except IOError: | |
241 ds = "" | |
785 | 242 self.opener("journal.dirstate", "w").write(ds) |
515 | 243 |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
244 tr = transaction.transaction(self.ui.warn, self.opener, |
1880
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1853
diff
changeset
|
245 self.join("journal"), |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
246 aftertrans(self.path)) |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
247 self.transhandle = tr |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
248 return tr |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
249 |
210 | 250 def recover(self): |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
251 l = self.lock() |
557 | 252 if os.path.exists(self.join("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
|
253 self.ui.status(_("rolling back interrupted transaction\n")) |
1516
0b1b029b4de3
Automatically run "verify" whenever we run "recover"
Matt Mackall <mpm@selenic.com>
parents:
1510
diff
changeset
|
254 transaction.rollback(self.opener, self.join("journal")) |
1784
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
255 self.reload() |
1516
0b1b029b4de3
Automatically run "verify" whenever we run "recover"
Matt Mackall <mpm@selenic.com>
parents:
1510
diff
changeset
|
256 return True |
210 | 257 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
|
258 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
|
259 return False |
210 | 260 |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
261 def undo(self, wlock=None): |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
262 if not wlock: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
263 wlock = self.wlock() |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
264 l = self.lock() |
210 | 265 if os.path.exists(self.join("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
|
266 self.ui.status(_("rolling back last transaction\n")) |
262 | 267 transaction.rollback(self.opener, self.join("undo")) |
421 | 268 util.rename(self.join("undo.dirstate"), self.join("dirstate")) |
1784
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
269 self.reload() |
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
270 self.wreload() |
163 | 271 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
|
272 self.ui.warn(_("no undo information available\n")) |
162 | 273 |
1784
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
274 def wreload(self): |
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
275 self.dirstate.read() |
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
276 |
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
277 def reload(self): |
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
278 self.changelog.load() |
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
279 self.manifest.load() |
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
280 self.tagscache = None |
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
281 self.nodetagscache = None |
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
282 |
2016
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
283 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
|
284 desc=None): |
161 | 285 try: |
2016
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
286 l = lock.lock(self.join(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
|
287 except lock.LockHeld, inst: |
2ba8bf7defda
add localrepo.wlock for protecting the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1516
diff
changeset
|
288 if not wait: |
2016
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
289 raise |
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
290 self.ui.warn(_("waiting for lock on %s held by %s\n") % |
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
291 (desc, inst.args[0])) |
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
292 # default to 600 seconds timeout |
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
293 l = lock.lock(self.join(lockname), |
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
294 int(self.ui.config("ui", "timeout") or 600), |
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
295 releasefn, desc=desc) |
1751
e9bf415a8ecb
localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
296 if acquirefn: |
e9bf415a8ecb
localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
297 acquirefn() |
e9bf415a8ecb
localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
298 return l |
e9bf415a8ecb
localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
299 |
e9bf415a8ecb
localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
300 def lock(self, wait=1): |
2016
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
301 return self.do_lock("lock", wait, acquirefn=self.reload, |
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
302 desc=_('repository %s') % self.origroot) |
1751
e9bf415a8ecb
localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
303 |
e9bf415a8ecb
localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
304 def wlock(self, wait=1): |
2016
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
305 return self.do_lock("wlock", wait, self.dirstate.write, |
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
306 self.wreload, |
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
307 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
|
308 |
1716
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
309 def checkfilemerge(self, filename, text, filelog, manifest1, manifest2): |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
310 "determine whether a new filenode is needed" |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
311 fp1 = manifest1.get(filename, nullid) |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
312 fp2 = manifest2.get(filename, nullid) |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
313 |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
314 if fp2 != nullid: |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
315 # is one parent an ancestor of the other? |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
316 fpa = filelog.ancestor(fp1, fp2) |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
317 if fpa == fp1: |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
318 fp1, fp2 = fp2, nullid |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
319 elif fpa == fp2: |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
320 fp2 = nullid |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
321 |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
322 # is the file unmodified from the parent? report existing entry |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
323 if fp2 == nullid and text == filelog.read(fp1): |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
324 return (fp1, None, None) |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
325 |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
326 return (None, fp1, fp2) |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
327 |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
328 def rawcommit(self, files, text, user, date, p1=None, p2=None, wlock=None): |
442 | 329 orig_parent = self.dirstate.parents()[0] or nullid |
452
a1e91c24dab5
rawcommit: do lookup of parents at the appropriate layer
mpm@selenic.com
parents:
442
diff
changeset
|
330 p1 = p1 or self.dirstate.parents()[0] or nullid |
a1e91c24dab5
rawcommit: do lookup of parents at the appropriate layer
mpm@selenic.com
parents:
442
diff
changeset
|
331 p2 = p2 or self.dirstate.parents()[1] or nullid |
302 | 332 c1 = self.changelog.read(p1) |
333 c2 = self.changelog.read(p2) | |
334 m1 = self.manifest.read(c1[0]) | |
335 mf1 = self.manifest.readflags(c1[0]) | |
336 m2 = self.manifest.read(c2[0]) | |
992
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
337 changed = [] |
302 | 338 |
442 | 339 if orig_parent == p1: |
340 update_dirstate = 1 | |
341 else: | |
342 update_dirstate = 0 | |
343 | |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
344 if not wlock: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
345 wlock = self.wlock() |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
346 l = self.lock() |
203 | 347 tr = self.transaction() |
302 | 348 mm = m1.copy() |
349 mfm = mf1.copy() | |
203 | 350 linkrev = self.changelog.count() |
351 for f in files: | |
352 try: | |
1019
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
353 t = self.wread(f) |
441 | 354 tm = util.is_exec(self.wjoin(f), mfm.get(f, False)) |
302 | 355 r = self.file(f) |
356 mfm[f] = tm | |
990 | 357 |
1716
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
358 (entry, fp1, fp2) = self.checkfilemerge(f, t, r, m1, m2) |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
359 if entry: |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
360 mm[f] = entry |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
361 continue |
990 | 362 |
363 mm[f] = r.add(t, {}, tr, linkrev, fp1, fp2) | |
992
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
364 changed.append(f) |
442 | 365 if update_dirstate: |
366 self.dirstate.update([f], "n") | |
203 | 367 except IOError: |
314
3402cb9a4c06
More tweaking to rawcommit for repo conversion
mpm@selenic.com
parents:
313
diff
changeset
|
368 try: |
3402cb9a4c06
More tweaking to rawcommit for repo conversion
mpm@selenic.com
parents:
313
diff
changeset
|
369 del mm[f] |
3402cb9a4c06
More tweaking to rawcommit for repo conversion
mpm@selenic.com
parents:
313
diff
changeset
|
370 del mfm[f] |
442 | 371 if update_dirstate: |
372 self.dirstate.forget([f]) | |
314
3402cb9a4c06
More tweaking to rawcommit for repo conversion
mpm@selenic.com
parents:
313
diff
changeset
|
373 except: |
3402cb9a4c06
More tweaking to rawcommit for repo conversion
mpm@selenic.com
parents:
313
diff
changeset
|
374 # deleted from p2? |
3402cb9a4c06
More tweaking to rawcommit for repo conversion
mpm@selenic.com
parents:
313
diff
changeset
|
375 pass |
203 | 376 |
302 | 377 mnode = self.manifest.add(mm, mfm, tr, linkrev, c1[0], c2[0]) |
608
d2994b5298fb
Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents:
588
diff
changeset
|
378 user = user or self.ui.username() |
992
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
379 n = self.changelog.add(mnode, changed, text, tr, p1, p2, user, date) |
203 | 380 tr.close() |
442 | 381 if update_dirstate: |
382 self.dirstate.setparents(n, nullid) | |
203 | 383 |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
384 def commit(self, files=None, text="", user=None, date=None, |
1807
f1f43ea22cbf
Allow repo lock to be passed in to localrepo.commit for performance
mason@suse.com
parents:
1806
diff
changeset
|
385 match=util.always, force=False, lock=None, wlock=None): |
220 | 386 commit = [] |
387 remove = [] | |
992
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
388 changed = [] |
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
389 |
220 | 390 if files: |
391 for f in files: | |
392 s = self.dirstate.state(f) | |
244 | 393 if s in 'nmai': |
220 | 394 commit.append(f) |
395 elif s == 'r': | |
396 remove.append(f) | |
397 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
|
398 self.ui.warn(_("%s not tracked!\n") % f) |
220 | 399 else: |
1619
1ba0d7041ac4
Distinguish removed and deleted files. Tests are not fixed yet.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1618
diff
changeset
|
400 modified, added, removed, deleted, unknown = self.changes(match=match) |
1618
ff339dd21976
Renamed c, a, d, u to modified, added, removed, unknown for users of changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1617
diff
changeset
|
401 commit = modified + added |
ff339dd21976
Renamed c, a, d, u to modified, added, removed, unknown for users of changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1617
diff
changeset
|
402 remove = removed |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
403 |
990 | 404 p1, p2 = self.dirstate.parents() |
405 c1 = self.changelog.read(p1) | |
406 c2 = self.changelog.read(p2) | |
407 m1 = self.manifest.read(c1[0]) | |
408 mf1 = self.manifest.readflags(c1[0]) | |
409 m2 = self.manifest.read(c2[0]) | |
410 | |
411 if not commit and not remove and not force and p2 == nullid: | |
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
|
412 self.ui.status(_("nothing changed\n")) |
901
120cba94d5aa
Change repo.comit to return None on error or the new revision number on
mason@suse.com
parents:
900
diff
changeset
|
413 return None |
151 | 414 |
1721
801756d0ca84
add pretxncommit hook.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1719
diff
changeset
|
415 xp1 = hex(p1) |
801756d0ca84
add pretxncommit hook.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1719
diff
changeset
|
416 if p2 == nullid: xp2 = '' |
801756d0ca84
add pretxncommit hook.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1719
diff
changeset
|
417 else: xp2 = hex(p2) |
801756d0ca84
add pretxncommit hook.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1719
diff
changeset
|
418 |
1727
019e6a47a53e
fix names of parent changeset ids in hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1726
diff
changeset
|
419 self.hook("precommit", throw=True, parent1=xp1, parent2=xp2) |
487 | 420 |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
421 if not wlock: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
422 wlock = self.wlock() |
1807
f1f43ea22cbf
Allow repo lock to be passed in to localrepo.commit for performance
mason@suse.com
parents:
1806
diff
changeset
|
423 if not lock: |
f1f43ea22cbf
Allow repo lock to be passed in to localrepo.commit for performance
mason@suse.com
parents:
1806
diff
changeset
|
424 lock = self.lock() |
151 | 425 tr = self.transaction() |
426 | |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
427 # check in files |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
428 new = {} |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
429 linkrev = self.changelog.count() |
220 | 430 commit.sort() |
431 for f in commit: | |
83 | 432 self.ui.note(f + "\n") |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
433 try: |
441 | 434 mf1[f] = util.is_exec(self.wjoin(f), mf1.get(f, False)) |
1019
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
435 t = self.wread(f) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
436 except IOError: |
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
|
437 self.ui.warn(_("trouble committing %s!\n") % f) |
220 | 438 raise |
439 | |
1117 | 440 r = self.file(f) |
441 | |
363 | 442 meta = {} |
443 cp = self.dirstate.copied(f) | |
444 if cp: | |
445 meta["copy"] = cp | |
446 meta["copyrev"] = hex(m1.get(cp, m2.get(cp, nullid))) | |
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
|
447 self.ui.debug(_(" %s: copy %s:%s\n") % (f, cp, meta["copyrev"])) |
1117 | 448 fp1, fp2 = nullid, nullid |
449 else: | |
1716
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
450 entry, fp1, fp2 = self.checkfilemerge(f, t, r, m1, m2) |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
451 if entry: |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
452 new[f] = entry |
990 | 453 continue |
454 | |
363 | 455 new[f] = r.add(t, meta, tr, linkrev, fp1, fp2) |
992
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
456 # remember what we've added so that we can later calculate |
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
457 # the files to pull from a set of changesets |
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
458 changed.append(f) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
459 |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
460 # update manifest |
1629
3024cacfb2c9
Copy manifest map before modifying it (see issue86)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1621
diff
changeset
|
461 m1 = m1.copy() |
229 | 462 m1.update(new) |
416
5e9e8b8d2629
[PATCH] Removal of a file added by merging branches
mpm@selenic.com
parents:
415
diff
changeset
|
463 for f in remove: |
5e9e8b8d2629
[PATCH] Removal of a file added by merging branches
mpm@selenic.com
parents:
415
diff
changeset
|
464 if f in m1: |
5e9e8b8d2629
[PATCH] Removal of a file added by merging branches
mpm@selenic.com
parents:
415
diff
changeset
|
465 del m1[f] |
741 | 466 mn = self.manifest.add(m1, mf1, tr, linkrev, c1[0], c2[0], |
467 (new, remove)) | |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
468 |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
469 # add changeset |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
470 new = new.keys() |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
471 new.sort() |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
472 |
1983
ae12a81549a7
Pass correct username as $HGUSER to hgeditor if "commit -u" is used.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1981
diff
changeset
|
473 user = user or self.ui.username() |
288 | 474 if not text: |
1709
069129d24b26
Create default commit message in a more pythonic way.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1708
diff
changeset
|
475 edittext = [""] |
992
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
476 if p2 != nullid: |
1709
069129d24b26
Create default commit message in a more pythonic way.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1708
diff
changeset
|
477 edittext.append("HG: branch merge") |
069129d24b26
Create default commit message in a more pythonic way.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1708
diff
changeset
|
478 edittext.extend(["HG: changed %s" % f for f in changed]) |
069129d24b26
Create default commit message in a more pythonic way.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1708
diff
changeset
|
479 edittext.extend(["HG: removed %s" % f for f in remove]) |
992
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
480 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
|
481 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
|
482 edittext.append("") |
1706
20b621154e17
Run commit message editor in the repo root (like hooks).
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1680
diff
changeset
|
483 # 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
|
484 olddir = os.getcwd() |
20b621154e17
Run commit message editor in the repo root (like hooks).
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1680
diff
changeset
|
485 os.chdir(self.root) |
1983
ae12a81549a7
Pass correct username as $HGUSER to hgeditor if "commit -u" is used.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1981
diff
changeset
|
486 edittext = 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
|
487 os.chdir(olddir) |
288 | 488 if not edittext.rstrip(): |
901
120cba94d5aa
Change repo.comit to return None on error or the new revision number on
mason@suse.com
parents:
900
diff
changeset
|
489 return None |
288 | 490 text = edittext |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
491 |
1645
c6ffedc4f11b
add removed files to the changelog file list
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1632
diff
changeset
|
492 n = self.changelog.add(mn, changed + remove, text, tr, p1, p2, user, date) |
1727
019e6a47a53e
fix names of parent changeset ids in hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1726
diff
changeset
|
493 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
|
494 parent2=xp2) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
495 tr.close() |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
496 |
229 | 497 self.dirstate.setparents(n) |
220 | 498 self.dirstate.update(new, "n") |
499 self.dirstate.forget(remove) | |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
500 |
1727
019e6a47a53e
fix names of parent changeset ids in hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1726
diff
changeset
|
501 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
|
502 return n |
660
2c83350784c3
Move commit hook after commit completes
Matt Mackall <mpm@selenic.com>
parents:
659
diff
changeset
|
503 |
2029
d436b21b20dc
rewrite revert command. fix issues 93, 123, 147.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
504 def walk(self, node=None, files=[], match=util.always, badmatch=None): |
724
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
723
diff
changeset
|
505 if node: |
1582
63799b01985c
fix the cat command
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
506 fdict = dict.fromkeys(files) |
726
809a870a0e73
Add a source designator to the walk methods.
Bryan O'Sullivan <bos@serpentine.com>
parents:
725
diff
changeset
|
507 for fn in self.manifest.read(self.changelog.read(node)[0]): |
1582
63799b01985c
fix the cat command
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
508 fdict.pop(fn, None) |
63799b01985c
fix the cat command
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
509 if match(fn): |
63799b01985c
fix the cat command
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
510 yield 'm', fn |
63799b01985c
fix the cat command
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
511 for fn in fdict: |
2029
d436b21b20dc
rewrite revert command. fix issues 93, 123, 147.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
512 if badmatch and badmatch(fn): |
d436b21b20dc
rewrite revert command. fix issues 93, 123, 147.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
513 if match(fn): |
d436b21b20dc
rewrite revert command. fix issues 93, 123, 147.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
514 yield 'b', fn |
d436b21b20dc
rewrite revert command. fix issues 93, 123, 147.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
515 else: |
d436b21b20dc
rewrite revert command. fix issues 93, 123, 147.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
516 self.ui.warn(_('%s: No such file in rev %s\n') % ( |
d436b21b20dc
rewrite revert command. fix issues 93, 123, 147.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
517 util.pathto(self.getcwd(), 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
|
518 else: |
2042
a514c7509fa9
small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2038
diff
changeset
|
519 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
|
520 yield src, fn |
723 | 521 |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
522 def changes(self, node1=None, node2=None, files=[], match=util.always, |
2022
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2021
diff
changeset
|
523 wlock=None, show_ignored=None): |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
524 """return changes between two nodes or node and working directory |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
525 |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
526 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
|
527 If node2 is None, compare node1 with working directory. |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
528 """ |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
529 |
536 | 530 def fcmp(fn, mf): |
1019
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
531 t1 = self.wread(fn) |
994
88c15682d9b0
Fix callers to file.revision to use file.read
mpm@selenic.com
parents:
993
diff
changeset
|
532 t2 = self.file(fn).read(mf.get(fn, nullid)) |
29 | 533 return cmp(t1, t2) |
534 | |
723 | 535 def mfmatches(node): |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
536 change = self.changelog.read(node) |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
537 mf = dict(self.manifest.read(change[0])) |
723 | 538 for fn in mf.keys(): |
539 if not match(fn): | |
540 del mf[fn] | |
541 return mf | |
741 | 542 |
1802
8a7a24b96697
speed up hg log --debug
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
1789
diff
changeset
|
543 if node1: |
8a7a24b96697
speed up hg log --debug
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
1789
diff
changeset
|
544 # 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
|
545 # 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
|
546 # 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
|
547 mf1 = mfmatches(node1) |
8a7a24b96697
speed up hg log --debug
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
1789
diff
changeset
|
548 |
536 | 549 # are we comparing the working directory? |
561 | 550 if not node2: |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
551 if not wlock: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
552 try: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
553 wlock = self.wlock(wait=0) |
1754
fdfe89a3962d
use repo.lock when cloning via copy, use lock.LockException when necessary
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1752
diff
changeset
|
554 except lock.LockException: |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
555 wlock = None |
2022
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2021
diff
changeset
|
556 lookup, modified, added, removed, deleted, unknown, ignored = ( |
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2021
diff
changeset
|
557 self.dirstate.changes(files, match, show_ignored)) |
536 | 558 |
559 # are we comparing working dir against its parent? | |
561 | 560 if not node1: |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
561 if lookup: |
536 | 562 # do a full compare of any files that might have changed |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
563 mf2 = mfmatches(self.dirstate.parents()[0]) |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
564 for f in lookup: |
561 | 565 if fcmp(f, mf2): |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
566 modified.append(f) |
1532
27077812fffb
reset mtime when two files are equal
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1531
diff
changeset
|
567 elif wlock is not None: |
27077812fffb
reset mtime when two files are equal
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1531
diff
changeset
|
568 self.dirstate.update([f], "n") |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
569 else: |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
570 # we are comparing working dir against non-parent |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
571 # generate a pseudo-manifest for the working dir |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
572 mf2 = mfmatches(self.dirstate.parents()[0]) |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
573 for f in lookup + modified + added: |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
574 mf2[f] = "" |
1617
ece5d785e87a
Make localrepo.changes() internally distinguish between removed and deleted.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1616
diff
changeset
|
575 for f in removed: |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
576 if f in mf2: |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
577 del mf2[f] |
536 | 578 else: |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
579 # we are comparing two revisions |
2022
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2021
diff
changeset
|
580 deleted, unknown, ignored = [], [], [] |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
581 mf2 = mfmatches(node2) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
582 |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
583 if node1: |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
584 # flush lists from dirstate before comparing manifests |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
585 modified, added = [], [] |
566 | 586 |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
587 for fn in mf2: |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
588 if mf1.has_key(fn): |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
589 if mf1[fn] != mf2[fn] and (mf2[fn] != "" or fcmp(fn, mf1)): |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
590 modified.append(fn) |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
591 del mf1[fn] |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
592 else: |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
593 added.append(fn) |
515 | 594 |
1617
ece5d785e87a
Make localrepo.changes() internally distinguish between removed and deleted.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1616
diff
changeset
|
595 removed = mf1.keys() |
ece5d785e87a
Make localrepo.changes() internally distinguish between removed and deleted.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1616
diff
changeset
|
596 |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
597 # sort and return results: |
2022
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2021
diff
changeset
|
598 for l in modified, added, removed, deleted, unknown, ignored: |
561 | 599 l.sort() |
2022
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2021
diff
changeset
|
600 if show_ignored is None: |
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2021
diff
changeset
|
601 return (modified, added, removed, deleted, unknown) |
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2021
diff
changeset
|
602 else: |
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2021
diff
changeset
|
603 return (modified, added, removed, deleted, unknown, ignored) |
32 | 604 |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
605 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
|
606 if not wlock: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
607 wlock = self.wlock() |
220 | 608 for f in list: |
244 | 609 p = self.wjoin(f) |
611
48c3eb2bf844
* clean up error handling when user requests to use a non file object
shaleh@speakeasy.net
parents:
609
diff
changeset
|
610 if not os.path.exists(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
|
611 self.ui.warn(_("%s does not exist!\n") % f) |
611
48c3eb2bf844
* clean up error handling when user requests to use a non file object
shaleh@speakeasy.net
parents:
609
diff
changeset
|
612 elif not os.path.isfile(p): |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
613 self.ui.warn(_("%s not added: only files supported currently\n") |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
614 % 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
|
615 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
|
616 self.ui.warn(_("%s already tracked!\n") % f) |
220 | 617 else: |
618 self.dirstate.update([f], "a") | |
619 | |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
620 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
|
621 if not wlock: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
622 wlock = self.wlock() |
220 | 623 for f in list: |
624 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
|
625 self.ui.warn(_("%s not added!\n") % f) |
220 | 626 else: |
627 self.dirstate.forget([f]) | |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
628 |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
629 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
|
630 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
|
631 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
|
632 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
|
633 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
|
634 except OSError, inst: |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
635 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
|
636 raise |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
637 if not wlock: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
638 wlock = self.wlock() |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
639 for f in list: |
244 | 640 p = self.wjoin(f) |
611
48c3eb2bf844
* clean up error handling when user requests to use a non file object
shaleh@speakeasy.net
parents:
609
diff
changeset
|
641 if os.path.exists(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
|
642 self.ui.warn(_("%s still exists!\n") % f) |
402 | 643 elif self.dirstate.state(f) == 'a': |
657
22bc6fb9aefc
dirstate.forget() takes a list
Matt Mackall <mpm@selenic.com>
parents:
656
diff
changeset
|
644 self.dirstate.forget([f]) |
220 | 645 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
|
646 self.ui.warn(_("%s not tracked!\n") % f) |
220 | 647 else: |
648 self.dirstate.update([f], "r") | |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
649 |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
650 def undelete(self, list, wlock=None): |
1448
182879d71922
Allow reverting a deleted file with two parents
Matt Mackall <mpm@selenic.com>
parents:
1447
diff
changeset
|
651 p = self.dirstate.parents()[0] |
1447
508a3f559553
revert added and removed files to their normal state before reverting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1427
diff
changeset
|
652 mn = self.changelog.read(p)[0] |
508a3f559553
revert added and removed files to their normal state before reverting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1427
diff
changeset
|
653 mf = self.manifest.readflags(mn) |
508a3f559553
revert added and removed files to their normal state before reverting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1427
diff
changeset
|
654 m = self.manifest.read(mn) |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
655 if not wlock: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
656 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
|
657 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
|
658 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
|
659 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
|
660 else: |
508a3f559553
revert added and removed files to their normal state before reverting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1427
diff
changeset
|
661 t = self.file(f).read(m[f]) |
1477
d3566eda2bcb
util.opener already create the base directory if it doesn't exist
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1473
diff
changeset
|
662 self.wwrite(f, t) |
1447
508a3f559553
revert added and removed files to their normal state before reverting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1427
diff
changeset
|
663 util.set_exec(self.wjoin(f), mf[f]) |
508a3f559553
revert added and removed files to their normal state before reverting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1427
diff
changeset
|
664 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
|
665 |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
666 def copy(self, source, dest, wlock=None): |
363 | 667 p = self.wjoin(dest) |
781 | 668 if not os.path.exists(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
|
669 self.ui.warn(_("%s does not exist!\n") % dest) |
781 | 670 elif not os.path.isfile(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
|
671 self.ui.warn(_("copy failed: %s is not a file\n") % dest) |
363 | 672 else: |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
673 if not wlock: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
674 wlock = self.wlock() |
363 | 675 if self.dirstate.state(dest) == '?': |
676 self.dirstate.update([dest], "a") | |
677 self.dirstate.copy(source, dest) | |
678 | |
1551
e793cbc8be00
Fixes to "hg heads -r FOO":
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1550
diff
changeset
|
679 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
|
680 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
|
681 # 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
|
682 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
|
683 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
|
684 return [n for (r, n) in heads] |
222 | 685 |
898 | 686 # branchlookup returns a dict giving a list of branches for |
687 # each head. A branch is defined as the tag of a node or | |
688 # the branch of the node's parents. If a node has multiple | |
689 # branch tags, tags are eliminated if they are visible from other | |
690 # branch tags. | |
691 # | |
692 # So, for this graph: a->b->c->d->e | |
693 # \ / | |
694 # aa -----/ | |
919 | 695 # a has tag 2.6.12 |
898 | 696 # d has tag 2.6.13 |
697 # e would have branch tags for 2.6.12 and 2.6.13. Because the node | |
698 # for 2.6.12 can be reached from the node 2.6.13, that is eliminated | |
699 # from the list. | |
700 # | |
701 # It is possible that more than one head will have the same branch tag. | |
702 # callers need to check the result for multiple heads under the same | |
703 # branch tag if that is a problem for them (ie checkout of a specific | |
704 # branch). | |
705 # | |
706 # passing in a specific branch will limit the depth of the search | |
707 # through the parents. It won't limit the branches returned in the | |
708 # result though. | |
709 def branchlookup(self, heads=None, branch=None): | |
710 if not heads: | |
711 heads = self.heads() | |
712 headt = [ h for h in heads ] | |
713 chlog = self.changelog | |
714 branches = {} | |
715 merges = [] | |
716 seenmerge = {} | |
717 | |
718 # traverse the tree once for each head, recording in the branches | |
719 # dict which tags are visible from this head. The branches | |
720 # dict also records which tags are visible from each tag | |
721 # while we traverse. | |
722 while headt or merges: | |
723 if merges: | |
724 n, found = merges.pop() | |
725 visit = [n] | |
726 else: | |
727 h = headt.pop() | |
728 visit = [h] | |
729 found = [h] | |
730 seen = {} | |
731 while visit: | |
732 n = visit.pop() | |
733 if n in seen: | |
734 continue | |
735 pp = chlog.parents(n) | |
736 tags = self.nodetags(n) | |
737 if tags: | |
738 for x in tags: | |
739 if x == 'tip': | |
740 continue | |
741 for f in found: | |
742 branches.setdefault(f, {})[n] = 1 | |
743 branches.setdefault(n, {})[n] = 1 | |
744 break | |
745 if n not in found: | |
746 found.append(n) | |
747 if branch in tags: | |
748 continue | |
749 seen[n] = 1 | |
750 if pp[1] != nullid and n not in seenmerge: | |
751 merges.append((pp[1], [x for x in found])) | |
752 seenmerge[n] = 1 | |
753 if pp[0] != nullid: | |
754 visit.append(pp[0]) | |
755 # traverse the branches dict, eliminating branch tags from each | |
756 # head that are visible from another branch tag for that head. | |
757 out = {} | |
758 viscache = {} | |
759 for h in heads: | |
760 def visible(node): | |
761 if node in viscache: | |
762 return viscache[node] | |
763 ret = {} | |
764 visit = [node] | |
765 while visit: | |
766 x = visit.pop() | |
767 if x in viscache: | |
768 ret.update(viscache[x]) | |
769 elif x not in ret: | |
770 ret[x] = 1 | |
771 if x in branches: | |
772 visit[len(visit):] = branches[x].keys() | |
773 viscache[node] = ret | |
774 return ret | |
775 if h not in branches: | |
776 continue | |
777 # O(n^2), but somewhat limited. This only searches the | |
778 # tags visible from a specific head, not all the tags in the | |
779 # whole repo. | |
780 for b in branches[h]: | |
781 vis = False | |
782 for bb in branches[h].keys(): | |
783 if b != bb: | |
784 if b in visible(bb): | |
785 vis = True | |
786 break | |
787 if not vis: | |
788 l = out.setdefault(h, []) | |
789 l[len(l):] = self.nodetags(b) | |
790 return out | |
791 | |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
792 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
|
793 if not nodes: |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
794 nodes = [self.changelog.tip()] |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
795 b = [] |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
796 for n in nodes: |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
797 t = n |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
798 while n: |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
799 p = self.changelog.parents(n) |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
800 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
|
801 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
|
802 break |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
803 n = p[0] |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
804 return b |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
805 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
806 def between(self, pairs): |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
807 r = [] |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
808 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
809 for top, bottom in pairs: |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
810 n, l, i = top, [], 0 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
811 f = 1 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
812 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
813 while n != bottom: |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
814 p = self.changelog.parents(n)[0] |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
815 if i == f: |
575 | 816 l.append(n) |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
817 f = f * 2 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
818 n = p |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
819 i += 1 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
820 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
821 r.append(l) |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
822 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
823 return r |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
824 |
1959
d53a18f592be
add -f/--force to pull, incoming, outgoing, to work on unrelated repo.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1947
diff
changeset
|
825 def findincoming(self, remote, base=None, heads=None, force=False): |
65
d40cc5aacc31
Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents:
64
diff
changeset
|
826 m = self.changelog.nodemap |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
827 search = [] |
1072 | 828 fetch = {} |
148
c32286d0a665
Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents:
146
diff
changeset
|
829 seen = {} |
c32286d0a665
Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents:
146
diff
changeset
|
830 seenbranch = {} |
816
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
831 if base == None: |
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
832 base = {} |
192 | 833 |
636
ac0ec421e3a5
Move the empty changeset detection out of findincoming to pull
Matt Mackall <mpm@selenic.com>
parents:
635
diff
changeset
|
834 # 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
|
835 # 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
|
836 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
|
837 |
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
838 if not heads: |
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
839 heads = remote.heads() |
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
840 |
222 | 841 unknown = [] |
842 for h in heads: | |
843 if h not in m: | |
844 unknown.append(h) | |
621
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
845 else: |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
846 base[h] = 1 |
46 | 847 |
222 | 848 if not unknown: |
1895
d7c038e805e9
findincoming should return an iterable
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1893
diff
changeset
|
849 return [] |
324 | 850 |
851 rep = {} | |
852 reqcnt = 0 | |
515 | 853 |
579
ffeb2c3a1966
Actually warn on pulling from an unrelated repository
mpm@selenic.com
parents:
578
diff
changeset
|
854 # search through remote branches |
ffeb2c3a1966
Actually warn on pulling from an unrelated repository
mpm@selenic.com
parents:
578
diff
changeset
|
855 # 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
|
856 # head, root, first parent, second parent |
ffeb2c3a1966
Actually warn on pulling from an unrelated repository
mpm@selenic.com
parents:
578
diff
changeset
|
857 # (a branch always has two parents (or none) by definition) |
222 | 858 unknown = remote.branches(unknown) |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
859 while unknown: |
324 | 860 r = [] |
861 while unknown: | |
862 n = unknown.pop(0) | |
863 if n[0] in seen: | |
864 continue | |
148
c32286d0a665
Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents:
146
diff
changeset
|
865 |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
866 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
|
867 % (short(n[0]), short(n[1]))) |
324 | 868 if n[0] == nullid: |
869 break | |
328 | 870 if 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
|
871 self.ui.debug(_("branch already found\n")) |
324 | 872 continue |
873 if 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
|
874 self.ui.debug(_("found incomplete branch %s:%s\n") |
324 | 875 % (short(n[0]), short(n[1]))) |
876 search.append(n) # schedule branch range for scanning | |
328 | 877 seenbranch[n] = 1 |
324 | 878 else: |
879 if n[1] not in seen and n[1] not in fetch: | |
880 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
|
881 self.ui.debug(_("found new changeset %s\n") % |
324 | 882 short(n[1])) |
1072 | 883 fetch[n[1]] = 1 # earliest unknown |
579
ffeb2c3a1966
Actually warn on pulling from an unrelated repository
mpm@selenic.com
parents:
578
diff
changeset
|
884 base[n[2]] = 1 # latest known |
324 | 885 continue |
886 | |
887 for a in n[2:4]: | |
888 if a not in rep: | |
889 r.append(a) | |
890 rep[a] = 1 | |
891 | |
328 | 892 seen[n[0]] = 1 |
893 | |
324 | 894 if r: |
895 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
|
896 self.ui.debug(_("request %d: %s\n") % |
324 | 897 (reqcnt, " ".join(map(short, r)))) |
898 for p in range(0, len(r), 10): | |
899 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
|
900 self.ui.debug(_("received %s:%s\n") % |
148
c32286d0a665
Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents:
146
diff
changeset
|
901 (short(b[0]), short(b[1]))) |
1072 | 902 if b[0] in m: |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
903 self.ui.debug(_("found base node %s\n") |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
904 % short(b[0])) |
1072 | 905 base[b[0]] = 1 |
906 elif b[0] not in seen: | |
148
c32286d0a665
Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents:
146
diff
changeset
|
907 unknown.append(b) |
515 | 908 |
579
ffeb2c3a1966
Actually warn on pulling from an unrelated repository
mpm@selenic.com
parents:
578
diff
changeset
|
909 # 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
|
910 while search: |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
911 n = search.pop(0) |
324 | 912 reqcnt += 1 |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
913 l = remote.between([(n[0], n[1])])[0] |
328 | 914 l.append(n[1]) |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
915 p = n[0] |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
916 f = 1 |
328 | 917 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
|
918 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
|
919 if i in m: |
85 | 920 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
|
921 self.ui.debug(_("found new branch changeset %s\n") % |
83 | 922 short(p)) |
1072 | 923 fetch[p] = 1 |
579
ffeb2c3a1966
Actually warn on pulling from an unrelated repository
mpm@selenic.com
parents:
578
diff
changeset
|
924 base[i] = 1 |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
925 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
|
926 self.ui.debug(_("narrowed branch search to %s:%s\n") |
83 | 927 % (short(p), short(i))) |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
928 search.append((p, i)) |
65
d40cc5aacc31
Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents:
64
diff
changeset
|
929 break |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
930 p, f = i, f * 2 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
931 |
579
ffeb2c3a1966
Actually warn on pulling from an unrelated repository
mpm@selenic.com
parents:
578
diff
changeset
|
932 # sanity check our fetch list |
1072 | 933 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
|
934 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
|
935 raise repo.RepoError(_("already have changeset ") + short(f[:4])) |
83 | 936 |
579
ffeb2c3a1966
Actually warn on pulling from an unrelated repository
mpm@selenic.com
parents:
578
diff
changeset
|
937 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
|
938 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
|
939 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
|
940 else: |
d53a18f592be
add -f/--force to pull, incoming, outgoing, to work on unrelated repo.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1947
diff
changeset
|
941 raise util.Abort(_("repository is unrelated")) |
511 | 942 |
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
|
943 self.ui.note(_("found new changesets starting at ") + |
83 | 944 " ".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
|
945 |
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
|
946 self.ui.debug(_("%d total queries\n") % reqcnt) |
324 | 947 |
1072 | 948 return fetch.keys() |
516 | 949 |
1959
d53a18f592be
add -f/--force to pull, incoming, outgoing, to work on unrelated repo.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1947
diff
changeset
|
950 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
|
951 """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
|
952 |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
953 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
|
954 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
|
955 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
|
956 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
|
957 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
|
958 """ |
816
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
959 if base == None: |
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
960 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
|
961 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
|
962 |
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
|
963 self.ui.debug(_("common changesets up to ") |
1072 | 964 + " ".join(map(short, base.keys())) + "\n") |
965 | |
621
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
966 remain = dict.fromkeys(self.changelog.nodemap) |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
967 |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
968 # 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
|
969 del remain[nullid] |
621
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
970 remove = base.keys() |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
971 while remove: |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
972 n = remove.pop(0) |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
973 if n in remain: |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
974 del remain[n] |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
975 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
|
976 remove.append(p) |
621
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
977 |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
978 # 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
|
979 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
|
980 # 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
|
981 updated_heads = {} |
621
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
982 for n in remain: |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
983 p1, p2 = self.changelog.parents(n) |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
984 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
|
985 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
|
986 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
|
987 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
|
988 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
|
989 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
|
990 updated_heads[p2] = True |
621
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
991 |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
992 # 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
|
993 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
|
994 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
|
995 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
|
996 return subset |
621
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
997 |
1959
d53a18f592be
add -f/--force to pull, incoming, outgoing, to work on unrelated repo.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1947
diff
changeset
|
998 def pull(self, remote, heads=None, force=False): |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
999 l = self.lock() |
636
ac0ec421e3a5
Move the empty changeset detection out of findincoming to pull
Matt Mackall <mpm@selenic.com>
parents:
635
diff
changeset
|
1000 |
ac0ec421e3a5
Move the empty changeset detection out of findincoming to pull
Matt Mackall <mpm@selenic.com>
parents:
635
diff
changeset
|
1001 # if we have an empty repo, fetch everything |
ac0ec421e3a5
Move the empty changeset detection out of findincoming to pull
Matt Mackall <mpm@selenic.com>
parents:
635
diff
changeset
|
1002 if self.changelog.tip() == nullid: |
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.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
|
1004 fetch = [nullid] |
ac0ec421e3a5
Move the empty changeset detection out of findincoming to pull
Matt Mackall <mpm@selenic.com>
parents:
635
diff
changeset
|
1005 else: |
1959
d53a18f592be
add -f/--force to pull, incoming, outgoing, to work on unrelated repo.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1947
diff
changeset
|
1006 fetch = self.findincoming(remote, force=force) |
636
ac0ec421e3a5
Move the empty changeset detection out of findincoming to pull
Matt Mackall <mpm@selenic.com>
parents:
635
diff
changeset
|
1007 |
622
e9fe5d5e67f7
Add generic repo commands for pull and push
Matt Mackall <mpm@selenic.com>
parents:
621
diff
changeset
|
1008 if not fetch: |
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
|
1009 self.ui.status(_("no changes found\n")) |
2019
ced2d3620f95
add merge command. means same thing as "update -m".
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
1010 return 0 |
622
e9fe5d5e67f7
Add generic repo commands for pull and push
Matt Mackall <mpm@selenic.com>
parents:
621
diff
changeset
|
1011 |
1461
02099220ad49
Implementing clone -r, which clones all changesets needed to reach a
Eric Hopper <hopper@omnifarious.org>
parents:
1460
diff
changeset
|
1012 if heads is None: |
1736
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1013 cg = remote.changegroup(fetch, 'pull') |
1461
02099220ad49
Implementing clone -r, which clones all changesets needed to reach a
Eric Hopper <hopper@omnifarious.org>
parents:
1460
diff
changeset
|
1014 else: |
1736
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1015 cg = remote.changegroupsubset(fetch, heads, 'pull') |
622
e9fe5d5e67f7
Add generic repo commands for pull and push
Matt Mackall <mpm@selenic.com>
parents:
621
diff
changeset
|
1016 return self.addchangegroup(cg) |
e9fe5d5e67f7
Add generic repo commands for pull and push
Matt Mackall <mpm@selenic.com>
parents:
621
diff
changeset
|
1017 |
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
|
1018 def push(self, remote, force=False, revs=None): |
622
e9fe5d5e67f7
Add generic repo commands for pull and push
Matt Mackall <mpm@selenic.com>
parents:
621
diff
changeset
|
1019 lock = remote.lock() |
816
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
1020 |
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
1021 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
|
1022 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
|
1023 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
|
1024 if not force and inc: |
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
|
1025 self.ui.warn(_("abort: unsynced remote changes!\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
|
1026 self.ui.status(_("(did you forget to sync?" |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1027 " use push -f to force)\n")) |
816
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
1028 return 1 |
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
1029 |
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
|
1030 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
|
1031 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
|
1032 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
|
1033 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
|
1034 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
|
1035 |
284fc722c342
add an optional argument to push only the specified revisions (push -r)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1713
diff
changeset
|
1036 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
|
1037 self.ui.status(_("no changes found\n")) |
622
e9fe5d5e67f7
Add generic repo commands for pull and push
Matt Mackall <mpm@selenic.com>
parents:
621
diff
changeset
|
1038 return 1 |
816
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
1039 elif not force: |
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
|
1040 if revs is not None: |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1041 updated_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
|
1042 for base in msng_cl: |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1043 for parent in self.changelog.parents(base): |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1044 if parent in 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
|
1045 updated_heads[parent] = 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
|
1046 updated_heads = 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
|
1047 if len(updated_heads) < len(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
|
1048 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
|
1049 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
|
1050 " use push -f to force)\n")) |
816
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
1051 return 1 |
622
e9fe5d5e67f7
Add generic repo commands for pull and push
Matt Mackall <mpm@selenic.com>
parents:
621
diff
changeset
|
1052 |
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
|
1053 if revs is None: |
1782 | 1054 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
|
1055 else: |
1782 | 1056 cg = self.changegroupsubset(update, revs, 'push') |
622
e9fe5d5e67f7
Add generic repo commands for pull and push
Matt Mackall <mpm@selenic.com>
parents:
621
diff
changeset
|
1057 return remote.addchangegroup(cg) |
e9fe5d5e67f7
Add generic repo commands for pull and push
Matt Mackall <mpm@selenic.com>
parents:
621
diff
changeset
|
1058 |
1736
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1059 def changegroupsubset(self, bases, heads, source): |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1060 """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
|
1061 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
|
1062 the heads. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1063 |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1064 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
|
1065 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
|
1066 is non-trivial. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1067 |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1068 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
|
1069 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
|
1070 |
1736
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1071 self.hook('preoutgoing', throw=True, source=source) |
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1072 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1073 # Set up some initial variables |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1074 # 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
|
1075 cl = self.changelog |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1076 # 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
|
1077 # changegroup. |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1078 msng_cl_lst, bases, heads = cl.nodesbetween(bases, heads) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1079 # 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
|
1080 # 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
|
1081 # necessary to re-create the changegroup. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1082 |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1083 # 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
|
1084 # 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
|
1085 knownheads = {} |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1086 # 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
|
1087 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
|
1088 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
|
1089 if p != nullid: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1090 knownheads[p] = 1 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1091 knownheads = knownheads.keys() |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1092 if knownheads: |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1093 # 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
|
1094 # 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
|
1095 # 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
|
1096 # changeset. |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1097 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
|
1098 junk = None |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1099 # 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
|
1100 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
|
1101 else: |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1102 # 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
|
1103 # know about any changesets. |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1104 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
|
1105 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1106 # 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
|
1107 mnfst = self.manifest |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1108 # 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
|
1109 msng_mnfst_set = {} |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1110 # 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
|
1111 msng_filenode_set = {} |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1112 |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1113 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
|
1114 junk = None |
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1115 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1116 # 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
|
1117 # 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
|
1118 def identity(x): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1119 return x |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1120 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1121 # 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
|
1122 # inner function. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1123 def cmp_by_rev_func(revlog): |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1124 # 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
|
1125 # 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
|
1126 # 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
|
1127 # 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
|
1128 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
|
1129 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
|
1130 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
|
1131 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1132 # 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
|
1133 # 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
|
1134 # 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
|
1135 # 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
|
1136 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
|
1137 haslst = hasset.keys() |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1138 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
|
1139 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
|
1140 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
|
1141 while parentlst: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1142 n = parentlst.pop() |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1143 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
|
1144 hasset[n] = 1 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1145 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
|
1146 parentlst.extend(p) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1147 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
|
1148 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
|
1149 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1150 # 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
|
1151 # 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
|
1152 def manifest_and_file_collector(changedfileset): |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1153 # 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
|
1154 # 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
|
1155 # 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
|
1156 # 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
|
1157 # 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
|
1158 # changed in any changeset in the changegroup. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1159 # |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1160 # 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
|
1161 # 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
|
1162 # the manifest. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1163 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
|
1164 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
|
1165 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
|
1166 # 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
|
1167 # 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
|
1168 changedfileset.setdefault(f, f) |
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1169 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
|
1170 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
|
1171 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1172 # 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
|
1173 # 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
|
1174 # 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
|
1175 def prune_manifests(): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1176 has_mnfst_set = {} |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1177 for n in msng_mnfst_set: |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1178 # 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
|
1179 # 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
|
1180 # 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
|
1181 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
|
1182 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
|
1183 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
|
1184 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
|
1185 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1186 # 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
|
1187 # 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
|
1188 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
|
1189 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
|
1190 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1191 # 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
|
1192 # 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
|
1193 def filenode_collector(changedfiles): |
1462
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1194 next_rev = [0] |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1195 # 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
|
1196 # 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
|
1197 # 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
|
1198 # |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1199 # 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
|
1200 # 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
|
1201 # 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
|
1202 def collect_msng_filenodes(mnfstnode): |
1462
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1203 r = mnfst.rev(mnfstnode) |
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1204 if r == next_rev[0]: |
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1205 # 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
|
1206 # 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
|
1207 delta = mdiff.patchtext(mnfst.delta(mnfstnode)) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1208 # 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
|
1209 for dline in delta.splitlines(): |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1210 # 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
|
1211 f, fnode = dline.split('\0') |
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1212 fnode = bin(fnode[:40]) |
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1213 f = changedfiles.get(f, None) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1214 # 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
|
1215 # about. |
1462
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1216 if f is not None: |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1217 # Get the changenode this manifest belongs to |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1218 clnode = msng_mnfst_set[mnfstnode] |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1219 # 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
|
1220 # there isn't one already. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1221 ndset = msng_filenode_set.setdefault(f, {}) |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1222 # 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
|
1223 # 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
|
1224 ndset.setdefault(fnode, clnode) |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1225 else: |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1226 # Otherwise we need a full manifest. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1227 m = mnfst.read(mnfstnode) |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1228 # For every file in we care about. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1229 for f in changedfiles: |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1230 fnode = m.get(f, None) |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1231 # If it's in the manifest |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1232 if fnode is not None: |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1233 # See comments above. |
1462
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1234 clnode = msng_mnfst_set[mnfstnode] |
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1235 ndset = msng_filenode_set.setdefault(f, {}) |
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1236 ndset.setdefault(fnode, clnode) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1237 # 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
|
1238 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
|
1239 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
|
1240 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1241 # 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
|
1242 # 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
|
1243 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
|
1244 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
|
1245 hasset = {} |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1246 # 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
|
1247 # 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
|
1248 # that filenode. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1249 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
|
1250 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
|
1251 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
|
1252 hasset[n] = 1 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1253 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
|
1254 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1255 # 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
|
1256 # inner function. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1257 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
|
1258 msngset = msng_filenode_set[fname] |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1259 # 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
|
1260 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
|
1261 return msngset[fnode] |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1262 return lookup_filenode_link |
515 | 1263 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1264 # 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
|
1265 # 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
|
1266 def gengroup(): |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1267 # 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
|
1268 changedfiles = {} |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1269 # 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
|
1270 # 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
|
1271 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
|
1272 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
|
1273 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
|
1274 yield chnk |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1275 |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1276 # 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
|
1277 # 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
|
1278 prune_manifests() |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1279 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
|
1280 # 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
|
1281 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
|
1282 # 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
|
1283 # 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
|
1284 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
|
1285 filenode_collector(changedfiles)) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1286 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
|
1287 yield chnk |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1288 |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1289 # 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
|
1290 # them. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1291 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
|
1292 msng_mnfst_set.clear() |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1293 |
1462
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1294 changedfiles = changedfiles.keys() |
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1295 changedfiles.sort() |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1296 # 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
|
1297 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
|
1298 filerevlog = self.file(fname) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1299 # 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
|
1300 # 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
|
1301 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
|
1302 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
|
1303 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
|
1304 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
|
1305 msng_filenode_lst = [] |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1306 # 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
|
1307 # 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
|
1308 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
|
1309 yield changegroup.genchunk(fname) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1310 # 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
|
1311 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
|
1312 # 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
|
1313 # 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
|
1314 # from filenodes. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1315 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
|
1316 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
|
1317 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
|
1318 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
|
1319 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
|
1320 # 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
|
1321 del msng_filenode_set[fname] |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1322 # 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
|
1323 yield changegroup.closechunk() |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1324 |
1736
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1325 self.hook('outgoing', node=hex(msng_cl_lst[0]), source=source) |
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1326 |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1327 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
|
1328 |
1736
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1329 def changegroup(self, basenodes, source): |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1330 """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
|
1331 doesn't. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1332 |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1333 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
|
1334 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
|
1335 |
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1336 self.hook('preoutgoing', throw=True, source=source) |
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1337 |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1338 cl = self.changelog |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1339 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
|
1340 revset = dict.fromkeys([cl.rev(n) for n in nodes]) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1341 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1342 def identity(x): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1343 return x |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1344 |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1345 def gennodelst(revlog): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1346 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
|
1347 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
|
1348 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
|
1349 yield n |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1350 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1351 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
|
1352 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
|
1353 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
|
1354 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
|
1355 changedfileset[fname] = 1 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1356 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
|
1357 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1358 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
|
1359 def lookuprevlink(n): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1360 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
|
1361 return lookuprevlink |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1362 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1363 def gengroup(): |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1364 # 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
|
1365 changedfiles = {} |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1366 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1367 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
|
1368 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
|
1369 yield chnk |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1370 changedfiles = changedfiles.keys() |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1371 changedfiles.sort() |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1372 |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1373 mnfst = self.manifest |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1374 nodeiter = gennodelst(mnfst) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1375 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
|
1376 yield chnk |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1377 |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1378 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
|
1379 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
|
1380 nodeiter = gennodelst(filerevlog) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1381 nodeiter = list(nodeiter) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1382 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
|
1383 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
|
1384 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
|
1385 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
|
1386 yield chnk |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1387 |
1981
736b6c96bbbc
make incoming work via ssh (issue139); move chunk code into separate module.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1967
diff
changeset
|
1388 yield changegroup.closechunk() |
1736
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1389 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
|
1390 |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1391 return util.chunkbuffer(gengroup()) |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1392 |
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1393 def addchangegroup(self, source): |
2019
ced2d3620f95
add merge command. means same thing as "update -m".
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
1394 """add changegroup to repo. |
ced2d3620f95
add merge command. means same thing as "update -m".
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
1395 returns number of heads modified or added + 1.""" |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1396 |
222 | 1397 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
|
1398 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
|
1399 return cl.count() |
222 | 1400 |
1401 def revmap(x): | |
1998
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1402 return cl.rev(x) |
222 | 1403 |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1404 if not source: |
2019
ced2d3620f95
add merge command. means same thing as "update -m".
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
1405 return 0 |
1730
0f1d2c75db5e
add prechangegroup and pretxnchangegroup hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1721
diff
changeset
|
1406 |
0f1d2c75db5e
add prechangegroup and pretxnchangegroup hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1721
diff
changeset
|
1407 self.hook('prechangegroup', throw=True) |
0f1d2c75db5e
add prechangegroup and pretxnchangegroup hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1721
diff
changeset
|
1408 |
222 | 1409 changesets = files = revisions = 0 |
225 | 1410 |
222 | 1411 tr = self.transaction() |
1412 | |
1998
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1413 # write changelog and manifest data to temp files so |
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1414 # concurrent readers will not see inconsistent view |
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1415 cl = appendfile.appendchangelog(self.opener) |
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1416 |
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1417 oldheads = len(cl.heads()) |
1040
35e883d1ff9b
Show number of new heads when doing a pull
mpm@selenic.com
parents:
1019
diff
changeset
|
1418 |
222 | 1419 # pull off the changeset group |
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
|
1420 self.ui.status(_("adding changesets\n")) |
1998
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1421 co = cl.tip() |
1981
736b6c96bbbc
make incoming work via ssh (issue139); move chunk code into separate module.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1967
diff
changeset
|
1422 chunkiter = changegroup.chunkiter(source) |
1998
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1423 cn = cl.addgroup(chunkiter, csmap, tr, 1) # unique |
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1424 cnr, cor = map(cl.rev, (cn, co)) |
1375
f2b00be33e2c
Fix traceback when nothing was added during unbundle
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1353
diff
changeset
|
1425 if cn == nullid: |
f2b00be33e2c
Fix traceback when nothing was added during unbundle
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1353
diff
changeset
|
1426 cnr = cor |
1316 | 1427 changesets = cnr - cor |
222 | 1428 |
1998
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1429 mf = appendfile.appendmanifest(self.opener) |
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1430 |
222 | 1431 # pull off the manifest group |
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
|
1432 self.ui.status(_("adding manifests\n")) |
1998
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1433 mm = mf.tip() |
1981
736b6c96bbbc
make incoming work via ssh (issue139); move chunk code into separate module.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1967
diff
changeset
|
1434 chunkiter = changegroup.chunkiter(source) |
1998
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1435 mo = mf.addgroup(chunkiter, revmap, tr) |
222 | 1436 |
1437 # process the files | |
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
|
1438 self.ui.status(_("adding file changes\n")) |
222 | 1439 while 1: |
1981
736b6c96bbbc
make incoming work via ssh (issue139); move chunk code into separate module.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1967
diff
changeset
|
1440 f = changegroup.getchunk(source) |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1441 if not f: |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1442 break |
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
|
1443 self.ui.debug(_("adding %s revisions\n") % f) |
222 | 1444 fl = self.file(f) |
529
aace5b681fe9
Attempt to fix negative revision count from pull
mpm@selenic.com
parents:
522
diff
changeset
|
1445 o = fl.count() |
1981
736b6c96bbbc
make incoming work via ssh (issue139); move chunk code into separate module.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1967
diff
changeset
|
1446 chunkiter = changegroup.chunkiter(source) |
736b6c96bbbc
make incoming work via ssh (issue139); move chunk code into separate module.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1967
diff
changeset
|
1447 n = fl.addgroup(chunkiter, revmap, tr) |
529
aace5b681fe9
Attempt to fix negative revision count from pull
mpm@selenic.com
parents:
522
diff
changeset
|
1448 revisions += fl.count() - o |
222 | 1449 files += 1 |
1450 | |
1998
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1451 # write order here is important so concurrent readers will see |
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1452 # consistent view of repo |
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1453 mf.writedata() |
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1454 cl.writedata() |
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1455 |
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1456 # make changelog and manifest see real files again |
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1457 self.changelog = changelog.changelog(self.opener) |
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1458 self.manifest = manifest.manifest(self.opener) |
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1459 |
1040
35e883d1ff9b
Show number of new heads when doing a pull
mpm@selenic.com
parents:
1019
diff
changeset
|
1460 newheads = len(self.changelog.heads()) |
35e883d1ff9b
Show number of new heads when doing a pull
mpm@selenic.com
parents:
1019
diff
changeset
|
1461 heads = "" |
35e883d1ff9b
Show number of new heads when doing a pull
mpm@selenic.com
parents:
1019
diff
changeset
|
1462 if oldheads and newheads > oldheads: |
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
|
1463 heads = _(" (+%d heads)") % (newheads - oldheads) |
1040
35e883d1ff9b
Show number of new heads when doing a pull
mpm@selenic.com
parents:
1019
diff
changeset
|
1464 |
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
|
1465 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
|
1466 " 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
|
1467 % (changesets, revisions, files, heads)) |
222 | 1468 |
1730
0f1d2c75db5e
add prechangegroup and pretxnchangegroup hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1721
diff
changeset
|
1469 self.hook('pretxnchangegroup', throw=True, |
0f1d2c75db5e
add prechangegroup and pretxnchangegroup hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1721
diff
changeset
|
1470 node=hex(self.changelog.node(cor+1))) |
0f1d2c75db5e
add prechangegroup and pretxnchangegroup hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1721
diff
changeset
|
1471 |
222 | 1472 tr.close() |
780 | 1473 |
1375
f2b00be33e2c
Fix traceback when nothing was added during unbundle
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1353
diff
changeset
|
1474 if changesets > 0: |
1717
7a4a16a7d21f
hooks run after transactions finish must not affect method results.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1713
diff
changeset
|
1475 self.hook("changegroup", node=hex(self.changelog.node(cor+1))) |
780 | 1476 |
1375
f2b00be33e2c
Fix traceback when nothing was added during unbundle
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1353
diff
changeset
|
1477 for i in range(cor + 1, cnr + 1): |
1713
03ee100b8c21
hooks: distinguish between locally committed and incoming changes.
Daniel Santa Cruz <byteshack@gmail.com>
parents:
1712
diff
changeset
|
1478 self.hook("incoming", node=hex(self.changelog.node(i))) |
1316 | 1479 |
2019
ced2d3620f95
add merge command. means same thing as "update -m".
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
1480 return newheads - oldheads + 1 |
ced2d3620f95
add merge command. means same thing as "update -m".
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
1481 |
588 | 1482 def update(self, node, allow=False, force=False, choose=None, |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
1483 moddirstate=True, forcemerge=False, wlock=None): |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1484 pl = self.dirstate.parents() |
275 | 1485 if not force and pl[1] != nullid: |
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
|
1486 self.ui.warn(_("aborting: outstanding uncommitted merges\n")) |
690 | 1487 return 1 |
46 | 1488 |
1663
d529cdc0a3ee
return a non-zero exit code when a merge failed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1645
diff
changeset
|
1489 err = False |
d529cdc0a3ee
return a non-zero exit code when a merge failed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1645
diff
changeset
|
1490 |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1491 p1, p2 = pl[0], node |
305 | 1492 pa = self.changelog.ancestor(p1, p2) |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1493 m1n = self.changelog.read(p1)[0] |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1494 m2n = self.changelog.read(p2)[0] |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1495 man = self.manifest.ancestor(m1n, m2n) |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1496 m1 = self.manifest.read(m1n) |
276 | 1497 mf1 = self.manifest.readflags(m1n) |
1629
3024cacfb2c9
Copy manifest map before modifying it (see issue86)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1621
diff
changeset
|
1498 m2 = self.manifest.read(m2n).copy() |
276 | 1499 mf2 = self.manifest.readflags(m2n) |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1500 ma = self.manifest.read(man) |
412 | 1501 mfa = self.manifest.readflags(man) |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1502 |
1619
1ba0d7041ac4
Distinguish removed and deleted files. Tests are not fixed yet.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1618
diff
changeset
|
1503 modified, added, removed, deleted, unknown = self.changes() |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1504 |
1674
dee55c4a4963
abort when using 'update -m' and this is not a merge
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1667
diff
changeset
|
1505 # is this a jump, or a merge? i.e. is there a linear path |
dee55c4a4963
abort when using 'update -m' and this is not a merge
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1667
diff
changeset
|
1506 # from p1 to p2? |
dee55c4a4963
abort when using 'update -m' and this is not a merge
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1667
diff
changeset
|
1507 linear_path = (pa == p1 or pa == p2) |
dee55c4a4963
abort when using 'update -m' and this is not a merge
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1667
diff
changeset
|
1508 |
dee55c4a4963
abort when using 'update -m' and this is not a merge
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1667
diff
changeset
|
1509 if allow and linear_path: |
dee55c4a4963
abort when using 'update -m' and this is not a merge
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1667
diff
changeset
|
1510 raise util.Abort(_("there is nothing to merge, " |
dee55c4a4963
abort when using 'update -m' and this is not a merge
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1667
diff
changeset
|
1511 "just use 'hg update'")) |
1581
db10b7114de0
abort when merging two heads and repository has local changes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
1512 if allow and not forcemerge: |
1618
ff339dd21976
Renamed c, a, d, u to modified, added, removed, unknown for users of changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1617
diff
changeset
|
1513 if modified or added or removed: |
1995
2da2d46862fb
Spelling fix: "commited" -> "committed"
mcmillen@cs.cmu.edu
parents:
1986
diff
changeset
|
1514 raise util.Abort(_("outstanding uncommitted changes")) |
1581
db10b7114de0
abort when merging two heads and repository has local changes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
1515 if not forcemerge and not force: |
1618
ff339dd21976
Renamed c, a, d, u to modified, added, removed, unknown for users of changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1617
diff
changeset
|
1516 for f in unknown: |
1581
db10b7114de0
abort when merging two heads and repository has local changes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
1517 if f in m2: |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1518 t1 = self.wread(f) |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1519 t2 = self.file(f).read(m2[f]) |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1520 if cmp(t1, t2) != 0: |
1581
db10b7114de0
abort when merging two heads and repository has local changes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
1521 raise util.Abort(_("'%s' already exists in the working" |
db10b7114de0
abort when merging two heads and repository has local changes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
1522 " dir and differs from remote") % f) |
db10b7114de0
abort when merging two heads and repository has local changes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
1523 |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1524 # resolve the manifest to determine which files |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1525 # we care about merging |
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
|
1526 self.ui.note(_("resolving manifests\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
|
1527 self.ui.debug(_(" force %s allow %s moddirstate %s linear %s\n") % |
650
2c934c7b79dc
Fix bug in reverting deleted files
Matt Mackall <mpm@selenic.com>
parents:
649
diff
changeset
|
1528 (force, allow, moddirstate, linear_path)) |
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
|
1529 self.ui.debug(_(" ancestor %s local %s remote %s\n") % |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1530 (short(man), short(m1n), short(m2n))) |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1531 |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1532 merge = {} |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1533 get = {} |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1534 remove = [] |
46 | 1535 |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1536 # construct a working dir manifest |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1537 mw = m1.copy() |
276 | 1538 mfw = mf1.copy() |
1618
ff339dd21976
Renamed c, a, d, u to modified, added, removed, unknown for users of changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1617
diff
changeset
|
1539 umap = dict.fromkeys(unknown) |
576 | 1540 |
1618
ff339dd21976
Renamed c, a, d, u to modified, added, removed, unknown for users of changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1617
diff
changeset
|
1541 for f in added + modified + unknown: |
254 | 1542 mw[f] = "" |
441 | 1543 mfw[f] = util.is_exec(self.wjoin(f), mfw.get(f, False)) |
576 | 1544 |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
1545 if moddirstate and not wlock: |
1531
2ba8bf7defda
add localrepo.wlock for protecting the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1516
diff
changeset
|
1546 wlock = self.wlock() |
2ba8bf7defda
add localrepo.wlock for protecting the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1516
diff
changeset
|
1547 |
1621
ee16f06174bd
Restored old behaviour for 'hg co' and 'hg co -C' for removed files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1619
diff
changeset
|
1548 for f in deleted + removed: |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1549 if f in mw: |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1550 del mw[f] |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1551 |
408
3695fbd2c33b
[PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents:
407
diff
changeset
|
1552 # If we're jumping between revisions (as opposed to merging), |
3695fbd2c33b
[PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents:
407
diff
changeset
|
1553 # and if neither the working directory nor the target rev has |
3695fbd2c33b
[PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents:
407
diff
changeset
|
1554 # the file, then we need to remove it from the dirstate, to |
3695fbd2c33b
[PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents:
407
diff
changeset
|
1555 # prevent the dirstate from listing the file when it is no |
3695fbd2c33b
[PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents:
407
diff
changeset
|
1556 # longer in the manifest. |
588 | 1557 if moddirstate and linear_path and f not in m2: |
408
3695fbd2c33b
[PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents:
407
diff
changeset
|
1558 self.dirstate.forget((f,)) |
3695fbd2c33b
[PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents:
407
diff
changeset
|
1559 |
576 | 1560 # Compare manifests |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1561 for f, n in mw.iteritems(): |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1562 if choose and not choose(f): |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1563 continue |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1564 if f in m2: |
277
79279550c8ff
merge: update permissions even if file contents didn't change
mpm@selenic.com
parents:
276
diff
changeset
|
1565 s = 0 |
79279550c8ff
merge: update permissions even if file contents didn't change
mpm@selenic.com
parents:
276
diff
changeset
|
1566 |
407
0e0d0670b2bc
[PATCH] Merging identical changes from another branch
mpm@selenic.com
parents:
405
diff
changeset
|
1567 # is the wfile new since m1, and match m2? |
428 | 1568 if f not in m1: |
1019
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
1569 t1 = self.wread(f) |
994
88c15682d9b0
Fix callers to file.revision to use file.read
mpm@selenic.com
parents:
993
diff
changeset
|
1570 t2 = self.file(f).read(m2[f]) |
407
0e0d0670b2bc
[PATCH] Merging identical changes from another branch
mpm@selenic.com
parents:
405
diff
changeset
|
1571 if cmp(t1, t2) == 0: |
0e0d0670b2bc
[PATCH] Merging identical changes from another branch
mpm@selenic.com
parents:
405
diff
changeset
|
1572 n = m2[f] |
0e0d0670b2bc
[PATCH] Merging identical changes from another branch
mpm@selenic.com
parents:
405
diff
changeset
|
1573 del t1, t2 |
0e0d0670b2bc
[PATCH] Merging identical changes from another branch
mpm@selenic.com
parents:
405
diff
changeset
|
1574 |
296
a3d83bf86755
hg update: fix clobbering files when going backwards
mpm@selenic.com
parents:
292
diff
changeset
|
1575 # are files different? |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1576 if n != m2[f]: |
254 | 1577 a = ma.get(f, nullid) |
296
a3d83bf86755
hg update: fix clobbering files when going backwards
mpm@selenic.com
parents:
292
diff
changeset
|
1578 # are both different from the ancestor? |
254 | 1579 if n != a and m2[f] != a: |
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
|
1580 self.ui.debug(_(" %s versions differ, resolve\n") % f) |
276 | 1581 # merge executable bits |
1582 # "if we changed or they changed, change in merge" | |
1583 a, b, c = mfa.get(f, 0), mfw[f], mf2[f] | |
1584 mode = ((a^b) | (a^c)) ^ a | |
1585 merge[f] = (m1.get(f, nullid), m2[f], mode) | |
277
79279550c8ff
merge: update permissions even if file contents didn't change
mpm@selenic.com
parents:
276
diff
changeset
|
1586 s = 1 |
305 | 1587 # are we clobbering? |
1588 # is remote's version newer? | |
1589 # or are we going back in time? | |
1590 elif force or m2[f] != a or (p2 == pa and mw[f] == m1[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
|
1591 self.ui.debug(_(" remote %s is newer, get\n") % f) |
254 | 1592 get[f] = m2[f] |
277
79279550c8ff
merge: update permissions even if file contents didn't change
mpm@selenic.com
parents:
276
diff
changeset
|
1593 s = 1 |
576 | 1594 elif f in umap: |
1595 # this unknown file is the same as the checkout | |
1596 get[f] = m2[f] | |
277
79279550c8ff
merge: update permissions even if file contents didn't change
mpm@selenic.com
parents:
276
diff
changeset
|
1597 |
79279550c8ff
merge: update permissions even if file contents didn't change
mpm@selenic.com
parents:
276
diff
changeset
|
1598 if not s and mfw[f] != mf2[f]: |
79279550c8ff
merge: update permissions even if file contents didn't change
mpm@selenic.com
parents:
276
diff
changeset
|
1599 if force: |
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
|
1600 self.ui.debug(_(" updating permissions for %s\n") % f) |
441 | 1601 util.set_exec(self.wjoin(f), mf2[f]) |
277
79279550c8ff
merge: update permissions even if file contents didn't change
mpm@selenic.com
parents:
276
diff
changeset
|
1602 else: |
79279550c8ff
merge: update permissions even if file contents didn't change
mpm@selenic.com
parents:
276
diff
changeset
|
1603 a, b, c = mfa.get(f, 0), mfw[f], mf2[f] |
79279550c8ff
merge: update permissions even if file contents didn't change
mpm@selenic.com
parents:
276
diff
changeset
|
1604 mode = ((a^b) | (a^c)) ^ a |
79279550c8ff
merge: update permissions even if file contents didn't change
mpm@selenic.com
parents:
276
diff
changeset
|
1605 if mode != b: |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1606 self.ui.debug(_(" updating permissions for %s\n") |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1607 % f) |
441 | 1608 util.set_exec(self.wjoin(f), mode) |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1609 del m2[f] |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1610 elif f in ma: |
616 | 1611 if n != ma[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
|
1612 r = _("d") |
616 | 1613 if not force and (linear_path or allow): |
415
c2b9502a4e96
[PATCH] Don't prompt user for keep-vs-delete when the merge is about to be aborted
mpm@selenic.com
parents:
413
diff
changeset
|
1614 r = self.ui.prompt( |
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
|
1615 (_(" local changed %s which remote deleted\n") % f) + |
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
|
1616 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) |
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
|
1617 if r == _("d"): |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1618 remove.append(f) |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1619 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
|
1620 self.ui.debug(_("other deleted %s\n") % f) |
254 | 1621 remove.append(f) # other deleted it |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1622 else: |
1236
67a28636ea64
Fix bug with co -C across branches, update tests
mpm@selenic.com
parents:
1234
diff
changeset
|
1623 # file is created on branch or in working directory |
67a28636ea64
Fix bug with co -C across branches, update tests
mpm@selenic.com
parents:
1234
diff
changeset
|
1624 if force and f not in umap: |
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
|
1625 self.ui.debug(_("remote deleted %s, clobbering\n") % f) |
1236
67a28636ea64
Fix bug with co -C across branches, update tests
mpm@selenic.com
parents:
1234
diff
changeset
|
1626 remove.append(f) |
67a28636ea64
Fix bug with co -C across branches, update tests
mpm@selenic.com
parents:
1234
diff
changeset
|
1627 elif n == m1.get(f, nullid): # same as parent |
1234
9ee8428d84a1
Revert unrelated changes in previous commit
mpm@selenic.com
parents:
1233
diff
changeset
|
1628 if p2 == pa: # going backwards? |
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
|
1629 self.ui.debug(_("remote deleted %s\n") % f) |
1234
9ee8428d84a1
Revert unrelated changes in previous commit
mpm@selenic.com
parents:
1233
diff
changeset
|
1630 remove.append(f) |
9ee8428d84a1
Revert unrelated changes in previous commit
mpm@selenic.com
parents:
1233
diff
changeset
|
1631 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
|
1632 self.ui.debug(_("local modified %s, keeping\n") % f) |
254 | 1633 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
|
1634 self.ui.debug(_("working dir created %s, keeping\n") % f) |
46 | 1635 |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1636 for f, n in m2.iteritems(): |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1637 if choose and not choose(f): |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1638 continue |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1639 if f[0] == "/": |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1640 continue |
616 | 1641 if f in ma and n != ma[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
|
1642 r = _("k") |
616 | 1643 if not force and (linear_path or allow): |
415
c2b9502a4e96
[PATCH] Don't prompt user for keep-vs-delete when the merge is about to be aborted
mpm@selenic.com
parents:
413
diff
changeset
|
1644 r = self.ui.prompt( |
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
|
1645 (_("remote changed %s which local deleted\n") % f) + |
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
|
1646 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1647 if r == _("k"): |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1648 get[f] = n |
616 | 1649 elif f not in ma: |
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
|
1650 self.ui.debug(_("remote created %s\n") % f) |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1651 get[f] = n |
616 | 1652 else: |
680
4b7b79d2db2c
Handle undeletion of files when checking out old revisions
Matt Mackall <mpm@selenic.com>
parents:
679
diff
changeset
|
1653 if force or p2 == pa: # going backwards? |
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
|
1654 self.ui.debug(_("local deleted %s, recreating\n") % f) |
650
2c934c7b79dc
Fix bug in reverting deleted files
Matt Mackall <mpm@selenic.com>
parents:
649
diff
changeset
|
1655 get[f] = n |
680
4b7b79d2db2c
Handle undeletion of files when checking out old revisions
Matt Mackall <mpm@selenic.com>
parents:
679
diff
changeset
|
1656 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
|
1657 self.ui.debug(_("local deleted %s\n") % f) |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1658 |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1659 del mw, m1, m2, ma |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1660 |
275 | 1661 if force: |
1662 for f in merge: | |
1663 get[f] = merge[f][1] | |
1664 merge = {} | |
1665 | |
690 | 1666 if linear_path or force: |
254 | 1667 # we don't need to do any magic, just jump to the new rev |
993 | 1668 branch_merge = False |
254 | 1669 p1, p2 = p2, nullid |
1670 else: | |
275 | 1671 if not allow: |
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
|
1672 self.ui.status(_("this update spans a branch" |
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
|
1673 " affecting the following files:\n")) |
305 | 1674 fl = merge.keys() + get.keys() |
1675 fl.sort() | |
1676 for f in fl: | |
1677 cf = "" | |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1678 if f in merge: |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1679 cf = _(" (resolve)") |
305 | 1680 self.ui.status(" %s%s\n" % (f, cf)) |
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
|
1681 self.ui.warn(_("aborting update spanning branches!\n")) |
2019
ced2d3620f95
add merge command. means same thing as "update -m".
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
1682 self.ui.status(_("(use 'hg merge' to merge across branches" |
2038
5c4496ed152d
Tell the user the real "hg update -C" command, not just "-C" when aborting.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2029
diff
changeset
|
1683 " or 'hg update -C' to lose changes)\n")) |
275 | 1684 return 1 |
993 | 1685 branch_merge = True |
254 | 1686 |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1687 # get the files we don't need to change |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1688 files = get.keys() |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1689 files.sort() |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1690 for f in files: |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1691 if f[0] == "/": |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1692 continue |
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
|
1693 self.ui.note(_("getting %s\n") % f) |
276 | 1694 t = self.file(f).read(get[f]) |
1477
d3566eda2bcb
util.opener already create the base directory if it doesn't exist
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1473
diff
changeset
|
1695 self.wwrite(f, t) |
441 | 1696 util.set_exec(self.wjoin(f), mf2[f]) |
588 | 1697 if moddirstate: |
993 | 1698 if branch_merge: |
1699 self.dirstate.update([f], 'n', st_mtime=-1) | |
992
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
1700 else: |
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
1701 self.dirstate.update([f], 'n') |
46 | 1702 |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1703 # merge the tricky bits |
1922
6d50d6189269
ui: output the number of file updated/merged/removed/... on update
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1893
diff
changeset
|
1704 failedmerge = [] |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1705 files = merge.keys() |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1706 files.sort() |
1883
b98160cfb2f3
give more info to hgmerge script.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1882
diff
changeset
|
1707 xp1 = hex(p1) |
b98160cfb2f3
give more info to hgmerge script.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1882
diff
changeset
|
1708 xp2 = hex(p2) |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1709 for f in files: |
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
|
1710 self.ui.status(_("merging %s\n") % f) |
993 | 1711 my, other, flag = merge[f] |
1883
b98160cfb2f3
give more info to hgmerge script.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1882
diff
changeset
|
1712 ret = self.merge3(f, my, other, xp1, xp2) |
1663
d529cdc0a3ee
return a non-zero exit code when a merge failed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1645
diff
changeset
|
1713 if ret: |
d529cdc0a3ee
return a non-zero exit code when a merge failed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1645
diff
changeset
|
1714 err = True |
1922
6d50d6189269
ui: output the number of file updated/merged/removed/... on update
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1893
diff
changeset
|
1715 failedmerge.append(f) |
441 | 1716 util.set_exec(self.wjoin(f), flag) |
862
d70c1c31fd45
Fix 3-way-merge of original parent, workdir and new parent.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
861
diff
changeset
|
1717 if moddirstate: |
993 | 1718 if branch_merge: |
1719 # We've done a branch merge, mark this file as merged | |
1720 # so that we properly record the merger later | |
1721 self.dirstate.update([f], 'm') | |
862
d70c1c31fd45
Fix 3-way-merge of original parent, workdir and new parent.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
861
diff
changeset
|
1722 else: |
993 | 1723 # We've update-merged a locally modified file, so |
1724 # we set the dirstate to emulate a normal checkout | |
1725 # of that file some time in the past. Thus our | |
1726 # merge will appear as a normal local file | |
1727 # modification. | |
1728 f_len = len(self.file(f).read(other)) | |
1729 self.dirstate.update([f], 'n', st_size=f_len, st_mtime=-1) | |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1730 |
681 | 1731 remove.sort() |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1732 for f in remove: |
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
|
1733 self.ui.note(_("removing %s\n") % f) |
1835
bdfb524d728a
Validate paths before reading or writing files in repository or working dir.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1807
diff
changeset
|
1734 util.audit_path(f) |
690 | 1735 try: |
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
|
1736 util.unlink(self.wjoin(f)) |
690 | 1737 except OSError, inst: |
1398
3f76ac60130d
make update quieter when nothing is wrong
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1384
diff
changeset
|
1738 if inst.errno != errno.ENOENT: |
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
|
1739 self.ui.warn(_("update failed to remove %s: %s!\n") % |
1398
3f76ac60130d
make update quieter when nothing is wrong
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1384
diff
changeset
|
1740 (f, inst.strerror)) |
588 | 1741 if moddirstate: |
993 | 1742 if branch_merge: |
1743 self.dirstate.update(remove, 'r') | |
1744 else: | |
588 | 1745 self.dirstate.forget(remove) |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1746 |
1495
1e265c2bec94
Deal with merge abort more gracefully
Matt Mackall <mpm@selenic.com>
parents:
1493
diff
changeset
|
1747 if moddirstate: |
1e265c2bec94
Deal with merge abort more gracefully
Matt Mackall <mpm@selenic.com>
parents:
1493
diff
changeset
|
1748 self.dirstate.setparents(p1, p2) |
1922
6d50d6189269
ui: output the number of file updated/merged/removed/... on update
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1893
diff
changeset
|
1749 |
6d50d6189269
ui: output the number of file updated/merged/removed/... on update
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1893
diff
changeset
|
1750 stat = ((len(get), _("updated")), |
6d50d6189269
ui: output the number of file updated/merged/removed/... on update
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1893
diff
changeset
|
1751 (len(merge) - len(failedmerge), _("merged")), |
6d50d6189269
ui: output the number of file updated/merged/removed/... on update
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1893
diff
changeset
|
1752 (len(remove), _("removed")), |
6d50d6189269
ui: output the number of file updated/merged/removed/... on update
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1893
diff
changeset
|
1753 (len(failedmerge), _("unresolved"))) |
6d50d6189269
ui: output the number of file updated/merged/removed/... on update
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1893
diff
changeset
|
1754 note = ", ".join([_("%d files %s") % s for s in stat]) |
6d50d6189269
ui: output the number of file updated/merged/removed/... on update
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1893
diff
changeset
|
1755 self.ui.note("%s\n" % note) |
6d50d6189269
ui: output the number of file updated/merged/removed/... on update
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1893
diff
changeset
|
1756 if moddirstate and branch_merge: |
6d50d6189269
ui: output the number of file updated/merged/removed/... on update
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1893
diff
changeset
|
1757 self.ui.note(_("(branch merge, don't forget to commit)\n")) |
6d50d6189269
ui: output the number of file updated/merged/removed/... on update
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1893
diff
changeset
|
1758 |
1663
d529cdc0a3ee
return a non-zero exit code when a merge failed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1645
diff
changeset
|
1759 return err |
1495
1e265c2bec94
Deal with merge abort more gracefully
Matt Mackall <mpm@selenic.com>
parents:
1493
diff
changeset
|
1760 |
1883
b98160cfb2f3
give more info to hgmerge script.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1882
diff
changeset
|
1761 def merge3(self, fn, my, other, p1, p2): |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1762 """perform a 3-way merge in the working directory""" |
249 | 1763 |
96 | 1764 def temp(prefix, node): |
1765 pre = "%s~%s." % (os.path.basename(fn), prefix) | |
1766 (fd, name) = tempfile.mkstemp("", pre) | |
417 | 1767 f = os.fdopen(fd, "wb") |
1019
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
1768 self.wwrite(fn, fl.read(node), f) |
96 | 1769 f.close() |
1770 return name | |
1771 | |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1772 fl = self.file(fn) |
96 | 1773 base = fl.ancestor(my, other) |
244 | 1774 a = self.wjoin(fn) |
346 | 1775 b = temp("base", base) |
1776 c = temp("other", other) | |
96 | 1777 |
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
|
1778 self.ui.note(_("resolving %s\n") % fn) |
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
|
1779 self.ui.debug(_("file %s: my %s other %s ancestor %s\n") % |
1349
c6295d2a361e
More info on file merge for update --debug
Matt Mackall <mpm@selenic.com>
parents:
1346
diff
changeset
|
1780 (fn, short(my), short(other), short(base))) |
96 | 1781 |
703
fb6f85ecc863
merge program setting from hgrc wasn't used.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
691
diff
changeset
|
1782 cmd = (os.environ.get("HGMERGE") or self.ui.config("ui", "merge") |
fb6f85ecc863
merge program setting from hgrc wasn't used.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
691
diff
changeset
|
1783 or "hgmerge") |
1885
c4d577262d00
run merge program in repo root.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1883
diff
changeset
|
1784 r = util.system('%s "%s" "%s" "%s"' % (cmd, a, b, c), cwd=self.root, |
c4d577262d00
run merge program in repo root.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1883
diff
changeset
|
1785 environ={'HG_FILE': fn, |
1883
b98160cfb2f3
give more info to hgmerge script.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1882
diff
changeset
|
1786 'HG_MY_NODE': p1, |
b98160cfb2f3
give more info to hgmerge script.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1882
diff
changeset
|
1787 'HG_OTHER_NODE': p2, |
b98160cfb2f3
give more info to hgmerge script.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1882
diff
changeset
|
1788 'HG_FILE_MY_NODE': hex(my), |
b98160cfb2f3
give more info to hgmerge script.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1882
diff
changeset
|
1789 'HG_FILE_OTHER_NODE': hex(other), |
b98160cfb2f3
give more info to hgmerge script.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1882
diff
changeset
|
1790 'HG_FILE_BASE_NODE': hex(base)}) |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1791 if r: |
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
|
1792 self.ui.warn(_("merging %s failed!\n") % fn) |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1793 |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1794 os.unlink(b) |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1795 os.unlink(c) |
1663
d529cdc0a3ee
return a non-zero exit code when a merge failed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1645
diff
changeset
|
1796 return r |
96 | 1797 |
247 | 1798 def verify(self): |
1799 filelinkrevs = {} | |
1800 filenodes = {} | |
1801 changesets = revisions = files = 0 | |
1383
3d6d45faf8b2
hg verify: add an error reporting helper function
Matt Mackall <mpm@selenic.com>
parents:
1382
diff
changeset
|
1802 errors = [0] |
1382
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
1803 neededmanifests = {} |
247 | 1804 |
1383
3d6d45faf8b2
hg verify: add an error reporting helper function
Matt Mackall <mpm@selenic.com>
parents:
1382
diff
changeset
|
1805 def err(msg): |
3d6d45faf8b2
hg verify: add an error reporting helper function
Matt Mackall <mpm@selenic.com>
parents:
1382
diff
changeset
|
1806 self.ui.warn(msg + "\n") |
3d6d45faf8b2
hg verify: add an error reporting helper function
Matt Mackall <mpm@selenic.com>
parents:
1382
diff
changeset
|
1807 errors[0] += 1 |
3d6d45faf8b2
hg verify: add an error reporting helper function
Matt Mackall <mpm@selenic.com>
parents:
1382
diff
changeset
|
1808 |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1663
diff
changeset
|
1809 def checksize(obj, name): |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1663
diff
changeset
|
1810 d = obj.checksize() |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1663
diff
changeset
|
1811 if d[0]: |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1663
diff
changeset
|
1812 err(_("%s data length off by %d bytes") % (name, d[0])) |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1663
diff
changeset
|
1813 if d[1]: |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1663
diff
changeset
|
1814 err(_("%s index contains %d extra bytes") % (name, d[1])) |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1663
diff
changeset
|
1815 |
302 | 1816 seen = {} |
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
|
1817 self.ui.status(_("checking changesets\n")) |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1663
diff
changeset
|
1818 checksize(self.changelog, "changelog") |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1663
diff
changeset
|
1819 |
247 | 1820 for i in range(self.changelog.count()): |
1821 changesets += 1 | |
1822 n = self.changelog.node(i) | |
1382
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
1823 l = self.changelog.linkrev(n) |
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
1824 if l != i: |
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
|
1825 err(_("incorrect link (%d) for changeset revision %d") %(l, i)) |
302 | 1826 if n in seen: |
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
|
1827 err(_("duplicate changeset at revision %d") % i) |
302 | 1828 seen[n] = 1 |
515 | 1829 |
247 | 1830 for p in self.changelog.parents(n): |
1831 if p not in self.changelog.nodemap: | |
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
|
1832 err(_("changeset %s has unknown parent %s") % |
247 | 1833 (short(n), short(p))) |
1834 try: | |
1835 changes = self.changelog.read(n) | |
1492
5f0522d31967
Allow interrupting all parts of verify
Matt Mackall <mpm@selenic.com>
parents:
1480
diff
changeset
|
1836 except KeyboardInterrupt: |
5f0522d31967
Allow interrupting all parts of verify
Matt Mackall <mpm@selenic.com>
parents:
1480
diff
changeset
|
1837 self.ui.warn(_("interrupted")) |
5f0522d31967
Allow interrupting all parts of verify
Matt Mackall <mpm@selenic.com>
parents:
1480
diff
changeset
|
1838 raise |
247 | 1839 except Exception, inst: |
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
|
1840 err(_("unpacking changeset %s: %s") % (short(n), inst)) |
1853
5ac811b720de
Fix some problems when working on broken repositories:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1839
diff
changeset
|
1841 continue |
247 | 1842 |
1382
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
1843 neededmanifests[changes[0]] = n |
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
1844 |
247 | 1845 for f in changes[3]: |
1846 filelinkrevs.setdefault(f, []).append(i) | |
1847 | |
302 | 1848 seen = {} |
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
|
1849 self.ui.status(_("checking manifests\n")) |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1663
diff
changeset
|
1850 checksize(self.manifest, "manifest") |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1663
diff
changeset
|
1851 |
247 | 1852 for i in range(self.manifest.count()): |
1853 n = self.manifest.node(i) | |
1382
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
1854 l = self.manifest.linkrev(n) |
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
1855 |
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
1856 if l < 0 or l >= self.changelog.count(): |
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
|
1857 err(_("bad manifest link (%d) at revision %d") % (l, i)) |
1382
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
1858 |
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
1859 if n in neededmanifests: |
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
1860 del neededmanifests[n] |
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
1861 |
302 | 1862 if n in seen: |
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
|
1863 err(_("duplicate manifest at revision %d") % i) |
1383
3d6d45faf8b2
hg verify: add an error reporting helper function
Matt Mackall <mpm@selenic.com>
parents:
1382
diff
changeset
|
1864 |
302 | 1865 seen[n] = 1 |
515 | 1866 |
247 | 1867 for p in self.manifest.parents(n): |
1868 if p not in self.manifest.nodemap: | |
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
|
1869 err(_("manifest %s has unknown parent %s") % |
1383
3d6d45faf8b2
hg verify: add an error reporting helper function
Matt Mackall <mpm@selenic.com>
parents:
1382
diff
changeset
|
1870 (short(n), short(p))) |
247 | 1871 |
1872 try: | |
1873 delta = mdiff.patchtext(self.manifest.delta(n)) | |
1874 except KeyboardInterrupt: | |
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
|
1875 self.ui.warn(_("interrupted")) |
1097 | 1876 raise |
247 | 1877 except Exception, inst: |
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
|
1878 err(_("unpacking manifest %s: %s") % (short(n), inst)) |
1853
5ac811b720de
Fix some problems when working on broken repositories:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1839
diff
changeset
|
1879 continue |
247 | 1880 |
1853
5ac811b720de
Fix some problems when working on broken repositories:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1839
diff
changeset
|
1881 try: |
5ac811b720de
Fix some problems when working on broken repositories:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1839
diff
changeset
|
1882 ff = [ l.split('\0') for l in delta.splitlines() ] |
5ac811b720de
Fix some problems when working on broken repositories:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1839
diff
changeset
|
1883 for f, fn in ff: |
5ac811b720de
Fix some problems when working on broken repositories:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1839
diff
changeset
|
1884 filenodes.setdefault(f, {})[bin(fn[:40])] = 1 |
5ac811b720de
Fix some problems when working on broken repositories:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1839
diff
changeset
|
1885 except (ValueError, TypeError), inst: |
5ac811b720de
Fix some problems when working on broken repositories:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1839
diff
changeset
|
1886 err(_("broken delta in manifest %s: %s") % (short(n), inst)) |
247 | 1887 |
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
|
1888 self.ui.status(_("crosschecking files in changesets and manifests\n")) |
1382
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
1889 |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1890 for m, c in neededmanifests.items(): |
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
|
1891 err(_("Changeset %s refers to unknown manifest %s") % |
1384
d729850d52fa
hg verify: add some bin to hex conversions
Matt Mackall <mpm@selenic.com>
parents:
1383
diff
changeset
|
1892 (short(m), short(c))) |
1382
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
1893 del neededmanifests |
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
1894 |
247 | 1895 for f in filenodes: |
1896 if f not in filelinkrevs: | |
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
|
1897 err(_("file %s in manifest but not in changesets") % f) |
247 | 1898 |
1899 for f in filelinkrevs: | |
1900 if f not in filenodes: | |
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
|
1901 err(_("file %s in changeset but not in manifest") % f) |
247 | 1902 |
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
|
1903 self.ui.status(_("checking files\n")) |
247 | 1904 ff = filenodes.keys() |
1905 ff.sort() | |
1906 for f in ff: | |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1907 if f == "/dev/null": |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1908 continue |
247 | 1909 files += 1 |
1853
5ac811b720de
Fix some problems when working on broken repositories:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1839
diff
changeset
|
1910 if not f: |
5ac811b720de
Fix some problems when working on broken repositories:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1839
diff
changeset
|
1911 err(_("file without name in manifest %s") % short(n)) |
5ac811b720de
Fix some problems when working on broken repositories:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1839
diff
changeset
|
1912 continue |
247 | 1913 fl = self.file(f) |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1663
diff
changeset
|
1914 checksize(fl, f) |
1493
1a216cb4ee64
verify: add check for mismatch of index and data length
Matt Mackall <mpm@selenic.com>
parents:
1492
diff
changeset
|
1915 |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1916 nodes = {nullid: 1} |
302 | 1917 seen = {} |
247 | 1918 for i in range(fl.count()): |
1919 revisions += 1 | |
1920 n = fl.node(i) | |
1921 | |
302 | 1922 if n in seen: |
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
|
1923 err(_("%s: duplicate revision %d") % (f, i)) |
247 | 1924 if n not in filenodes[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
|
1925 err(_("%s: %d:%s not in manifests") % (f, i, short(n))) |
247 | 1926 else: |
1927 del filenodes[f][n] | |
1928 | |
1929 flr = fl.linkrev(n) | |
1853
5ac811b720de
Fix some problems when working on broken repositories:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1839
diff
changeset
|
1930 if flr not in filelinkrevs.get(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
|
1931 err(_("%s:%s points to unexpected changeset %d") |
1383
3d6d45faf8b2
hg verify: add an error reporting helper function
Matt Mackall <mpm@selenic.com>
parents:
1382
diff
changeset
|
1932 % (f, short(n), flr)) |
247 | 1933 else: |
1934 filelinkrevs[f].remove(flr) | |
1935 | |
1936 # verify contents | |
1937 try: | |
1938 t = fl.read(n) | |
1492
5f0522d31967
Allow interrupting all parts of verify
Matt Mackall <mpm@selenic.com>
parents:
1480
diff
changeset
|
1939 except KeyboardInterrupt: |
5f0522d31967
Allow interrupting all parts of verify
Matt Mackall <mpm@selenic.com>
parents:
1480
diff
changeset
|
1940 self.ui.warn(_("interrupted")) |
5f0522d31967
Allow interrupting all parts of verify
Matt Mackall <mpm@selenic.com>
parents:
1480
diff
changeset
|
1941 raise |
247 | 1942 except Exception, inst: |
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
|
1943 err(_("unpacking file %s %s: %s") % (f, short(n), inst)) |
247 | 1944 |
1945 # verify parents | |
1946 (p1, p2) = fl.parents(n) | |
1947 if p1 not in nodes: | |
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
|
1948 err(_("file %s:%s unknown parent 1 %s") % |
1383
3d6d45faf8b2
hg verify: add an error reporting helper function
Matt Mackall <mpm@selenic.com>
parents:
1382
diff
changeset
|
1949 (f, short(n), short(p1))) |
247 | 1950 if p2 not in nodes: |
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
|
1951 err(_("file %s:%s unknown parent 2 %s") % |
247 | 1952 (f, short(n), short(p1))) |
1953 nodes[n] = 1 | |
1954 | |
1955 # cross-check | |
1956 for node in filenodes[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
|
1957 err(_("node %s in manifests not in %s") % (hex(node), f)) |
247 | 1958 |
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
|
1959 self.ui.status(_("%d files, %d changesets, %d total revisions\n") % |
247 | 1960 (files, changesets, revisions)) |
1961 | |
1383
3d6d45faf8b2
hg verify: add an error reporting helper function
Matt Mackall <mpm@selenic.com>
parents:
1382
diff
changeset
|
1962 if errors[0]: |
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
|
1963 self.ui.warn(_("%d integrity errors encountered!\n") % errors[0]) |
247 | 1964 return 1 |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
1965 |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
1966 # used to avoid circular references so destructors work |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
1967 def aftertrans(base): |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
1968 p = base |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
1969 def a(): |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
1970 util.rename(os.path.join(p, "journal"), os.path.join(p, "undo")) |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
1971 util.rename(os.path.join(p, "journal.dirstate"), |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
1972 os.path.join(p, "undo.dirstate")) |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
1973 return a |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
1974 |