Mercurial > public > mercurial-scm > hg-stable
annotate mercurial/utils/procutil.py @ 52393:07a5a249faf8
procutil: stop using the `pycompat.open()` shim
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Wed, 04 Dec 2024 20:43:20 -0500 |
parents | f4733654f144 |
children | 1b9b6b4aa929 |
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> |
46819
d4ba4d51f85f
contributor: change mentions of mpm to olivia
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46412
diff
changeset
|
4 # Copyright 2005-2007 Olivia Mackall <olivia@selenic.com> |
8226
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 |
51901
f4733654f144
typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents:
51762
diff
changeset
|
10 from __future__ import annotations |
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 |
36462
1ca4e86c7265
util: handle fileno() on Python 3 throwing io.UnsupportedOperation
Augie Fackler <augie@google.com>
parents:
36452
diff
changeset
|
14 import io |
27358
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
15 import os |
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
16 import signal |
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
17 import subprocess |
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
18 import sys |
44764
ed684a82e29b
procutil: always waiting on child processes to prevent zombies with 'hg serve'
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
43918
diff
changeset
|
19 import threading |
27358
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
20 import time |
3769 | 21 |
49888
8147abc05794
pytype: stop excluding mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
49377
diff
changeset
|
22 from typing import ( |
8147abc05794
pytype: stop excluding mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
49377
diff
changeset
|
23 BinaryIO, |
8147abc05794
pytype: stop excluding mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
49377
diff
changeset
|
24 ) |
8147abc05794
pytype: stop excluding mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
49377
diff
changeset
|
25 |
37121
5be286db5fb5
procutil: move process/executable management functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37120
diff
changeset
|
26 from ..i18n import _ |
5be286db5fb5
procutil: move process/executable management functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37120
diff
changeset
|
27 |
5be286db5fb5
procutil: move process/executable management functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37120
diff
changeset
|
28 from .. import ( |
27358
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
29 encoding, |
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
30 error, |
32406
a9c71d578a1c
osutil: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32346
diff
changeset
|
31 policy, |
28818
6041fb8f2da8
pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
28497
diff
changeset
|
32 pycompat, |
49888
8147abc05794
pytype: stop excluding mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
49377
diff
changeset
|
33 typelib, |
37086
f99d64e8a4e4
stringutil: move generic string helpers to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37085
diff
changeset
|
34 ) |
3769 | 35 |
43712
664e24207728
procutil: move mainfrozen() to new resourceutil.py
Martin von Zweigbergk <martinvonz@google.com>
parents:
43701
diff
changeset
|
36 # Import like this to keep import-checker happy |
664e24207728
procutil: move mainfrozen() to new resourceutil.py
Martin von Zweigbergk <martinvonz@google.com>
parents:
43701
diff
changeset
|
37 from ..utils import resourceutil |
664e24207728
procutil: move mainfrozen() to new resourceutil.py
Martin von Zweigbergk <martinvonz@google.com>
parents:
43701
diff
changeset
|
38 |
43554
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43551
diff
changeset
|
39 osutil = policy.importmod('osutil') |
32245
4462a981e8df
base85: proxy through util module
Yuya Nishihara <yuya@tcha.org>
parents:
32203
diff
changeset
|
40 |
45045
c88577199023
procutil: split import and reassignment
Manuel Jacob <me@manueljacob.de>
parents:
45044
diff
changeset
|
41 if pycompat.iswindows: |
c88577199023
procutil: split import and reassignment
Manuel Jacob <me@manueljacob.de>
parents:
45044
diff
changeset
|
42 from .. import windows as platform |
c88577199023
procutil: split import and reassignment
Manuel Jacob <me@manueljacob.de>
parents:
45044
diff
changeset
|
43 else: |
c88577199023
procutil: split import and reassignment
Manuel Jacob <me@manueljacob.de>
parents:
45044
diff
changeset
|
44 from .. import posix as platform |
c88577199023
procutil: split import and reassignment
Manuel Jacob <me@manueljacob.de>
parents:
45044
diff
changeset
|
45 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
46 |
30908
3a4c0905f357
util: always force line buffered stdout when stdout is a tty (BC)
Simon Farnsworth <simonfar@fb.com>
parents:
30854
diff
changeset
|
47 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
|
48 try: |
3a4c0905f357
util: always force line buffered stdout when stdout is a tty (BC)
Simon Farnsworth <simonfar@fb.com>
parents:
30854
diff
changeset
|
49 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
|
50 except AttributeError: |
3a4c0905f357
util: always force line buffered stdout when stdout is a tty (BC)
Simon Farnsworth <simonfar@fb.com>
parents:
30854
diff
changeset
|
51 return False |
3a4c0905f357
util: always force line buffered stdout when stdout is a tty (BC)
Simon Farnsworth <simonfar@fb.com>
parents:
30854
diff
changeset
|
52 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
53 |
46174
a1601ff3877c
procutil: introduce pseudo file object that just raises EBADF
Yuya Nishihara <yuya@tcha.org>
parents:
46103
diff
changeset
|
54 class BadFile(io.RawIOBase): |
a1601ff3877c
procutil: introduce pseudo file object that just raises EBADF
Yuya Nishihara <yuya@tcha.org>
parents:
46103
diff
changeset
|
55 """Dummy file object to simulate closed stdio behavior""" |
a1601ff3877c
procutil: introduce pseudo file object that just raises EBADF
Yuya Nishihara <yuya@tcha.org>
parents:
46103
diff
changeset
|
56 |
a1601ff3877c
procutil: introduce pseudo file object that just raises EBADF
Yuya Nishihara <yuya@tcha.org>
parents:
46103
diff
changeset
|
57 def readinto(self, b): |
a1601ff3877c
procutil: introduce pseudo file object that just raises EBADF
Yuya Nishihara <yuya@tcha.org>
parents:
46103
diff
changeset
|
58 raise IOError(errno.EBADF, 'Bad file descriptor') |
a1601ff3877c
procutil: introduce pseudo file object that just raises EBADF
Yuya Nishihara <yuya@tcha.org>
parents:
46103
diff
changeset
|
59 |
a1601ff3877c
procutil: introduce pseudo file object that just raises EBADF
Yuya Nishihara <yuya@tcha.org>
parents:
46103
diff
changeset
|
60 def write(self, b): |
a1601ff3877c
procutil: introduce pseudo file object that just raises EBADF
Yuya Nishihara <yuya@tcha.org>
parents:
46103
diff
changeset
|
61 raise IOError(errno.EBADF, 'Bad file descriptor') |
a1601ff3877c
procutil: introduce pseudo file object that just raises EBADF
Yuya Nishihara <yuya@tcha.org>
parents:
46103
diff
changeset
|
62 |
a1601ff3877c
procutil: introduce pseudo file object that just raises EBADF
Yuya Nishihara <yuya@tcha.org>
parents:
46103
diff
changeset
|
63 |
49037
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
49004
diff
changeset
|
64 class LineBufferedWrapper: |
45042
2bfbd7d2c204
procutil: define LineBufferedWrapper on all Python versions
Manuel Jacob <me@manueljacob.de>
parents:
45020
diff
changeset
|
65 def __init__(self, orig): |
2bfbd7d2c204
procutil: define LineBufferedWrapper on all Python versions
Manuel Jacob <me@manueljacob.de>
parents:
45020
diff
changeset
|
66 self.orig = orig |
44991
f9734b2d59cc
py3: make stdout line-buffered if connected to a TTY
Manuel Jacob <me@manueljacob.de>
parents:
44926
diff
changeset
|
67 |
45042
2bfbd7d2c204
procutil: define LineBufferedWrapper on all Python versions
Manuel Jacob <me@manueljacob.de>
parents:
45020
diff
changeset
|
68 def __getattr__(self, attr): |
2bfbd7d2c204
procutil: define LineBufferedWrapper on all Python versions
Manuel Jacob <me@manueljacob.de>
parents:
45020
diff
changeset
|
69 return getattr(self.orig, attr) |
44991
f9734b2d59cc
py3: make stdout line-buffered if connected to a TTY
Manuel Jacob <me@manueljacob.de>
parents:
44926
diff
changeset
|
70 |
45042
2bfbd7d2c204
procutil: define LineBufferedWrapper on all Python versions
Manuel Jacob <me@manueljacob.de>
parents:
45020
diff
changeset
|
71 def write(self, s): |
2bfbd7d2c204
procutil: define LineBufferedWrapper on all Python versions
Manuel Jacob <me@manueljacob.de>
parents:
45020
diff
changeset
|
72 orig = self.orig |
2bfbd7d2c204
procutil: define LineBufferedWrapper on all Python versions
Manuel Jacob <me@manueljacob.de>
parents:
45020
diff
changeset
|
73 res = orig.write(s) |
2bfbd7d2c204
procutil: define LineBufferedWrapper on all Python versions
Manuel Jacob <me@manueljacob.de>
parents:
45020
diff
changeset
|
74 if s.endswith(b'\n'): |
2bfbd7d2c204
procutil: define LineBufferedWrapper on all Python versions
Manuel Jacob <me@manueljacob.de>
parents:
45020
diff
changeset
|
75 orig.flush() |
2bfbd7d2c204
procutil: define LineBufferedWrapper on all Python versions
Manuel Jacob <me@manueljacob.de>
parents:
45020
diff
changeset
|
76 return res |
44991
f9734b2d59cc
py3: make stdout line-buffered if connected to a TTY
Manuel Jacob <me@manueljacob.de>
parents:
44926
diff
changeset
|
77 |
45042
2bfbd7d2c204
procutil: define LineBufferedWrapper on all Python versions
Manuel Jacob <me@manueljacob.de>
parents:
45020
diff
changeset
|
78 |
48526
333a2656e981
pytype: stop excluding procutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
46889
diff
changeset
|
79 # pytype: disable=attribute-error |
45042
2bfbd7d2c204
procutil: define LineBufferedWrapper on all Python versions
Manuel Jacob <me@manueljacob.de>
parents:
45020
diff
changeset
|
80 io.BufferedIOBase.register(LineBufferedWrapper) |
48526
333a2656e981
pytype: stop excluding procutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
46889
diff
changeset
|
81 # pytype: enable=attribute-error |
44991
f9734b2d59cc
py3: make stdout line-buffered if connected to a TTY
Manuel Jacob <me@manueljacob.de>
parents:
44926
diff
changeset
|
82 |
f9734b2d59cc
py3: make stdout line-buffered if connected to a TTY
Manuel Jacob <me@manueljacob.de>
parents:
44926
diff
changeset
|
83 |
45043
fd205a9c358a
procutil: factor out conditional creation of LineBufferedWrapper
Manuel Jacob <me@manueljacob.de>
parents:
45042
diff
changeset
|
84 def make_line_buffered(stream): |
49377
094a5fa3cf52
procutil: make stream detection in make_line_buffered more correct and strict
Manuel Jacob <me@manueljacob.de>
parents:
49139
diff
changeset
|
85 # First, check if we need to wrap the stream. |
094a5fa3cf52
procutil: make stream detection in make_line_buffered more correct and strict
Manuel Jacob <me@manueljacob.de>
parents:
49139
diff
changeset
|
86 check_stream = stream |
094a5fa3cf52
procutil: make stream detection in make_line_buffered more correct and strict
Manuel Jacob <me@manueljacob.de>
parents:
49139
diff
changeset
|
87 while True: |
094a5fa3cf52
procutil: make stream detection in make_line_buffered more correct and strict
Manuel Jacob <me@manueljacob.de>
parents:
49139
diff
changeset
|
88 if isinstance(check_stream, WriteAllWrapper): |
094a5fa3cf52
procutil: make stream detection in make_line_buffered more correct and strict
Manuel Jacob <me@manueljacob.de>
parents:
49139
diff
changeset
|
89 check_stream = check_stream.orig |
094a5fa3cf52
procutil: make stream detection in make_line_buffered more correct and strict
Manuel Jacob <me@manueljacob.de>
parents:
49139
diff
changeset
|
90 elif pycompat.iswindows and isinstance( |
094a5fa3cf52
procutil: make stream detection in make_line_buffered more correct and strict
Manuel Jacob <me@manueljacob.de>
parents:
49139
diff
changeset
|
91 check_stream, |
094a5fa3cf52
procutil: make stream detection in make_line_buffered more correct and strict
Manuel Jacob <me@manueljacob.de>
parents:
49139
diff
changeset
|
92 # pytype: disable=module-attr |
094a5fa3cf52
procutil: make stream detection in make_line_buffered more correct and strict
Manuel Jacob <me@manueljacob.de>
parents:
49139
diff
changeset
|
93 platform.winstdout |
094a5fa3cf52
procutil: make stream detection in make_line_buffered more correct and strict
Manuel Jacob <me@manueljacob.de>
parents:
49139
diff
changeset
|
94 # pytype: enable=module-attr |
094a5fa3cf52
procutil: make stream detection in make_line_buffered more correct and strict
Manuel Jacob <me@manueljacob.de>
parents:
49139
diff
changeset
|
95 ): |
094a5fa3cf52
procutil: make stream detection in make_line_buffered more correct and strict
Manuel Jacob <me@manueljacob.de>
parents:
49139
diff
changeset
|
96 check_stream = check_stream.fp |
094a5fa3cf52
procutil: make stream detection in make_line_buffered more correct and strict
Manuel Jacob <me@manueljacob.de>
parents:
49139
diff
changeset
|
97 else: |
094a5fa3cf52
procutil: make stream detection in make_line_buffered more correct and strict
Manuel Jacob <me@manueljacob.de>
parents:
49139
diff
changeset
|
98 break |
094a5fa3cf52
procutil: make stream detection in make_line_buffered more correct and strict
Manuel Jacob <me@manueljacob.de>
parents:
49139
diff
changeset
|
99 if isinstance(check_stream, io.RawIOBase): |
094a5fa3cf52
procutil: make stream detection in make_line_buffered more correct and strict
Manuel Jacob <me@manueljacob.de>
parents:
49139
diff
changeset
|
100 # The stream is unbuffered, we don't need to emulate line buffering. |
45043
fd205a9c358a
procutil: factor out conditional creation of LineBufferedWrapper
Manuel Jacob <me@manueljacob.de>
parents:
45042
diff
changeset
|
101 return stream |
49377
094a5fa3cf52
procutil: make stream detection in make_line_buffered more correct and strict
Manuel Jacob <me@manueljacob.de>
parents:
49139
diff
changeset
|
102 elif isinstance(check_stream, io.BufferedIOBase): |
094a5fa3cf52
procutil: make stream detection in make_line_buffered more correct and strict
Manuel Jacob <me@manueljacob.de>
parents:
49139
diff
changeset
|
103 # The stream supports some kind of buffering. We can't assume that |
094a5fa3cf52
procutil: make stream detection in make_line_buffered more correct and strict
Manuel Jacob <me@manueljacob.de>
parents:
49139
diff
changeset
|
104 # lines are flushed. Fall back to wrapping the stream. |
094a5fa3cf52
procutil: make stream detection in make_line_buffered more correct and strict
Manuel Jacob <me@manueljacob.de>
parents:
49139
diff
changeset
|
105 pass |
094a5fa3cf52
procutil: make stream detection in make_line_buffered more correct and strict
Manuel Jacob <me@manueljacob.de>
parents:
49139
diff
changeset
|
106 else: |
094a5fa3cf52
procutil: make stream detection in make_line_buffered more correct and strict
Manuel Jacob <me@manueljacob.de>
parents:
49139
diff
changeset
|
107 raise NotImplementedError( |
094a5fa3cf52
procutil: make stream detection in make_line_buffered more correct and strict
Manuel Jacob <me@manueljacob.de>
parents:
49139
diff
changeset
|
108 "can't determine whether stream is buffered or not" |
094a5fa3cf52
procutil: make stream detection in make_line_buffered more correct and strict
Manuel Jacob <me@manueljacob.de>
parents:
49139
diff
changeset
|
109 ) |
094a5fa3cf52
procutil: make stream detection in make_line_buffered more correct and strict
Manuel Jacob <me@manueljacob.de>
parents:
49139
diff
changeset
|
110 |
45043
fd205a9c358a
procutil: factor out conditional creation of LineBufferedWrapper
Manuel Jacob <me@manueljacob.de>
parents:
45042
diff
changeset
|
111 if isinstance(stream, LineBufferedWrapper): |
fd205a9c358a
procutil: factor out conditional creation of LineBufferedWrapper
Manuel Jacob <me@manueljacob.de>
parents:
45042
diff
changeset
|
112 return stream |
fd205a9c358a
procutil: factor out conditional creation of LineBufferedWrapper
Manuel Jacob <me@manueljacob.de>
parents:
45042
diff
changeset
|
113 return LineBufferedWrapper(stream) |
fd205a9c358a
procutil: factor out conditional creation of LineBufferedWrapper
Manuel Jacob <me@manueljacob.de>
parents:
45042
diff
changeset
|
114 |
fd205a9c358a
procutil: factor out conditional creation of LineBufferedWrapper
Manuel Jacob <me@manueljacob.de>
parents:
45042
diff
changeset
|
115 |
45867
b56feaa9b520
chgserver: backport py3 buffered I/O workarounds from procutil
Yuya Nishihara <yuya@tcha.org>
parents:
45809
diff
changeset
|
116 def unwrap_line_buffered(stream): |
b56feaa9b520
chgserver: backport py3 buffered I/O workarounds from procutil
Yuya Nishihara <yuya@tcha.org>
parents:
45809
diff
changeset
|
117 if isinstance(stream, LineBufferedWrapper): |
b56feaa9b520
chgserver: backport py3 buffered I/O workarounds from procutil
Yuya Nishihara <yuya@tcha.org>
parents:
45809
diff
changeset
|
118 assert not isinstance(stream.orig, LineBufferedWrapper) |
b56feaa9b520
chgserver: backport py3 buffered I/O workarounds from procutil
Yuya Nishihara <yuya@tcha.org>
parents:
45809
diff
changeset
|
119 return stream.orig |
b56feaa9b520
chgserver: backport py3 buffered I/O workarounds from procutil
Yuya Nishihara <yuya@tcha.org>
parents:
45809
diff
changeset
|
120 return stream |
b56feaa9b520
chgserver: backport py3 buffered I/O workarounds from procutil
Yuya Nishihara <yuya@tcha.org>
parents:
45809
diff
changeset
|
121 |
b56feaa9b520
chgserver: backport py3 buffered I/O workarounds from procutil
Yuya Nishihara <yuya@tcha.org>
parents:
45809
diff
changeset
|
122 |
49888
8147abc05794
pytype: stop excluding mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
49377
diff
changeset
|
123 class WriteAllWrapper(typelib.BinaryIO_Proxy): |
8147abc05794
pytype: stop excluding mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
49377
diff
changeset
|
124 def __init__(self, orig: BinaryIO): |
45095
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
125 self.orig = orig |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
126 |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
127 def __getattr__(self, attr): |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
128 return getattr(self.orig, attr) |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
129 |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
130 def write(self, s): |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
131 write1 = self.orig.write |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
132 m = memoryview(s) |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
133 total_to_write = len(s) |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
134 total_written = 0 |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
135 while total_written < total_to_write: |
48842
90e564882f07
procutil: avoid `+= None` when writing to full std{err,out} descriptor on py3
Matt Harbison <matt_harbison@yahoo.com>
parents:
48527
diff
changeset
|
136 c = write1(m[total_written:]) |
90e564882f07
procutil: avoid `+= None` when writing to full std{err,out} descriptor on py3
Matt Harbison <matt_harbison@yahoo.com>
parents:
48527
diff
changeset
|
137 if c: |
90e564882f07
procutil: avoid `+= None` when writing to full std{err,out} descriptor on py3
Matt Harbison <matt_harbison@yahoo.com>
parents:
48527
diff
changeset
|
138 total_written += c |
45095
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
139 return total_written |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
140 |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
141 |
48526
333a2656e981
pytype: stop excluding procutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
46889
diff
changeset
|
142 # pytype: disable=attribute-error |
45095
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
143 io.IOBase.register(WriteAllWrapper) |
48526
333a2656e981
pytype: stop excluding procutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
46889
diff
changeset
|
144 # pytype: enable=attribute-error |
45095
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
145 |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
146 |
45103
a5fa2761a6cd
procutil: make _make_write_all() function private
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
147 def _make_write_all(stream): |
45095
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
148 if isinstance(stream, WriteAllWrapper): |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
149 return stream |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
150 if isinstance(stream, io.BufferedIOBase): |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
151 # The io.BufferedIOBase.write() contract guarantees that all data is |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
152 # written. |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
153 return stream |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
154 # In general, the write() method of streams is free to write only part of |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
155 # the data. |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
156 return WriteAllWrapper(stream) |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
157 |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45094
diff
changeset
|
158 |
49001
3681b4c56618
procutil: delete Python 2 support code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
159 # Python 3 implements its own I/O streams. Unlike stdio of C library, |
3681b4c56618
procutil: delete Python 2 support code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
160 # sys.stdin/stdout/stderr may be None if underlying fd is closed. |
46084
81c1f5d1801f
procutils: don't try to get `.buffer` if sys.stdin is None
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46034
diff
changeset
|
161 |
49001
3681b4c56618
procutil: delete Python 2 support code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
162 # TODO: .buffer might not exist if std streams were replaced; we'll need |
3681b4c56618
procutil: delete Python 2 support code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
163 # a silly wrapper to make a bytes stream backed by a unicode one. |
46175
a04c03b0678e
procutil: assign pseudo file object if sys.stdout/stderr is missing
Yuya Nishihara <yuya@tcha.org>
parents:
46174
diff
changeset
|
164 |
49001
3681b4c56618
procutil: delete Python 2 support code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
165 if sys.stdin is None: |
3681b4c56618
procutil: delete Python 2 support code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
166 stdin = BadFile() |
3681b4c56618
procutil: delete Python 2 support code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
167 else: |
3681b4c56618
procutil: delete Python 2 support code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
168 stdin = sys.stdin.buffer |
3681b4c56618
procutil: delete Python 2 support code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
169 if sys.stdout is None: |
3681b4c56618
procutil: delete Python 2 support code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
170 stdout = BadFile() |
45057
9694895749ad
pycompat: remove pycompat.{stdin,stdout,stderr}
Manuel Jacob <me@manueljacob.de>
parents:
45048
diff
changeset
|
171 else: |
49001
3681b4c56618
procutil: delete Python 2 support code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
172 stdout = _make_write_all(sys.stdout.buffer) |
3681b4c56618
procutil: delete Python 2 support code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
173 if sys.stderr is None: |
3681b4c56618
procutil: delete Python 2 support code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
174 stderr = BadFile() |
3681b4c56618
procutil: delete Python 2 support code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
175 else: |
3681b4c56618
procutil: delete Python 2 support code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
176 stderr = _make_write_all(sys.stderr.buffer) |
30908
3a4c0905f357
util: always force line buffered stdout when stdout is a tty (BC)
Simon Farnsworth <simonfar@fb.com>
parents:
30854
diff
changeset
|
177 |
49001
3681b4c56618
procutil: delete Python 2 support code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
178 if pycompat.iswindows: |
3681b4c56618
procutil: delete Python 2 support code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
179 # Work around Windows bugs. |
3681b4c56618
procutil: delete Python 2 support code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
180 stdout = platform.winstdout(stdout) # pytype: disable=module-attr |
3681b4c56618
procutil: delete Python 2 support code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
181 stderr = platform.winstdout(stderr) # pytype: disable=module-attr |
51002
def6f1a4604b
openvms: make process spawning works on OpenVMS
Jean-Francois Pieronne <jf.pieronne@laposte.net>
parents:
50952
diff
changeset
|
182 if isatty(stdout) and pycompat.sysplatform != b'OpenVMS': |
49001
3681b4c56618
procutil: delete Python 2 support code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
183 # The standard library doesn't offer line-buffered binary streams. |
3681b4c56618
procutil: delete Python 2 support code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
184 stdout = make_line_buffered(stdout) |
14926
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
185 |
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
186 findexe = platform.findexe |
37118
49d6ba67c93f
util: mark platform-specific gethgcmd() as private
Yuya Nishihara <yuya@tcha.org>
parents:
37102
diff
changeset
|
187 _gethgcmd = platform.gethgcmd |
14926
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
188 getuser = platform.getuser |
28027
14033c5dd261
util: enable getpid to be replaced
timeless <timeless@mozdev.org>
parents:
27785
diff
changeset
|
189 getpid = os.getpid |
14926
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
190 hidewindow = platform.hidewindow |
22245
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21914
diff
changeset
|
191 readpipe = platform.readpipe |
14926
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
192 setbinary = platform.setbinary |
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
193 setsignalhandler = platform.setsignalhandler |
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
194 shellquote = platform.shellquote |
36445
0cb09c322647
util: factor out shellsplit() function
Yuya Nishihara <yuya@tcha.org>
parents:
36395
diff
changeset
|
195 shellsplit = platform.shellsplit |
14926
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
196 spawndetached = platform.spawndetached |
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
197 sshargs = platform.sshargs |
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
198 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
|
199 |
32248
d74b0cff94a9
osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents:
32245
diff
changeset
|
200 try: |
d74b0cff94a9
osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents:
32245
diff
changeset
|
201 setprocname = osutil.setprocname |
d74b0cff94a9
osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents:
32245
diff
changeset
|
202 except AttributeError: |
d74b0cff94a9
osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents:
32245
diff
changeset
|
203 pass |
35464
8652ab4046e4
osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents:
35166
diff
changeset
|
204 try: |
8652ab4046e4
osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents:
35166
diff
changeset
|
205 unblocksignal = osutil.unblocksignal |
8652ab4046e4
osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents:
35166
diff
changeset
|
206 except AttributeError: |
8652ab4046e4
osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents:
35166
diff
changeset
|
207 pass |
32248
d74b0cff94a9
osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents:
32245
diff
changeset
|
208 |
51002
def6f1a4604b
openvms: make process spawning works on OpenVMS
Jean-Francois Pieronne <jf.pieronne@laposte.net>
parents:
50952
diff
changeset
|
209 closefds = pycompat.isposix and pycompat.sysplatform != b'OpenVMS' |
10197
29e3c4a7699b
subrepo: normalize svn output line-endings
Patrick Mezard <pmezard@gmail.com>
parents:
9996
diff
changeset
|
210 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
211 |
37460
a6c6b7beb025
procutil: unify platform.explainexit()
Yuya Nishihara <yuya@tcha.org>
parents:
37459
diff
changeset
|
212 def explainexit(code): |
37463
bbd240f81ac5
procutil: make explainexit() simply return a message (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37462
diff
changeset
|
213 """return a message describing a subprocess status |
37460
a6c6b7beb025
procutil: unify platform.explainexit()
Yuya Nishihara <yuya@tcha.org>
parents:
37459
diff
changeset
|
214 (codes from kill are negative - not os.system/wait encoding)""" |
a6c6b7beb025
procutil: unify platform.explainexit()
Yuya Nishihara <yuya@tcha.org>
parents:
37459
diff
changeset
|
215 if code >= 0: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
216 return _(b"exited with status %d") % code |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
217 return _(b"killed by signal %d") % -code |
37460
a6c6b7beb025
procutil: unify platform.explainexit()
Yuya Nishihara <yuya@tcha.org>
parents:
37459
diff
changeset
|
218 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
219 |
49037
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
49004
diff
changeset
|
220 class _pfile: |
37459
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
221 """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
|
222 |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
223 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
|
224 self._proc = proc |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
225 self._fp = fp |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
226 |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
227 def close(self): |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
228 # 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
|
229 self._fp.close() |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
230 return self._proc.wait() |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
231 |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
232 def __iter__(self): |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
233 return iter(self._fp) |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
234 |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
235 def __getattr__(self, attr): |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
236 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
|
237 |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
238 def __enter__(self): |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
239 return self |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
240 |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
241 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
|
242 self.close() |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
243 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
244 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
245 def popen(cmd, mode=b'rb', bufsize=-1): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
246 if mode == b'rb': |
37459
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
247 return _popenreader(cmd, bufsize) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
248 elif mode == b'wb': |
37459
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
249 return _popenwriter(cmd, bufsize) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
250 raise error.ProgrammingError(b'unsupported mode: %r' % mode) |
37459
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
251 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
252 |
37459
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
253 def _popenreader(cmd, bufsize): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
254 p = subprocess.Popen( |
44926
8e8fd938ca07
cleanup: eliminate procutil.quotecommand()
Manuel Jacob <me@manueljacob.de>
parents:
44768
diff
changeset
|
255 tonativestr(cmd), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
256 shell=True, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
257 bufsize=bufsize, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
258 close_fds=closefds, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
259 stdout=subprocess.PIPE, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
260 ) |
37459
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
261 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
|
262 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
263 |
37459
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
264 def _popenwriter(cmd, bufsize): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
265 p = subprocess.Popen( |
44926
8e8fd938ca07
cleanup: eliminate procutil.quotecommand()
Manuel Jacob <me@manueljacob.de>
parents:
44768
diff
changeset
|
266 tonativestr(cmd), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
267 shell=True, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
268 bufsize=bufsize, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
269 close_fds=closefds, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
270 stdin=subprocess.PIPE, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
271 ) |
37459
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
272 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
|
273 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
274 |
37464
632b92899203
procutil: drop unused 'newlines' option from popen*() (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37463
diff
changeset
|
275 def popen2(cmd, env=None): |
9089
8ec39725d966
util: remove unused bufsize argument
Martin Geisler <mg@lazybytes.net>
parents:
9084
diff
changeset
|
276 # 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
|
277 # 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
|
278 # poor performance on Mac OS X: http://bugs.python.org/issue4194 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
279 p = subprocess.Popen( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
280 tonativestr(cmd), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
281 shell=True, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
282 bufsize=-1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
283 close_fds=closefds, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
284 stdin=subprocess.PIPE, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
285 stdout=subprocess.PIPE, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
286 env=tonativeenv(env), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
287 ) |
8280
0b02d98d44d0
util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents:
8257
diff
changeset
|
288 return p.stdin, p.stdout |
10197
29e3c4a7699b
subrepo: normalize svn output line-endings
Patrick Mezard <pmezard@gmail.com>
parents:
9996
diff
changeset
|
289 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
290 |
37464
632b92899203
procutil: drop unused 'newlines' option from popen*() (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37463
diff
changeset
|
291 def popen3(cmd, env=None): |
632b92899203
procutil: drop unused 'newlines' option from popen*() (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37463
diff
changeset
|
292 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
|
293 return stdin, stdout, stderr |
9baf4330d88f
sshpeer: store subprocess so it cleans up correctly
Durham Goode <durham@fb.com>
parents:
18736
diff
changeset
|
294 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
295 |
37464
632b92899203
procutil: drop unused 'newlines' option from popen*() (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37463
diff
changeset
|
296 def popen4(cmd, env=None, bufsize=-1): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
297 p = subprocess.Popen( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
298 tonativestr(cmd), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
299 shell=True, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
300 bufsize=bufsize, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
301 close_fds=closefds, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
302 stdin=subprocess.PIPE, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
303 stdout=subprocess.PIPE, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
304 stderr=subprocess.PIPE, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
305 env=tonativeenv(env), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
306 ) |
18759
9baf4330d88f
sshpeer: store subprocess so it cleans up correctly
Durham Goode <durham@fb.com>
parents:
18736
diff
changeset
|
307 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
|
308 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
309 |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
310 def pipefilter(s, cmd): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
311 '''filter string S through command CMD, returning its output''' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
312 p = subprocess.Popen( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
313 tonativestr(cmd), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
314 shell=True, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
315 close_fds=closefds, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
316 stdin=subprocess.PIPE, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
317 stdout=subprocess.PIPE, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
318 ) |
8302
d2ad8c066676
util: simplify pipefilter and avoid subprocess race
Martin Geisler <mg@lazybytes.net>
parents:
8299
diff
changeset
|
319 pout, perr = p.communicate(s) |
d2ad8c066676
util: simplify pipefilter and avoid subprocess race
Martin Geisler <mg@lazybytes.net>
parents:
8299
diff
changeset
|
320 return pout |
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
321 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
322 |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
323 def tempfilter(s, cmd): |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45867
diff
changeset
|
324 """filter string S through a pair of temporary files with CMD. |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
325 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
|
326 with the strings INFILE and OUTFILE replaced by the real names of |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45867
diff
changeset
|
327 the temporary files generated.""" |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
328 inname, outname = None, None |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
329 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
330 infd, inname = pycompat.mkstemp(prefix=b'hg-filter-in-') |
43554
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43551
diff
changeset
|
331 fp = os.fdopen(infd, 'wb') |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
332 fp.write(s) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
333 fp.close() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
334 outfd, outname = pycompat.mkstemp(prefix=b'hg-filter-out-') |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
335 os.close(outfd) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
336 cmd = cmd.replace(b'INFILE', inname) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
337 cmd = cmd.replace(b'OUTFILE', outname) |
37461
538353b80676
procutil: fix error message of tempfile filter
Yuya Nishihara <yuya@tcha.org>
parents:
37460
diff
changeset
|
338 code = system(cmd) |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
339 if code: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
340 raise error.Abort( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
341 _(b"command '%s' failed: %s") % (cmd, explainexit(code)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
342 ) |
52393
07a5a249faf8
procutil: stop using the `pycompat.open()` shim
Matt Harbison <matt_harbison@yahoo.com>
parents:
51901
diff
changeset
|
343 with open(outname, 'rb') as fp: |
37120
e7b517809ebc
util: stop using readfile() in tempfilter()
Yuya Nishihara <yuya@tcha.org>
parents:
37119
diff
changeset
|
344 return fp.read() |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
345 finally: |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
346 try: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
347 if inname: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
348 os.unlink(inname) |
14004
97ed99d1f419
eliminate various naked except clauses
Idan Kamara <idankk86@gmail.com>
parents:
13985
diff
changeset
|
349 except OSError: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
350 pass |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
351 try: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
352 if outname: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
353 os.unlink(outname) |
14004
97ed99d1f419
eliminate various naked except clauses
Idan Kamara <idankk86@gmail.com>
parents:
13985
diff
changeset
|
354 except OSError: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
355 pass |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
356 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
357 |
37119
7ccc9b8aca4c
util: mark filtertable as private constant
Yuya Nishihara <yuya@tcha.org>
parents:
37118
diff
changeset
|
358 _filtertable = { |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
359 b'tempfile:': tempfilter, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
360 b'pipe:': pipefilter, |
37119
7ccc9b8aca4c
util: mark filtertable as private constant
Yuya Nishihara <yuya@tcha.org>
parents:
37118
diff
changeset
|
361 } |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
362 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
363 |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
364 def filter(s, cmd): |
43807
be8552f25cab
cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents:
43712
diff
changeset
|
365 """filter a string through a command that transforms its input to its |
be8552f25cab
cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents:
43712
diff
changeset
|
366 output""" |
49004
f254fc73d956
global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
49001
diff
changeset
|
367 for name, fn in _filtertable.items(): |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
368 if cmd.startswith(name): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
369 return fn(s, cmd[len(name) :].lstrip()) |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
370 return pipefilter(s, cmd) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
371 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
372 |
22632
db15bb2d6323
util: move _hgexecutable a few lines, closer to where it is used
Mads Kiilerich <madski@unity3d.com>
parents:
22245
diff
changeset
|
373 _hgexecutable = None |
db15bb2d6323
util: move _hgexecutable a few lines, closer to where it is used
Mads Kiilerich <madski@unity3d.com>
parents:
22245
diff
changeset
|
374 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
375 |
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
376 def hgexecutable(): |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
377 """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
|
378 |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
379 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
|
380 """ |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
381 if _hgexecutable is None: |
51002
def6f1a4604b
openvms: make process spawning works on OpenVMS
Jean-Francois Pieronne <jf.pieronne@laposte.net>
parents:
50952
diff
changeset
|
382 hg = encoding.environ.get(b'HG', '') |
43554
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43551
diff
changeset
|
383 mainmod = sys.modules['__main__'] |
51002
def6f1a4604b
openvms: make process spawning works on OpenVMS
Jean-Francois Pieronne <jf.pieronne@laposte.net>
parents:
50952
diff
changeset
|
384 if pycompat.sysplatform == b'OpenVMS' and hg[0:1] == '$': |
def6f1a4604b
openvms: make process spawning works on OpenVMS
Jean-Francois Pieronne <jf.pieronne@laposte.net>
parents:
50952
diff
changeset
|
385 hg = 'mcr ' + hg[1:] |
6500 | 386 if hg: |
14229
85fd8402cbc4
rename util.set_hgexecutable to _sethgexecutable
Adrian Buehlmann <adrian@cadifra.com>
parents:
14228
diff
changeset
|
387 _sethgexecutable(hg) |
43712
664e24207728
procutil: move mainfrozen() to new resourceutil.py
Martin von Zweigbergk <martinvonz@google.com>
parents:
43701
diff
changeset
|
388 elif resourceutil.mainfrozen(): |
43701
38387f9e4d22
py3: use native string for 'macosx_app'
Martin von Zweigbergk <martinvonz@google.com>
parents:
43700
diff
changeset
|
389 if getattr(sys, 'frozen', None) == 'macosx_app': |
27765
f1fb93eebb1d
util: adjust hgexecutable() to handle frozen Mercurial on OS X
Matt Harbison <matt_harbison@yahoo.com>
parents:
27764
diff
changeset
|
390 # Env variable set by py2app |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
391 _sethgexecutable(encoding.environ[b'EXECUTABLEPATH']) |
27765
f1fb93eebb1d
util: adjust hgexecutable() to handle frozen Mercurial on OS X
Matt Harbison <matt_harbison@yahoo.com>
parents:
27764
diff
changeset
|
392 else: |
30672
10b17ed9b591
py3: replace sys.executable with pycompat.sysexecutable
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30647
diff
changeset
|
393 _sethgexecutable(pycompat.sysexecutable) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
394 elif ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
395 not pycompat.iswindows |
43700
47d983f0af65
py3: drop an unnecessary fsencode() before comparing with constant
Martin von Zweigbergk <martinvonz@google.com>
parents:
43699
diff
changeset
|
396 and os.path.basename(getattr(mainmod, '__file__', '')) == 'hg' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
397 ): |
31091
2912b06905dc
py3: use pycompat.fsencode() to convert __file__ to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
31008
diff
changeset
|
398 _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
|
399 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
400 _sethgexecutable( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
401 findexe(b'hg') or os.path.basename(pycompat.sysargv[0]) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
402 ) |
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
403 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
|
404 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
405 |
14229
85fd8402cbc4
rename util.set_hgexecutable to _sethgexecutable
Adrian Buehlmann <adrian@cadifra.com>
parents:
14228
diff
changeset
|
406 def _sethgexecutable(path): |
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
407 """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
|
408 global _hgexecutable |
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
409 _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
|
410 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
411 |
36801
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36799
diff
changeset
|
412 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
|
413 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
|
414 try: |
36801
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36799
diff
changeset
|
415 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
|
416 except io.UnsupportedOperation: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
417 return False # fileno() raised UnsupportedOperation |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
418 |
26450
1138e1d05207
util.system: compare fileno to see if it needs stdout redirection
Yuya Nishihara <yuya@tcha.org>
parents:
26392
diff
changeset
|
419 |
36801
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36799
diff
changeset
|
420 def isstdin(f): |
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36799
diff
changeset
|
421 return _testfileno(f, sys.__stdin__) |
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36799
diff
changeset
|
422 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
423 |
36801
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36799
diff
changeset
|
424 def isstdout(f): |
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36799
diff
changeset
|
425 return _testfileno(f, sys.__stdout__) |
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36799
diff
changeset
|
426 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
427 |
37126
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
428 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
|
429 """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
|
430 |
7f78de1c93aa
procutil: redirect ui.fout to stderr while stdio is protected
Yuya Nishihara <yuya@tcha.org>
parents:
37221
diff
changeset
|
431 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
|
432 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
|
433 |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
434 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
|
435 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
|
436 "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
|
437 """ |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
438 uout.flush() |
37221
ac71cbad5da3
procutil: unroll uin/uout loop in protectstdio()
Yuya Nishihara <yuya@tcha.org>
parents:
37127
diff
changeset
|
439 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
|
440 if _testfileno(uin, stdin): |
37221
ac71cbad5da3
procutil: unroll uin/uout loop in protectstdio()
Yuya Nishihara <yuya@tcha.org>
parents:
37127
diff
changeset
|
441 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
|
442 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
|
443 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
|
444 os.close(nullfd) |
43554
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43551
diff
changeset
|
445 fin = os.fdopen(newfd, 'rb') |
38799
e5724be689b3
procutil: compare fd number to see if stdio protection is needed (issue5992)
Yuya Nishihara <yuya@tcha.org>
parents:
38528
diff
changeset
|
446 if _testfileno(uout, stdout): |
37221
ac71cbad5da3
procutil: unroll uin/uout loop in protectstdio()
Yuya Nishihara <yuya@tcha.org>
parents:
37127
diff
changeset
|
447 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
|
448 os.dup2(stderr.fileno(), uout.fileno()) |
43554
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43551
diff
changeset
|
449 fout = os.fdopen(newfd, 'wb') |
37221
ac71cbad5da3
procutil: unroll uin/uout loop in protectstdio()
Yuya Nishihara <yuya@tcha.org>
parents:
37127
diff
changeset
|
450 return fin, fout |
37126
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
451 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
452 |
37126
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
453 def restorestdio(uin, uout, fin, fout): |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
454 """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
|
455 uout.flush() |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
456 for f, uif in [(fin, uin), (fout, uout)]: |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
457 if f is not uif: |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
458 os.dup2(f.fileno(), uif.fileno()) |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
459 f.close() |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37121
diff
changeset
|
460 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
461 |
30736
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30672
diff
changeset
|
462 def shellenviron(environ=None): |
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30672
diff
changeset
|
463 """return environ with optional override, useful for shelling out""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
464 |
30736
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30672
diff
changeset
|
465 def py2shell(val): |
43807
be8552f25cab
cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents:
43712
diff
changeset
|
466 """convert python object into string that is useful to shell""" |
30736
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30672
diff
changeset
|
467 if val is None or val is False: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
468 return b'0' |
30736
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30672
diff
changeset
|
469 if val is True: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
470 return b'1' |
36448
d26b0bedfaa4
util: use pycompat.bytestr() instead of str()
Augie Fackler <augie@google.com>
parents:
36445
diff
changeset
|
471 return pycompat.bytestr(val) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
472 |
30736
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30672
diff
changeset
|
473 env = dict(encoding.environ) |
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30672
diff
changeset
|
474 if environ: |
49004
f254fc73d956
global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
49001
diff
changeset
|
475 env.update((k, py2shell(v)) for k, v in environ.items()) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
476 env[b'HG'] = hgexecutable() |
30736
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30672
diff
changeset
|
477 return env |
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30672
diff
changeset
|
478 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
479 |
38495
72286f9e324f
procutil: add a shim for translating shell commands to native commands
Matt Harbison <matt_harbison@yahoo.com>
parents:
38459
diff
changeset
|
480 if pycompat.iswindows: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
481 |
38495
72286f9e324f
procutil: add a shim for translating shell commands to native commands
Matt Harbison <matt_harbison@yahoo.com>
parents:
38459
diff
changeset
|
482 def shelltonative(cmd, env): |
43526
54f4d094bab1
procutil: suppress pytype warnings around windows-only attributes
Augie Fackler <augie@google.com>
parents:
43165
diff
changeset
|
483 return platform.shelltocmdexe( # pytype: disable=module-attr |
54f4d094bab1
procutil: suppress pytype warnings around windows-only attributes
Augie Fackler <augie@google.com>
parents:
43165
diff
changeset
|
484 cmd, shellenviron(env) |
54f4d094bab1
procutil: suppress pytype warnings around windows-only attributes
Augie Fackler <augie@google.com>
parents:
43165
diff
changeset
|
485 ) |
39678
50f46b771921
py3: partially fix pager spawning on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
38528
diff
changeset
|
486 |
50f46b771921
py3: partially fix pager spawning on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
38528
diff
changeset
|
487 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
|
488 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
489 |
38495
72286f9e324f
procutil: add a shim for translating shell commands to native commands
Matt Harbison <matt_harbison@yahoo.com>
parents:
38459
diff
changeset
|
490 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
|
491 return cmd |
72286f9e324f
procutil: add a shim for translating shell commands to native commands
Matt Harbison <matt_harbison@yahoo.com>
parents:
38459
diff
changeset
|
492 |
39678
50f46b771921
py3: partially fix pager spawning on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
38528
diff
changeset
|
493 tonativestr = pycompat.identity |
50f46b771921
py3: partially fix pager spawning on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
38528
diff
changeset
|
494 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
495 |
39678
50f46b771921
py3: partially fix pager spawning on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
38528
diff
changeset
|
496 def tonativeenv(env): |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45867
diff
changeset
|
497 """convert the environment from bytes to strings suitable for Popen(), etc.""" |
39678
50f46b771921
py3: partially fix pager spawning on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
38528
diff
changeset
|
498 return pycompat.rapply(tonativestr, env) |
50f46b771921
py3: partially fix pager spawning on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
38528
diff
changeset
|
499 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
500 |
31125
3f8f53190d6a
chg: deduplicate error handling of ui.system()
Yuya Nishihara <yuya@tcha.org>
parents:
31091
diff
changeset
|
501 def system(cmd, environ=None, cwd=None, out=None): |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45867
diff
changeset
|
502 """enhanced shell command execution. |
1882
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
503 run with environment maybe modified, maybe in different dir. |
508 | 504 |
11469
c37f35d7f2f5
http: deliver hook output to client
Maxim Khitrov <mkhitrov@gmail.com>
parents:
11297
diff
changeset
|
505 if out is specified, it is assumed to be a file-like object that has a |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45867
diff
changeset
|
506 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
|
507 try: |
30482
39d13b8c101d
py3: bulk replace sys.stdin/out/err by util's
Yuya Nishihara <yuya@tcha.org>
parents:
30481
diff
changeset
|
508 stdout.flush() |
13439
d724a69309e0
util: flush stdout before calling external processes
Mads Kiilerich <mads@kiilerich.com>
parents:
13400
diff
changeset
|
509 except Exception: |
d724a69309e0
util: flush stdout before calling external processes
Mads Kiilerich <mads@kiilerich.com>
parents:
13400
diff
changeset
|
510 pass |
32904
19b0fd4b5570
plan9: drop py26 hacks
Matt Harbison <matt_harbison@yahoo.com>
parents:
32835
diff
changeset
|
511 env = shellenviron(environ) |
36801
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36799
diff
changeset
|
512 if out is None or isstdout(out): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
513 rc = subprocess.call( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
514 tonativestr(cmd), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
515 shell=True, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
516 close_fds=closefds, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
517 env=tonativeenv(env), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
518 cwd=pycompat.rapply(tonativestr, cwd), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
519 ) |
11469
c37f35d7f2f5
http: deliver hook output to client
Maxim Khitrov <mkhitrov@gmail.com>
parents:
11297
diff
changeset
|
520 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
521 proc = subprocess.Popen( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
522 tonativestr(cmd), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
523 shell=True, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
524 close_fds=closefds, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
525 env=tonativeenv(env), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
526 cwd=pycompat.rapply(tonativestr, cwd), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
527 stdout=subprocess.PIPE, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
528 stderr=subprocess.STDOUT, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
529 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
530 for line in iter(proc.stdout.readline, b''): |
32904
19b0fd4b5570
plan9: drop py26 hacks
Matt Harbison <matt_harbison@yahoo.com>
parents:
32835
diff
changeset
|
531 out.write(line) |
19b0fd4b5570
plan9: drop py26 hacks
Matt Harbison <matt_harbison@yahoo.com>
parents:
32835
diff
changeset
|
532 proc.wait() |
19b0fd4b5570
plan9: drop py26 hacks
Matt Harbison <matt_harbison@yahoo.com>
parents:
32835
diff
changeset
|
533 rc = proc.returncode |
9517
4368f582c806
util.system: Use subprocess instead of os.system
Mads Kiilerich <mads@kiilerich.com>
parents:
9508
diff
changeset
|
534 return rc |
1880
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
535 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
536 |
43918
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43873
diff
changeset
|
537 _is_gui = None |
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43873
diff
changeset
|
538 |
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43873
diff
changeset
|
539 |
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43873
diff
changeset
|
540 def _gui(): |
6007
090b1a665901
filemerge: add config item for GUI tools
Matt Mackall <mpm@selenic.com>
parents:
6006
diff
changeset
|
541 '''Are we running in a GUI?''' |
34647 | 542 if pycompat.isdarwin: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
543 if b'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
|
544 # 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
|
545 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
|
546 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
|
547 # 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
|
548 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
|
549 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
|
550 # 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
|
551 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
|
552 else: |
46361
128a17d8436f
procutil: extend gui test to detect wayland session (issue6479)
Yuya Nishihara <yuya@tcha.org>
parents:
46175
diff
changeset
|
553 return ( |
128a17d8436f
procutil: extend gui test to detect wayland session (issue6479)
Yuya Nishihara <yuya@tcha.org>
parents:
46175
diff
changeset
|
554 pycompat.iswindows |
128a17d8436f
procutil: extend gui test to detect wayland session (issue6479)
Yuya Nishihara <yuya@tcha.org>
parents:
46175
diff
changeset
|
555 or encoding.environ.get(b"DISPLAY") |
128a17d8436f
procutil: extend gui test to detect wayland session (issue6479)
Yuya Nishihara <yuya@tcha.org>
parents:
46175
diff
changeset
|
556 or encoding.environ.get(b"WAYLAND_DISPLAY") |
128a17d8436f
procutil: extend gui test to detect wayland session (issue6479)
Yuya Nishihara <yuya@tcha.org>
parents:
46175
diff
changeset
|
557 ) |
6007
090b1a665901
filemerge: add config item for GUI tools
Matt Mackall <mpm@selenic.com>
parents:
6006
diff
changeset
|
558 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
559 |
43918
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43873
diff
changeset
|
560 def gui(): |
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43873
diff
changeset
|
561 global _is_gui |
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43873
diff
changeset
|
562 if _is_gui is None: |
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43873
diff
changeset
|
563 _is_gui = _gui() |
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43873
diff
changeset
|
564 return _is_gui |
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43873
diff
changeset
|
565 |
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43873
diff
changeset
|
566 |
10239
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10199
diff
changeset
|
567 def hgcmd(): |
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10199
diff
changeset
|
568 """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
|
569 |
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10199
diff
changeset
|
570 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
|
571 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
|
572 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
|
573 """ |
43712
664e24207728
procutil: move mainfrozen() to new resourceutil.py
Martin von Zweigbergk <martinvonz@google.com>
parents:
43701
diff
changeset
|
574 if resourceutil.mainfrozen(): |
43701
38387f9e4d22
py3: use native string for 'macosx_app'
Martin von Zweigbergk <martinvonz@google.com>
parents:
43700
diff
changeset
|
575 if getattr(sys, 'frozen', None) == 'macosx_app': |
27766
198f78a52a2f
util: adjust hgcmd() to handle frozen Mercurial on OS X
Matt Harbison <matt_harbison@yahoo.com>
parents:
27765
diff
changeset
|
576 # Env variable set by py2app |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
577 return [encoding.environ[b'EXECUTABLEPATH']] |
27766
198f78a52a2f
util: adjust hgcmd() to handle frozen Mercurial on OS X
Matt Harbison <matt_harbison@yahoo.com>
parents:
27765
diff
changeset
|
578 else: |
30672
10b17ed9b591
py3: replace sys.executable with pycompat.sysexecutable
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30647
diff
changeset
|
579 return [pycompat.sysexecutable] |
37118
49d6ba67c93f
util: mark platform-specific gethgcmd() as private
Yuya Nishihara <yuya@tcha.org>
parents:
37102
diff
changeset
|
580 return _gethgcmd() |
10344
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
581 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
582 |
49905
a9faacdc5943
typing: add type hints to mercurial/win32.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
49888
diff
changeset
|
583 def rundetached(args, condfn) -> int: |
10344
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
584 """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
|
585 |
10344
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
586 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
|
587 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
|
588 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
|
589 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
|
590 True, return -1. |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
591 """ |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
592 # 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
|
593 # 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
|
594 # 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
|
595 # 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
|
596 # 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
|
597 # 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
|
598 # us our child process terminated. |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
599 terminated = set() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
600 |
10344
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
601 def handler(signum, frame): |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
602 terminated.add(os.wait()) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
603 |
10344
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
604 prevhandler = None |
14968
b7dbe957585c
util: use safehasattr or getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14942
diff
changeset
|
605 SIGCHLD = getattr(signal, 'SIGCHLD', None) |
b7dbe957585c
util: use safehasattr or getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14942
diff
changeset
|
606 if SIGCHLD is not None: |
b7dbe957585c
util: use safehasattr or getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14942
diff
changeset
|
607 prevhandler = signal.signal(SIGCHLD, handler) |
10344
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
608 try: |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
609 pid = spawndetached(args) |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
610 while not condfn(): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
611 if (pid in terminated or not testpid(pid)) and not condfn(): |
10344
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
612 return -1 |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
613 time.sleep(0.1) |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
614 return pid |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
615 finally: |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
616 if prevhandler is not None: |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
617 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
|
618 |
49905
a9faacdc5943
typing: add type hints to mercurial/win32.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
49888
diff
changeset
|
619 # pytype seems to get confused by not having a return in the finally |
a9faacdc5943
typing: add type hints to mercurial/win32.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
49888
diff
changeset
|
620 # block, and thinks the return value should be Optional[int] here. It |
a9faacdc5943
typing: add type hints to mercurial/win32.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
49888
diff
changeset
|
621 # appears to be https://github.com/google/pytype/issues/938, without |
a9faacdc5943
typing: add type hints to mercurial/win32.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
49888
diff
changeset
|
622 # the `with` clause. |
a9faacdc5943
typing: add type hints to mercurial/win32.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
49888
diff
changeset
|
623 pass # pytype: disable=bad-return-type |
a9faacdc5943
typing: add type hints to mercurial/win32.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
49888
diff
changeset
|
624 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
625 |
38528
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
626 @contextlib.contextmanager |
41079
8ecb17b7f432
procutil: correct spelling of uninterruptable -> uninterruptible
Kyle Lippincott <spectral@google.com>
parents:
40751
diff
changeset
|
627 def uninterruptible(warn): |
38528
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
628 """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
|
629 |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
630 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
|
631 |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
632 Args: |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
633 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
|
634 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
|
635 """ |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
636 |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
637 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
|
638 shouldbail = [] |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
639 |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
640 def disabledsiginthandler(*args): |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
641 if warn(): |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
642 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
|
643 del oldsiginthandler[0] |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
644 shouldbail.append(True) |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
645 |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
646 try: |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
647 try: |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
648 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
|
649 except ValueError: |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
650 # 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
|
651 del oldsiginthandler[0] |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
652 yield |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
653 finally: |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
654 if oldsiginthandler: |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
655 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
|
656 if shouldbail: |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38527
diff
changeset
|
657 raise KeyboardInterrupt |
40547
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
658 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
659 |
40547
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
660 if pycompat.iswindows: |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
661 # 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
|
662 # 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
|
663 # No stdlib constant exists for this value |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
664 DETACHED_PROCESS = 0x00000008 |
40586
1d3bed7d2923
procutil: import concerns about creationflags on Windows from D1701
Boris Feld <boris.feld@octobus.net>
parents:
40548
diff
changeset
|
665 # 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
|
666 # 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
|
667 # See https://phab.mercurial-scm.org/D1701 for discussion |
43526
54f4d094bab1
procutil: suppress pytype warnings around windows-only attributes
Augie Fackler <augie@google.com>
parents:
43165
diff
changeset
|
668 _creationflags = ( |
54f4d094bab1
procutil: suppress pytype warnings around windows-only attributes
Augie Fackler <augie@google.com>
parents:
43165
diff
changeset
|
669 DETACHED_PROCESS |
54f4d094bab1
procutil: suppress pytype warnings around windows-only attributes
Augie Fackler <augie@google.com>
parents:
43165
diff
changeset
|
670 | subprocess.CREATE_NEW_PROCESS_GROUP # pytype: disable=module-attr |
54f4d094bab1
procutil: suppress pytype warnings around windows-only attributes
Augie Fackler <augie@google.com>
parents:
43165
diff
changeset
|
671 ) |
40547
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
672 |
42511
ca1014ad3de4
procutil: allow callers of runbgcommand to assume the process starts
Augie Fackler <augie@google.com>
parents:
41837
diff
changeset
|
673 def runbgcommand( |
43456
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
674 script, |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
675 env, |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
676 shell=False, |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
677 stdout=None, |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
678 stderr=None, |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
679 ensurestart=True, |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
680 record_wait=None, |
45809
37c65704869d
procutil: allow to specify arbitrary stdin bytes to runbgcommand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45148
diff
changeset
|
681 stdin_bytes=None, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
682 ): |
40547
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
683 '''Spawn a command without waiting for it to finish.''' |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
684 # 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
|
685 # need to because the detached process has no console connection. |
45809
37c65704869d
procutil: allow to specify arbitrary stdin bytes to runbgcommand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45148
diff
changeset
|
686 |
51145
a9e00554b3e4
procutil: move stdin assignment outside of try-finally block
Anton Shestakov <av6@dwimlabs.net>
parents:
51002
diff
changeset
|
687 stdin = None |
a9e00554b3e4
procutil: move stdin assignment outside of try-finally block
Anton Shestakov <av6@dwimlabs.net>
parents:
51002
diff
changeset
|
688 |
45809
37c65704869d
procutil: allow to specify arbitrary stdin bytes to runbgcommand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45148
diff
changeset
|
689 try: |
37c65704869d
procutil: allow to specify arbitrary stdin bytes to runbgcommand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45148
diff
changeset
|
690 if stdin_bytes is not None: |
37c65704869d
procutil: allow to specify arbitrary stdin bytes to runbgcommand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45148
diff
changeset
|
691 stdin = pycompat.unnamedtempfile() |
37c65704869d
procutil: allow to specify arbitrary stdin bytes to runbgcommand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45148
diff
changeset
|
692 stdin.write(stdin_bytes) |
37c65704869d
procutil: allow to specify arbitrary stdin bytes to runbgcommand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45148
diff
changeset
|
693 stdin.flush() |
37c65704869d
procutil: allow to specify arbitrary stdin bytes to runbgcommand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45148
diff
changeset
|
694 stdin.seek(0) |
37c65704869d
procutil: allow to specify arbitrary stdin bytes to runbgcommand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45148
diff
changeset
|
695 |
37c65704869d
procutil: allow to specify arbitrary stdin bytes to runbgcommand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45148
diff
changeset
|
696 p = subprocess.Popen( |
46034 | 697 pycompat.rapply(tonativestr, script), |
45809
37c65704869d
procutil: allow to specify arbitrary stdin bytes to runbgcommand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45148
diff
changeset
|
698 shell=shell, |
37c65704869d
procutil: allow to specify arbitrary stdin bytes to runbgcommand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45148
diff
changeset
|
699 env=tonativeenv(env), |
37c65704869d
procutil: allow to specify arbitrary stdin bytes to runbgcommand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45148
diff
changeset
|
700 close_fds=True, |
37c65704869d
procutil: allow to specify arbitrary stdin bytes to runbgcommand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45148
diff
changeset
|
701 creationflags=_creationflags, |
37c65704869d
procutil: allow to specify arbitrary stdin bytes to runbgcommand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45148
diff
changeset
|
702 stdin=stdin, |
37c65704869d
procutil: allow to specify arbitrary stdin bytes to runbgcommand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45148
diff
changeset
|
703 stdout=stdout, |
37c65704869d
procutil: allow to specify arbitrary stdin bytes to runbgcommand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45148
diff
changeset
|
704 stderr=stderr, |
37c65704869d
procutil: allow to specify arbitrary stdin bytes to runbgcommand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45148
diff
changeset
|
705 ) |
37c65704869d
procutil: allow to specify arbitrary stdin bytes to runbgcommand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45148
diff
changeset
|
706 if record_wait is not None: |
37c65704869d
procutil: allow to specify arbitrary stdin bytes to runbgcommand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45148
diff
changeset
|
707 record_wait(p.wait) |
37c65704869d
procutil: allow to specify arbitrary stdin bytes to runbgcommand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45148
diff
changeset
|
708 finally: |
37c65704869d
procutil: allow to specify arbitrary stdin bytes to runbgcommand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45148
diff
changeset
|
709 if stdin is not None: |
37c65704869d
procutil: allow to specify arbitrary stdin bytes to runbgcommand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45148
diff
changeset
|
710 stdin.close() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
711 |
40547
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39845
diff
changeset
|
712 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43021
diff
changeset
|
713 |
49001
3681b4c56618
procutil: delete Python 2 support code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
714 def runbgcommand( |
46889
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
715 cmd, |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
716 env, |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
717 shell=False, |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
718 stdout=None, |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
719 stderr=None, |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
720 ensurestart=True, |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
721 record_wait=None, |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
722 stdin_bytes=None, |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
723 ): |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
724 """Spawn a command without waiting for it to finish. |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
725 |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
726 |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
727 When `record_wait` is not None, the spawned process will not be fully |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
728 detached and the `record_wait` argument will be called with a the |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
729 `Subprocess.wait` function for the spawned process. This is mostly |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
730 useful for developers that need to make sure the spawned process |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
731 finished before a certain point. (eg: writing test)""" |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
732 if pycompat.isdarwin: |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
733 # avoid crash in CoreFoundation in case another thread |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
734 # calls gui() while we're calling fork(). |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
735 gui() |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
736 |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
737 if shell: |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
738 script = cmd |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
739 else: |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
740 if isinstance(cmd, bytes): |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
741 cmd = [cmd] |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
742 script = b' '.join(shellquote(x) for x in cmd) |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
743 if record_wait is None: |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
744 # double-fork to completely detach from the parent process |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
745 script = b'( %s ) &' % script |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
746 start_new_session = True |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
747 else: |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
748 start_new_session = False |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
749 ensurestart = True |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
750 |
48527
f8540fe4be0f
procutil: avoid an uninitialized variable usage on tempfile exception
Matt Harbison <matt_harbison@yahoo.com>
parents:
48526
diff
changeset
|
751 stdin = None |
f8540fe4be0f
procutil: avoid an uninitialized variable usage on tempfile exception
Matt Harbison <matt_harbison@yahoo.com>
parents:
48526
diff
changeset
|
752 |
46889
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
753 try: |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
754 if stdin_bytes is None: |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
755 stdin = subprocess.DEVNULL |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
756 else: |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
757 stdin = pycompat.unnamedtempfile() |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
758 stdin.write(stdin_bytes) |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
759 stdin.flush() |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
760 stdin.seek(0) |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
761 if stdout is None: |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
762 stdout = subprocess.DEVNULL |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
763 if stderr is None: |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
764 stderr = subprocess.DEVNULL |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
765 |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
766 p = subprocess.Popen( |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
767 script, |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
768 shell=True, |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
769 env=env, |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
770 close_fds=True, |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
771 stdin=stdin, |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
772 stdout=stdout, |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
773 stderr=stderr, |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
774 start_new_session=start_new_session, |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
775 ) |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
776 except Exception: |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
777 if record_wait is not None: |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
778 record_wait(255) |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
779 raise |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
780 finally: |
48527
f8540fe4be0f
procutil: avoid an uninitialized variable usage on tempfile exception
Matt Harbison <matt_harbison@yahoo.com>
parents:
48526
diff
changeset
|
781 if stdin_bytes is not None and stdin is not None: |
48526
333a2656e981
pytype: stop excluding procutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
46889
diff
changeset
|
782 assert not isinstance(stdin, int) |
46889
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
783 stdin.close() |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
784 if not ensurestart: |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
785 # Even though we're not waiting on the child process, |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
786 # we still must call waitpid() on it at some point so |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
787 # it's not a zombie/defunct. This is especially relevant for |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
788 # chg since the parent process won't die anytime soon. |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
789 # We use a thread to make the overhead tiny. |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
790 t = threading.Thread(target=lambda: p.wait) |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
791 t.daemon = True |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
792 t.start() |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
793 else: |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
794 returncode = p.wait |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
795 if record_wait is not None: |
8759e22f1649
procutil: avoid using os.fork() to implement runbgcommand
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46819
diff
changeset
|
796 record_wait(returncode) |