diff options
Diffstat (limited to 'git_command.py')
-rw-r--r-- | git_command.py | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/git_command.py b/git_command.py index 3309f378..4ad908f6 100644 --- a/git_command.py +++ b/git_command.py | |||
@@ -17,6 +17,7 @@ import os | |||
17 | import sys | 17 | import sys |
18 | import subprocess | 18 | import subprocess |
19 | import tempfile | 19 | import tempfile |
20 | from signal import SIGTERM | ||
20 | from error import GitError | 21 | from error import GitError |
21 | from trace import REPO_TRACE, IsTrace, Trace | 22 | from trace import REPO_TRACE, IsTrace, Trace |
22 | 23 | ||
@@ -29,6 +30,7 @@ LAST_CWD = None | |||
29 | 30 | ||
30 | _ssh_proxy_path = None | 31 | _ssh_proxy_path = None |
31 | _ssh_sock_path = None | 32 | _ssh_sock_path = None |
33 | _ssh_clients = [] | ||
32 | 34 | ||
33 | def ssh_sock(create=True): | 35 | def ssh_sock(create=True): |
34 | global _ssh_sock_path | 36 | global _ssh_sock_path |
@@ -51,6 +53,24 @@ def _ssh_proxy(): | |||
51 | 'git_ssh') | 53 | 'git_ssh') |
52 | return _ssh_proxy_path | 54 | return _ssh_proxy_path |
53 | 55 | ||
56 | def _add_ssh_client(p): | ||
57 | _ssh_clients.append(p) | ||
58 | |||
59 | def _remove_ssh_client(p): | ||
60 | try: | ||
61 | _ssh_clients.remove(p) | ||
62 | except ValueError: | ||
63 | pass | ||
64 | |||
65 | def terminate_ssh_clients(): | ||
66 | global _ssh_clients | ||
67 | for p in _ssh_clients: | ||
68 | try: | ||
69 | os.kill(p.pid, SIGTERM) | ||
70 | p.wait() | ||
71 | except OSError: | ||
72 | pass | ||
73 | _ssh_clients = [] | ||
54 | 74 | ||
55 | class _GitCall(object): | 75 | class _GitCall(object): |
56 | def version(self): | 76 | def version(self): |
@@ -188,6 +208,9 @@ class GitCommand(object): | |||
188 | except Exception, e: | 208 | except Exception, e: |
189 | raise GitError('%s: %s' % (command[1], e)) | 209 | raise GitError('%s: %s' % (command[1], e)) |
190 | 210 | ||
211 | if ssh_proxy: | ||
212 | _add_ssh_client(p) | ||
213 | |||
191 | self.process = p | 214 | self.process = p |
192 | self.stdin = p.stdin | 215 | self.stdin = p.stdin |
193 | 216 | ||
@@ -210,4 +233,8 @@ class GitCommand(object): | |||
210 | else: | 233 | else: |
211 | p.stderr = None | 234 | p.stderr = None |
212 | 235 | ||
213 | return self.process.wait() | 236 | try: |
237 | rc = p.wait() | ||
238 | finally: | ||
239 | _remove_ssh_client(p) | ||
240 | return rc | ||