diff options
author | David Pursehouse <dpursehouse@collab.net> | 2017-08-30 10:24:03 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2017-08-30 10:24:03 +0000 |
commit | d1ebc89a083f2966f8c65246bb63e2deaadfab62 (patch) | |
tree | cd6bd047ba2c7b83a25ba045a48efa95393f7fbe /git_command.py | |
parent | 9ead97bb51f5b1ad1d0a45e0c5442f15e1e38fd7 (diff) | |
parent | ad1abcb556bfff2744928a8f29d216aee43fdbe3 (diff) | |
download | git-repo-d1ebc89a083f2966f8c65246bb63e2deaadfab62.tar.gz |
Merge changes from topic "windows-support"
* changes:
Port os.rename calls to work on Windows
Workaround shutil.rmtree limitation on Windows
Add support for creating symbolic links on Windows
Make "git command" and "forall" work on Windows
Diffstat (limited to 'git_command.py')
-rw-r--r-- | git_command.py | 29 |
1 files changed, 8 insertions, 21 deletions
diff --git a/git_command.py b/git_command.py index 9f7d2930..dfa6a924 100644 --- a/git_command.py +++ b/git_command.py | |||
@@ -14,14 +14,14 @@ | |||
14 | # limitations under the License. | 14 | # limitations under the License. |
15 | 15 | ||
16 | from __future__ import print_function | 16 | from __future__ import print_function |
17 | import fcntl | ||
18 | import os | 17 | import os |
19 | import select | ||
20 | import sys | 18 | import sys |
21 | import subprocess | 19 | import subprocess |
22 | import tempfile | 20 | import tempfile |
23 | from signal import SIGTERM | 21 | from signal import SIGTERM |
22 | |||
24 | from error import GitError | 23 | from error import GitError |
24 | import platform_utils | ||
25 | from trace import REPO_TRACE, IsTrace, Trace | 25 | from trace import REPO_TRACE, IsTrace, Trace |
26 | from wrapper import Wrapper | 26 | from wrapper import Wrapper |
27 | 27 | ||
@@ -78,16 +78,6 @@ def terminate_ssh_clients(): | |||
78 | 78 | ||
79 | _git_version = None | 79 | _git_version = None |
80 | 80 | ||
81 | class _sfd(object): | ||
82 | """select file descriptor class""" | ||
83 | def __init__(self, fd, dest, std_name): | ||
84 | assert std_name in ('stdout', 'stderr') | ||
85 | self.fd = fd | ||
86 | self.dest = dest | ||
87 | self.std_name = std_name | ||
88 | def fileno(self): | ||
89 | return self.fd.fileno() | ||
90 | |||
91 | class _GitCall(object): | 81 | class _GitCall(object): |
92 | def version(self): | 82 | def version(self): |
93 | p = GitCommand(None, ['--version'], capture_stdout=True) | 83 | p = GitCommand(None, ['--version'], capture_stdout=True) |
@@ -253,19 +243,16 @@ class GitCommand(object): | |||
253 | 243 | ||
254 | def _CaptureOutput(self): | 244 | def _CaptureOutput(self): |
255 | p = self.process | 245 | p = self.process |
256 | s_in = [_sfd(p.stdout, sys.stdout, 'stdout'), | 246 | s_in = platform_utils.FileDescriptorStreams.create() |
257 | _sfd(p.stderr, sys.stderr, 'stderr')] | 247 | s_in.add(p.stdout, sys.stdout, 'stdout') |
248 | s_in.add(p.stderr, sys.stderr, 'stderr') | ||
258 | self.stdout = '' | 249 | self.stdout = '' |
259 | self.stderr = '' | 250 | self.stderr = '' |
260 | 251 | ||
261 | for s in s_in: | 252 | while not s_in.is_done: |
262 | flags = fcntl.fcntl(s.fd, fcntl.F_GETFL) | 253 | in_ready = s_in.select() |
263 | fcntl.fcntl(s.fd, fcntl.F_SETFL, flags | os.O_NONBLOCK) | ||
264 | |||
265 | while s_in: | ||
266 | in_ready, _, _ = select.select(s_in, [], []) | ||
267 | for s in in_ready: | 254 | for s in in_ready: |
268 | buf = s.fd.read(4096) | 255 | buf = s.read() |
269 | if not buf: | 256 | if not buf: |
270 | s_in.remove(s) | 257 | s_in.remove(s) |
271 | continue | 258 | continue |