361 hardlink = False |
361 hardlink = False |
362 shutil.copy(src, dst) |
362 shutil.copy(src, dst) |
363 else: |
363 else: |
364 shutil.copy(src, dst) |
364 shutil.copy(src, dst) |
365 |
365 |
366 def opener(base): |
366 def audit_path(path): |
|
367 """Abort if path contains dangerous components""" |
|
368 parts = os.path.normcase(path).split(os.sep) |
|
369 if (os.path.splitdrive(path)[0] or parts[0] in ('.hg', '') |
|
370 or os.pardir in parts): |
|
371 raise Abort(_("path contains illegal component: %s\n") % path) |
|
372 |
|
373 def opener(base, audit=True): |
367 """ |
374 """ |
368 return a function that opens files relative to base |
375 return a function that opens files relative to base |
369 |
376 |
370 this function is used to hide the details of COW semantics and |
377 this function is used to hide the details of COW semantics and |
371 remote file access from higher level code. |
378 remote file access from higher level code. |
372 """ |
379 """ |
373 p = base |
380 p = base |
|
381 audit_p = audit |
374 |
382 |
375 def mktempcopy(name): |
383 def mktempcopy(name): |
376 d, fn = os.path.split(name) |
384 d, fn = os.path.split(name) |
377 fd, temp = tempfile.mkstemp(prefix=fn, dir=d) |
385 fd, temp = tempfile.mkstemp(prefix=fn, dir=d) |
378 fp = os.fdopen(fd, "wb") |
386 fp = os.fdopen(fd, "wb") |
399 rename(self.temp, self.__name) |
407 rename(self.temp, self.__name) |
400 def __del__(self): |
408 def __del__(self): |
401 self.close() |
409 self.close() |
402 |
410 |
403 def o(path, mode="r", text=False, atomic=False): |
411 def o(path, mode="r", text=False, atomic=False): |
|
412 if audit_p: |
|
413 audit_path(path) |
404 f = os.path.join(p, path) |
414 f = os.path.join(p, path) |
405 |
415 |
406 if not text: |
416 if not text: |
407 mode += "b" # for that other OS |
417 mode += "b" # for that other OS |
408 |
418 |