2424TagReference
2525)
2626
27- from git .util import (
28- join_path ,
29- _digest_process_messages ,
30- _finalize_proc
31- )
27+ from git .util import join_path
3228from gitdb .util import join
3329
3430import re
3733
3834__all__ = ('RemoteProgress' ,'PushInfo' ,'FetchInfo' ,'Remote' )
3935
36+ #{ Utilities
37+
38+ def digest_process_messages (fh ,progress ):
39+ """Read progress messages from file-like object fh, supplying the respective
40+ progress messages to the progress instance.
41+
42+ :param fh: File handle to read from
43+ :return: list(line, ...) list of lines without linebreaks that did
44+ not contain progress information"""
45+ line_so_far = ''
46+ dropped_lines = list ()
47+ while True :
48+ char = fh .read (1 )
49+ if not char :
50+ break
51+
52+ if char in ('\r ' ,'\n ' ):
53+ dropped_lines .extend (progress ._parse_progress_line (line_so_far ))
54+ line_so_far = ''
55+ else :
56+ line_so_far += char
57+ # END process parsed line
58+ # END while file is not done reading
59+ return dropped_lines
60+
61+ def finalize_process (proc ):
62+ """Wait for the process (clone, fetch, pull or push) and handle its errors accordingly"""
63+ try :
64+ proc .wait ()
65+ except GitCommandError ,e :
66+ # if a push has rejected items, the command has non-zero return status
67+ # a return status of 128 indicates a connection error - reraise the previous one
68+ if proc .poll ()== 128 :
69+ raise
70+ pass
71+ # END exception handling
72+
73+ def add_progress (kwargs ,git ,progress ):
74+ """Add the --progress flag to the given kwargs dict if supported by the
75+ git command. If the actual progress in the given progress instance is not
76+ given, we do not request any progress
77+ :return: possibly altered kwargs"""
78+ if progress is not None :
79+ v = git .version_info
80+ if v [0 ]> 1 or v [1 ]> 7 or v [2 ]> 0 or v [3 ]> 3 :
81+ kwargs ['progress' ]= True
82+ #END handle --progress
83+ #END handle progress
84+ return kwargs
85+
86+ #} END utilities
87+
4088
4189class PushInfo (object ):
4290"""
@@ -445,7 +493,7 @@ def _get_fetch_info_from_stderr(self, proc, progress):
445493# this also waits for the command to finish
446494# Skip some progress lines that don't provide relevant information
447495fetch_info_lines = list ()
448- for line in _digest_process_messages (proc .stderr ,progress ):
496+ for line in digest_process_messages (proc .stderr ,progress ):
449497if line .startswith ('From' )or line .startswith ('remote: Total' ):
450498continue
451499elif line .startswith ('warning:' ):
@@ -467,15 +515,15 @@ def _get_fetch_info_from_stderr(self, proc, progress):
467515output .extend (FetchInfo ._from_line (self .repo ,err_line ,fetch_line )
468516for err_line ,fetch_line in zip (fetch_info_lines ,fetch_head_info ))
469517
470- _finalize_proc (proc )
518+ finalize_process (proc )
471519return output
472520
473521def _get_push_info (self ,proc ,progress ):
474522# read progress information from stderr
475523# we hope stdout can hold all the data, it should ...
476524# read the lines manually as it will use carriage returns between the messages
477525# to override the previous one. This is why we read the bytes manually
478- _digest_process_messages (proc .stderr ,progress )
526+ digest_process_messages (proc .stderr ,progress )
479527
480528output = IterableList ('name' )
481529for line in proc .stdout .readlines ():
@@ -487,7 +535,7 @@ def _get_push_info(self, proc, progress):
487535# END exception handling
488536# END for each line
489537
490- _finalize_proc (proc )
538+ finalize_process (proc )
491539return output
492540
493541
@@ -514,6 +562,7 @@ def fetch(self, refspec=None, progress=None, **kwargs):
514562:note:
515563As fetch does not provide progress information to non-ttys, we cannot make
516564it available here unfortunately as in the 'push' method."""
565+ kwargs = add_progress (kwargs ,self .repo .git ,progress )
517566proc = self .repo .git .fetch (self ,refspec ,with_extended_output = True ,as_process = True ,v = True ,** kwargs )
518567return self ._get_fetch_info_from_stderr (proc ,progress or RemoteProgress ())
519568
@@ -525,6 +574,7 @@ def pull(self, refspec=None, progress=None, **kwargs):
525574:param progress: see 'push' method
526575:param kwargs: Additional arguments to be passed to git-pull
527576:return: Please see 'fetch' method """
577+ kwargs = add_progress (kwargs ,self .repo .git ,progress )
528578proc = self .repo .git .pull (self ,refspec ,with_extended_output = True ,as_process = True ,v = True ,** kwargs )
529579return self ._get_fetch_info_from_stderr (proc ,progress or RemoteProgress ())
530580
@@ -546,6 +596,7 @@ def push(self, refspec=None, progress=None, **kwargs):
546596in their flags.
547597If the operation fails completely, the length of the returned IterableList will
548598be null."""
599+ kwargs = add_progress (kwargs ,self .repo .git ,progress )
549600proc = self .repo .git .push (self ,refspec ,porcelain = True ,as_process = True ,** kwargs )
550601return self ._get_push_info (proc ,progress or RemoteProgress ())
551602