comparison hgext/largefiles/overrides.py @ 15279:018608160299 stable

largefiles: use separate try/except and try/finally as needed for python2.4 cfccd3bee7b3 introduced a try/except/finally block, which breaks compatibility with python2.4
author Thomas Arendsen Hein <thomas@intevation.de>
date Sun, 16 Oct 2011 11:28:03 +0200
parents 7ab05d752405
children db7b09e689f1
comparison
equal deleted inserted replaced
15278:2ed335669e18 15279:018608160299
318 # only match normal files and run it, then replace it to just 318 # only match normal files and run it, then replace it to just
319 # match largefiles and run it again. 319 # match largefiles and run it again.
320 nonormalfiles = False 320 nonormalfiles = False
321 nolfiles = False 321 nolfiles = False
322 try: 322 try:
323 installnormalfilesmatchfn(repo[None].manifest()) 323 try:
324 result = orig(ui, repo, pats, opts, rename) 324 installnormalfilesmatchfn(repo[None].manifest())
325 except util.Abort, e: 325 result = orig(ui, repo, pats, opts, rename)
326 if str(e) != 'no files to copy': 326 except util.Abort, e:
327 raise e 327 if str(e) != 'no files to copy':
328 else: 328 raise e
329 nonormalfiles = True 329 else:
330 result = 0 330 nonormalfiles = True
331 result = 0
331 finally: 332 finally:
332 restorematchfn() 333 restorematchfn()
333 334
334 # The first rename can cause our current working directory to be removed. 335 # The first rename can cause our current working directory to be removed.
335 # In that case there is nothing left to copy/rename so just quit. 336 # In that case there is nothing left to copy/rename so just quit.
337 repo.getcwd() 338 repo.getcwd()
338 except OSError: 339 except OSError:
339 return result 340 return result
340 341
341 try: 342 try:
342 # When we call orig below it creates the standins but we don't add them 343 try:
343 # to the dir state until later so lock during that time. 344 # When we call orig below it creates the standins but we don't add them
344 wlock = repo.wlock() 345 # to the dir state until later so lock during that time.
345 346 wlock = repo.wlock()
346 manifest = repo[None].manifest() 347
347 oldmatch = None # for the closure 348 manifest = repo[None].manifest()
348 def override_match(repo, pats=[], opts={}, globbed=False, 349 oldmatch = None # for the closure
349 default='relpath'): 350 def override_match(repo, pats=[], opts={}, globbed=False,
350 newpats = [] 351 default='relpath'):
351 # The patterns were previously mangled to add the standin 352 newpats = []
352 # directory; we need to remove that now 353 # The patterns were previously mangled to add the standin
354 # directory; we need to remove that now
355 for pat in pats:
356 if match_.patkind(pat) is None and lfutil.shortname in pat:
357 newpats.append(pat.replace(lfutil.shortname, ''))
358 else:
359 newpats.append(pat)
360 match = oldmatch(repo, newpats, opts, globbed, default)
361 m = copy.copy(match)
362 lfile = lambda f: lfutil.standin(f) in manifest
363 m._files = [lfutil.standin(f) for f in m._files if lfile(f)]
364 m._fmap = set(m._files)
365 orig_matchfn = m.matchfn
366 m.matchfn = lambda f: (lfutil.isstandin(f) and
367 lfile(lfutil.splitstandin(f)) and
368 orig_matchfn(lfutil.splitstandin(f)) or
369 None)
370 return m
371 oldmatch = installmatchfn(override_match)
372 listpats = []
353 for pat in pats: 373 for pat in pats:
354 if match_.patkind(pat) is None and lfutil.shortname in pat: 374 if match_.patkind(pat) is not None:
355 newpats.append(pat.replace(lfutil.shortname, '')) 375 listpats.append(pat)
356 else: 376 else:
357 newpats.append(pat) 377 listpats.append(makestandin(pat))
358 match = oldmatch(repo, newpats, opts, globbed, default) 378
359 m = copy.copy(match) 379 try:
360 lfile = lambda f: lfutil.standin(f) in manifest 380 origcopyfile = util.copyfile
361 m._files = [lfutil.standin(f) for f in m._files if lfile(f)] 381 copiedfiles = []
362 m._fmap = set(m._files) 382 def override_copyfile(src, dest):
363 orig_matchfn = m.matchfn 383 if lfutil.shortname in src and lfutil.shortname in dest:
364 m.matchfn = lambda f: (lfutil.isstandin(f) and 384 destlfile = dest.replace(lfutil.shortname, '')
365 lfile(lfutil.splitstandin(f)) and 385 if not opts['force'] and os.path.exists(destlfile):
366 orig_matchfn(lfutil.splitstandin(f)) or 386 raise IOError('',
367 None) 387 _('destination largefile already exists'))
368 return m 388 copiedfiles.append((src, dest))
369 oldmatch = installmatchfn(override_match) 389 origcopyfile(src, dest)
370 listpats = [] 390
371 for pat in pats: 391 util.copyfile = override_copyfile
372 if match_.patkind(pat) is not None: 392 result += orig(ui, repo, listpats, opts, rename)
373 listpats.append(pat) 393 finally:
394 util.copyfile = origcopyfile
395
396 lfdirstate = lfutil.openlfdirstate(ui, repo)
397 for (src, dest) in copiedfiles:
398 if lfutil.shortname in src and lfutil.shortname in dest:
399 srclfile = src.replace(lfutil.shortname, '')
400 destlfile = dest.replace(lfutil.shortname, '')
401 destlfiledir = os.path.dirname(destlfile) or '.'
402 if not os.path.isdir(destlfiledir):
403 os.makedirs(destlfiledir)
404 if rename:
405 os.rename(srclfile, destlfile)
406 lfdirstate.remove(os.path.relpath(srclfile,
407 repo.root))
408 else:
409 util.copyfile(srclfile, destlfile)
410 lfdirstate.add(os.path.relpath(destlfile,
411 repo.root))
412 lfdirstate.write()
413 except util.Abort, e:
414 if str(e) != 'no files to copy':
415 raise e
374 else: 416 else:
375 listpats.append(makestandin(pat)) 417 nolfiles = True
376
377 try:
378 origcopyfile = util.copyfile
379 copiedfiles = []
380 def override_copyfile(src, dest):
381 if lfutil.shortname in src and lfutil.shortname in dest:
382 destlfile = dest.replace(lfutil.shortname, '')
383 if not opts['force'] and os.path.exists(destlfile):
384 raise IOError('',
385 _('destination largefile already exists'))
386 copiedfiles.append((src, dest))
387 origcopyfile(src, dest)
388
389 util.copyfile = override_copyfile
390 result += orig(ui, repo, listpats, opts, rename)
391 finally:
392 util.copyfile = origcopyfile
393
394 lfdirstate = lfutil.openlfdirstate(ui, repo)
395 for (src, dest) in copiedfiles:
396 if lfutil.shortname in src and lfutil.shortname in dest:
397 srclfile = src.replace(lfutil.shortname, '')
398 destlfile = dest.replace(lfutil.shortname, '')
399 destlfiledir = os.path.dirname(destlfile) or '.'
400 if not os.path.isdir(destlfiledir):
401 os.makedirs(destlfiledir)
402 if rename:
403 os.rename(srclfile, destlfile)
404 lfdirstate.remove(os.path.relpath(srclfile,
405 repo.root))
406 else:
407 util.copyfile(srclfile, destlfile)
408 lfdirstate.add(os.path.relpath(destlfile,
409 repo.root))
410 lfdirstate.write()
411 except util.Abort, e:
412 if str(e) != 'no files to copy':
413 raise e
414 else:
415 nolfiles = True
416 finally: 418 finally:
417 restorematchfn() 419 restorematchfn()
418 wlock.release() 420 wlock.release()
419 421
420 if nolfiles and nonormalfiles: 422 if nolfiles and nonormalfiles: