Mercurial > hg
annotate mercurial/utils/procutil.py @ 44831:6d3768b11241
diff: avoid going from contexts to nodes and back
This will allow us to pass in-memory contexts that may not have a
valid node to the diffing logic.
Differential Revision: https://phab.mercurial-scm.org/D8503
author | Augie Fackler <augie@google.com> |
---|---|
date | Thu, 07 May 2020 16:56:03 -0400 |
parents | a89381e04c58 |
children | ed684a82e29b |
rev | line source |
---|---|
37118
5be286db5fb5
procutil: move process/executable management functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37117
diff
changeset
|
1 # procutil.py - utility for managing processes and executable environment |
8226
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
2 # |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
3 # Copyright 2005 K. Thananchayan <thananck@yahoo.com> |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
4 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com> |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
5 # Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com> |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
6 # |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
7 # This software may be used and distributed according to the terms of the |
10263 | 8 # GNU General Public License version 2 or any later version. |
1082 | 9 |
37118
5be286db5fb5
procutil: move process/executable management functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37117
diff
changeset
|
10 from __future__ import absolute_import |
27358
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
11 |
37124
6715e8035b4f
procutil: introduce context-manager interface for protect/restorestdio
Yuya Nishihara <yuya@tcha.org>
parents:
37123
diff
changeset
|
12 import contextlib |
40497
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
13 import errno |
36432
1ca4e86c7265
util: handle fileno() on Python 3 throwing io.UnsupportedOperation
Augie Fackler <augie@google.com>
parents:
36422
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 |
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
19 import time |
3769 | 20 |
37118
5be286db5fb5
procutil: move process/executable management functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37117
diff
changeset
|
21 from ..i18n import _ |
43089
c59eb1560c44
py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43085
diff
changeset
|
22 from ..pycompat import ( |
c59eb1560c44
py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43085
diff
changeset
|
23 getattr, |
c59eb1560c44
py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43085
diff
changeset
|
24 open, |
c59eb1560c44
py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43085
diff
changeset
|
25 ) |
37118
5be286db5fb5
procutil: move process/executable management functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37117
diff
changeset
|
26 |
5be286db5fb5
procutil: move process/executable management functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37117
diff
changeset
|
27 from .. import ( |
27358
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
28 encoding, |
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
29 error, |
32367
a9c71d578a1c
osutil: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32306
diff
changeset
|
30 policy, |
28818
6041fb8f2da8
pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
28497
diff
changeset
|
31 pycompat, |
37083
f99d64e8a4e4
stringutil: move generic string helpers to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37082
diff
changeset
|
32 ) |
3769 | 33 |
43671
664e24207728
procutil: move mainfrozen() to new resourceutil.py
Martin von Zweigbergk <martinvonz@google.com>
parents:
43657
diff
changeset
|
34 # Import like this to keep import-checker happy |
664e24207728
procutil: move mainfrozen() to new resourceutil.py
Martin von Zweigbergk <martinvonz@google.com>
parents:
43657
diff
changeset
|
35 from ..utils import resourceutil |
664e24207728
procutil: move mainfrozen() to new resourceutil.py
Martin von Zweigbergk <martinvonz@google.com>
parents:
43657
diff
changeset
|
36 |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
37 osutil = policy.importmod('osutil') |
32201
4462a981e8df
base85: proxy through util module
Yuya Nishihara <yuya@tcha.org>
parents:
32154
diff
changeset
|
38 |
30472
277f4fe6d01a
py3: provide bytes stdin/out/err through util module
Yuya Nishihara <yuya@tcha.org>
parents:
30471
diff
changeset
|
39 stderr = pycompat.stderr |
277f4fe6d01a
py3: provide bytes stdin/out/err through util module
Yuya Nishihara <yuya@tcha.org>
parents:
30471
diff
changeset
|
40 stdin = pycompat.stdin |
277f4fe6d01a
py3: provide bytes stdin/out/err through util module
Yuya Nishihara <yuya@tcha.org>
parents:
30471
diff
changeset
|
41 stdout = pycompat.stdout |
32572
377c74ef008d
win32mbcs: avoid unintentional failure at colorization
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
31952
diff
changeset
|
42 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
43 |
30876
3a4c0905f357
util: always force line buffered stdout when stdout is a tty (BC)
Simon Farnsworth <simonfar@fb.com>
parents:
30854
diff
changeset
|
44 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
|
45 try: |
3a4c0905f357
util: always force line buffered stdout when stdout is a tty (BC)
Simon Farnsworth <simonfar@fb.com>
parents:
30854
diff
changeset
|
46 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
|
47 except AttributeError: |
3a4c0905f357
util: always force line buffered stdout when stdout is a tty (BC)
Simon Farnsworth <simonfar@fb.com>
parents:
30854
diff
changeset
|
48 return False |
3a4c0905f357
util: always force line buffered stdout when stdout is a tty (BC)
Simon Farnsworth <simonfar@fb.com>
parents:
30854
diff
changeset
|
49 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
50 |
30876
3a4c0905f357
util: always force line buffered stdout when stdout is a tty (BC)
Simon Farnsworth <simonfar@fb.com>
parents:
30854
diff
changeset
|
51 # glibc determines buffering on first write to stdout - if we replace a TTY |
3a4c0905f357
util: always force line buffered stdout when stdout is a tty (BC)
Simon Farnsworth <simonfar@fb.com>
parents:
30854
diff
changeset
|
52 # destined stdout with a pipe destined stdout (e.g. pager), we want line |
38455
0b63a6743010
procutil: use unbuffered stdout on Windows
Sune Foldager <cryo@cyanite.org>
parents:
37464
diff
changeset
|
53 # buffering (or unbuffered, on Windows) |
30876
3a4c0905f357
util: always force line buffered stdout when stdout is a tty (BC)
Simon Farnsworth <simonfar@fb.com>
parents:
30854
diff
changeset
|
54 if isatty(stdout): |
38455
0b63a6743010
procutil: use unbuffered stdout on Windows
Sune Foldager <cryo@cyanite.org>
parents:
37464
diff
changeset
|
55 if pycompat.iswindows: |
0b63a6743010
procutil: use unbuffered stdout on Windows
Sune Foldager <cryo@cyanite.org>
parents:
37464
diff
changeset
|
56 # Windows doesn't support line buffering |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
57 stdout = os.fdopen(stdout.fileno(), 'wb', 0) |
43165
227ba1afcb65
py3: keep stdout as defined by pycompat in procutil
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
43115
diff
changeset
|
58 elif not pycompat.ispy3: |
227ba1afcb65
py3: keep stdout as defined by pycompat in procutil
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
43115
diff
changeset
|
59 # on Python 3, stdout (sys.stdout.buffer) is already line buffered and |
227ba1afcb65
py3: keep stdout as defined by pycompat in procutil
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
43115
diff
changeset
|
60 # buffering=1 is not handled in binary mode |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
61 stdout = os.fdopen(stdout.fileno(), 'wb', 1) |
30876
3a4c0905f357
util: always force line buffered stdout when stdout is a tty (BC)
Simon Farnsworth <simonfar@fb.com>
parents:
30854
diff
changeset
|
62 |
34645 | 63 if pycompat.iswindows: |
37118
5be286db5fb5
procutil: move process/executable management functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37117
diff
changeset
|
64 from .. import windows as platform |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
65 |
30876
3a4c0905f357
util: always force line buffered stdout when stdout is a tty (BC)
Simon Farnsworth <simonfar@fb.com>
parents:
30854
diff
changeset
|
66 stdout = platform.winstdout(stdout) |
14912
ec46a7da9f2c
util: move windows and posix wildcard imports to begin of file
Adrian Buehlmann <adrian@cadifra.com>
parents:
14911
diff
changeset
|
67 else: |
37118
5be286db5fb5
procutil: move process/executable management functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37117
diff
changeset
|
68 from .. import posix as platform |
14926
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
69 |
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
70 findexe = platform.findexe |
37115
49d6ba67c93f
util: mark platform-specific gethgcmd() as private
Yuya Nishihara <yuya@tcha.org>
parents:
37099
diff
changeset
|
71 _gethgcmd = platform.gethgcmd |
14926
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
72 getuser = platform.getuser |
28027
14033c5dd261
util: enable getpid to be replaced
timeless <timeless@mozdev.org>
parents:
27785
diff
changeset
|
73 getpid = os.getpid |
14926
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
74 hidewindow = platform.hidewindow |
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
75 quotecommand = platform.quotecommand |
22245
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21914
diff
changeset
|
76 readpipe = platform.readpipe |
14926
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
77 setbinary = platform.setbinary |
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
78 setsignalhandler = platform.setsignalhandler |
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
79 shellquote = platform.shellquote |
36415
0cb09c322647
util: factor out shellsplit() function
Yuya Nishihara <yuya@tcha.org>
parents:
36362
diff
changeset
|
80 shellsplit = platform.shellsplit |
14926
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
81 spawndetached = platform.spawndetached |
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
82 sshargs = platform.sshargs |
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14918
diff
changeset
|
83 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
|
84 |
32208
d74b0cff94a9
osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents:
32201
diff
changeset
|
85 try: |
d74b0cff94a9
osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents:
32201
diff
changeset
|
86 setprocname = osutil.setprocname |
d74b0cff94a9
osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents:
32201
diff
changeset
|
87 except AttributeError: |
d74b0cff94a9
osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents:
32201
diff
changeset
|
88 pass |
35460
8652ab4046e4
osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents:
35145
diff
changeset
|
89 try: |
8652ab4046e4
osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents:
35145
diff
changeset
|
90 unblocksignal = osutil.unblocksignal |
8652ab4046e4
osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents:
35145
diff
changeset
|
91 except AttributeError: |
8652ab4046e4
osutil: add a function to unblock signals
Jun Wu <quark@fb.com>
parents:
35145
diff
changeset
|
92 pass |
32208
d74b0cff94a9
osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents:
32201
diff
changeset
|
93 |
34646 | 94 closefds = pycompat.isposix |
10197
29e3c4a7699b
subrepo: normalize svn output line-endings
Patrick Mezard <pmezard@gmail.com>
parents:
9996
diff
changeset
|
95 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
96 |
37460
a6c6b7beb025
procutil: unify platform.explainexit()
Yuya Nishihara <yuya@tcha.org>
parents:
37459
diff
changeset
|
97 def explainexit(code): |
37463
bbd240f81ac5
procutil: make explainexit() simply return a message (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37462
diff
changeset
|
98 """return a message describing a subprocess status |
37460
a6c6b7beb025
procutil: unify platform.explainexit()
Yuya Nishihara <yuya@tcha.org>
parents:
37459
diff
changeset
|
99 (codes from kill are negative - not os.system/wait encoding)""" |
a6c6b7beb025
procutil: unify platform.explainexit()
Yuya Nishihara <yuya@tcha.org>
parents:
37459
diff
changeset
|
100 if code >= 0: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
101 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
|
102 return _(b"killed by signal %d") % -code |
37460
a6c6b7beb025
procutil: unify platform.explainexit()
Yuya Nishihara <yuya@tcha.org>
parents:
37459
diff
changeset
|
103 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
104 |
37459
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
105 class _pfile(object): |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
106 """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:
37220
diff
changeset
|
107 |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
108 def __init__(self, proc, fp): |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
109 self._proc = proc |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
110 self._fp = fp |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
111 |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
112 def close(self): |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
113 # 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:
37220
diff
changeset
|
114 self._fp.close() |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
115 return self._proc.wait() |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
116 |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
117 def __iter__(self): |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
118 return iter(self._fp) |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
119 |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
120 def __getattr__(self, attr): |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
121 return getattr(self._fp, attr) |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
122 |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
123 def __enter__(self): |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
124 return self |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
125 |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
126 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:
37220
diff
changeset
|
127 self.close() |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
128 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
129 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
130 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
|
131 if mode == b'rb': |
37459
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
132 return _popenreader(cmd, bufsize) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
133 elif mode == b'wb': |
37459
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
134 return _popenwriter(cmd, bufsize) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
135 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:
37220
diff
changeset
|
136 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
137 |
37459
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
138 def _popenreader(cmd, bufsize): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
139 p = subprocess.Popen( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
140 tonativestr(quotecommand(cmd)), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
141 shell=True, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
142 bufsize=bufsize, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
143 close_fds=closefds, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
144 stdout=subprocess.PIPE, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
145 ) |
37459
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
146 return _pfile(p, p.stdout) |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
147 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
148 |
37459
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
149 def _popenwriter(cmd, bufsize): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
150 p = subprocess.Popen( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
151 tonativestr(quotecommand(cmd)), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
152 shell=True, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
153 bufsize=bufsize, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
154 close_fds=closefds, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
155 stdin=subprocess.PIPE, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
156 ) |
37459
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
157 return _pfile(p, p.stdin) |
90c5ca718781
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37220
diff
changeset
|
158 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
159 |
37464
632b92899203
procutil: drop unused 'newlines' option from popen*() (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37463
diff
changeset
|
160 def popen2(cmd, env=None): |
9089
8ec39725d966
util: remove unused bufsize argument
Martin Geisler <mg@lazybytes.net>
parents:
9084
diff
changeset
|
161 # 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
|
162 # 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
|
163 # poor performance on Mac OS X: http://bugs.python.org/issue4194 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
164 p = subprocess.Popen( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
165 tonativestr(cmd), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
166 shell=True, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
167 bufsize=-1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
168 close_fds=closefds, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
169 stdin=subprocess.PIPE, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
170 stdout=subprocess.PIPE, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
171 env=tonativeenv(env), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
172 ) |
8280
0b02d98d44d0
util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents:
8257
diff
changeset
|
173 return p.stdin, p.stdout |
10197
29e3c4a7699b
subrepo: normalize svn output line-endings
Patrick Mezard <pmezard@gmail.com>
parents:
9996
diff
changeset
|
174 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
175 |
37464
632b92899203
procutil: drop unused 'newlines' option from popen*() (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37463
diff
changeset
|
176 def popen3(cmd, env=None): |
632b92899203
procutil: drop unused 'newlines' option from popen*() (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37463
diff
changeset
|
177 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
|
178 return stdin, stdout, stderr |
9baf4330d88f
sshpeer: store subprocess so it cleans up correctly
Durham Goode <durham@fb.com>
parents:
18736
diff
changeset
|
179 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
180 |
37464
632b92899203
procutil: drop unused 'newlines' option from popen*() (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37463
diff
changeset
|
181 def popen4(cmd, env=None, bufsize=-1): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
182 p = subprocess.Popen( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
183 tonativestr(cmd), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
184 shell=True, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
185 bufsize=bufsize, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
186 close_fds=closefds, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
187 stdin=subprocess.PIPE, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
188 stdout=subprocess.PIPE, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
189 stderr=subprocess.PIPE, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
190 env=tonativeenv(env), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
191 ) |
18759
9baf4330d88f
sshpeer: store subprocess so it cleans up correctly
Durham Goode <durham@fb.com>
parents:
18736
diff
changeset
|
192 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
|
193 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
194 |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
195 def pipefilter(s, cmd): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
196 '''filter string S through command CMD, returning its output''' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
197 p = subprocess.Popen( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
198 tonativestr(cmd), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
199 shell=True, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
200 close_fds=closefds, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
201 stdin=subprocess.PIPE, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
202 stdout=subprocess.PIPE, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
203 ) |
8302
d2ad8c066676
util: simplify pipefilter and avoid subprocess race
Martin Geisler <mg@lazybytes.net>
parents:
8299
diff
changeset
|
204 pout, perr = p.communicate(s) |
d2ad8c066676
util: simplify pipefilter and avoid subprocess race
Martin Geisler <mg@lazybytes.net>
parents:
8299
diff
changeset
|
205 return pout |
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
206 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
207 |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
208 def tempfilter(s, cmd): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
209 '''filter string S through a pair of temporary files with CMD. |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
210 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
|
211 with the strings INFILE and OUTFILE replaced by the real names of |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
212 the temporary files generated.''' |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
213 inname, outname = None, None |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
214 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
215 infd, inname = pycompat.mkstemp(prefix=b'hg-filter-in-') |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
216 fp = os.fdopen(infd, 'wb') |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
217 fp.write(s) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
218 fp.close() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
219 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
|
220 os.close(outfd) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
221 cmd = cmd.replace(b'INFILE', inname) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
222 cmd = cmd.replace(b'OUTFILE', outname) |
37461
538353b80676
procutil: fix error message of tempfile filter
Yuya Nishihara <yuya@tcha.org>
parents:
37460
diff
changeset
|
223 code = system(cmd) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
224 if pycompat.sysplatform == b'OpenVMS' and code & 1: |
4720
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
225 code = 0 |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
226 if code: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
227 raise error.Abort( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
228 _(b"command '%s' failed: %s") % (cmd, explainexit(code)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
229 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
230 with open(outname, b'rb') as fp: |
37117
e7b517809ebc
util: stop using readfile() in tempfilter()
Yuya Nishihara <yuya@tcha.org>
parents:
37116
diff
changeset
|
231 return fp.read() |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
232 finally: |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
233 try: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
234 if inname: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
235 os.unlink(inname) |
14004
97ed99d1f419
eliminate various naked except clauses
Idan Kamara <idankk86@gmail.com>
parents:
13985
diff
changeset
|
236 except OSError: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
237 pass |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
238 try: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
239 if outname: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
240 os.unlink(outname) |
14004
97ed99d1f419
eliminate various naked except clauses
Idan Kamara <idankk86@gmail.com>
parents:
13985
diff
changeset
|
241 except OSError: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
242 pass |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
243 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
244 |
37116
7ccc9b8aca4c
util: mark filtertable as private constant
Yuya Nishihara <yuya@tcha.org>
parents:
37115
diff
changeset
|
245 _filtertable = { |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
246 b'tempfile:': tempfilter, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
247 b'pipe:': pipefilter, |
37116
7ccc9b8aca4c
util: mark filtertable as private constant
Yuya Nishihara <yuya@tcha.org>
parents:
37115
diff
changeset
|
248 } |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
249 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
250 |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
251 def filter(s, cmd): |
43787
be8552f25cab
cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents:
43671
diff
changeset
|
252 """filter a string through a command that transforms its input to its |
be8552f25cab
cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents:
43671
diff
changeset
|
253 output""" |
43106
d783f945a701
py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43096
diff
changeset
|
254 for name, fn in pycompat.iteritems(_filtertable): |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
255 if cmd.startswith(name): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
256 return fn(s, cmd[len(name) :].lstrip()) |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
257 return pipefilter(s, cmd) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
258 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
259 |
22632
db15bb2d6323
util: move _hgexecutable a few lines, closer to where it is used
Mads Kiilerich <madski@unity3d.com>
parents:
22245
diff
changeset
|
260 _hgexecutable = None |
db15bb2d6323
util: move _hgexecutable a few lines, closer to where it is used
Mads Kiilerich <madski@unity3d.com>
parents:
22245
diff
changeset
|
261 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
262 |
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
263 def hgexecutable(): |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
264 """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
|
265 |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
266 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
|
267 """ |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
268 if _hgexecutable is None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
269 hg = encoding.environ.get(b'HG') |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
270 mainmod = sys.modules['__main__'] |
6500 | 271 if hg: |
14229
85fd8402cbc4
rename util.set_hgexecutable to _sethgexecutable
Adrian Buehlmann <adrian@cadifra.com>
parents:
14228
diff
changeset
|
272 _sethgexecutable(hg) |
43671
664e24207728
procutil: move mainfrozen() to new resourceutil.py
Martin von Zweigbergk <martinvonz@google.com>
parents:
43657
diff
changeset
|
273 elif resourceutil.mainfrozen(): |
43657
38387f9e4d22
py3: use native string for 'macosx_app'
Martin von Zweigbergk <martinvonz@google.com>
parents:
43656
diff
changeset
|
274 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
|
275 # Env variable set by py2app |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
276 _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
|
277 else: |
30669
10b17ed9b591
py3: replace sys.executable with pycompat.sysexecutable
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30642
diff
changeset
|
278 _sethgexecutable(pycompat.sysexecutable) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
279 elif ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
280 not pycompat.iswindows |
43656
47d983f0af65
py3: drop an unnecessary fsencode() before comparing with constant
Martin von Zweigbergk <martinvonz@google.com>
parents:
43655
diff
changeset
|
281 and os.path.basename(getattr(mainmod, '__file__', '')) == 'hg' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
282 ): |
31074
2912b06905dc
py3: use pycompat.fsencode() to convert __file__ to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30988
diff
changeset
|
283 _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
|
284 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
285 _sethgexecutable( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
286 findexe(b'hg') or os.path.basename(pycompat.sysargv[0]) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
287 ) |
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
288 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
|
289 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
290 |
14229
85fd8402cbc4
rename util.set_hgexecutable to _sethgexecutable
Adrian Buehlmann <adrian@cadifra.com>
parents:
14228
diff
changeset
|
291 def _sethgexecutable(path): |
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
292 """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
|
293 global _hgexecutable |
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
294 _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
|
295 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
296 |
36793
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36791
diff
changeset
|
297 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
|
298 fileno = getattr(f, 'fileno', None) |
36432
1ca4e86c7265
util: handle fileno() on Python 3 throwing io.UnsupportedOperation
Augie Fackler <augie@google.com>
parents:
36422
diff
changeset
|
299 try: |
36793
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36791
diff
changeset
|
300 return fileno and fileno() == stdf.fileno() |
36432
1ca4e86c7265
util: handle fileno() on Python 3 throwing io.UnsupportedOperation
Augie Fackler <augie@google.com>
parents:
36422
diff
changeset
|
301 except io.UnsupportedOperation: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
302 return False # fileno() raised UnsupportedOperation |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
303 |
26450
1138e1d05207
util.system: compare fileno to see if it needs stdout redirection
Yuya Nishihara <yuya@tcha.org>
parents:
26392
diff
changeset
|
304 |
36793
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36791
diff
changeset
|
305 def isstdin(f): |
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36791
diff
changeset
|
306 return _testfileno(f, sys.__stdin__) |
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36791
diff
changeset
|
307 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
308 |
36793
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36791
diff
changeset
|
309 def isstdout(f): |
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36791
diff
changeset
|
310 return _testfileno(f, sys.__stdout__) |
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36791
diff
changeset
|
311 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
312 |
37123
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37118
diff
changeset
|
313 def protectstdio(uin, uout): |
37220
7f78de1c93aa
procutil: redirect ui.fout to stderr while stdio is protected
Yuya Nishihara <yuya@tcha.org>
parents:
37219
diff
changeset
|
314 """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:
37219
diff
changeset
|
315 |
7f78de1c93aa
procutil: redirect ui.fout to stderr while stdio is protected
Yuya Nishihara <yuya@tcha.org>
parents:
37219
diff
changeset
|
316 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:
37219
diff
changeset
|
317 redirected to stderr so the output is still readable. |
37123
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37118
diff
changeset
|
318 |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37118
diff
changeset
|
319 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:
37118
diff
changeset
|
320 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:
37118
diff
changeset
|
321 "owned" in that print(), exec(), etc. never reach to them. |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37118
diff
changeset
|
322 """ |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37118
diff
changeset
|
323 uout.flush() |
37219
ac71cbad5da3
procutil: unroll uin/uout loop in protectstdio()
Yuya Nishihara <yuya@tcha.org>
parents:
37124
diff
changeset
|
324 fin, fout = uin, uout |
39807
e5724be689b3
procutil: compare fd number to see if stdio protection is needed (issue5992)
Yuya Nishihara <yuya@tcha.org>
parents:
38526
diff
changeset
|
325 if _testfileno(uin, stdin): |
37219
ac71cbad5da3
procutil: unroll uin/uout loop in protectstdio()
Yuya Nishihara <yuya@tcha.org>
parents:
37124
diff
changeset
|
326 newfd = os.dup(uin.fileno()) |
37220
7f78de1c93aa
procutil: redirect ui.fout to stderr while stdio is protected
Yuya Nishihara <yuya@tcha.org>
parents:
37219
diff
changeset
|
327 nullfd = os.open(os.devnull, os.O_RDONLY) |
37219
ac71cbad5da3
procutil: unroll uin/uout loop in protectstdio()
Yuya Nishihara <yuya@tcha.org>
parents:
37124
diff
changeset
|
328 os.dup2(nullfd, uin.fileno()) |
37220
7f78de1c93aa
procutil: redirect ui.fout to stderr while stdio is protected
Yuya Nishihara <yuya@tcha.org>
parents:
37219
diff
changeset
|
329 os.close(nullfd) |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
330 fin = os.fdopen(newfd, 'rb') |
39807
e5724be689b3
procutil: compare fd number to see if stdio protection is needed (issue5992)
Yuya Nishihara <yuya@tcha.org>
parents:
38526
diff
changeset
|
331 if _testfileno(uout, stdout): |
37219
ac71cbad5da3
procutil: unroll uin/uout loop in protectstdio()
Yuya Nishihara <yuya@tcha.org>
parents:
37124
diff
changeset
|
332 newfd = os.dup(uout.fileno()) |
37220
7f78de1c93aa
procutil: redirect ui.fout to stderr while stdio is protected
Yuya Nishihara <yuya@tcha.org>
parents:
37219
diff
changeset
|
333 os.dup2(stderr.fileno(), uout.fileno()) |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
334 fout = os.fdopen(newfd, 'wb') |
37219
ac71cbad5da3
procutil: unroll uin/uout loop in protectstdio()
Yuya Nishihara <yuya@tcha.org>
parents:
37124
diff
changeset
|
335 return fin, fout |
37123
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37118
diff
changeset
|
336 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
337 |
37123
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37118
diff
changeset
|
338 def restorestdio(uin, uout, fin, fout): |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37118
diff
changeset
|
339 """Restore (uin, uout) streams from possibly duplicated (fin, fout)""" |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37118
diff
changeset
|
340 uout.flush() |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37118
diff
changeset
|
341 for f, uif in [(fin, uin), (fout, uout)]: |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37118
diff
changeset
|
342 if f is not uif: |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37118
diff
changeset
|
343 os.dup2(f.fileno(), uif.fileno()) |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37118
diff
changeset
|
344 f.close() |
0216232f21ab
procutil: move protectio/restoreio from commandserver
Yuya Nishihara <yuya@tcha.org>
parents:
37118
diff
changeset
|
345 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
346 |
30736
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30669
diff
changeset
|
347 def shellenviron(environ=None): |
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30669
diff
changeset
|
348 """return environ with optional override, useful for shelling out""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
349 |
30736
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30669
diff
changeset
|
350 def py2shell(val): |
43787
be8552f25cab
cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents:
43671
diff
changeset
|
351 """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:
30669
diff
changeset
|
352 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
|
353 return b'0' |
30736
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30669
diff
changeset
|
354 if val is True: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
355 return b'1' |
36418
d26b0bedfaa4
util: use pycompat.bytestr() instead of str()
Augie Fackler <augie@google.com>
parents:
36415
diff
changeset
|
356 return pycompat.bytestr(val) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
357 |
30736
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30669
diff
changeset
|
358 env = dict(encoding.environ) |
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30669
diff
changeset
|
359 if environ: |
43106
d783f945a701
py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43096
diff
changeset
|
360 env.update((k, py2shell(v)) for k, v in pycompat.iteritems(environ)) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
361 env[b'HG'] = hgexecutable() |
30736
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30669
diff
changeset
|
362 return env |
d9e5b0aeeb90
util: extract the logic calculating environment variables
Jun Wu <quark@fb.com>
parents:
30669
diff
changeset
|
363 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
364 |
38491
72286f9e324f
procutil: add a shim for translating shell commands to native commands
Matt Harbison <matt_harbison@yahoo.com>
parents:
38454
diff
changeset
|
365 if pycompat.iswindows: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
366 |
38491
72286f9e324f
procutil: add a shim for translating shell commands to native commands
Matt Harbison <matt_harbison@yahoo.com>
parents:
38454
diff
changeset
|
367 def shelltonative(cmd, env): |
43478
54f4d094bab1
procutil: suppress pytype warnings around windows-only attributes
Augie Fackler <augie@google.com>
parents:
43165
diff
changeset
|
368 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
|
369 cmd, shellenviron(env) |
54f4d094bab1
procutil: suppress pytype warnings around windows-only attributes
Augie Fackler <augie@google.com>
parents:
43165
diff
changeset
|
370 ) |
39662
50f46b771921
py3: partially fix pager spawning on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
38526
diff
changeset
|
371 |
50f46b771921
py3: partially fix pager spawning on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
38526
diff
changeset
|
372 tonativestr = encoding.strfromlocal |
38491
72286f9e324f
procutil: add a shim for translating shell commands to native commands
Matt Harbison <matt_harbison@yahoo.com>
parents:
38454
diff
changeset
|
373 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
374 |
38491
72286f9e324f
procutil: add a shim for translating shell commands to native commands
Matt Harbison <matt_harbison@yahoo.com>
parents:
38454
diff
changeset
|
375 def shelltonative(cmd, env): |
72286f9e324f
procutil: add a shim for translating shell commands to native commands
Matt Harbison <matt_harbison@yahoo.com>
parents:
38454
diff
changeset
|
376 return cmd |
72286f9e324f
procutil: add a shim for translating shell commands to native commands
Matt Harbison <matt_harbison@yahoo.com>
parents:
38454
diff
changeset
|
377 |
39662
50f46b771921
py3: partially fix pager spawning on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
38526
diff
changeset
|
378 tonativestr = pycompat.identity |
50f46b771921
py3: partially fix pager spawning on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
38526
diff
changeset
|
379 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
380 |
39662
50f46b771921
py3: partially fix pager spawning on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
38526
diff
changeset
|
381 def tonativeenv(env): |
50f46b771921
py3: partially fix pager spawning on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
38526
diff
changeset
|
382 '''convert the environment from bytes to strings suitable for Popen(), etc. |
50f46b771921
py3: partially fix pager spawning on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
38526
diff
changeset
|
383 ''' |
50f46b771921
py3: partially fix pager spawning on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
38526
diff
changeset
|
384 return pycompat.rapply(tonativestr, env) |
50f46b771921
py3: partially fix pager spawning on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
38526
diff
changeset
|
385 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
386 |
31108
3f8f53190d6a
chg: deduplicate error handling of ui.system()
Yuya Nishihara <yuya@tcha.org>
parents:
31074
diff
changeset
|
387 def system(cmd, environ=None, cwd=None, out=None): |
1882
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
388 '''enhanced shell command execution. |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
389 run with environment maybe modified, maybe in different dir. |
508 | 390 |
11469
c37f35d7f2f5
http: deliver hook output to client
Maxim Khitrov <mkhitrov@gmail.com>
parents:
11297
diff
changeset
|
391 if out is specified, it is assumed to be a file-like object that has a |
c37f35d7f2f5
http: deliver hook output to client
Maxim Khitrov <mkhitrov@gmail.com>
parents:
11297
diff
changeset
|
392 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
|
393 try: |
30473
39d13b8c101d
py3: bulk replace sys.stdin/out/err by util's
Yuya Nishihara <yuya@tcha.org>
parents:
30472
diff
changeset
|
394 stdout.flush() |
13439
d724a69309e0
util: flush stdout before calling external processes
Mads Kiilerich <mads@kiilerich.com>
parents:
13400
diff
changeset
|
395 except Exception: |
d724a69309e0
util: flush stdout before calling external processes
Mads Kiilerich <mads@kiilerich.com>
parents:
13400
diff
changeset
|
396 pass |
13188
6c9345f9edca
util: concentrate quoting knowledge to windows.py quotecommand()
Steve Borho <steve@borho.org>
parents:
13128
diff
changeset
|
397 cmd = quotecommand(cmd) |
32886
19b0fd4b5570
plan9: drop py26 hacks
Matt Harbison <matt_harbison@yahoo.com>
parents:
32816
diff
changeset
|
398 env = shellenviron(environ) |
36793
eca1051e6c22
util: add public isstdin/isstdout() functions
Yuya Nishihara <yuya@tcha.org>
parents:
36791
diff
changeset
|
399 if out is None or isstdout(out): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
400 rc = subprocess.call( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
401 tonativestr(cmd), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
402 shell=True, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
403 close_fds=closefds, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
404 env=tonativeenv(env), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
405 cwd=pycompat.rapply(tonativestr, cwd), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
406 ) |
11469
c37f35d7f2f5
http: deliver hook output to client
Maxim Khitrov <mkhitrov@gmail.com>
parents:
11297
diff
changeset
|
407 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
408 proc = subprocess.Popen( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
409 tonativestr(cmd), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
410 shell=True, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
411 close_fds=closefds, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
412 env=tonativeenv(env), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
413 cwd=pycompat.rapply(tonativestr, cwd), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
414 stdout=subprocess.PIPE, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
415 stderr=subprocess.STDOUT, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
416 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
417 for line in iter(proc.stdout.readline, b''): |
32886
19b0fd4b5570
plan9: drop py26 hacks
Matt Harbison <matt_harbison@yahoo.com>
parents:
32816
diff
changeset
|
418 out.write(line) |
19b0fd4b5570
plan9: drop py26 hacks
Matt Harbison <matt_harbison@yahoo.com>
parents:
32816
diff
changeset
|
419 proc.wait() |
19b0fd4b5570
plan9: drop py26 hacks
Matt Harbison <matt_harbison@yahoo.com>
parents:
32816
diff
changeset
|
420 rc = proc.returncode |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
421 if pycompat.sysplatform == b'OpenVMS' and rc & 1: |
32886
19b0fd4b5570
plan9: drop py26 hacks
Matt Harbison <matt_harbison@yahoo.com>
parents:
32816
diff
changeset
|
422 rc = 0 |
9517
4368f582c806
util.system: Use subprocess instead of os.system
Mads Kiilerich <mads@kiilerich.com>
parents:
9508
diff
changeset
|
423 return rc |
1880
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
424 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
425 |
43912
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43862
diff
changeset
|
426 _is_gui = None |
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43862
diff
changeset
|
427 |
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43862
diff
changeset
|
428 |
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43862
diff
changeset
|
429 def _gui(): |
6007
090b1a665901
filemerge: add config item for GUI tools
Matt Mackall <mpm@selenic.com>
parents:
6006
diff
changeset
|
430 '''Are we running in a GUI?''' |
34647 | 431 if pycompat.isdarwin: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
432 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
|
433 # 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
|
434 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
|
435 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
|
436 # 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
|
437 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
|
438 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
|
439 # 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
|
440 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
|
441 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
442 return pycompat.iswindows or encoding.environ.get(b"DISPLAY") |
6007
090b1a665901
filemerge: add config item for GUI tools
Matt Mackall <mpm@selenic.com>
parents:
6006
diff
changeset
|
443 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
444 |
43912
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43862
diff
changeset
|
445 def gui(): |
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43862
diff
changeset
|
446 global _is_gui |
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43862
diff
changeset
|
447 if _is_gui is None: |
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43862
diff
changeset
|
448 _is_gui = _gui() |
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43862
diff
changeset
|
449 return _is_gui |
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43862
diff
changeset
|
450 |
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43862
diff
changeset
|
451 |
10239
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10199
diff
changeset
|
452 def hgcmd(): |
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10199
diff
changeset
|
453 """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
|
454 |
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10199
diff
changeset
|
455 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
|
456 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
|
457 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
|
458 """ |
43671
664e24207728
procutil: move mainfrozen() to new resourceutil.py
Martin von Zweigbergk <martinvonz@google.com>
parents:
43657
diff
changeset
|
459 if resourceutil.mainfrozen(): |
43657
38387f9e4d22
py3: use native string for 'macosx_app'
Martin von Zweigbergk <martinvonz@google.com>
parents:
43656
diff
changeset
|
460 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
|
461 # Env variable set by py2app |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
462 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
|
463 else: |
30669
10b17ed9b591
py3: replace sys.executable with pycompat.sysexecutable
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30642
diff
changeset
|
464 return [pycompat.sysexecutable] |
37115
49d6ba67c93f
util: mark platform-specific gethgcmd() as private
Yuya Nishihara <yuya@tcha.org>
parents:
37099
diff
changeset
|
465 return _gethgcmd() |
10344
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
466 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
467 |
10344
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
468 def rundetached(args, condfn): |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
469 """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
|
470 |
10344
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
471 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
|
472 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
|
473 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
|
474 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
|
475 True, return -1. |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
476 """ |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
477 # 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
|
478 # 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
|
479 # 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
|
480 # 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
|
481 # 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
|
482 # 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
|
483 # us our child process terminated. |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
484 terminated = set() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
485 |
10344
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
486 def handler(signum, frame): |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
487 terminated.add(os.wait()) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
488 |
10344
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
489 prevhandler = None |
14968
b7dbe957585c
util: use safehasattr or getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14942
diff
changeset
|
490 SIGCHLD = getattr(signal, 'SIGCHLD', None) |
b7dbe957585c
util: use safehasattr or getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14942
diff
changeset
|
491 if SIGCHLD is not None: |
b7dbe957585c
util: use safehasattr or getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14942
diff
changeset
|
492 prevhandler = signal.signal(SIGCHLD, handler) |
10344
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
493 try: |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
494 pid = spawndetached(args) |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
495 while not condfn(): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
496 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
|
497 return -1 |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
498 time.sleep(0.1) |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
499 return pid |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
500 finally: |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
501 if prevhandler is not None: |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
502 signal.signal(signal.SIGCHLD, prevhandler) |
38526
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
503 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
504 |
38526
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
505 @contextlib.contextmanager |
41076
8ecb17b7f432
procutil: correct spelling of uninterruptable -> uninterruptible
Kyle Lippincott <spectral@google.com>
parents:
40712
diff
changeset
|
506 def uninterruptible(warn): |
38526
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
507 """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:
38525
diff
changeset
|
508 |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
509 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:
38525
diff
changeset
|
510 |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
511 Args: |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
512 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:
38525
diff
changeset
|
513 previous signal handling should be restored. |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
514 """ |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
515 |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
516 oldsiginthandler = [signal.getsignal(signal.SIGINT)] |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
517 shouldbail = [] |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
518 |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
519 def disabledsiginthandler(*args): |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
520 if warn(): |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
521 signal.signal(signal.SIGINT, oldsiginthandler[0]) |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
522 del oldsiginthandler[0] |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
523 shouldbail.append(True) |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
524 |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
525 try: |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
526 try: |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
527 signal.signal(signal.SIGINT, disabledsiginthandler) |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
528 except ValueError: |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
529 # wrong thread, oh well, we tried |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
530 del oldsiginthandler[0] |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
531 yield |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
532 finally: |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
533 if oldsiginthandler: |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
534 signal.signal(signal.SIGINT, oldsiginthandler[0]) |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
535 if shouldbail: |
313a940d49a3
ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
38525
diff
changeset
|
536 raise KeyboardInterrupt |
40497
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
537 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
538 |
40497
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
539 if pycompat.iswindows: |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
540 # no fork on Windows, but we can create a detached process |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
541 # https://msdn.microsoft.com/en-us/library/windows/desktop/ms684863.aspx |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
542 # No stdlib constant exists for this value |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
543 DETACHED_PROCESS = 0x00000008 |
40536
1d3bed7d2923
procutil: import concerns about creationflags on Windows from D1701
Boris Feld <boris.feld@octobus.net>
parents:
40498
diff
changeset
|
544 # 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:
40498
diff
changeset
|
545 # Using subprocess.CREATE_NEW_CONSOLE might helps. |
1d3bed7d2923
procutil: import concerns about creationflags on Windows from D1701
Boris Feld <boris.feld@octobus.net>
parents:
40498
diff
changeset
|
546 # See https://phab.mercurial-scm.org/D1701 for discussion |
43478
54f4d094bab1
procutil: suppress pytype warnings around windows-only attributes
Augie Fackler <augie@google.com>
parents:
43165
diff
changeset
|
547 _creationflags = ( |
54f4d094bab1
procutil: suppress pytype warnings around windows-only attributes
Augie Fackler <augie@google.com>
parents:
43165
diff
changeset
|
548 DETACHED_PROCESS |
54f4d094bab1
procutil: suppress pytype warnings around windows-only attributes
Augie Fackler <augie@google.com>
parents:
43165
diff
changeset
|
549 | 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
|
550 ) |
40497
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
551 |
42496
ca1014ad3de4
procutil: allow callers of runbgcommand to assume the process starts
Augie Fackler <augie@google.com>
parents:
41832
diff
changeset
|
552 def runbgcommand( |
43848
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
553 script, |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
554 env, |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
555 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
|
556 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
|
557 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
|
558 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
|
559 record_wait=None, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
560 ): |
40497
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
561 '''Spawn a command without waiting for it to finish.''' |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
562 # 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:
39840
diff
changeset
|
563 # need to because the detached process has no console connection. |
43848
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
564 p = subprocess.Popen( |
40498
8fab95aa5280
procutil: port over windows encoding fixes from logtoprocess
Augie Fackler <augie@google.com>
parents:
40497
diff
changeset
|
565 tonativestr(script), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
566 shell=shell, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
567 env=tonativeenv(env), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
568 close_fds=True, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
569 creationflags=_creationflags, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
570 stdout=stdout, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
571 stderr=stderr, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
572 ) |
43848
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
573 if record_wait is not None: |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
574 record_wait(p.wait) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
575 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
576 |
40497
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
577 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
578 |
42496
ca1014ad3de4
procutil: allow callers of runbgcommand to assume the process starts
Augie Fackler <augie@google.com>
parents:
41832
diff
changeset
|
579 def runbgcommand( |
43848
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
580 cmd, |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
581 env, |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
582 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
|
583 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
|
584 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
|
585 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
|
586 record_wait=None, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
587 ): |
43848
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
588 '''Spawn a command without waiting for it to finish. |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
589 |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
590 |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
591 When `record_wait` is not None, the spawned process will not be fully |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
592 detached and the `record_wait` argument will be called with a the |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
593 `Subprocess.wait` function for the spawned process. This is mostly |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
594 useful for developers that need to make sure the spawned process |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
595 finished before a certain point. (eg: writing test)''' |
43912
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43862
diff
changeset
|
596 if pycompat.isdarwin: |
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43862
diff
changeset
|
597 # avoid crash in CoreFoundation in case another thread |
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43862
diff
changeset
|
598 # calls gui() while we're calling fork(). |
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43862
diff
changeset
|
599 gui() |
a89381e04c58
procutil: try and avoid angering CoreFoundation on macOS
Augie Fackler <augie@google.com>
parents:
43862
diff
changeset
|
600 |
40497
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
601 # double-fork to completely detach from the parent process |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
602 # based on http://code.activestate.com/recipes/278731 |
43848
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
603 if record_wait is None: |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
604 pid = os.fork() |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
605 if pid: |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
606 if not ensurestart: |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
607 return |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
608 # Parent process |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
609 (_pid, status) = os.waitpid(pid, 0) |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
610 if os.WIFEXITED(status): |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
611 returncode = os.WEXITSTATUS(status) |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
612 else: |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
613 returncode = -(os.WTERMSIG(status)) |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
614 if returncode != 0: |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
615 # The child process's return code is 0 on success, an errno |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
616 # value on failure, or 255 if we don't have a valid errno |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
617 # value. |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
618 # |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
619 # (It would be slightly nicer to return the full exception info |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
620 # over a pipe as the subprocess module does. For now it |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
621 # doesn't seem worth adding that complexity here, though.) |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
622 if returncode == 255: |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
623 returncode = errno.EINVAL |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
624 raise OSError( |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
625 returncode, |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
626 b'error running %r: %s' |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
627 % (cmd, os.strerror(returncode)), |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
628 ) |
42496
ca1014ad3de4
procutil: allow callers of runbgcommand to assume the process starts
Augie Fackler <augie@google.com>
parents:
41832
diff
changeset
|
629 return |
40497
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
630 |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
631 returncode = 255 |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
632 try: |
43848
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
633 if record_wait is None: |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
634 # Start a new session |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
635 os.setsid() |
40497
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
636 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
637 stdin = open(os.devnull, b'r') |
40497
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
638 if stdout is None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
639 stdout = open(os.devnull, b'w') |
40497
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
640 if stderr is None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
641 stderr = open(os.devnull, b'w') |
40497
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
642 |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
643 # connect stdin to devnull to make sure the subprocess can't |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
644 # muck up that stream for mercurial. |
43848
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
645 p = subprocess.Popen( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
646 cmd, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
647 shell=shell, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
648 env=env, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
649 close_fds=True, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
650 stdin=stdin, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
651 stdout=stdout, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
652 stderr=stderr, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
653 ) |
43848
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
654 if record_wait is not None: |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
655 record_wait(p.wait) |
40497
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
656 returncode = 0 |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
657 except EnvironmentError as ex: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
658 returncode = ex.errno & 0xFF |
40497
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
659 if returncode == 0: |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
660 # This shouldn't happen, but just in case make sure the |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
661 # return code is never 0 here. |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
662 returncode = 255 |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
663 except Exception: |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
664 returncode = 255 |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
665 finally: |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
666 # mission accomplished, this child needs to exit and not |
3fbfbc8c9f82
remotefilelog: transplant runbgcommand to procutil
Augie Fackler <augie@google.com>
parents:
39840
diff
changeset
|
667 # continue the hg process here. |
43848
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
668 if record_wait is None: |
15a6c6783060
procutil: add a option to not fully detach background process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43165
diff
changeset
|
669 os._exit(returncode) |