Mercurial > hg-stable
annotate mercurial/utils/procutil.py @ 42511:ca1014ad3de4
procutil: allow callers of runbgcommand to assume the process starts
Experimentally starting the subprocess can take as much as 40ms, and
for some of our use cases that's frivolous: we know the binary will
start, and if it doesn't we'd only ever ignore it and continue
anyway. This lets those use cases be faster.
Differential Revision: https://phab.mercurial-scm.org/D6537
author | Augie Fackler <augie@google.com> |
---|---|
date | Tue, 18 Jun 2019 09:43:27 -0400 |
parents | b275dbb60089 |
children | f1f9ad5ae4f8 |
rev | line source |
---|---|
37121
5be286db5fb5
procutil: move process/executable management functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37120
diff
changeset
|
1 # procutil.py - utility for managing processes and executable environment |
8226
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
2 # |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
3 # Copyright 2005 K. Thananchayan <thananck@yahoo.com> |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
4 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com> |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
5 # Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com> |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
6 # |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
7 # This software may be used and distributed according to the terms of the |
10263 | 8 # GNU General Public License version 2 or any later version. |
1082 | 9 |
37121
5be286db5fb5
procutil: move process/executable management functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37120
diff
changeset
|
10 from __future__ import absolute_import |
27358
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
11 |
37127
6715e8035b4f
procutil: introduce context-manager interface for protect/restorestdio
Yuya Nishihara <yuya@tcha.org>
parents:
37126
diff
changeset
|
12 import contextlib |
40547
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
13 import errno |
27358
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
14 import imp |
36462
1ca4e86c7265
util: handle fileno() on Python 3 throwing io.UnsupportedOperation
Augie Fackler <augie@google.com>
parents:
36452
diff
changeset
|
15 import io |
27358
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
16 import os |
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
17 import signal |
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
18 import subprocess |
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
19 import sys |
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
20 import time |
3769 | 21 |
37121
5be286db5fb5
procutil: move process/executable management functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37120
diff
changeset
|
22 from ..i18n import _ |
5be286db5fb5
procutil: move process/executable management functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37120
diff
changeset
|
23 |
5be286db5fb5
procutil: move process/executable management functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37120
diff
changeset
|
24 from .. import ( |
27358
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
25 encoding, |
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
26 error, |
32406
a9c71d578a1c
osutil: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32346
diff
changeset
|
27 policy, |
28818
6041fb8f2da8
pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
28497
diff
changeset
|
28 pycompat, |
37086
f99d64e8a4e4
stringutil: move generic string helpers to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37085
diff
changeset
|
29 ) |
3769 | 30 |
32406
a9c71d578a1c
osutil: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32346
diff
changeset
|
31 osutil = policy.importmod(r'osutil') |
32245
4462a981e8df
base85: proxy through util module
Yuya Nishihara <yuya@tcha.org>
parents:
32203
diff
changeset
|
32 |
30481
277f4fe6d01a
py3: provide bytes stdin/out/err through util module
Yuya Nishihara <yuya@tcha.org>
parents:
30480
diff
changeset
|
33 stderr = pycompat.stderr |
277f4fe6d01a
py3: provide bytes stdin/out/err through util module
Yuya Nishihara <yuya@tcha.org>
parents:
30480
diff
changeset
|
34 stdin = pycompat.stdin |
277f4fe6d01a
py3: provide bytes stdin/out/err through util module
Yuya Nishihara <yuya@tcha.org>
parents:
30480
diff
changeset
|
35 stdout = pycompat.stdout |
32131
377c74ef008d
win32mbcs: avoid unintentional failure at colorization
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
31952
diff
changeset
|
36 |
30908
3a4c0905f357
util: always force line buffered stdout when stdout is a tty (BC)
Simon Farnsworth <simonfar@fb.com>
parents:
30854
diff
changeset
|
37 def isatty(fp): |
3a4c0905f357
util: always force line buffered stdout when stdout is a tty (BC)
Simon Farnsworth <simonfar@fb.com>
parents:
30854
diff
changeset
|
38 try: |
3a4c0905f357
util: always force line buffered stdout when stdout is a tty (BC)
Simon Farnsworth <simonfar@fb.com>
parents:
30854
diff
changeset
|
39 return fp.isatty() |
3a4c0905f357
util: always force line buffered stdout when stdout is a tty (BC)
Simon Farnsworth <simonfar@fb.com>
parents:
30854
diff
changeset
|
40 except AttributeError: |
3a4c0905f357
util: always force line buffered stdout when stdout is a tty (BC)
Simon Farnsworth <simonfar@fb.com>
parents:
30854
diff
changeset
|
41 return False |
3a4c0905f357
util: always force line buffered stdout when stdout is a tty (BC)
Simon Farnsworth <simonfar@fb.com>
parents:
30854
diff
changeset
|
42 |
3a4c0905f357
util: always force line buffered stdout when stdout is a tty (BC)
Simon Farnsworth <simonfar@fb.com>
parents:
30854
diff
changeset
|
43 # glibc determines buffering on first write to stdout - if we replace a TTY |
3a4c0905f357
util: always force line buffered stdout when stdout is a tty (BC)
Simon Farnsworth <simonfar@fb.com>
parents:
30854
diff
changeset
|
44 # destined stdout with a pipe destined stdout (e.g. pager), we want line |
37879
0b63a6743010
procutil: use unbuffered stdout on Windows
Sune Foldager <cryo@cyanite.org>
parents:
37464
diff
changeset
|
45 # buffering (or unbuffered, on Windows) |
30908
3a4c0905f357
util: always force line buffered stdout when stdout is a tty (BC)
Simon Farnsworth <simonfar@fb.com>
parents:
30854
diff
changeset
|
46 if isatty(stdout): |
37879
0b63a6743010
procutil: use unbuffered stdout on Windows
Sune Foldager <cryo@cyanite.org>
parents:
37464
diff
changeset
|
47 if pycompat.iswindows: |
0b63a6743010
procutil: use unbuffered stdout on Windows
Sune Foldager <cryo@cyanite.org>
parents:
37464
diff
changeset
|
48 # Windows doesn't support line buffering |
0b63a6743010
procutil: use unbuffered stdout on Windows
Sune Foldager <cryo@cyanite.org>
parents:
37464
diff
changeset
|
49 stdout = os.fdopen(stdout.fileno(), r'wb', 0) |
0b63a6743010
procutil: use unbuffered stdout on Windows
Sune Foldager <cryo@cyanite.org>
parents:
37464
diff
changeset
|
50 else: |
0b63a6743010
procutil: use unbuffered stdout on Windows
Sune Foldager <cryo@cyanite.org>
parents:
37464
diff
changeset
|
51 stdout = os.fdopen(stdout.fileno(), r'wb', 1) |
30908
3a4c0905f357
util: always force line buffered stdout when stdout is a tty (BC)
Simon Farnsworth <simonfar@fb.com>
parents:
30854
diff
changeset
|
52 |
34645 | 53 if pycompat.iswindows: |
37121
5be286db5fb5
procutil: move process/executable management functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37120
diff
changeset
|
54 from .. import windows as platform |
30908
3a4c0905f357
util: always force line buffered stdout when stdout is a tty (BC)
Simon Farnsworth <simonfar@fb.com>
parents:
30854
diff
changeset
|
55 stdout = platform.winstdout(stdout) |
14912
ec46a7da9f2c
util: move windows and posix wildcard imports to begin of file
Adrian Buehlmann <adrian@cadifra.com>
parents:
14911
diff
changeset
|
56 else: |
37121
5be286db5fb5
procutil: move process/executable management functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37120
diff
changeset
|
57 from .. import posix as platform |
14926
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
58 |
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
59 findexe = platform.findexe |
37118
49d6ba67c93f
util: mark platform-specific gethgcmd() as private
Yuya Nishihara <yuya@tcha.org>
parents:
37102
diff
changeset
|
60 _gethgcmd = platform.gethgcmd |
14926
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
61 getuser = platform.getuser |
28027
14033c5dd261
util: enable getpid to be replaced
timeless <timeless@mozdev.org>
parents:
27785
diff
changeset
|
62 getpid = os.getpid |
14926
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
63 hidewindow = platform.hidewindow |
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
64 quotecommand = platform.quotecommand |
22245
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21914
diff
changeset
|
65 readpipe = platform.readpipe |
14926
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
66 setbinary = platform.setbinary |
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
67 setsignalhandler = platform.setsignalhandler |
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
68 shellquote = platform.shellquote |
36445
0cb09c322647
util: factor out shellsplit() function
Yuya Nishihara <yuya@tcha.org>
parents:
36395
diff
changeset
|
69 shellsplit = platform.shellsplit |
14926
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
70 spawndetached = platform.spawndetached |
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
71 sshargs = platform.sshargs |
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
72 testpid = platform.testpid |
14912
ec46a7da9f2c
util: move windows and posix wildcard imports to begin of file
Adrian Buehlmann <adrian@cadifra.com>
parents:
14911
diff
changeset
|
73 |
32248
d74b0cff94a9
osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents:
32245
diff
changeset
|
74 try: |
d74b0cff94a9
osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents:
32245
diff
changeset
|
75 setprocname = osutil.setprocname |
d74b0cff94a9
osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents:
32245
diff
changeset
|
76 except AttributeError: |
d74b0cff94a9
osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents:
32245
diff
changeset
|
77 pass |
35464
8652ab4046e4
osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents:
35166
diff
changeset
|
78 try: |
8652ab4046e4
osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents:
35166
diff
changeset
|
79 unblocksignal = osutil.unblocksignal |
8652ab4046e4
osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents:
35166
diff
changeset
|
80 except AttributeError: |
8652ab4046e4
osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents:
35166
diff
changeset
|
81 pass |
32248
d74b0cff94a9
osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents:
32245
diff
changeset
|
82 |
34646 | 83 closefds = pycompat.isposix |
10197
29e3c4a7699b
subrepo: normalize svn output line-endings
Patrick Mezard <pmezard@gmail.com>
parents:
9996
diff
changeset
|
84 |
37460
a6c6b7beb025
procutil: unify platform.explainexit()
Yuya Nishihara <yuya@tcha.org>
parents:
37459
diff
changeset
|
85 def explainexit(code): |
37463
bbd240f81ac5
procutil: make explainexit() simply return a message (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37462
diff
changeset
|
86 """return a message describing a subprocess status |
37460
a6c6b7beb025
procutil: unify platform.explainexit()
Yuya Nishihara <yuya@tcha.org>
parents:
37459
diff
changeset
|
87 (codes from kill are negative - not os.system/wait encoding)""" |
a6c6b7beb025
procutil: unify platform.explainexit()
Yuya Nishihara <yuya@tcha.org>
parents:
37459
diff
changeset
|
88 if code >= 0: |
37463
bbd240f81ac5
procutil: make explainexit() simply return a message (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37462
diff
changeset
|
89 return _("exited with status %d") % code |
bbd240f81ac5
procutil: make explainexit() simply return a message (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37462
diff
changeset
|
90 return _("killed by signal %d") % -code |
37460
a6c6b7beb025
procutil: unify platform.explainexit()
Yuya Nishihara <yuya@tcha.org>
parents:
37459
diff
changeset
|
91 |
37459
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
92 class _pfile(object): |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
93 """File-like wrapper for a stream opened by subprocess.Popen()""" |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
94 |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
95 def __init__(self, proc, fp): |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
96 self._proc = proc |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
97 self._fp = fp |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
98 |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
99 def close(self): |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
100 # unlike os.popen(), this returns an integer in subprocess coding |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
101 self._fp.close() |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
102 return self._proc.wait() |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
103 |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
104 def __iter__(self): |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
105 return iter(self._fp) |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
106 |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
107 def __getattr__(self, attr): |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
108 return getattr(self._fp, attr) |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
109 |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
110 def __enter__(self): |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
111 return self |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
112 |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
113 def __exit__(self, exc_type, exc_value, exc_tb): |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
114 self.close() |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
115 |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
116 def popen(cmd, mode='rb', bufsize=-1): |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
117 if mode == 'rb': |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
118 return _popenreader(cmd, bufsize) |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
119 elif mode == 'wb': |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
120 return _popenwriter(cmd, bufsize) |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
121 raise error.ProgrammingError('unsupported mode: %r' % mode) |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
122 |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
123 def _popenreader(cmd, bufsize): |
39831
c31ce080eb75
py3: convert arguments, cwd and env to native strings when spawning subprocess
Matt Harbison <matt_harbison@yahoo.com>
parents:
39678
diff
changeset
|
124 p = subprocess.Popen(tonativestr(quotecommand(cmd)), |
c31ce080eb75
py3: convert arguments, cwd and env to native strings when spawning subprocess
Matt Harbison <matt_harbison@yahoo.com>
parents:
39678
diff
changeset
|
125 shell=True, bufsize=bufsize, |
37459
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
126 close_fds=closefds, |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
127 stdout=subprocess.PIPE) |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
128 return _pfile(p, p.stdout) |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
129 |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
130 def _popenwriter(cmd, bufsize): |
39831
c31ce080eb75
py3: convert arguments, cwd and env to native strings when spawning subprocess
Matt Harbison <matt_harbison@yahoo.com>
parents:
39678
diff
changeset
|
131 p = subprocess.Popen(tonativestr(quotecommand(cmd)), |
c31ce080eb75
py3: convert arguments, cwd and env to native strings when spawning subprocess
Matt Harbison <matt_harbison@yahoo.com>
parents:
39678
diff
changeset
|
132 shell=True, bufsize=bufsize, |
37459
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
133 close_fds=closefds, |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
134 stdin=subprocess.PIPE) |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
135 return _pfile(p, p.stdin) |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
136 |
37464
632b92899203
procutil: drop unused 'newlines' option from popen*() (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37463
diff
changeset
|
137 def popen2(cmd, env=None): |
9089
8ec39725d966
util: remove unused bufsize argument
Martin Geisler <mg@lazybytes.net>
parents:
9084
diff
changeset
|
138 # Setting bufsize to -1 lets the system decide the buffer size. |
8ec39725d966
util: remove unused bufsize argument
Martin Geisler <mg@lazybytes.net>
parents:
9084
diff
changeset
|
139 # The default for bufsize is 0, meaning unbuffered. This leads to |
8ec39725d966
util: remove unused bufsize argument
Martin Geisler <mg@lazybytes.net>
parents:
9084
diff
changeset
|
140 # poor performance on Mac OS X: http://bugs.python.org/issue4194 |
39841
f1d6021453c2
py3: remove a couple of superfluous calls to pycompat.rapply()
Matt Harbison <matt_harbison@yahoo.com>
parents:
39831
diff
changeset
|
141 p = subprocess.Popen(tonativestr(cmd), |
39831
c31ce080eb75
py3: convert arguments, cwd and env to native strings when spawning subprocess
Matt Harbison <matt_harbison@yahoo.com>
parents:
39678
diff
changeset
|
142 shell=True, bufsize=-1, |
9083
ec171737aaf1
Backed out changeset fce065538bcf: it caused a 5x performance regression on OS X
Bryan O'Sullivan <bos@serpentine.com>
parents:
8340
diff
changeset
|
143 close_fds=closefds, |
10197
29e3c4a7699b
subrepo: normalize svn output line-endings
Patrick Mezard <pmezard@gmail.com>
parents:
9996
diff
changeset
|
144 stdin=subprocess.PIPE, stdout=subprocess.PIPE, |
39831
c31ce080eb75
py3: convert arguments, cwd and env to native strings when spawning subprocess
Matt Harbison <matt_harbison@yahoo.com>
parents:
39678
diff
changeset
|
145 env=tonativeenv(env)) |
8280
0b02d98d44d0
util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents:
8257
diff
changeset
|
146 return p.stdin, p.stdout |
10197
29e3c4a7699b
subrepo: normalize svn output line-endings
Patrick Mezard <pmezard@gmail.com>
parents:
9996
diff
changeset
|
147 |
37464
632b92899203
procutil: drop unused 'newlines' option from popen*() (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37463
diff
changeset
|
148 def popen3(cmd, env=None): |
632b92899203
procutil: drop unused 'newlines' option from popen*() (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37463
diff
changeset
|
149 stdin, stdout, stderr, p = popen4(cmd, env) |
18759
9baf4330d88f
sshpeer: store subprocess so it cleans up correctly
Durham Goode <durham@fb.com>
parents:
18736
diff
changeset
|
150 return stdin, stdout, stderr |
9baf4330d88f
sshpeer: store subprocess so it cleans up correctly
Durham Goode <durham@fb.com>
parents:
18736
diff
changeset
|
151 |
37464
632b92899203
procutil: drop unused 'newlines' option from popen*() (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37463
diff
changeset
|
152 def popen4(cmd, env=None, bufsize=-1): |
39841
f1d6021453c2
py3: remove a couple of superfluous calls to pycompat.rapply()
Matt Harbison <matt_harbison@yahoo.com>
parents:
39831
diff
changeset
|
153 p = subprocess.Popen(tonativestr(cmd), |
39831
c31ce080eb75
py3: convert arguments, cwd and env to native strings when spawning subprocess
Matt Harbison <matt_harbison@yahoo.com>
parents:
39678
diff
changeset
|
154 shell=True, bufsize=bufsize, |
9083
ec171737aaf1
Backed out changeset fce065538bcf: it caused a 5x performance regression on OS X
Bryan O'Sullivan <bos@serpentine.com>
parents:
8340
diff
changeset
|
155 close_fds=closefds, |
8280
0b02d98d44d0
util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents:
8257
diff
changeset
|
156 stdin=subprocess.PIPE, stdout=subprocess.PIPE, |
10197
29e3c4a7699b
subrepo: normalize svn output line-endings
Patrick Mezard <pmezard@gmail.com>
parents:
9996
diff
changeset
|
157 stderr=subprocess.PIPE, |
39831
c31ce080eb75
py3: convert arguments, cwd and env to native strings when spawning subprocess
Matt Harbison <matt_harbison@yahoo.com>
parents:
39678
diff
changeset
|
158 env=tonativeenv(env)) |
18759
9baf4330d88f
sshpeer: store subprocess so it cleans up correctly
Durham Goode <durham@fb.com>
parents:
18736
diff
changeset
|
159 return p.stdin, p.stdout, p.stderr, p |
7106
4674706b5b95
python2.6: use subprocess if available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
160 |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
161 def pipefilter(s, cmd): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
162 '''filter string S through command CMD, returning its output''' |
39841
f1d6021453c2
py3: remove a couple of superfluous calls to pycompat.rapply()
Matt Harbison <matt_harbison@yahoo.com>
parents:
39831
diff
changeset
|
163 p = subprocess.Popen(tonativestr(cmd), |
39831
c31ce080eb75
py3: convert arguments, cwd and env to native strings when spawning subprocess
Matt Harbison <matt_harbison@yahoo.com>
parents:
39678
diff
changeset
|
164 shell=True, close_fds=closefds, |
8302
d2ad8c066676
util: simplify pipefilter and avoid subprocess race
Martin Geisler <mg@lazybytes.net>
parents:
8299
diff
changeset
|
165 stdin=subprocess.PIPE, stdout=subprocess.PIPE) |
d2ad8c066676
util: simplify pipefilter and avoid subprocess race
Martin Geisler <mg@lazybytes.net>
parents:
8299
diff
changeset
|
166 pout, perr = p.communicate(s) |
d2ad8c066676
util: simplify pipefilter and avoid subprocess race
Martin Geisler <mg@lazybytes.net>
parents:
8299
diff
changeset
|
167 return pout |
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
168 |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
169 def tempfilter(s, cmd): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
170 '''filter string S through a pair of temporary files with CMD. |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
171 CMD is used as a template to create the real command to be run, |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
172 with the strings INFILE and OUTFILE replaced by the real names of |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
173 the temporary files generated.''' |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
174 inname, outname = None, None |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
175 try: |
38197
aac4be30e250
py3: wrap tempfile.mkstemp() to use bytes path
Yuya Nishihara <yuya@tcha.org>
parents:
37464
diff
changeset
|
176 infd, inname = pycompat.mkstemp(prefix='hg-filter-in-') |
36843
5bc7ff103081
py3: use r'' instead of sysstr('') to get around code transformer
Yuya Nishihara <yuya@tcha.org>
parents:
36840
diff
changeset
|
177 fp = os.fdopen(infd, r'wb') |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
178 fp.write(s) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
179 fp.close() |
38197
aac4be30e250
py3: wrap tempfile.mkstemp() to use bytes path
Yuya Nishihara <yuya@tcha.org>
parents:
37464
diff
changeset
|
180 outfd, outname = pycompat.mkstemp(prefix='hg-filter-out-') |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
181 os.close(outfd) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
182 cmd = cmd.replace('INFILE', inname) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
183 cmd = cmd.replace('OUTFILE', outname) |
37461
538353b80676
procutil: fix error message of tempfile filter
Yuya Nishihara <yuya@tcha.org>
parents:
37460
diff
changeset
|
184 code = system(cmd) |
30647
e995f00a9e9a
py3: replace sys.platform with pycompat.sysplatform (part 2 of 2)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30644
diff
changeset
|
185 if pycompat.sysplatform == 'OpenVMS' and code & 1: |
4720
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
186 code = 0 |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
187 if code: |
37099
895f209b593b
util: use error.Abort instead of local alias
Yuya Nishihara <yuya@tcha.org>
parents:
37098
diff
changeset
|
188 raise error.Abort(_("command '%s' failed: %s") % |
37463
bbd240f81ac5
procutil: make explainexit() simply return a message (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37462
diff
changeset
|
189 (cmd, explainexit(code))) |
37120
e7b517809ebc
util: stop using readfile() in tempfilter()
Yuya Nishihara <yuya@tcha.org>
parents:
37119
diff
changeset
|
190 with open(outname, 'rb') as fp: |
e7b517809ebc
util: stop using readfile() in tempfilter()
Yuya Nishihara <yuya@tcha.org>
parents:
37119
diff
changeset
|
191 return fp.read() |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
192 finally: |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
193 try: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
194 if inname: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
195 os.unlink(inname) |
14004
97ed99d1f419
eliminate various naked except clauses
Idan Kamara <idankk86@gmail.com>
parents:
13985
diff
changeset
|
196 except OSError: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
197 pass |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
198 try: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
199 if outname: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
200 os.unlink(outname) |
14004
97ed99d1f419
eliminate various naked except clauses
Idan Kamara <idankk86@gmail.com>
parents:
13985
diff
changeset
|
201 except OSError: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
202 pass |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
203 |
37119
7ccc9b8aca4c
util: mark filtertable as private constant
Yuya Nishihara <yuya@tcha.org>
parents:
37118
diff
changeset
|
204 _filtertable = { |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
205 'tempfile:': tempfilter, |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
206 'pipe:': pipefilter, |
37119
7ccc9b8aca4c
util: mark filtertable as private constant
Yuya Nishihara <yuya@tcha.org>
parents:
37118
diff
changeset
|
207 } |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
208 |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
209 def filter(s, cmd): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
210 "filter a string through a command that transforms its input to its output" |
37119
7ccc9b8aca4c
util: mark filtertable as private constant
Yuya Nishihara <yuya@tcha.org>
parents:
37118
diff
changeset
|
211 for name, fn in _filtertable.iteritems(): |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
212 if cmd.startswith(name): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
213 return fn(s, cmd[len(name):].lstrip()) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
214 return pipefilter(s, cmd) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
215 |
14228
116de1da2154
rename util.main_is_frozen to mainfrozen
Adrian Buehlmann <adrian@cadifra.com>
parents:
14167
diff
changeset
|
216 def mainfrozen(): |
6499
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
217 """return True if we are a frozen executable. |
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
218 |
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
219 The code supports py2exe (most common, Windows only) and tools/freeze |
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
220 (portable, not much used). |
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
221 """ |
37121
5be286db5fb5
procutil: move process/executable management functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37120
diff
changeset
|
222 return (pycompat.safehasattr(sys, "frozen") or # new py2exe |
5be286db5fb5
procutil: move process/executable management functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37120
diff
changeset
|
223 pycompat.safehasattr(sys, "importers") or # old py2exe |
41837
b275dbb60089
procutil: use a raw string for module name
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41284
diff
changeset
|
224 imp.is_frozen(r"__main__")) # tools/freeze |
6499
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
225 |
22632
db15bb2d6323
util: move _hgexecutable a few lines, closer to where it is used
Mads Kiilerich <madski@unity3d.com>
parents:
22245
diff
changeset
|
226 _hgexecutable = None |
db15bb2d6323
util: move _hgexecutable a few lines, closer to where it is used
Mads Kiilerich <madski@unity3d.com>
parents:
22245
diff
changeset
|
227 |
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
228 def hgexecutable(): |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
229 """return location of the 'hg' executable. |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
230 |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
231 Defaults to $HG or 'hg' in the search path. |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
232 """ |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
233 if _hgexecutable is None: |
30642
344e68882cd3
py3: replace os.environ with encoding.environ (part 4 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30630
diff
changeset
|
234 hg = encoding.environ.get('HG') |
36843
5bc7ff103081
py3: use r'' instead of sysstr('') to get around code transformer
Yuya Nishihara <yuya@tcha.org>
parents:
36840
diff
changeset
|
235 mainmod = sys.modules[r'__main__'] |
6500 | 236 if hg: |
14229
85fd8402cbc4
rename util.set_hgexecutable to _sethgexecutable
Adrian Buehlmann <adrian@cadifra.com>
parents:
14228
diff
changeset
|
237 _sethgexecutable(hg) |
14228
116de1da2154
rename util.main_is_frozen to mainfrozen
Adrian Buehlmann <adrian@cadifra.com>
parents:
14167
diff
changeset
|
238 elif mainfrozen(): |
27765
f1fb93eebb1d
util: adjust hgexecutable() to handle frozen Mercurial on OS X
Matt Harbison <matt_harbison@yahoo.com>
parents:
27764
diff
changeset
|
239 if getattr(sys, 'frozen', None) == 'macosx_app': |
f1fb93eebb1d
util: adjust hgexecutable() to handle frozen Mercurial on OS X
Matt Harbison <matt_harbison@yahoo.com>
parents:
27764
diff
changeset
|
240 # Env variable set by py2app |
30642
344e68882cd3
py3: replace os.environ with encoding.environ (part 4 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30630
diff
changeset
|
241 _sethgexecutable(encoding.environ['EXECUTABLEPATH']) |
27765
f1fb93eebb1d
util: adjust hgexecutable() to handle frozen Mercurial on OS X
Matt Harbison <matt_harbison@yahoo.com>
parents:
27764
diff
changeset
|
242 else: |
30672
10b17ed9b591
py3: replace sys.executable with pycompat.sysexecutable
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30647
diff
changeset
|
243 _sethgexecutable(pycompat.sysexecutable) |
40751
246b61bfdc2f
procutil: don't allow the main 'hg' script to be treated as the Windows exe
Matt Harbison <matt_harbison@yahoo.com>
parents:
40586
diff
changeset
|
244 elif (not pycompat.iswindows and os.path.basename( |
31091
2912b06905dc
py3: use pycompat.fsencode() to convert __file__ to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
31008
diff
changeset
|
245 pycompat.fsencode(getattr(mainmod, '__file__', ''))) == 'hg'): |
2912b06905dc
py3: use pycompat.fsencode() to convert __file__ to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
31008
diff
changeset
|
246 _sethgexecutable(pycompat.fsencode(mainmod.__file__)) |
6499
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
247 else: |
14271
4030630fb59c
rename util.find_exe to findexe
Adrian Buehlmann <adrian@cadifra.com>
parents:
14262
diff
changeset
|
248 exe = findexe('hg') or os.path.basename(sys.argv[0]) |
14229
85fd8402cbc4
rename util.set_hgexecutable to _sethgexecutable
Adrian Buehlmann <adrian@cadifra.com>
parents:
14228
diff
changeset
|
249 _sethgexecutable(exe) |
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
250 return _hgexecutable |
4686
849f011dbf79
Remember path to 'hg' executable and pass to external tools and hooks as $HG.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4673
diff
changeset
|
251 |
14229
85fd8402cbc4
rename util.set_hgexecutable to _sethgexecutable
Adrian Buehlmann <adrian@cadifra.com>
parents:
14228
diff
changeset
|
252 def _sethgexecutable(path): |
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
253 """set location of the 'hg' executable""" |
4686
849f011dbf79
Remember path to 'hg' executable and pass to external tools and hooks as $HG.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4673
diff
changeset
|
254 global _hgexecutable |
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
255 _hgexecutable = path |
4686
849f011dbf79
Remember path to 'hg' executable and pass to external tools and hooks as $HG.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4673
diff
changeset
|
256 |
36801
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36799
diff
changeset
|
257 def _testfileno(f, stdf): |
26450
1138e1d05207
util.system: compare fileno to see if it needs stdout redirection
Yuya Nishihara <yuya@tcha.org>
parents:
26392
diff
changeset
|
258 fileno = getattr(f, 'fileno', None) |
36462
1ca4e86c7265
util: handle fileno() on Python 3 throwing io.UnsupportedOperation
Augie Fackler <augie@google.com>
parents:
36452
diff
changeset
|
259 try: |
36801
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36799
diff
changeset
|
260 return fileno and fileno() == stdf.fileno() |
36462
1ca4e86c7265
util: handle fileno() on Python 3 throwing io.UnsupportedOperation
Augie Fackler <augie@google.com>
parents:
36452
diff
changeset
|
261 except io.UnsupportedOperation: |
1ca4e86c7265
util: handle fileno() on Python 3 throwing io.UnsupportedOperation
Augie Fackler <augie@google.com>
parents:
36452
diff
changeset
|
262 return False # fileno() raised UnsupportedOperation |
26450
1138e1d05207
util.system: compare fileno to see if it needs stdout redirection
Yuya Nishihara <yuya@tcha.org>
parents:
26392
diff
changeset
|
263 |
36801
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36799
diff
changeset
|
264 def isstdin(f): |
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36799
diff
changeset
|
265 return _testfileno(f, sys.__stdin__) |
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36799
diff
changeset
|
266 |
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36799
diff
changeset
|
267 def isstdout(f): |
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36799
diff
changeset
|
268 return _testfileno(f, sys.__stdout__) |
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36799
diff
changeset
|
269 |
37126
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
270 def protectstdio(uin, uout): |
37222
7f78de1c93aa
procutil: redirect ui.fout to stderr while stdio is protected
Yuya Nishihara <yuya@tcha.org>
parents:
37221
diff
changeset
|
271 """Duplicate streams and redirect original if (uin, uout) are stdio |
7f78de1c93aa
procutil: redirect ui.fout to stderr while stdio is protected
Yuya Nishihara <yuya@tcha.org>
parents:
37221
diff
changeset
|
272 |
7f78de1c93aa
procutil: redirect ui.fout to stderr while stdio is protected
Yuya Nishihara <yuya@tcha.org>
parents:
37221
diff
changeset
|
273 If uin is stdin, it's redirected to /dev/null. If uout is stdout, it's |
7f78de1c93aa
procutil: redirect ui.fout to stderr while stdio is protected
Yuya Nishihara <yuya@tcha.org>
parents:
37221
diff
changeset
|
274 redirected to stderr so the output is still readable. |
37126
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
275 |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
276 Returns (fin, fout) which point to the original (uin, uout) fds, but |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
277 may be copy of (uin, uout). The returned streams can be considered |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
278 "owned" in that print(), exec(), etc. never reach to them. |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
279 """ |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
280 uout.flush() |
37221
ac71cbad5da3
procutil: unroll uin/uout loop in protectstdio()
Yuya Nishihara <yuya@tcha.org>
parents:
37127
diff
changeset
|
281 fin, fout = uin, uout |
38799
e5724be689b3
procutil: compare fd number to see if stdio protection is needed (issue5992)
Yuya Nishihara <yuya@tcha.org>
parents:
38528
diff
changeset
|
282 if _testfileno(uin, stdin): |
37221
ac71cbad5da3
procutil: unroll uin/uout loop in protectstdio()
Yuya Nishihara <yuya@tcha.org>
parents:
37127
diff
changeset
|
283 newfd = os.dup(uin.fileno()) |
37222
7f78de1c93aa
procutil: redirect ui.fout to stderr while stdio is protected
Yuya Nishihara <yuya@tcha.org>
parents:
37221
diff
changeset
|
284 nullfd = os.open(os.devnull, os.O_RDONLY) |
37221
ac71cbad5da3
procutil: unroll uin/uout loop in protectstdio()
Yuya Nishihara <yuya@tcha.org>
parents:
37127
diff
changeset
|
285 os.dup2(nullfd, uin.fileno()) |
37222
7f78de1c93aa
procutil: redirect ui.fout to stderr while stdio is protected
Yuya Nishihara <yuya@tcha.org>
parents:
37221
diff
changeset
|
286 os.close(nullfd) |
37221
ac71cbad5da3
procutil: unroll uin/uout loop in protectstdio()
Yuya Nishihara <yuya@tcha.org>
parents:
37127
diff
changeset
|
287 fin = os.fdopen(newfd, r'rb') |
38799
e5724be689b3
procutil: compare fd number to see if stdio protection is needed (issue5992)
Yuya Nishihara <yuya@tcha.org>
parents:
38528
diff
changeset
|
288 if _testfileno(uout, stdout): |
37221
ac71cbad5da3
procutil: unroll uin/uout loop in protectstdio()
Yuya Nishihara <yuya@tcha.org>
parents:
37127
diff
changeset
|
289 newfd = os.dup(uout.fileno()) |
37222
7f78de1c93aa
procutil: redirect ui.fout to stderr while stdio is protected
Yuya Nishihara <yuya@tcha.org>
parents:
37221
diff
changeset
|
290 os.dup2(stderr.fileno(), uout.fileno()) |
37221
ac71cbad5da3
procutil: unroll uin/uout loop in protectstdio()
Yuya Nishihara <yuya@tcha.org>
parents:
37127
diff
changeset
|
291 fout = os.fdopen(newfd, r'wb') |
ac71cbad5da3
procutil: unroll uin/uout loop in protectstdio()
Yuya Nishihara <yuya@tcha.org>
parents:
37127
diff
changeset
|
292 return fin, fout |
37126
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
293 |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
294 def restorestdio(uin, uout, fin, fout): |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
295 """Restore (uin, uout) streams from possibly duplicated (fin, fout)""" |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
296 uout.flush() |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
297 for f, uif in [(fin, uin), (fout, uout)]: |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
298 if f is not uif: |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
299 os.dup2(f.fileno(), uif.fileno()) |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
300 f.close() |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
301 |
30736
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30672
diff
changeset
|
302 def shellenviron(environ=None): |
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30672
diff
changeset
|
303 """return environ with optional override, useful for shelling out""" |
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30672
diff
changeset
|
304 def py2shell(val): |
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30672
diff
changeset
|
305 'convert python object into string that is useful to shell' |
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30672
diff
changeset
|
306 if val is None or val is False: |
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30672
diff
changeset
|
307 return '0' |
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30672
diff
changeset
|
308 if val is True: |
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30672
diff
changeset
|
309 return '1' |
36448
d26b0bedfaa4
util: use pycompat.bytestr() instead of str()
Augie Fackler <augie@google.com>
parents:
36445
diff
changeset
|
310 return pycompat.bytestr(val) |
30736
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30672
diff
changeset
|
311 env = dict(encoding.environ) |
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30672
diff
changeset
|
312 if environ: |
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30672
diff
changeset
|
313 env.update((k, py2shell(v)) for k, v in environ.iteritems()) |
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30672
diff
changeset
|
314 env['HG'] = hgexecutable() |
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30672
diff
changeset
|
315 return env |
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30672
diff
changeset
|
316 |
38495
72286f9e324f
procutil: add a shim for translating shell commands to native commands
Matt Harbison <matt_harbison@yahoo.com>
parents:
38459
diff
changeset
|
317 if pycompat.iswindows: |
72286f9e324f
procutil: add a shim for translating shell commands to native commands
Matt Harbison <matt_harbison@yahoo.com>
parents:
38459
diff
changeset
|
318 def shelltonative(cmd, env): |
72286f9e324f
procutil: add a shim for translating shell commands to native commands
Matt Harbison <matt_harbison@yahoo.com>
parents:
38459
diff
changeset
|
319 return platform.shelltocmdexe(cmd, shellenviron(env)) |
39678
50f46b771921
py3: partially fix pager spawning on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
38528
diff
changeset
|
320 |
50f46b771921
py3: partially fix pager spawning on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
38528
diff
changeset
|
321 tonativestr = encoding.strfromlocal |
38495
72286f9e324f
procutil: add a shim for translating shell commands to native commands
Matt Harbison <matt_harbison@yahoo.com>
parents:
38459
diff
changeset
|
322 else: |
72286f9e324f
procutil: add a shim for translating shell commands to native commands
Matt Harbison <matt_harbison@yahoo.com>
parents:
38459
diff
changeset
|
323 def shelltonative(cmd, env): |
72286f9e324f
procutil: add a shim for translating shell commands to native commands
Matt Harbison <matt_harbison@yahoo.com>
parents:
38459
diff
changeset
|
324 return cmd |
72286f9e324f
procutil: add a shim for translating shell commands to native commands
Matt Harbison <matt_harbison@yahoo.com>
parents:
38459
diff
changeset
|
325 |
39678
50f46b771921
py3: partially fix pager spawning on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
38528
diff
changeset
|
326 tonativestr = pycompat.identity |
50f46b771921
py3: partially fix pager spawning on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
38528
diff
changeset
|
327 |
50f46b771921
py3: partially fix pager spawning on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
38528
diff
changeset
|
328 def tonativeenv(env): |
50f46b771921
py3: partially fix pager spawning on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
38528
diff
changeset
|
329 '''convert the environment from bytes to strings suitable for Popen(), etc. |
50f46b771921
py3: partially fix pager spawning on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
38528
diff
changeset
|
330 ''' |
50f46b771921
py3: partially fix pager spawning on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
38528
diff
changeset
|
331 return pycompat.rapply(tonativestr, env) |
50f46b771921
py3: partially fix pager spawning on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
38528
diff
changeset
|
332 |
31125
3f8f53190d6a
chg: deduplicate error handling of ui.system()
Yuya Nishihara <yuya@tcha.org>
parents:
31091
diff
changeset
|
333 def system(cmd, environ=None, cwd=None, out=None): |
1882
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
334 '''enhanced shell command execution. |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
335 run with environment maybe modified, maybe in different dir. |
508 | 336 |
11469
c37f35d7f2f5
http: deliver hook output to client
Maxim Khitrov <mkhitrov@gmail.com>
parents:
11297
diff
changeset
|
337 if out is specified, it is assumed to be a file-like object that has a |
c37f35d7f2f5
http: deliver hook output to client
Maxim Khitrov <mkhitrov@gmail.com>
parents:
11297
diff
changeset
|
338 write() method. stdout and stderr will be redirected to out.''' |
13439
d724a69309e0
util: flush stdout before calling external processes
Mads Kiilerich <mads@kiilerich.com>
parents:
13400
diff
changeset
|
339 try: |
30482
39d13b8c101d
py3: bulk replace sys.stdin/out/err by util's
Yuya Nishihara <yuya@tcha.org>
parents:
30481
diff
changeset
|
340 stdout.flush() |
13439
d724a69309e0
util: flush stdout before calling external processes
Mads Kiilerich <mads@kiilerich.com>
parents:
13400
diff
changeset
|
341 except Exception: |
d724a69309e0
util: flush stdout before calling external processes
Mads Kiilerich <mads@kiilerich.com>
parents:
13400
diff
changeset
|
342 pass |
13188
6c9345f9edca
util: concentrate quoting knowledge to windows.py quotecommand()
Steve Borho <steve@borho.org>
parents:
13128
diff
changeset
|
343 cmd = quotecommand(cmd) |
32904
19b0fd4b5570
plan9: drop py26 hacks
Matt Harbison <matt_harbison@yahoo.com>
parents:
32835
diff
changeset
|
344 env = shellenviron(environ) |
36801
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36799
diff
changeset
|
345 if out is None or isstdout(out): |
39841
f1d6021453c2
py3: remove a couple of superfluous calls to pycompat.rapply()
Matt Harbison <matt_harbison@yahoo.com>
parents:
39831
diff
changeset
|
346 rc = subprocess.call(tonativestr(cmd), |
39831
c31ce080eb75
py3: convert arguments, cwd and env to native strings when spawning subprocess
Matt Harbison <matt_harbison@yahoo.com>
parents:
39678
diff
changeset
|
347 shell=True, close_fds=closefds, |
c31ce080eb75
py3: convert arguments, cwd and env to native strings when spawning subprocess
Matt Harbison <matt_harbison@yahoo.com>
parents:
39678
diff
changeset
|
348 env=tonativeenv(env), |
c31ce080eb75
py3: convert arguments, cwd and env to native strings when spawning subprocess
Matt Harbison <matt_harbison@yahoo.com>
parents:
39678
diff
changeset
|
349 cwd=pycompat.rapply(tonativestr, cwd)) |
11469
c37f35d7f2f5
http: deliver hook output to client
Maxim Khitrov <mkhitrov@gmail.com>
parents:
11297
diff
changeset
|
350 else: |
39841
f1d6021453c2
py3: remove a couple of superfluous calls to pycompat.rapply()
Matt Harbison <matt_harbison@yahoo.com>
parents:
39831
diff
changeset
|
351 proc = subprocess.Popen(tonativestr(cmd), |
39831
c31ce080eb75
py3: convert arguments, cwd and env to native strings when spawning subprocess
Matt Harbison <matt_harbison@yahoo.com>
parents:
39678
diff
changeset
|
352 shell=True, close_fds=closefds, |
c31ce080eb75
py3: convert arguments, cwd and env to native strings when spawning subprocess
Matt Harbison <matt_harbison@yahoo.com>
parents:
39678
diff
changeset
|
353 env=tonativeenv(env), |
c31ce080eb75
py3: convert arguments, cwd and env to native strings when spawning subprocess
Matt Harbison <matt_harbison@yahoo.com>
parents:
39678
diff
changeset
|
354 cwd=pycompat.rapply(tonativestr, cwd), |
c31ce080eb75
py3: convert arguments, cwd and env to native strings when spawning subprocess
Matt Harbison <matt_harbison@yahoo.com>
parents:
39678
diff
changeset
|
355 stdout=subprocess.PIPE, |
32904
19b0fd4b5570
plan9: drop py26 hacks
Matt Harbison <matt_harbison@yahoo.com>
parents:
32835
diff
changeset
|
356 stderr=subprocess.STDOUT) |
19b0fd4b5570
plan9: drop py26 hacks
Matt Harbison <matt_harbison@yahoo.com>
parents:
32835
diff
changeset
|
357 for line in iter(proc.stdout.readline, ''): |
19b0fd4b5570
plan9: drop py26 hacks
Matt Harbison <matt_harbison@yahoo.com>
parents:
32835
diff
changeset
|
358 out.write(line) |
19b0fd4b5570
plan9: drop py26 hacks
Matt Harbison <matt_harbison@yahoo.com>
parents:
32835
diff
changeset
|
359 proc.wait() |
19b0fd4b5570
plan9: drop py26 hacks
Matt Harbison <matt_harbison@yahoo.com>
parents:
32835
diff
changeset
|
360 rc = proc.returncode |
19b0fd4b5570
plan9: drop py26 hacks
Matt Harbison <matt_harbison@yahoo.com>
parents:
32835
diff
changeset
|
361 if pycompat.sysplatform == 'OpenVMS' and rc & 1: |
19b0fd4b5570
plan9: drop py26 hacks
Matt Harbison <matt_harbison@yahoo.com>
parents:
32835
diff
changeset
|
362 rc = 0 |
9517
4368f582c806
util.system: Use subprocess instead of os.system
Mads Kiilerich <mads@kiilerich.com>
parents:
9508
diff
changeset
|
363 return rc |
1880
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
364 |
6007
090b1a665901
filemerge: add config item for GUI tools
Matt Mackall <mpm@selenic.com>
parents:
6006
diff
changeset
|
365 def gui(): |
090b1a665901
filemerge: add config item for GUI tools
Matt Mackall <mpm@selenic.com>
parents:
6006
diff
changeset
|
366 '''Are we running in a GUI?''' |
34647 | 367 if pycompat.isdarwin: |
30642
344e68882cd3
py3: replace os.environ with encoding.environ (part 4 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30630
diff
changeset
|
368 if 'SSH_CONNECTION' in encoding.environ: |
13734
16118b4859a1
util: add Mac-specific check whether we're in a GUI session (issue2553)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13439
diff
changeset
|
369 # handle SSH access to a box where the user is logged in |
16118b4859a1
util: add Mac-specific check whether we're in a GUI session (issue2553)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13439
diff
changeset
|
370 return False |
16118b4859a1
util: add Mac-specific check whether we're in a GUI session (issue2553)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13439
diff
changeset
|
371 elif getattr(osutil, 'isgui', None): |
16118b4859a1
util: add Mac-specific check whether we're in a GUI session (issue2553)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13439
diff
changeset
|
372 # check if a CoreGraphics session is available |
16118b4859a1
util: add Mac-specific check whether we're in a GUI session (issue2553)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13439
diff
changeset
|
373 return osutil.isgui() |
16118b4859a1
util: add Mac-specific check whether we're in a GUI session (issue2553)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13439
diff
changeset
|
374 else: |
16118b4859a1
util: add Mac-specific check whether we're in a GUI session (issue2553)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13439
diff
changeset
|
375 # pure build; use a safe default |
16118b4859a1
util: add Mac-specific check whether we're in a GUI session (issue2553)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13439
diff
changeset
|
376 return True |
16118b4859a1
util: add Mac-specific check whether we're in a GUI session (issue2553)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13439
diff
changeset
|
377 else: |
34645 | 378 return pycompat.iswindows or encoding.environ.get("DISPLAY") |
6007
090b1a665901
filemerge: add config item for GUI tools
Matt Mackall <mpm@selenic.com>
parents:
6006
diff
changeset
|
379 |
10239
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10199
diff
changeset
|
380 def hgcmd(): |
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10199
diff
changeset
|
381 """Return the command used to execute current hg |
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10199
diff
changeset
|
382 |
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10199
diff
changeset
|
383 This is different from hgexecutable() because on Windows we want |
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10199
diff
changeset
|
384 to avoid things opening new shell windows like batch files, so we |
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10199
diff
changeset
|
385 get either the python call or current executable. |
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10199
diff
changeset
|
386 """ |
14228
116de1da2154
rename util.main_is_frozen to mainfrozen
Adrian Buehlmann <adrian@cadifra.com>
parents:
14167
diff
changeset
|
387 if mainfrozen(): |
27766
198f78a52a2f
util: adjust hgcmd() to handle frozen Mercurial on OS X
Matt Harbison <matt_harbison@yahoo.com>
parents:
27765
diff
changeset
|
388 if getattr(sys, 'frozen', None) == 'macosx_app': |
198f78a52a2f
util: adjust hgcmd() to handle frozen Mercurial on OS X
Matt Harbison <matt_harbison@yahoo.com>
parents:
27765
diff
changeset
|
389 # Env variable set by py2app |
30642
344e68882cd3
py3: replace os.environ with encoding.environ (part 4 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30630
diff
changeset
|
390 return [encoding.environ['EXECUTABLEPATH']] |
27766
198f78a52a2f
util: adjust hgcmd() to handle frozen Mercurial on OS X
Matt Harbison <matt_harbison@yahoo.com>
parents:
27765
diff
changeset
|
391 else: |
30672
10b17ed9b591
py3: replace sys.executable with pycompat.sysexecutable
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30647
diff
changeset
|
392 return [pycompat.sysexecutable] |
37118
49d6ba67c93f
util: mark platform-specific gethgcmd() as private
Yuya Nishihara <yuya@tcha.org>
parents:
37102
diff
changeset
|
393 return _gethgcmd() |
10344
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
394 |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
395 def rundetached(args, condfn): |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
396 """Execute the argument list in a detached process. |
10422
600142e7a028
util: fix trailing whitespace found by check-code
Augie Fackler <durin42@gmail.com>
parents:
10344
diff
changeset
|
397 |
10344
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
398 condfn is a callable which is called repeatedly and should return |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
399 True once the child process is known to have started successfully. |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
400 At this point, the child process PID is returned. If the child |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
401 process fails to start or finishes before condfn() evaluates to |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
402 True, return -1. |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
403 """ |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
404 # Windows case is easier because the child process is either |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
405 # successfully starting and validating the condition or exiting |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
406 # on failure. We just poll on its PID. On Unix, if the child |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
407 # process fails to start, it will be left in a zombie state until |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
408 # the parent wait on it, which we cannot do since we expect a long |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
409 # running process on success. Instead we listen for SIGCHLD telling |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
410 # us our child process terminated. |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
411 terminated = set() |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
412 def handler(signum, frame): |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
413 terminated.add(os.wait()) |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
414 prevhandler = None |
14968
b7dbe957585c
util: use safehasattr or getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14942
diff
changeset
|
415 SIGCHLD = getattr(signal, 'SIGCHLD', None) |
b7dbe957585c
util: use safehasattr or getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14942
diff
changeset
|
416 if SIGCHLD is not None: |
b7dbe957585c
util: use safehasattr or getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14942
diff
changeset
|
417 prevhandler = signal.signal(SIGCHLD, handler) |
10344
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
418 try: |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
419 pid = spawndetached(args) |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
420 while not condfn(): |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
421 if ((pid in terminated or not testpid(pid)) |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
422 and not condfn()): |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
423 return -1 |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
424 time.sleep(0.1) |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
425 return pid |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
426 finally: |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
427 if prevhandler is not None: |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
428 signal.signal(signal.SIGCHLD, prevhandler) |
38528
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
429 |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
430 @contextlib.contextmanager |
41079
8ecb17b7f432
procutil: correct spelling of uninterruptable -> uninterruptible
Kyle Lippincott <spectral@google.com>
parents:
40751
diff
changeset
|
431 def uninterruptible(warn): |
38528
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
432 """Inhibit SIGINT handling on a region of code. |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
433 |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
434 Note that if this is called in a non-main thread, it turns into a no-op. |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
435 |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
436 Args: |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
437 warn: A callable which takes no arguments, and returns True if the |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
438 previous signal handling should be restored. |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
439 """ |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
440 |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
441 oldsiginthandler = [signal.getsignal(signal.SIGINT)] |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
442 shouldbail = [] |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
443 |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
444 def disabledsiginthandler(*args): |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
445 if warn(): |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
446 signal.signal(signal.SIGINT, oldsiginthandler[0]) |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
447 del oldsiginthandler[0] |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
448 shouldbail.append(True) |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
449 |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
450 try: |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
451 try: |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
452 signal.signal(signal.SIGINT, disabledsiginthandler) |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
453 except ValueError: |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
454 # wrong thread, oh well, we tried |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
455 del oldsiginthandler[0] |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
456 yield |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
457 finally: |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
458 if oldsiginthandler: |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
459 signal.signal(signal.SIGINT, oldsiginthandler[0]) |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
460 if shouldbail: |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
461 raise KeyboardInterrupt |
40547
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
462 |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
463 if pycompat.iswindows: |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
464 # no fork on Windows, but we can create a detached process |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
465 # https://msdn.microsoft.com/en-us/library/windows/desktop/ms684863.aspx |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
466 # No stdlib constant exists for this value |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
467 DETACHED_PROCESS = 0x00000008 |
40586
1d3bed7d2923
procutil: import concerns about creationflags on Windows from D1701
Boris Feld <boris.feld@octobus.net>
parents:
40548
diff
changeset
|
468 # Following creation flags might create a console GUI window. |
1d3bed7d2923
procutil: import concerns about creationflags on Windows from D1701
Boris Feld <boris.feld@octobus.net>
parents:
40548
diff
changeset
|
469 # Using subprocess.CREATE_NEW_CONSOLE might helps. |
1d3bed7d2923
procutil: import concerns about creationflags on Windows from D1701
Boris Feld <boris.feld@octobus.net>
parents:
40548
diff
changeset
|
470 # See https://phab.mercurial-scm.org/D1701 for discussion |
40547
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
471 _creationflags = DETACHED_PROCESS | subprocess.CREATE_NEW_PROCESS_GROUP |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
472 |
42511
ca1014ad3de4
procutil: allow callers of runbgcommand to assume the process starts
Augie Fackler <augie@google.com>
parents:
41837
diff
changeset
|
473 def runbgcommand( |
ca1014ad3de4
procutil: allow callers of runbgcommand to assume the process starts
Augie Fackler <augie@google.com>
parents:
41837
diff
changeset
|
474 script, env, shell=False, stdout=None, stderr=None, ensurestart=True): |
40547
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
475 '''Spawn a command without waiting for it to finish.''' |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
476 # we can't use close_fds *and* redirect stdin. I'm not sure that we |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
477 # need to because the detached process has no console connection. |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
478 subprocess.Popen( |
40548
8fab95aa5280
procutil: port over windows encoding fixes from logtoprocess
Augie Fackler <augie@google.com>
parents:
40547
diff
changeset
|
479 tonativestr(script), |
8fab95aa5280
procutil: port over windows encoding fixes from logtoprocess
Augie Fackler <augie@google.com>
parents:
40547
diff
changeset
|
480 shell=shell, env=tonativeenv(env), close_fds=True, |
8fab95aa5280
procutil: port over windows encoding fixes from logtoprocess
Augie Fackler <augie@google.com>
parents:
40547
diff
changeset
|
481 creationflags=_creationflags, stdout=stdout, |
8fab95aa5280
procutil: port over windows encoding fixes from logtoprocess
Augie Fackler <augie@google.com>
parents:
40547
diff
changeset
|
482 stderr=stderr) |
40547
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
483 else: |
42511
ca1014ad3de4
procutil: allow callers of runbgcommand to assume the process starts
Augie Fackler <augie@google.com>
parents:
41837
diff
changeset
|
484 def runbgcommand( |
ca1014ad3de4
procutil: allow callers of runbgcommand to assume the process starts
Augie Fackler <augie@google.com>
parents:
41837
diff
changeset
|
485 cmd, env, shell=False, stdout=None, stderr=None, ensurestart=True): |
40547
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
486 '''Spawn a command without waiting for it to finish.''' |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
487 # double-fork to completely detach from the parent process |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
488 # based on http://code.activestate.com/recipes/278731 |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
489 pid = os.fork() |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
490 if pid: |
42511
ca1014ad3de4
procutil: allow callers of runbgcommand to assume the process starts
Augie Fackler <augie@google.com>
parents:
41837
diff
changeset
|
491 if not ensurestart: |
ca1014ad3de4
procutil: allow callers of runbgcommand to assume the process starts
Augie Fackler <augie@google.com>
parents:
41837
diff
changeset
|
492 return |
40547
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
493 # Parent process |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
494 (_pid, status) = os.waitpid(pid, 0) |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
495 if os.WIFEXITED(status): |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
496 returncode = os.WEXITSTATUS(status) |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
497 else: |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
498 returncode = -os.WTERMSIG(status) |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
499 if returncode != 0: |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
500 # The child process's return code is 0 on success, an errno |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
501 # value on failure, or 255 if we don't have a valid errno |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
502 # value. |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
503 # |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
504 # (It would be slightly nicer to return the full exception info |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
505 # over a pipe as the subprocess module does. For now it |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
506 # doesn't seem worth adding that complexity here, though.) |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
507 if returncode == 255: |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
508 returncode = errno.EINVAL |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
509 raise OSError(returncode, 'error running %r: %s' % |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
510 (cmd, os.strerror(returncode))) |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
511 return |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
512 |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
513 returncode = 255 |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
514 try: |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
515 # Start a new session |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
516 os.setsid() |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
517 |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
518 stdin = open(os.devnull, 'r') |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
519 if stdout is None: |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
520 stdout = open(os.devnull, 'w') |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
521 if stderr is None: |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
522 stderr = open(os.devnull, 'w') |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
523 |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
524 # connect stdin to devnull to make sure the subprocess can't |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
525 # muck up that stream for mercurial. |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
526 subprocess.Popen( |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
527 cmd, shell=shell, env=env, close_fds=True, |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
528 stdin=stdin, stdout=stdout, stderr=stderr) |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
529 returncode = 0 |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
530 except EnvironmentError as ex: |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
531 returncode = (ex.errno & 0xff) |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
532 if returncode == 0: |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
533 # This shouldn't happen, but just in case make sure the |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
534 # return code is never 0 here. |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
535 returncode = 255 |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
536 except Exception: |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
537 returncode = 255 |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
538 finally: |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
539 # mission accomplished, this child needs to exit and not |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
540 # continue the hg process here. |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
541 os._exit(returncode) |