Mercurial > public > mercurial-scm > hg
comparison mercurial/verify.py @ 17860:a45b33f12627 stable
verify: fix all doubled-slash sites (issue3665)
author | Bryan O'Sullivan <bryano@fb.com> |
---|---|
date | Wed, 24 Oct 2012 09:27:47 -0700 |
parents | 7aa7380691b8 |
children | e1e181a64de7 |
comparison
equal
deleted
inserted
replaced
17859:d38d90ad5bbf | 17860:a45b33f12627 |
---|---|
5 # This software may be used and distributed according to the terms of the | 5 # This software may be used and distributed according to the terms of the |
6 # GNU General Public License version 2 or any later version. | 6 # GNU General Public License version 2 or any later version. |
7 | 7 |
8 from node import nullid, short | 8 from node import nullid, short |
9 from i18n import _ | 9 from i18n import _ |
10 import os, posixpath | 10 import os |
11 import revlog, util, error | 11 import revlog, util, error |
12 | 12 |
13 def verify(repo): | 13 def verify(repo): |
14 lock = repo.lock() | 14 lock = repo.lock() |
15 try: | 15 try: |
16 return _verify(repo) | 16 return _verify(repo) |
17 finally: | 17 finally: |
18 lock.release() | 18 lock.release() |
19 | |
20 def _normpath(f): | |
21 # under hg < 2.4, convert didn't sanitize paths properly, so a | |
22 # converted repo may contain repeated slashes | |
23 while '//' in f: | |
24 f = f.replace('//', '/') | |
25 return f | |
19 | 26 |
20 def _verify(repo): | 27 def _verify(repo): |
21 mflinkrevs = {} | 28 mflinkrevs = {} |
22 filelinkrevs = {} | 29 filelinkrevs = {} |
23 filenodes = {} | 30 filenodes = {} |
133 changes = cl.read(n) | 140 changes = cl.read(n) |
134 if changes[0] != nullid: | 141 if changes[0] != nullid: |
135 mflinkrevs.setdefault(changes[0], []).append(i) | 142 mflinkrevs.setdefault(changes[0], []).append(i) |
136 refersmf = True | 143 refersmf = True |
137 for f in changes[3]: | 144 for f in changes[3]: |
138 filelinkrevs.setdefault(f, []).append(i) | 145 filelinkrevs.setdefault(_normpath(f), []).append(i) |
139 except Exception, inst: | 146 except Exception, inst: |
140 refersmf = True | 147 refersmf = True |
141 exc(i, _("unpacking changeset %s") % short(n), inst) | 148 exc(i, _("unpacking changeset %s") % short(n), inst) |
142 ui.progress(_('checking'), None) | 149 ui.progress(_('checking'), None) |
143 | 150 |
160 try: | 167 try: |
161 for f, fn in mf.readdelta(n).iteritems(): | 168 for f, fn in mf.readdelta(n).iteritems(): |
162 if not f: | 169 if not f: |
163 err(lr, _("file without name in manifest")) | 170 err(lr, _("file without name in manifest")) |
164 elif f != "/dev/null": | 171 elif f != "/dev/null": |
165 filenodes.setdefault(f, {}).setdefault(fn, lr) | 172 filenodes.setdefault(_normpath(f), {}).setdefault(fn, lr) |
166 except Exception, inst: | 173 except Exception, inst: |
167 exc(lr, _("reading manifest delta %s") % short(n), inst) | 174 exc(lr, _("reading manifest delta %s") % short(n), inst) |
168 ui.progress(_('checking'), None) | 175 ui.progress(_('checking'), None) |
169 | 176 |
170 ui.status(_("crosschecking files in changesets and manifests\n")) | 177 ui.status(_("crosschecking files in changesets and manifests\n")) |
207 storefiles = set() | 214 storefiles = set() |
208 for f, f2, size in repo.store.datafiles(): | 215 for f, f2, size in repo.store.datafiles(): |
209 if not f: | 216 if not f: |
210 err(None, _("cannot decode filename '%s'") % f2) | 217 err(None, _("cannot decode filename '%s'") % f2) |
211 elif size > 0 or not revlogv1: | 218 elif size > 0 or not revlogv1: |
212 storefiles.add(f) | 219 storefiles.add(_normpath(f)) |
213 | 220 |
214 files = sorted(set(filenodes) | set(filelinkrevs)) | 221 files = sorted(set(filenodes) | set(filelinkrevs)) |
215 total = len(files) | 222 total = len(files) |
216 for i, f in enumerate(files): | 223 for i, f in enumerate(files): |
217 ui.progress(_('checking'), i, item=f, total=total) | 224 ui.progress(_('checking'), i, item=f, total=total) |
234 | 241 |
235 for ff in fl.files(): | 242 for ff in fl.files(): |
236 try: | 243 try: |
237 storefiles.remove(ff) | 244 storefiles.remove(ff) |
238 except KeyError: | 245 except KeyError: |
239 # under hg < 2.4, convert didn't sanitize paths properly, | 246 err(lr, _("missing revlog!"), ff) |
240 # so a converted repo may contain repeated slashes | |
241 try: | |
242 storefiles.remove(posixpath.normpath(ff)) | |
243 except KeyError: | |
244 err(lr, _("missing revlog!"), ff) | |
245 | 247 |
246 checklog(fl, f, lr) | 248 checklog(fl, f, lr) |
247 seen = {} | 249 seen = {} |
248 rp = None | 250 rp = None |
249 for i in fl: | 251 for i in fl: |