##// END OF EJS Templates
issue 1144: prevent traceback on verify of bundles
John Mulligan -
r7141:8d1bdaf8 default
parent child Browse files
Show More
@@ -1,235 +1,238 b''
1 # verify.py - repository integrity checking for Mercurial
1 # verify.py - repository integrity checking for Mercurial
2 #
2 #
3 # Copyright 2006, 2007 Matt Mackall <mpm@selenic.com>
3 # Copyright 2006, 2007 Matt Mackall <mpm@selenic.com>
4 #
4 #
5 # This software may be used and distributed according to the terms
5 # This software may be used and distributed according to the terms
6 # of the GNU General Public License, incorporated herein by reference.
6 # of the GNU General Public License, incorporated herein by reference.
7
7
8 from node import nullid, short
8 from node import nullid, short
9 from i18n import _
9 from i18n import _
10 import revlog, util
10 import revlog, util
11
11
12 def verify(repo):
12 def verify(repo):
13 lock = repo.lock()
13 lock = repo.lock()
14 try:
14 try:
15 return _verify(repo)
15 return _verify(repo)
16 finally:
16 finally:
17 del lock
17 del lock
18
18
19 def _verify(repo):
19 def _verify(repo):
20 mflinkrevs = {}
20 mflinkrevs = {}
21 filelinkrevs = {}
21 filelinkrevs = {}
22 filenodes = {}
22 filenodes = {}
23 revisions = 0
23 revisions = 0
24 badrevs = {}
24 badrevs = {}
25 errors = [0]
25 errors = [0]
26 warnings = [0]
26 warnings = [0]
27 ui = repo.ui
27 ui = repo.ui
28 cl = repo.changelog
28 cl = repo.changelog
29 mf = repo.manifest
29 mf = repo.manifest
30
30
31 if not repo.cancopy():
32 raise util.Abort(_("cannot verify bundle or remote repos"))
33
31 def err(linkrev, msg, filename=None):
34 def err(linkrev, msg, filename=None):
32 if linkrev != None:
35 if linkrev != None:
33 badrevs[linkrev] = True
36 badrevs[linkrev] = True
34 else:
37 else:
35 linkrev = '?'
38 linkrev = '?'
36 msg = "%s: %s" % (linkrev, msg)
39 msg = "%s: %s" % (linkrev, msg)
37 if filename:
40 if filename:
38 msg = "%s@%s" % (filename, msg)
41 msg = "%s@%s" % (filename, msg)
39 ui.warn(" " + msg + "\n")
42 ui.warn(" " + msg + "\n")
40 errors[0] += 1
43 errors[0] += 1
41
44
42 def exc(linkrev, msg, inst, filename=None):
45 def exc(linkrev, msg, inst, filename=None):
43 if isinstance(inst, KeyboardInterrupt):
46 if isinstance(inst, KeyboardInterrupt):
44 ui.warn(_("interrupted"))
47 ui.warn(_("interrupted"))
45 raise
48 raise
46 err(linkrev, "%s: %s" % (msg, inst), filename)
49 err(linkrev, "%s: %s" % (msg, inst), filename)
47
50
48 def warn(msg):
51 def warn(msg):
49 ui.warn(msg + "\n")
52 ui.warn(msg + "\n")
50 warnings[0] += 1
53 warnings[0] += 1
51
54
52 def checklog(obj, name):
55 def checklog(obj, name):
53 if not len(obj) and (havecl or havemf):
56 if not len(obj) and (havecl or havemf):
54 err(0, _("empty or missing %s") % name)
57 err(0, _("empty or missing %s") % name)
55 return
58 return
56
59
57 d = obj.checksize()
60 d = obj.checksize()
58 if d[0]:
61 if d[0]:
59 err(None, _("data length off by %d bytes") % d[0], name)
62 err(None, _("data length off by %d bytes") % d[0], name)
60 if d[1]:
63 if d[1]:
61 err(None, _("index contains %d extra bytes") % d[1], name)
64 err(None, _("index contains %d extra bytes") % d[1], name)
62
65
63 if obj.version != revlog.REVLOGV0:
66 if obj.version != revlog.REVLOGV0:
64 if not revlogv1:
67 if not revlogv1:
65 warn(_("warning: `%s' uses revlog format 1") % name)
68 warn(_("warning: `%s' uses revlog format 1") % name)
66 elif revlogv1:
69 elif revlogv1:
67 warn(_("warning: `%s' uses revlog format 0") % name)
70 warn(_("warning: `%s' uses revlog format 0") % name)
68
71
69 def checkentry(obj, i, node, seen, linkrevs, f):
72 def checkentry(obj, i, node, seen, linkrevs, f):
70 lr = obj.linkrev(node)
73 lr = obj.linkrev(node)
71 if lr < 0 or (havecl and lr not in linkrevs):
74 if lr < 0 or (havecl and lr not in linkrevs):
72 t = "unexpected"
75 t = "unexpected"
73 if lr < 0 or lr >= len(cl):
76 if lr < 0 or lr >= len(cl):
74 t = "nonexistent"
77 t = "nonexistent"
75 err(None, _("rev %d point to %s changeset %d") % (i, t, lr), f)
78 err(None, _("rev %d point to %s changeset %d") % (i, t, lr), f)
76 if linkrevs:
79 if linkrevs:
77 warn(_(" (expected %s)") % " ".join(map(str,linkrevs)))
80 warn(_(" (expected %s)") % " ".join(map(str,linkrevs)))
78 lr = None # can't be trusted
81 lr = None # can't be trusted
79
82
80 try:
83 try:
81 p1, p2 = obj.parents(node)
84 p1, p2 = obj.parents(node)
82 if p1 not in seen and p1 != nullid:
85 if p1 not in seen and p1 != nullid:
83 err(lr, _("unknown parent 1 %s of %s") %
86 err(lr, _("unknown parent 1 %s of %s") %
84 (short(p1), short(n)), f)
87 (short(p1), short(n)), f)
85 if p2 not in seen and p2 != nullid:
88 if p2 not in seen and p2 != nullid:
86 err(lr, _("unknown parent 2 %s of %s") %
89 err(lr, _("unknown parent 2 %s of %s") %
87 (short(p2), short(p1)), f)
90 (short(p2), short(p1)), f)
88 except Exception, inst:
91 except Exception, inst:
89 exc(lr, _("checking parents of %s") % short(node), inst, f)
92 exc(lr, _("checking parents of %s") % short(node), inst, f)
90
93
91 if node in seen:
94 if node in seen:
92 err(lr, _("duplicate revision %d (%d)") % (i, seen[n]), f)
95 err(lr, _("duplicate revision %d (%d)") % (i, seen[n]), f)
93 seen[n] = i
96 seen[n] = i
94 return lr
97 return lr
95
98
96 revlogv1 = cl.version != revlog.REVLOGV0
99 revlogv1 = cl.version != revlog.REVLOGV0
97 if ui.verbose or not revlogv1:
100 if ui.verbose or not revlogv1:
98 ui.status(_("repository uses revlog format %d\n") %
101 ui.status(_("repository uses revlog format %d\n") %
99 (revlogv1 and 1 or 0))
102 (revlogv1 and 1 or 0))
100
103
101 havecl = len(cl) > 0
104 havecl = len(cl) > 0
102 havemf = len(mf) > 0
105 havemf = len(mf) > 0
103
106
104 ui.status(_("checking changesets\n"))
107 ui.status(_("checking changesets\n"))
105 seen = {}
108 seen = {}
106 checklog(cl, "changelog")
109 checklog(cl, "changelog")
107 for i in repo:
110 for i in repo:
108 n = cl.node(i)
111 n = cl.node(i)
109 checkentry(cl, i, n, seen, [i], "changelog")
112 checkentry(cl, i, n, seen, [i], "changelog")
110
113
111 try:
114 try:
112 changes = cl.read(n)
115 changes = cl.read(n)
113 mflinkrevs.setdefault(changes[0], []).append(i)
116 mflinkrevs.setdefault(changes[0], []).append(i)
114 for f in changes[3]:
117 for f in changes[3]:
115 filelinkrevs.setdefault(f, []).append(i)
118 filelinkrevs.setdefault(f, []).append(i)
116 except Exception, inst:
119 except Exception, inst:
117 exc(i, _("unpacking changeset %s") % short(n), inst)
120 exc(i, _("unpacking changeset %s") % short(n), inst)
118
121
119 ui.status(_("checking manifests\n"))
122 ui.status(_("checking manifests\n"))
120 seen = {}
123 seen = {}
121 checklog(mf, "manifest")
124 checklog(mf, "manifest")
122 for i in mf:
125 for i in mf:
123 n = mf.node(i)
126 n = mf.node(i)
124 lr = checkentry(mf, i, n, seen, mflinkrevs.get(n, []), "manifest")
127 lr = checkentry(mf, i, n, seen, mflinkrevs.get(n, []), "manifest")
125 if n in mflinkrevs:
128 if n in mflinkrevs:
126 del mflinkrevs[n]
129 del mflinkrevs[n]
127
130
128 try:
131 try:
129 for f, fn in mf.readdelta(n).iteritems():
132 for f, fn in mf.readdelta(n).iteritems():
130 if not f:
133 if not f:
131 err(lr, _("file without name in manifest"))
134 err(lr, _("file without name in manifest"))
132 elif f != "/dev/null":
135 elif f != "/dev/null":
133 fns = filenodes.setdefault(f, {})
136 fns = filenodes.setdefault(f, {})
134 if fn not in fns:
137 if fn not in fns:
135 fns[fn] = n
138 fns[fn] = n
136 except Exception, inst:
139 except Exception, inst:
137 exc(lr, _("reading manifest delta %s") % short(n), inst)
140 exc(lr, _("reading manifest delta %s") % short(n), inst)
138
141
139 ui.status(_("crosschecking files in changesets and manifests\n"))
142 ui.status(_("crosschecking files in changesets and manifests\n"))
140
143
141 if havemf:
144 if havemf:
142 for c, m in util.sort([(c, m) for m in mflinkrevs for c in mflinkrevs[m]]):
145 for c, m in util.sort([(c, m) for m in mflinkrevs for c in mflinkrevs[m]]):
143 err(c, _("changeset refers to unknown manifest %s") % short(m))
146 err(c, _("changeset refers to unknown manifest %s") % short(m))
144 del mflinkrevs
147 del mflinkrevs
145
148
146 for f in util.sort(filelinkrevs):
149 for f in util.sort(filelinkrevs):
147 if f not in filenodes:
150 if f not in filenodes:
148 lr = filelinkrevs[f][0]
151 lr = filelinkrevs[f][0]
149 err(lr, _("in changeset but not in manifest"), f)
152 err(lr, _("in changeset but not in manifest"), f)
150
153
151 if havecl:
154 if havecl:
152 for f in util.sort(filenodes):
155 for f in util.sort(filenodes):
153 if f not in filelinkrevs:
156 if f not in filelinkrevs:
154 try:
157 try:
155 lr = min([repo.file(f).linkrev(n) for n in filenodes[f]])
158 lr = min([repo.file(f).linkrev(n) for n in filenodes[f]])
156 except:
159 except:
157 lr = None
160 lr = None
158 err(lr, _("in manifest but not in changeset"), f)
161 err(lr, _("in manifest but not in changeset"), f)
159
162
160 ui.status(_("checking files\n"))
163 ui.status(_("checking files\n"))
161
164
162 storefiles = {}
165 storefiles = {}
163 for f, f2, size in repo.store.datafiles():
166 for f, f2, size in repo.store.datafiles():
164 if not f:
167 if not f:
165 err(None, _("cannot decode filename '%s'") % f2)
168 err(None, _("cannot decode filename '%s'") % f2)
166 elif size > 0:
169 elif size > 0:
167 storefiles[f] = True
170 storefiles[f] = True
168
171
169 files = util.sort(util.unique(filenodes.keys() + filelinkrevs.keys()))
172 files = util.sort(util.unique(filenodes.keys() + filelinkrevs.keys()))
170 for f in files:
173 for f in files:
171 fl = repo.file(f)
174 fl = repo.file(f)
172
175
173 for ff in fl.files():
176 for ff in fl.files():
174 try:
177 try:
175 del storefiles[ff]
178 del storefiles[ff]
176 except KeyError:
179 except KeyError:
177 err(0, _("missing revlog!"), ff)
180 err(0, _("missing revlog!"), ff)
178
181
179 checklog(fl, f)
182 checklog(fl, f)
180 seen = {}
183 seen = {}
181 for i in fl:
184 for i in fl:
182 revisions += 1
185 revisions += 1
183 n = fl.node(i)
186 n = fl.node(i)
184 lr = checkentry(fl, i, n, seen, filelinkrevs.get(f, []), f)
187 lr = checkentry(fl, i, n, seen, filelinkrevs.get(f, []), f)
185 if f in filenodes:
188 if f in filenodes:
186 if havemf and n not in filenodes[f]:
189 if havemf and n not in filenodes[f]:
187 err(lr, _("%s not in manifests") % (short(n)), f)
190 err(lr, _("%s not in manifests") % (short(n)), f)
188 else:
191 else:
189 del filenodes[f][n]
192 del filenodes[f][n]
190
193
191 # verify contents
194 # verify contents
192 try:
195 try:
193 t = fl.read(n)
196 t = fl.read(n)
194 rp = fl.renamed(n)
197 rp = fl.renamed(n)
195 if len(t) != fl.size(i):
198 if len(t) != fl.size(i):
196 if not fl._readmeta(n): # ancient copy?
199 if not fl._readmeta(n): # ancient copy?
197 err(lr, _("unpacked size is %s, %s expected") %
200 err(lr, _("unpacked size is %s, %s expected") %
198 (len(t), fl.size(i)), f)
201 (len(t), fl.size(i)), f)
199 except Exception, inst:
202 except Exception, inst:
200 exc(lr, _("unpacking %s") % short(n), inst, f)
203 exc(lr, _("unpacking %s") % short(n), inst, f)
201
204
202 # check renames
205 # check renames
203 try:
206 try:
204 if rp:
207 if rp:
205 fl2 = repo.file(rp[0])
208 fl2 = repo.file(rp[0])
206 if not len(fl2):
209 if not len(fl2):
207 err(lr, _("empty or missing copy source revlog %s:%s")
210 err(lr, _("empty or missing copy source revlog %s:%s")
208 % (rp[0], short(rp[1])), f)
211 % (rp[0], short(rp[1])), f)
209 elif rp[1] == nullid:
212 elif rp[1] == nullid:
210 warn(_("warning: %s@%s: copy source revision is nullid %s:%s")
213 warn(_("warning: %s@%s: copy source revision is nullid %s:%s")
211 % (f, lr, rp[0], short(rp[1])))
214 % (f, lr, rp[0], short(rp[1])))
212 else:
215 else:
213 rev = fl2.rev(rp[1])
216 rev = fl2.rev(rp[1])
214 except Exception, inst:
217 except Exception, inst:
215 exc(lr, _("checking rename of %s") % short(n), inst, f)
218 exc(lr, _("checking rename of %s") % short(n), inst, f)
216
219
217 # cross-check
220 # cross-check
218 if f in filenodes:
221 if f in filenodes:
219 fns = [(mf.linkrev(l), n) for n,l in filenodes[f].items()]
222 fns = [(mf.linkrev(l), n) for n,l in filenodes[f].items()]
220 for lr, node in util.sort(fns):
223 for lr, node in util.sort(fns):
221 err(lr, _("%s in manifests not found") % short(node), f)
224 err(lr, _("%s in manifests not found") % short(node), f)
222
225
223 for f in storefiles:
226 for f in storefiles:
224 warn(_("warning: orphan revlog '%s'") % f)
227 warn(_("warning: orphan revlog '%s'") % f)
225
228
226 ui.status(_("%d files, %d changesets, %d total revisions\n") %
229 ui.status(_("%d files, %d changesets, %d total revisions\n") %
227 (len(files), len(cl), revisions))
230 (len(files), len(cl), revisions))
228 if warnings[0]:
231 if warnings[0]:
229 ui.warn(_("%d warnings encountered!\n") % warnings[0])
232 ui.warn(_("%d warnings encountered!\n") % warnings[0])
230 if errors[0]:
233 if errors[0]:
231 ui.warn(_("%d integrity errors encountered!\n") % errors[0])
234 ui.warn(_("%d integrity errors encountered!\n") % errors[0])
232 if badrevs:
235 if badrevs:
233 ui.warn(_("(first damaged changeset appears to be %d)\n")
236 ui.warn(_("(first damaged changeset appears to be %d)\n")
234 % min(badrevs))
237 % min(badrevs))
235 return 1
238 return 1
@@ -1,131 +1,142 b''
1 #!/bin/sh
1 #!/bin/sh
2
2
3 cp "$TESTDIR"/printenv.py .
3 cp "$TESTDIR"/printenv.py .
4
4
5 echo "====== Setting up test"
5 echo "====== Setting up test"
6 hg init test
6 hg init test
7 cd test
7 cd test
8 echo 0 > afile
8 echo 0 > afile
9 hg add afile
9 hg add afile
10 hg commit -m "0.0" -d "1000000 0"
10 hg commit -m "0.0" -d "1000000 0"
11 echo 1 >> afile
11 echo 1 >> afile
12 hg commit -m "0.1" -d "1000000 0"
12 hg commit -m "0.1" -d "1000000 0"
13 echo 2 >> afile
13 echo 2 >> afile
14 hg commit -m "0.2" -d "1000000 0"
14 hg commit -m "0.2" -d "1000000 0"
15 echo 3 >> afile
15 echo 3 >> afile
16 hg commit -m "0.3" -d "1000000 0"
16 hg commit -m "0.3" -d "1000000 0"
17 hg update -C 0
17 hg update -C 0
18 echo 1 >> afile
18 echo 1 >> afile
19 hg commit -m "1.1" -d "1000000 0"
19 hg commit -m "1.1" -d "1000000 0"
20 echo 2 >> afile
20 echo 2 >> afile
21 hg commit -m "1.2" -d "1000000 0"
21 hg commit -m "1.2" -d "1000000 0"
22 echo "a line" > fred
22 echo "a line" > fred
23 echo 3 >> afile
23 echo 3 >> afile
24 hg add fred
24 hg add fred
25 hg commit -m "1.3" -d "1000000 0"
25 hg commit -m "1.3" -d "1000000 0"
26 hg mv afile adifferentfile
26 hg mv afile adifferentfile
27 hg commit -m "1.3m" -d "1000000 0"
27 hg commit -m "1.3m" -d "1000000 0"
28 hg update -C 3
28 hg update -C 3
29 hg mv afile anotherfile
29 hg mv afile anotherfile
30 hg commit -m "0.3m" -d "1000000 0"
30 hg commit -m "0.3m" -d "1000000 0"
31 hg verify
31 hg verify
32 cd ..
32 cd ..
33 hg init empty
33 hg init empty
34
34
35 echo "====== Bundle --all"
35 echo "====== Bundle --all"
36 hg -R test bundle --all all.hg
36 hg -R test bundle --all all.hg
37 echo "====== Bundle test to full.hg"
37 echo "====== Bundle test to full.hg"
38 hg -R test bundle full.hg empty
38 hg -R test bundle full.hg empty
39 echo "====== Unbundle full.hg in test"
39 echo "====== Unbundle full.hg in test"
40 hg -R test unbundle full.hg
40 hg -R test unbundle full.hg
41 echo "====== Verify empty"
41 echo "====== Verify empty"
42 hg -R empty heads
42 hg -R empty heads
43 hg -R empty verify
43 hg -R empty verify
44
44
45 echo "====== Pull full.hg into test (using --cwd)"
45 echo "====== Pull full.hg into test (using --cwd)"
46 hg --cwd test pull ../full.hg
46 hg --cwd test pull ../full.hg
47 echo "====== Pull full.hg into empty (using --cwd)"
47 echo "====== Pull full.hg into empty (using --cwd)"
48 hg --cwd empty pull ../full.hg
48 hg --cwd empty pull ../full.hg
49 echo "====== Rollback empty"
49 echo "====== Rollback empty"
50 hg -R empty rollback
50 hg -R empty rollback
51 echo "====== Pull full.hg into empty again (using --cwd)"
51 echo "====== Pull full.hg into empty again (using --cwd)"
52 hg --cwd empty pull ../full.hg
52 hg --cwd empty pull ../full.hg
53
53
54 echo "====== Pull full.hg into test (using -R)"
54 echo "====== Pull full.hg into test (using -R)"
55 hg -R test pull full.hg
55 hg -R test pull full.hg
56 echo "====== Pull full.hg into empty (using -R)"
56 echo "====== Pull full.hg into empty (using -R)"
57 hg -R empty pull full.hg
57 hg -R empty pull full.hg
58 echo "====== Rollback empty"
58 echo "====== Rollback empty"
59 hg -R empty rollback
59 hg -R empty rollback
60 echo "====== Pull full.hg into empty again (using -R)"
60 echo "====== Pull full.hg into empty again (using -R)"
61 hg -R empty pull full.hg
61 hg -R empty pull full.hg
62
62
63 echo "====== Log -R full.hg in fresh empty"
63 echo "====== Log -R full.hg in fresh empty"
64 rm -r empty
64 rm -r empty
65 hg init empty
65 hg init empty
66 cd empty
66 cd empty
67 hg -R bundle://../full.hg log
67 hg -R bundle://../full.hg log
68
68
69 echo "====== Pull ../full.hg into empty (with hook)"
69 echo "====== Pull ../full.hg into empty (with hook)"
70 echo '[hooks]' >> .hg/hgrc
70 echo '[hooks]' >> .hg/hgrc
71 echo 'changegroup = python ../printenv.py changegroup' >> .hg/hgrc
71 echo 'changegroup = python ../printenv.py changegroup' >> .hg/hgrc
72 #doesn't work (yet ?)
72 #doesn't work (yet ?)
73 #hg -R bundle://../full.hg verify
73 #hg -R bundle://../full.hg verify
74 hg pull bundle://../full.hg
74 hg pull bundle://../full.hg
75 echo "====== Rollback empty"
75 echo "====== Rollback empty"
76 hg rollback
76 hg rollback
77 cd ..
77 cd ..
78 echo "====== Log -R bundle:empty+full.hg"
78 echo "====== Log -R bundle:empty+full.hg"
79 hg -R bundle:empty+full.hg log --template="{rev} "
79 hg -R bundle:empty+full.hg log --template="{rev} "
80 echo ""
80 echo ""
81 echo "====== Pull full.hg into empty again (using -R; with hook)"
81 echo "====== Pull full.hg into empty again (using -R; with hook)"
82 hg -R empty pull full.hg
82 hg -R empty pull full.hg
83
83
84 echo "====== Create partial clones"
84 echo "====== Create partial clones"
85 rm -r empty
85 rm -r empty
86 hg init empty
86 hg init empty
87 hg clone -r 3 test partial
87 hg clone -r 3 test partial
88 hg clone partial partial2
88 hg clone partial partial2
89 cd partial
89 cd partial
90 echo "====== Log -R full.hg in partial"
90 echo "====== Log -R full.hg in partial"
91 hg -R bundle://../full.hg log
91 hg -R bundle://../full.hg log
92 echo "====== Incoming full.hg in partial"
92 echo "====== Incoming full.hg in partial"
93 hg incoming bundle://../full.hg
93 hg incoming bundle://../full.hg
94 echo "====== Outgoing -R full.hg vs partial2 in partial"
94 echo "====== Outgoing -R full.hg vs partial2 in partial"
95 hg -R bundle://../full.hg outgoing ../partial2
95 hg -R bundle://../full.hg outgoing ../partial2
96 echo "====== Outgoing -R does-not-exist.hg vs partial2 in partial"
96 echo "====== Outgoing -R does-not-exist.hg vs partial2 in partial"
97 hg -R bundle://../does-not-exist.hg outgoing ../partial2
97 hg -R bundle://../does-not-exist.hg outgoing ../partial2
98 cd ..
98 cd ..
99
99
100 echo "====== Direct clone from bundle (all-history)"
100 echo "====== Direct clone from bundle (all-history)"
101 hg clone full.hg full-clone
101 hg clone full.hg full-clone
102 hg -R full-clone heads
102 hg -R full-clone heads
103 rm -r full-clone
103 rm -r full-clone
104
104
105 # test for http://www.selenic.com/mercurial/bts/issue216
105 # test for http://www.selenic.com/mercurial/bts/issue216
106 echo "====== Unbundle incremental bundles into fresh empty in one go"
106 echo "====== Unbundle incremental bundles into fresh empty in one go"
107 rm -r empty
107 rm -r empty
108 hg init empty
108 hg init empty
109 hg -R test bundle --base null -r 0 ../0.hg
109 hg -R test bundle --base null -r 0 ../0.hg
110 hg -R test bundle --base 0 -r 1 ../1.hg
110 hg -R test bundle --base 0 -r 1 ../1.hg
111 hg -R empty unbundle -u ../0.hg ../1.hg
111 hg -R empty unbundle -u ../0.hg ../1.hg
112
112
113 # test for 540d1059c802
113 # test for 540d1059c802
114 echo "====== test for 540d1059c802"
114 echo "====== test for 540d1059c802"
115 hg init orig
115 hg init orig
116 cd orig
116 cd orig
117 echo foo > foo
117 echo foo > foo
118 hg add foo
118 hg add foo
119 hg ci -m 'add foo' -d '0 0'
119 hg ci -m 'add foo' -d '0 0'
120
120
121 hg clone . ../copy
121 hg clone . ../copy
122 hg tag -d '0 0' foo
122 hg tag -d '0 0' foo
123
123
124 cd ../copy
124 cd ../copy
125 echo >> foo
125 echo >> foo
126 hg ci -m 'change foo' -d '0 0'
126 hg ci -m 'change foo' -d '0 0'
127 hg bundle ../bundle.hg ../orig
127 hg bundle ../bundle.hg ../orig
128
128
129 cd ../orig
129 cd ../orig
130 hg incoming ../bundle.hg
130 hg incoming ../bundle.hg
131 cd ..
131 cd ..
132
133 # test for http://www.selenic.com/mercurial/bts/issue1144
134 echo "===== test that verify bundle does not traceback"
135 # partial history bundle, fails w/ unkown parent
136 hg -R bundle.hg verify
137 # full history bundle, refuses to verify non-local repo
138 hg -R all.hg verify
139 # but, regular verify must continue to work
140 hg -R orig verify
141
142
@@ -1,311 +1,319 b''
1 ====== Setting up test
1 ====== Setting up test
2 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
2 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
3 created new head
3 created new head
4 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
4 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
5 checking changesets
5 checking changesets
6 checking manifests
6 checking manifests
7 crosschecking files in changesets and manifests
7 crosschecking files in changesets and manifests
8 checking files
8 checking files
9 4 files, 9 changesets, 7 total revisions
9 4 files, 9 changesets, 7 total revisions
10 ====== Bundle --all
10 ====== Bundle --all
11 9 changesets found
11 9 changesets found
12 ====== Bundle test to full.hg
12 ====== Bundle test to full.hg
13 searching for changes
13 searching for changes
14 9 changesets found
14 9 changesets found
15 ====== Unbundle full.hg in test
15 ====== Unbundle full.hg in test
16 adding changesets
16 adding changesets
17 adding manifests
17 adding manifests
18 adding file changes
18 adding file changes
19 added 0 changesets with 0 changes to 4 files
19 added 0 changesets with 0 changes to 4 files
20 (run 'hg update' to get a working copy)
20 (run 'hg update' to get a working copy)
21 ====== Verify empty
21 ====== Verify empty
22 changeset: -1:000000000000
22 changeset: -1:000000000000
23 tag: tip
23 tag: tip
24 user:
24 user:
25 date: Thu Jan 01 00:00:00 1970 +0000
25 date: Thu Jan 01 00:00:00 1970 +0000
26
26
27 checking changesets
27 checking changesets
28 checking manifests
28 checking manifests
29 crosschecking files in changesets and manifests
29 crosschecking files in changesets and manifests
30 checking files
30 checking files
31 0 files, 0 changesets, 0 total revisions
31 0 files, 0 changesets, 0 total revisions
32 ====== Pull full.hg into test (using --cwd)
32 ====== Pull full.hg into test (using --cwd)
33 pulling from ../full.hg
33 pulling from ../full.hg
34 searching for changes
34 searching for changes
35 no changes found
35 no changes found
36 ====== Pull full.hg into empty (using --cwd)
36 ====== Pull full.hg into empty (using --cwd)
37 pulling from ../full.hg
37 pulling from ../full.hg
38 requesting all changes
38 requesting all changes
39 adding changesets
39 adding changesets
40 adding manifests
40 adding manifests
41 adding file changes
41 adding file changes
42 added 9 changesets with 7 changes to 4 files (+1 heads)
42 added 9 changesets with 7 changes to 4 files (+1 heads)
43 (run 'hg heads' to see heads, 'hg merge' to merge)
43 (run 'hg heads' to see heads, 'hg merge' to merge)
44 ====== Rollback empty
44 ====== Rollback empty
45 rolling back last transaction
45 rolling back last transaction
46 ====== Pull full.hg into empty again (using --cwd)
46 ====== Pull full.hg into empty again (using --cwd)
47 pulling from ../full.hg
47 pulling from ../full.hg
48 requesting all changes
48 requesting all changes
49 adding changesets
49 adding changesets
50 adding manifests
50 adding manifests
51 adding file changes
51 adding file changes
52 added 9 changesets with 7 changes to 4 files (+1 heads)
52 added 9 changesets with 7 changes to 4 files (+1 heads)
53 (run 'hg heads' to see heads, 'hg merge' to merge)
53 (run 'hg heads' to see heads, 'hg merge' to merge)
54 ====== Pull full.hg into test (using -R)
54 ====== Pull full.hg into test (using -R)
55 pulling from full.hg
55 pulling from full.hg
56 searching for changes
56 searching for changes
57 no changes found
57 no changes found
58 ====== Pull full.hg into empty (using -R)
58 ====== Pull full.hg into empty (using -R)
59 pulling from full.hg
59 pulling from full.hg
60 searching for changes
60 searching for changes
61 no changes found
61 no changes found
62 ====== Rollback empty
62 ====== Rollback empty
63 rolling back last transaction
63 rolling back last transaction
64 ====== Pull full.hg into empty again (using -R)
64 ====== Pull full.hg into empty again (using -R)
65 pulling from full.hg
65 pulling from full.hg
66 requesting all changes
66 requesting all changes
67 adding changesets
67 adding changesets
68 adding manifests
68 adding manifests
69 adding file changes
69 adding file changes
70 added 9 changesets with 7 changes to 4 files (+1 heads)
70 added 9 changesets with 7 changes to 4 files (+1 heads)
71 (run 'hg heads' to see heads, 'hg merge' to merge)
71 (run 'hg heads' to see heads, 'hg merge' to merge)
72 ====== Log -R full.hg in fresh empty
72 ====== Log -R full.hg in fresh empty
73 changeset: 8:836ac62537ab
73 changeset: 8:836ac62537ab
74 tag: tip
74 tag: tip
75 parent: 3:ac69c658229d
75 parent: 3:ac69c658229d
76 user: test
76 user: test
77 date: Mon Jan 12 13:46:40 1970 +0000
77 date: Mon Jan 12 13:46:40 1970 +0000
78 summary: 0.3m
78 summary: 0.3m
79
79
80 changeset: 7:80fe151401c2
80 changeset: 7:80fe151401c2
81 user: test
81 user: test
82 date: Mon Jan 12 13:46:40 1970 +0000
82 date: Mon Jan 12 13:46:40 1970 +0000
83 summary: 1.3m
83 summary: 1.3m
84
84
85 changeset: 6:1e3f6b843bd6
85 changeset: 6:1e3f6b843bd6
86 user: test
86 user: test
87 date: Mon Jan 12 13:46:40 1970 +0000
87 date: Mon Jan 12 13:46:40 1970 +0000
88 summary: 1.3
88 summary: 1.3
89
89
90 changeset: 5:024e4e7df376
90 changeset: 5:024e4e7df376
91 user: test
91 user: test
92 date: Mon Jan 12 13:46:40 1970 +0000
92 date: Mon Jan 12 13:46:40 1970 +0000
93 summary: 1.2
93 summary: 1.2
94
94
95 changeset: 4:5f4f3ceb285e
95 changeset: 4:5f4f3ceb285e
96 parent: 0:5649c9d34dd8
96 parent: 0:5649c9d34dd8
97 user: test
97 user: test
98 date: Mon Jan 12 13:46:40 1970 +0000
98 date: Mon Jan 12 13:46:40 1970 +0000
99 summary: 1.1
99 summary: 1.1
100
100
101 changeset: 3:ac69c658229d
101 changeset: 3:ac69c658229d
102 user: test
102 user: test
103 date: Mon Jan 12 13:46:40 1970 +0000
103 date: Mon Jan 12 13:46:40 1970 +0000
104 summary: 0.3
104 summary: 0.3
105
105
106 changeset: 2:d62976ca1e50
106 changeset: 2:d62976ca1e50
107 user: test
107 user: test
108 date: Mon Jan 12 13:46:40 1970 +0000
108 date: Mon Jan 12 13:46:40 1970 +0000
109 summary: 0.2
109 summary: 0.2
110
110
111 changeset: 1:10b2180f755b
111 changeset: 1:10b2180f755b
112 user: test
112 user: test
113 date: Mon Jan 12 13:46:40 1970 +0000
113 date: Mon Jan 12 13:46:40 1970 +0000
114 summary: 0.1
114 summary: 0.1
115
115
116 changeset: 0:5649c9d34dd8
116 changeset: 0:5649c9d34dd8
117 user: test
117 user: test
118 date: Mon Jan 12 13:46:40 1970 +0000
118 date: Mon Jan 12 13:46:40 1970 +0000
119 summary: 0.0
119 summary: 0.0
120
120
121 ====== Pull ../full.hg into empty (with hook)
121 ====== Pull ../full.hg into empty (with hook)
122 changegroup hook: HG_NODE=5649c9d34dd87d0ecb5fd39672128376e83b22e1 HG_SOURCE=pull HG_URL=bundle:../full.hg
122 changegroup hook: HG_NODE=5649c9d34dd87d0ecb5fd39672128376e83b22e1 HG_SOURCE=pull HG_URL=bundle:../full.hg
123 pulling from bundle://../full.hg
123 pulling from bundle://../full.hg
124 requesting all changes
124 requesting all changes
125 adding changesets
125 adding changesets
126 adding manifests
126 adding manifests
127 adding file changes
127 adding file changes
128 added 9 changesets with 7 changes to 4 files (+1 heads)
128 added 9 changesets with 7 changes to 4 files (+1 heads)
129 (run 'hg heads' to see heads, 'hg merge' to merge)
129 (run 'hg heads' to see heads, 'hg merge' to merge)
130 ====== Rollback empty
130 ====== Rollback empty
131 rolling back last transaction
131 rolling back last transaction
132 ====== Log -R bundle:empty+full.hg
132 ====== Log -R bundle:empty+full.hg
133 8 7 6 5 4 3 2 1 0
133 8 7 6 5 4 3 2 1 0
134 ====== Pull full.hg into empty again (using -R; with hook)
134 ====== Pull full.hg into empty again (using -R; with hook)
135 changegroup hook: HG_NODE=5649c9d34dd87d0ecb5fd39672128376e83b22e1 HG_SOURCE=pull HG_URL=bundle:empty+full.hg
135 changegroup hook: HG_NODE=5649c9d34dd87d0ecb5fd39672128376e83b22e1 HG_SOURCE=pull HG_URL=bundle:empty+full.hg
136 pulling from full.hg
136 pulling from full.hg
137 requesting all changes
137 requesting all changes
138 adding changesets
138 adding changesets
139 adding manifests
139 adding manifests
140 adding file changes
140 adding file changes
141 added 9 changesets with 7 changes to 4 files (+1 heads)
141 added 9 changesets with 7 changes to 4 files (+1 heads)
142 (run 'hg heads' to see heads, 'hg merge' to merge)
142 (run 'hg heads' to see heads, 'hg merge' to merge)
143 ====== Create partial clones
143 ====== Create partial clones
144 requesting all changes
144 requesting all changes
145 adding changesets
145 adding changesets
146 adding manifests
146 adding manifests
147 adding file changes
147 adding file changes
148 added 4 changesets with 4 changes to 1 files
148 added 4 changesets with 4 changes to 1 files
149 updating working directory
149 updating working directory
150 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
150 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
151 updating working directory
151 updating working directory
152 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
152 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
153 ====== Log -R full.hg in partial
153 ====== Log -R full.hg in partial
154 changeset: 8:836ac62537ab
154 changeset: 8:836ac62537ab
155 tag: tip
155 tag: tip
156 parent: 3:ac69c658229d
156 parent: 3:ac69c658229d
157 user: test
157 user: test
158 date: Mon Jan 12 13:46:40 1970 +0000
158 date: Mon Jan 12 13:46:40 1970 +0000
159 summary: 0.3m
159 summary: 0.3m
160
160
161 changeset: 7:80fe151401c2
161 changeset: 7:80fe151401c2
162 user: test
162 user: test
163 date: Mon Jan 12 13:46:40 1970 +0000
163 date: Mon Jan 12 13:46:40 1970 +0000
164 summary: 1.3m
164 summary: 1.3m
165
165
166 changeset: 6:1e3f6b843bd6
166 changeset: 6:1e3f6b843bd6
167 user: test
167 user: test
168 date: Mon Jan 12 13:46:40 1970 +0000
168 date: Mon Jan 12 13:46:40 1970 +0000
169 summary: 1.3
169 summary: 1.3
170
170
171 changeset: 5:024e4e7df376
171 changeset: 5:024e4e7df376
172 user: test
172 user: test
173 date: Mon Jan 12 13:46:40 1970 +0000
173 date: Mon Jan 12 13:46:40 1970 +0000
174 summary: 1.2
174 summary: 1.2
175
175
176 changeset: 4:5f4f3ceb285e
176 changeset: 4:5f4f3ceb285e
177 parent: 0:5649c9d34dd8
177 parent: 0:5649c9d34dd8
178 user: test
178 user: test
179 date: Mon Jan 12 13:46:40 1970 +0000
179 date: Mon Jan 12 13:46:40 1970 +0000
180 summary: 1.1
180 summary: 1.1
181
181
182 changeset: 3:ac69c658229d
182 changeset: 3:ac69c658229d
183 user: test
183 user: test
184 date: Mon Jan 12 13:46:40 1970 +0000
184 date: Mon Jan 12 13:46:40 1970 +0000
185 summary: 0.3
185 summary: 0.3
186
186
187 changeset: 2:d62976ca1e50
187 changeset: 2:d62976ca1e50
188 user: test
188 user: test
189 date: Mon Jan 12 13:46:40 1970 +0000
189 date: Mon Jan 12 13:46:40 1970 +0000
190 summary: 0.2
190 summary: 0.2
191
191
192 changeset: 1:10b2180f755b
192 changeset: 1:10b2180f755b
193 user: test
193 user: test
194 date: Mon Jan 12 13:46:40 1970 +0000
194 date: Mon Jan 12 13:46:40 1970 +0000
195 summary: 0.1
195 summary: 0.1
196
196
197 changeset: 0:5649c9d34dd8
197 changeset: 0:5649c9d34dd8
198 user: test
198 user: test
199 date: Mon Jan 12 13:46:40 1970 +0000
199 date: Mon Jan 12 13:46:40 1970 +0000
200 summary: 0.0
200 summary: 0.0
201
201
202 ====== Incoming full.hg in partial
202 ====== Incoming full.hg in partial
203 comparing with bundle://../full.hg
203 comparing with bundle://../full.hg
204 searching for changes
204 searching for changes
205 changeset: 4:5f4f3ceb285e
205 changeset: 4:5f4f3ceb285e
206 parent: 0:5649c9d34dd8
206 parent: 0:5649c9d34dd8
207 user: test
207 user: test
208 date: Mon Jan 12 13:46:40 1970 +0000
208 date: Mon Jan 12 13:46:40 1970 +0000
209 summary: 1.1
209 summary: 1.1
210
210
211 changeset: 5:024e4e7df376
211 changeset: 5:024e4e7df376
212 user: test
212 user: test
213 date: Mon Jan 12 13:46:40 1970 +0000
213 date: Mon Jan 12 13:46:40 1970 +0000
214 summary: 1.2
214 summary: 1.2
215
215
216 changeset: 6:1e3f6b843bd6
216 changeset: 6:1e3f6b843bd6
217 user: test
217 user: test
218 date: Mon Jan 12 13:46:40 1970 +0000
218 date: Mon Jan 12 13:46:40 1970 +0000
219 summary: 1.3
219 summary: 1.3
220
220
221 changeset: 7:80fe151401c2
221 changeset: 7:80fe151401c2
222 user: test
222 user: test
223 date: Mon Jan 12 13:46:40 1970 +0000
223 date: Mon Jan 12 13:46:40 1970 +0000
224 summary: 1.3m
224 summary: 1.3m
225
225
226 changeset: 8:836ac62537ab
226 changeset: 8:836ac62537ab
227 tag: tip
227 tag: tip
228 parent: 3:ac69c658229d
228 parent: 3:ac69c658229d
229 user: test
229 user: test
230 date: Mon Jan 12 13:46:40 1970 +0000
230 date: Mon Jan 12 13:46:40 1970 +0000
231 summary: 0.3m
231 summary: 0.3m
232
232
233 ====== Outgoing -R full.hg vs partial2 in partial
233 ====== Outgoing -R full.hg vs partial2 in partial
234 comparing with ../partial2
234 comparing with ../partial2
235 searching for changes
235 searching for changes
236 changeset: 4:5f4f3ceb285e
236 changeset: 4:5f4f3ceb285e
237 parent: 0:5649c9d34dd8
237 parent: 0:5649c9d34dd8
238 user: test
238 user: test
239 date: Mon Jan 12 13:46:40 1970 +0000
239 date: Mon Jan 12 13:46:40 1970 +0000
240 summary: 1.1
240 summary: 1.1
241
241
242 changeset: 5:024e4e7df376
242 changeset: 5:024e4e7df376
243 user: test
243 user: test
244 date: Mon Jan 12 13:46:40 1970 +0000
244 date: Mon Jan 12 13:46:40 1970 +0000
245 summary: 1.2
245 summary: 1.2
246
246
247 changeset: 6:1e3f6b843bd6
247 changeset: 6:1e3f6b843bd6
248 user: test
248 user: test
249 date: Mon Jan 12 13:46:40 1970 +0000
249 date: Mon Jan 12 13:46:40 1970 +0000
250 summary: 1.3
250 summary: 1.3
251
251
252 changeset: 7:80fe151401c2
252 changeset: 7:80fe151401c2
253 user: test
253 user: test
254 date: Mon Jan 12 13:46:40 1970 +0000
254 date: Mon Jan 12 13:46:40 1970 +0000
255 summary: 1.3m
255 summary: 1.3m
256
256
257 changeset: 8:836ac62537ab
257 changeset: 8:836ac62537ab
258 tag: tip
258 tag: tip
259 parent: 3:ac69c658229d
259 parent: 3:ac69c658229d
260 user: test
260 user: test
261 date: Mon Jan 12 13:46:40 1970 +0000
261 date: Mon Jan 12 13:46:40 1970 +0000
262 summary: 0.3m
262 summary: 0.3m
263
263
264 ====== Outgoing -R does-not-exist.hg vs partial2 in partial
264 ====== Outgoing -R does-not-exist.hg vs partial2 in partial
265 abort: No such file or directory: ../does-not-exist.hg
265 abort: No such file or directory: ../does-not-exist.hg
266 ====== Direct clone from bundle (all-history)
266 ====== Direct clone from bundle (all-history)
267 requesting all changes
267 requesting all changes
268 adding changesets
268 adding changesets
269 adding manifests
269 adding manifests
270 adding file changes
270 adding file changes
271 added 9 changesets with 7 changes to 4 files (+1 heads)
271 added 9 changesets with 7 changes to 4 files (+1 heads)
272 updating working directory
272 updating working directory
273 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
273 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
274 changeset: 8:836ac62537ab
274 changeset: 8:836ac62537ab
275 tag: tip
275 tag: tip
276 parent: 3:ac69c658229d
276 parent: 3:ac69c658229d
277 user: test
277 user: test
278 date: Mon Jan 12 13:46:40 1970 +0000
278 date: Mon Jan 12 13:46:40 1970 +0000
279 summary: 0.3m
279 summary: 0.3m
280
280
281 changeset: 7:80fe151401c2
281 changeset: 7:80fe151401c2
282 user: test
282 user: test
283 date: Mon Jan 12 13:46:40 1970 +0000
283 date: Mon Jan 12 13:46:40 1970 +0000
284 summary: 1.3m
284 summary: 1.3m
285
285
286 ====== Unbundle incremental bundles into fresh empty in one go
286 ====== Unbundle incremental bundles into fresh empty in one go
287 1 changesets found
287 1 changesets found
288 1 changesets found
288 1 changesets found
289 adding changesets
289 adding changesets
290 adding manifests
290 adding manifests
291 adding file changes
291 adding file changes
292 added 1 changesets with 1 changes to 1 files
292 added 1 changesets with 1 changes to 1 files
293 adding changesets
293 adding changesets
294 adding manifests
294 adding manifests
295 adding file changes
295 adding file changes
296 added 1 changesets with 1 changes to 1 files
296 added 1 changesets with 1 changes to 1 files
297 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
297 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
298 ====== test for 540d1059c802
298 ====== test for 540d1059c802
299 updating working directory
299 updating working directory
300 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
300 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
301 searching for changes
301 searching for changes
302 1 changesets found
302 1 changesets found
303 comparing with ../bundle.hg
303 comparing with ../bundle.hg
304 searching for changes
304 searching for changes
305 changeset: 2:ed1b79f46b9a
305 changeset: 2:ed1b79f46b9a
306 tag: tip
306 tag: tip
307 parent: 0:bbd179dfa0a7
307 parent: 0:bbd179dfa0a7
308 user: test
308 user: test
309 date: Thu Jan 01 00:00:00 1970 +0000
309 date: Thu Jan 01 00:00:00 1970 +0000
310 summary: change foo
310 summary: change foo
311
311
312 ===== test that verify bundle does not traceback
313 abort: 00changelog.i@bbd179dfa0a7: unknown parent!
314 abort: cannot verify bundle or remote repos
315 checking changesets
316 checking manifests
317 crosschecking files in changesets and manifests
318 checking files
319 2 files, 2 changesets, 2 total revisions
General Comments 0
You need to be logged in to leave comments. Login now