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: