24
24
TagReference
25
25
)
26
26
27
- from git .util import (
28
- join_path ,
29
- _digest_process_messages ,
30
- _finalize_proc
31
- )
27
+ from git .util import join_path
32
28
from gitdb .util import join
33
29
34
30
import re
37
33
38
34
__all__ = ('RemoteProgress' , 'PushInfo' , 'FetchInfo' , 'Remote' )
39
35
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
+
40
88
41
89
class PushInfo (object ):
42
90
"""
@@ -445,7 +493,7 @@ def _get_fetch_info_from_stderr(self, proc, progress):
445
493
# this also waits for the command to finish
446
494
# Skip some progress lines that don't provide relevant information
447
495
fetch_info_lines = list ()
448
- for line in _digest_process_messages (proc .stderr , progress ):
496
+ for line in digest_process_messages (proc .stderr , progress ):
449
497
if line .startswith ('From' ) or line .startswith ('remote: Total' ):
450
498
continue
451
499
elif line .startswith ('warning:' ):
@@ -467,15 +515,15 @@ def _get_fetch_info_from_stderr(self, proc, progress):
467
515
output .extend (FetchInfo ._from_line (self .repo , err_line , fetch_line )
468
516
for err_line ,fetch_line in zip (fetch_info_lines , fetch_head_info ))
469
517
470
- _finalize_proc (proc )
518
+ finalize_process (proc )
471
519
return output
472
520
473
521
def _get_push_info (self , proc , progress ):
474
522
# read progress information from stderr
475
523
# we hope stdout can hold all the data, it should ...
476
524
# read the lines manually as it will use carriage returns between the messages
477
525
# 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 )
479
527
480
528
output = IterableList ('name' )
481
529
for line in proc .stdout .readlines ():
@@ -487,7 +535,7 @@ def _get_push_info(self, proc, progress):
487
535
# END exception handling
488
536
# END for each line
489
537
490
- _finalize_proc (proc )
538
+ finalize_process (proc )
491
539
return output
492
540
493
541
@@ -514,6 +562,7 @@ def fetch(self, refspec=None, progress=None, **kwargs):
514
562
:note:
515
563
As fetch does not provide progress information to non-ttys, we cannot make
516
564
it available here unfortunately as in the 'push' method."""
565
+ kwargs = add_progress (kwargs , self .repo .git , progress )
517
566
proc = self .repo .git .fetch (self , refspec , with_extended_output = True , as_process = True , v = True , ** kwargs )
518
567
return self ._get_fetch_info_from_stderr (proc , progress or RemoteProgress ())
519
568
@@ -525,6 +574,7 @@ def pull(self, refspec=None, progress=None, **kwargs):
525
574
:param progress: see 'push' method
526
575
:param kwargs: Additional arguments to be passed to git-pull
527
576
:return: Please see 'fetch' method """
577
+ kwargs = add_progress (kwargs , self .repo .git , progress )
528
578
proc = self .repo .git .pull (self , refspec , with_extended_output = True , as_process = True , v = True , ** kwargs )
529
579
return self ._get_fetch_info_from_stderr (proc , progress or RemoteProgress ())
530
580
@@ -546,6 +596,7 @@ def push(self, refspec=None, progress=None, **kwargs):
546
596
in their flags.
547
597
If the operation fails completely, the length of the returned IterableList will
548
598
be null."""
599
+ kwargs = add_progress (kwargs , self .repo .git , progress )
549
600
proc = self .repo .git .push (self , refspec , porcelain = True , as_process = True , ** kwargs )
550
601
return self ._get_push_info (proc , progress or RemoteProgress ())
551
602
0 commit comments