45 outfd, outname = tempfile.mkstemp(prefix='hgfout') |
45 outfd, outname = tempfile.mkstemp(prefix='hgfout') |
46 os.close(outfd) |
46 os.close(outfd) |
47 cmd = cmd.replace('INFILE', inname) |
47 cmd = cmd.replace('INFILE', inname) |
48 cmd = cmd.replace('OUTFILE', outname) |
48 cmd = cmd.replace('OUTFILE', outname) |
49 code = os.system(cmd) |
49 code = os.system(cmd) |
50 if code: raise Abort("command '%s' failed: %s" % |
50 if code: raise Abort(_("command '%s' failed: %s") % |
51 (cmd, explain_exit(code))) |
51 (cmd, explain_exit(code))) |
52 return open(outname, 'rb').read() |
52 return open(outname, 'rb').read() |
53 finally: |
53 finally: |
54 try: |
54 try: |
55 if inname: os.unlink(inname) |
55 if inname: os.unlink(inname) |
81 if line.startswith('patching file '): |
81 if line.startswith('patching file '): |
82 pf = parse_patch_output(line) |
82 pf = parse_patch_output(line) |
83 files.setdefault(pf, 1) |
83 files.setdefault(pf, 1) |
84 code = fp.close() |
84 code = fp.close() |
85 if code: |
85 if code: |
86 raise Abort("patch command failed: %s" % explain_exit(code)[0]) |
86 raise Abort(_("patch command failed: %s") % explain_exit(code)[0]) |
87 return files.keys() |
87 return files.keys() |
88 |
88 |
89 def binary(s): |
89 def binary(s): |
90 """return true if a string is binary data using diff's heuristic""" |
90 """return true if a string is binary data using diff's heuristic""" |
91 if s and '\0' in s[:4096]: |
91 if s and '\0' in s[:4096]: |
364 |
364 |
365 if hasattr(os, 'link'): |
365 if hasattr(os, 'link'): |
366 os_link = os.link |
366 os_link = os.link |
367 else: |
367 else: |
368 def os_link(src, dst): |
368 def os_link(src, dst): |
369 raise OSError(0, "Hardlinks not supported") |
369 raise OSError(0, _("Hardlinks not supported")) |
370 |
370 |
371 # Platform specific variants |
371 # Platform specific variants |
372 if os.name == 'nt': |
372 if os.name == 'nt': |
373 nulldev = 'NUL:' |
373 nulldev = 'NUL:' |
374 |
374 |
429 |
429 |
430 makelock = _makelock_file |
430 makelock = _makelock_file |
431 readlock = _readlock_file |
431 readlock = _readlock_file |
432 |
432 |
433 def explain_exit(code): |
433 def explain_exit(code): |
434 return "exited with status %d" % code, code |
434 return _("exited with status %d") % code, code |
435 |
435 |
436 else: |
436 else: |
437 nulldev = '/dev/null' |
437 nulldev = '/dev/null' |
438 |
438 |
439 hgrcd = '/etc/mercurial/hgrc.d' |
439 hgrcd = '/etc/mercurial/hgrc.d' |
492 |
492 |
493 def explain_exit(code): |
493 def explain_exit(code): |
494 """return a 2-tuple (desc, code) describing a process's status""" |
494 """return a 2-tuple (desc, code) describing a process's status""" |
495 if os.WIFEXITED(code): |
495 if os.WIFEXITED(code): |
496 val = os.WEXITSTATUS(code) |
496 val = os.WEXITSTATUS(code) |
497 return "exited with status %d" % val, val |
497 return _("exited with status %d") % val, val |
498 elif os.WIFSIGNALED(code): |
498 elif os.WIFSIGNALED(code): |
499 val = os.WTERMSIG(code) |
499 val = os.WTERMSIG(code) |
500 return "killed by signal %d" % val, val |
500 return _("killed by signal %d") % val, val |
501 elif os.WIFSTOPPED(code): |
501 elif os.WIFSTOPPED(code): |
502 val = os.WSTOPSIG(code) |
502 val = os.WSTOPSIG(code) |
503 return "stopped by signal %d" % val, val |
503 return _("stopped by signal %d") % val, val |
504 raise ValueError("invalid exit code") |
504 raise ValueError(_("invalid exit code")) |
505 |
505 |
506 class chunkbuffer(object): |
506 class chunkbuffer(object): |
507 """Allow arbitrary sized chunks of data to be efficiently read from an |
507 """Allow arbitrary sized chunks of data to be efficiently read from an |
508 iterator over chunks of arbitrary size.""" |
508 iterator over chunks of arbitrary size.""" |
509 |
509 |
512 targetsize is how big a buffer to try to maintain.""" |
512 targetsize is how big a buffer to try to maintain.""" |
513 self.in_iter = iter(in_iter) |
513 self.in_iter = iter(in_iter) |
514 self.buf = '' |
514 self.buf = '' |
515 self.targetsize = int(targetsize) |
515 self.targetsize = int(targetsize) |
516 if self.targetsize <= 0: |
516 if self.targetsize <= 0: |
517 raise ValueError("targetsize must be greater than 0, was %d" % |
517 raise ValueError(_("targetsize must be greater than 0, was %d") % |
518 targetsize) |
518 targetsize) |
519 self.iterempty = False |
519 self.iterempty = False |
520 |
520 |
521 def fillbuf(self): |
521 def fillbuf(self): |
522 """Ignore target size; read every chunk from iterator until empty.""" |
522 """Ignore target size; read every chunk from iterator until empty.""" |