Skip to content

Commit b4492c7

Browse files
committed
The progress arg to push, pull, fetch and clone is now a python callable.
This simplifies the API and removes the parser, RemoteProgres, from the API as RemoteProgress is an internal detail of the implementation. progress is accepted as: * None - drop progress messages * callable (function etc) - call the function with the same args as update * object - assume its RemoteProgress derived as use as before RemoteProgress takes an optional progress_function argument. It will call the progress function if not None otherwise call self.update as it used to.
1 parent bed4630 commit b4492c7

File tree

3 files changed

+54
-10
lines changed

3 files changed

+54
-10
lines changed

‎git/remote.py

+42-5
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,22 @@ def add_progress(kwargs, git, progress):
5757

5858
#} END utilities
5959

60+
def progress_object(progress):
61+
"""Given the 'progress' return a suitable object derived from
62+
RemoteProgress().
63+
"""
64+
# new API only needs progress as a function
65+
if callable(progress):
66+
return RemoteProgress(progress)
67+
68+
# where None is passed create a parser that eats the progress
69+
elif progress is None:
70+
return RemoteProgress()
71+
72+
# assume its the old API with an instance of RemoteProgress.
73+
else:
74+
return progress
75+
6076

6177
class PushInfo(object):
6278

@@ -535,7 +551,10 @@ def update(self, **kwargs):
535551
self.repo.git.remote(scmd, self.name, **kwargs)
536552
return self
537553

554+
538555
def _get_fetch_info_from_stderr(self, proc, progress):
556+
progress = progress_object(progress)
557+
539558
# skip first line as it is some remote info we are not interested in
540559
output = IterableList('name')
541560

@@ -580,6 +599,8 @@ def _get_fetch_info_from_stderr(self, proc, progress):
580599
return output
581600

582601
def _get_push_info(self, proc, progress):
602+
progress = progress_object(progress)
603+
583604
# read progress information from stderr
584605
# we hope stdout can hold all the data, it should ...
585606
# read the lines manually as it will use carriage returns between the messages
@@ -654,7 +675,7 @@ def fetch(self, refspec=None, progress=None, **kwargs):
654675

655676
proc = self.repo.git.fetch(self, *args, as_process=True, with_stdout=False, v=True,
656677
**kwargs)
657-
res = self._get_fetch_info_from_stderr(proc, progress or RemoteProgress())
678+
res = self._get_fetch_info_from_stderr(proc, progress)
658679
if hasattr(self.repo.odb, 'update_cache'):
659680
self.repo.odb.update_cache()
660681
return res
@@ -672,7 +693,7 @@ def pull(self, refspec=None, progress=None, **kwargs):
672693
self._assert_refspec()
673694
kwargs = add_progress(kwargs, self.repo.git, progress)
674695
proc = self.repo.git.pull(self, refspec, with_stdout=False, as_process=True, v=True, **kwargs)
675-
res = self._get_fetch_info_from_stderr(proc, progress or RemoteProgress())
696+
res = self._get_fetch_info_from_stderr(proc, progress)
676697
if hasattr(self.repo.odb, 'update_cache'):
677698
self.repo.odb.update_cache()
678699
return res
@@ -682,10 +703,26 @@ def push(self, refspec=None, progress=None, **kwargs):
682703
683704
:param refspec: see 'fetch' method
684705
:param progress:
685-
Instance of type RemoteProgress allowing the caller to receive
686-
progress information until the method returns.
687706
If None, progress information will be discarded
688707
708+
No further progress information is returned after push returns.
709+
710+
A function (callable) that is called with the progress infomation:
711+
712+
progress( op_code, cur_count, max_count=None, message='' )
713+
714+
op_code is a bit mask of values defined in git.RemoteProgress
715+
716+
cur_count and max_count are float values.
717+
718+
max_count is None if there is no max_count
719+
720+
messages is '' if there is no additon message.
721+
722+
Deprecated: Pass in a class derived from git.RemoteProgres that
723+
overrides the update() function.
724+
725+
689726
:param kwargs: Additional arguments to be passed to git-push
690727
:return:
691728
IterableList(PushInfo, ...) iterable list of PushInfo instances, each
@@ -697,7 +734,7 @@ def push(self, refspec=None, progress=None, **kwargs):
697734
be null."""
698735
kwargs = add_progress(kwargs, self.repo.git, progress)
699736
proc = self.repo.git.push(self, refspec, porcelain=True, as_process=True, **kwargs)
700-
return self._get_push_info(proc, progress or RemoteProgress())
737+
return self._get_push_info(proc, progress)
701738

702739
@property
703740
def config_reader(self):

‎git/repo/base.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@
3232
from git.config import GitConfigParser
3333
from git.remote import (
3434
Remote,
35-
add_progress
35+
add_progress,
36+
progress_object
3637
)
3738

3839
from git.db import GitCmdObjectDB
@@ -872,6 +873,8 @@ def init(cls, path=None, mkdir=True, odbt=DefaultDBType, **kwargs):
872873

873874
@classmethod
874875
def _clone(cls, git, url, path, odb_default_type, progress, **kwargs):
876+
progress = progress_object(progress)
877+
875878
# special handling for windows for path at which the clone should be
876879
# created.
877880
# tilde '~' will be expanded to the HOME no matter where the ~ occours. Hence

‎git/util.py

+8-4
Original file line numberDiff line numberDiff line change
@@ -174,11 +174,16 @@ class RemoteProgress(object):
174174
DONE_TOKEN = 'done.'
175175
TOKEN_SEPARATOR = ', '
176176

177-
__slots__ = ("_cur_line", "_seen_ops")
177+
__slots__ = ("_cur_line", "_seen_ops", "__progress_function")
178178
re_op_absolute = re.compile(r"(remote: )?([\w\s]+):\s+()(\d+)()(.*)")
179179
re_op_relative = re.compile(r"(remote: )?([\w\s]+):\s+(\d+)% \((\d+)/(\d+)\)(.*)")
180180

181-
def __init__(self):
181+
def __init__(self, progress_function=None):
182+
if progress_function is not None:
183+
self.__progress_function = progress_function
184+
else:
185+
self.__progress_function = self.update
186+
182187
self._seen_ops = list()
183188
self._cur_line = None
184189

@@ -267,7 +272,7 @@ def _parse_progress_line(self, line):
267272
# END end message handling
268273
message = message.strip(self.TOKEN_SEPARATOR)
269274

270-
self.update(op_code,
275+
self.__progress_function(op_code,
271276
cur_count and float(cur_count),
272277
max_count and float(max_count),
273278
message)
@@ -314,7 +319,6 @@ def update(self, op_code, cur_count, max_count=None, message=''):
314319
You may read the contents of the current line in self._cur_line"""
315320
pass
316321

317-
318322
class Actor(object):
319323

320324
"""Actors hold information about a person acting on the repository. They

0 commit comments

Comments
 (0)