Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/util.py @ 11469:c37f35d7f2f5 stable
http: deliver hook output to client
author | Maxim Khitrov <mkhitrov@gmail.com> |
---|---|
date | Wed, 30 Jun 2010 18:15:23 -0500 |
parents | d320e70442a5 |
children | 7546d4a272c8 a79214972da2 |
comparison
equal
deleted
inserted
replaced
11468:1c1126b1d919 | 11469:c37f35d7f2f5 |
---|---|
364 def set_hgexecutable(path): | 364 def set_hgexecutable(path): |
365 """set location of the 'hg' executable""" | 365 """set location of the 'hg' executable""" |
366 global _hgexecutable | 366 global _hgexecutable |
367 _hgexecutable = path | 367 _hgexecutable = path |
368 | 368 |
369 def system(cmd, environ={}, cwd=None, onerr=None, errprefix=None): | 369 def system(cmd, environ={}, cwd=None, onerr=None, errprefix=None, out=None): |
370 '''enhanced shell command execution. | 370 '''enhanced shell command execution. |
371 run with environment maybe modified, maybe in different dir. | 371 run with environment maybe modified, maybe in different dir. |
372 | 372 |
373 if command fails and onerr is None, return status. if ui object, | 373 if command fails and onerr is None, return status. if ui object, |
374 print error message and return status, else raise onerr object as | 374 print error message and return status, else raise onerr object as |
375 exception.''' | 375 exception. |
376 | |
377 if out is specified, it is assumed to be a file-like object that has a | |
378 write() method. stdout and stderr will be redirected to out.''' | |
376 def py2shell(val): | 379 def py2shell(val): |
377 'convert python object into string that is useful to shell' | 380 'convert python object into string that is useful to shell' |
378 if val is None or val is False: | 381 if val is None or val is False: |
379 return '0' | 382 return '0' |
380 if val is True: | 383 if val is True: |
384 if os.name == 'nt': | 387 if os.name == 'nt': |
385 cmd = '"%s"' % cmd | 388 cmd = '"%s"' % cmd |
386 env = dict(os.environ) | 389 env = dict(os.environ) |
387 env.update((k, py2shell(v)) for k, v in environ.iteritems()) | 390 env.update((k, py2shell(v)) for k, v in environ.iteritems()) |
388 env['HG'] = hgexecutable() | 391 env['HG'] = hgexecutable() |
389 rc = subprocess.call(cmd, shell=True, close_fds=closefds, | 392 if out is None: |
390 env=env, cwd=cwd) | 393 rc = subprocess.call(cmd, shell=True, close_fds=closefds, |
394 env=env, cwd=cwd) | |
395 else: | |
396 proc = subprocess.Popen(cmd, shell=True, close_fds=closefds, | |
397 env=env, cwd=cwd, stdout=subprocess.PIPE, | |
398 stderr=subprocess.STDOUT) | |
399 for line in proc.stdout: | |
400 out.write(line) | |
401 proc.wait() | |
402 rc = proc.returncode | |
391 if sys.platform == 'OpenVMS' and rc & 1: | 403 if sys.platform == 'OpenVMS' and rc & 1: |
392 rc = 0 | 404 rc = 0 |
393 if rc and onerr: | 405 if rc and onerr: |
394 errmsg = '%s %s' % (os.path.basename(origcmd.split(None, 1)[0]), | 406 errmsg = '%s %s' % (os.path.basename(origcmd.split(None, 1)[0]), |
395 explain_exit(rc)[0]) | 407 explain_exit(rc)[0]) |