summaryrefslogtreecommitdiff
path: root/git/util.py
diff options
context:
space:
mode:
Diffstat (limited to 'git/util.py')
-rw-r--r--git/util.py40
1 files changed, 39 insertions, 1 deletions
diff --git a/git/util.py b/git/util.py
index 4de736d3..4d1ea8d6 100644
--- a/git/util.py
+++ b/git/util.py
@@ -12,6 +12,7 @@ import stat
import shutil
import platform
import getpass
+import threading
# NOTE: Some of the unused imports might be used/imported by others.
# Handle once test-cases are back up and running.
@@ -32,7 +33,7 @@ from gitdb.util import ( # NOQA
__all__ = ("stream_copy", "join_path", "to_native_path_windows", "to_native_path_linux",
"join_path_native", "Stats", "IndexFileSHA1Writer", "Iterable", "IterableList",
"BlockingLockFile", "LockFile", 'Actor', 'get_user_id', 'assure_directory_exists',
- 'RemoteProgress', 'rmtree')
+ 'RemoteProgress', 'rmtree', 'WaitGroup')
#{ Utility Methods
@@ -249,6 +250,14 @@ class RemoteProgress(object):
# END for each sub line
return failed_lines
+ def new_message_handler(self):
+ """:return: a progress handler suitable for handle_process_output(), passing lines on to this Progress
+ handler in a suitable format"""
+ def handler(line):
+ return self._parse_progress_line(line.rstrip())
+ # end
+ return handler
+
def line_dropped(self, line):
"""Called whenever a line could not be understood and was therefore dropped."""
pass
@@ -691,3 +700,32 @@ class Iterable(object):
raise NotImplementedError("To be implemented by Subclass")
#} END classes
+
+
+class WaitGroup(object):
+ """WaitGroup is like Go sync.WaitGroup.
+
+ Without all the useful corner cases.
+ By Peter Teichman, taken from https://gist.github.com/pteichman/84b92ae7cef0ab98f5a8
+ """
+ def __init__(self):
+ self.count = 0
+ self.cv = threading.Condition()
+
+ def add(self, n):
+ self.cv.acquire()
+ self.count += n
+ self.cv.release()
+
+ def done(self):
+ self.cv.acquire()
+ self.count -= 1
+ if self.count == 0:
+ self.cv.notify_all()
+ self.cv.release()
+
+ def wait(self):
+ self.cv.acquire()
+ while self.count > 0:
+ self.cv.wait()
+ self.cv.release()