summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Frysinger <vapier@google.com>2021-05-04 17:58:26 -0400
committerMike Frysinger <vapier@google.com>2021-05-04 23:49:29 +0000
commit5ba80d404cd6d5dc6d1ccfcfc5f8fc560d82be06 (patch)
tree72180bb96766ac5546fdcaaad41351d9fa0cb0bc
parent1c3f57e8f13d4f6dc818bdf06c3a40f768ef1ce5 (diff)
downloadgit-repo-5ba80d404cd6d5dc6d1ccfcfc5f8fc560d82be06.tar.gz
git_config: hoist Windows ssh check earlier
The ssh master logic has never worked under Windows which is why this code always returned False when running there (including cygwin). But the OS check was still done while holding the threading lock. While it might be a little slower than necessary, it still worked. The switch from the threading module to the multiprocessing module changed global behavior subtly under Windows and broke things: the globals previously would stay valid, but now they get cleared. So the lock is reset to None in children workers. We could tweak the logic to pass the lock through, but there isn't much point when the rest of the code is still disabled in Windows. So perform the platform check before we grab the lock. This fixes the crash, and probably speeds things up a few nanoseconds. This shouldn't be a problem on Linux systems as the platform fork will duplicate the existing process memory (including globals). Bug: https://crbug.com/gerrit/14480 Change-Id: I1d1da82c6d7bd6b8cdc1f03f640a520ecd047063 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/305149 Reviewed-by: Raman Tenneti <rtenneti@google.com> Tested-by: Mike Frysinger <vapier@google.com>
-rw-r--r--git_config.py12
1 files changed, 7 insertions, 5 deletions
diff --git a/git_config.py b/git_config.py
index 914b2924..fcd0446c 100644
--- a/git_config.py
+++ b/git_config.py
@@ -459,6 +459,11 @@ def init_ssh():
459def _open_ssh(host, port=None): 459def _open_ssh(host, port=None):
460 global _ssh_master 460 global _ssh_master
461 461
462 # Bail before grabbing the lock if we already know that we aren't going to
463 # try creating new masters below.
464 if sys.platform in ('win32', 'cygwin'):
465 return False
466
462 # Acquire the lock. This is needed to prevent opening multiple masters for 467 # Acquire the lock. This is needed to prevent opening multiple masters for
463 # the same host when we're running "repo sync -jN" (for N > 1) _and_ the 468 # the same host when we're running "repo sync -jN" (for N > 1) _and_ the
464 # manifest <remote fetch="ssh://xyz"> specifies a different host from the 469 # manifest <remote fetch="ssh://xyz"> specifies a different host from the
@@ -476,11 +481,8 @@ def _open_ssh(host, port=None):
476 if key in _master_keys: 481 if key in _master_keys:
477 return True 482 return True
478 483
479 if (not _ssh_master 484 if not _ssh_master or 'GIT_SSH' in os.environ:
480 or 'GIT_SSH' in os.environ 485 # Failed earlier, so don't retry.
481 or sys.platform in ('win32', 'cygwin')):
482 # failed earlier, or cygwin ssh can't do this
483 #
484 return False 486 return False
485 487
486 # We will make two calls to ssh; this is the common part of both calls. 488 # We will make two calls to ssh; this is the common part of both calls.