11using System ;
22using System . Collections . Generic ;
3- using System . Text ;
43
54namespace SourceGit . Commands
65{
@@ -18,62 +17,66 @@ public QueryCommits(string repo, string limits, bool needFindHead = true)
1817
1918 public List < Models . Commit > Result ( )
2019 {
21- Exec ( ) ;
22-
23- if ( _findFirstMerged && ! _isHeadFounded && _commits . Count > 0 )
24- MarkFirstMerged ( ) ;
25-
26- return _commits ;
27- }
28-
29- protected override void OnReadline ( string line )
30- {
31- switch ( _nextPartIdx )
20+ var rs = ReadToEnd ( ) ;
21+ if ( ! rs . IsSuccess )
22+ return _commits ;
23+
24+ var nextPartIdx = 0 ;
25+ var start = 0 ;
26+ var end = rs . StdOut . IndexOf ( '\n ' , start ) ;
27+ var max = rs . StdOut . Length ;
28+ while ( end > 0 )
3229 {
33- case 0 :
34- _current = new Models . Commit ( ) { SHA = line } ;
35- _isSubjectSet = false ;
36- _commits . Add ( _current ) ;
37- break ;
38- case 1 :
39- ParseParent ( line ) ;
40- break ;
41- case 2 :
42- ParseDecorators ( line ) ;
43- break ;
44- case 3 :
45- _current . Author = Models . User . FindOrAdd ( line ) ;
46- break ;
47- case 4 :
48- _current . AuthorTime = ulong . Parse ( line ) ;
49- break ;
50- case 5 :
51- _current . Committer = Models . User . FindOrAdd ( line ) ;
52- break ;
53- case 6 :
54- _current . CommitterTime = ulong . Parse ( line ) ;
55- break ;
56- default :
57- if ( line . Equals ( _endOfBodyToken , StringComparison . Ordinal ) )
58- {
59- _nextPartIdx = 0 ;
60- _current . Body = _bodyReader . ToString ( ) . TrimEnd ( ) ;
61- _bodyReader . Clear ( ) ;
62- }
63- else
64- {
65- if ( ! _isSubjectSet )
30+ var line = rs . StdOut . Substring ( start , end - start ) ;
31+ switch ( nextPartIdx )
32+ {
33+ case 0 :
34+ _current = new Models . Commit ( ) { SHA = line } ;
35+ _commits . Add ( _current ) ;
36+ break ;
37+ case 1 :
38+ ParseParent ( line ) ;
39+ break ;
40+ case 2 :
41+ ParseDecorators ( line ) ;
42+ break ;
43+ case 3 :
44+ _current . Author = Models . User . FindOrAdd ( line ) ;
45+ break ;
46+ case 4 :
47+ _current . AuthorTime = ulong . Parse ( line ) ;
48+ break ;
49+ case 5 :
50+ _current . Committer = Models . User . FindOrAdd ( line ) ;
51+ break ;
52+ case 6 :
53+ _current . CommitterTime = ulong . Parse ( line ) ;
54+ start = end + 1 ;
55+ end = rs . StdOut . IndexOf ( _endOfBodyToken , start , StringComparison . Ordinal ) ;
56+ if ( end > 0 )
6657 {
67- _isSubjectSet = true ;
68- _current . SubjectLen = line . Length ;
58+ if ( end > start )
59+ _current . Body = rs . StdOut . Substring ( start , end - start ) . TrimEnd ( ) ;
60+
61+ start = end + _endOfBodyToken . Length + 1 ;
62+ end = start >= max ? - 1 : rs . StdOut . IndexOf ( '\n ' , start ) ;
6963 }
7064
71- _bodyReader . AppendLine ( line ) ;
72- }
73- return ;
65+ nextPartIdx = 0 ;
66+ continue ;
67+ default :
68+ break ;
69+ }
70+
71+ nextPartIdx ++ ;
72+ start = end + 1 ;
73+ end = rs . StdOut . IndexOf ( '\n ' , start ) ;
7474 }
7575
76- _nextPartIdx ++ ;
76+ if ( _findFirstMerged && ! _isHeadFounded && _commits . Count > 0 )
77+ MarkFirstMerged ( ) ;
78+
79+ return _commits ;
7780 }
7881
7982 private void ParseParent ( string data )
@@ -106,7 +109,7 @@ private void ParseDecorators(string data)
106109 _current . Decorators . Add ( new Models . Decorator ( )
107110 {
108111 Type = Models . DecoratorType . Tag ,
109- Name = d . Substring ( 15 ) . Trim ( ) ,
112+ Name = d . Substring ( 15 ) ,
110113 } ) ;
111114 }
112115 else if ( d . EndsWith ( "/HEAD" , StringComparison . Ordinal ) )
@@ -119,7 +122,7 @@ private void ParseDecorators(string data)
119122 _current . Decorators . Add ( new Models . Decorator ( )
120123 {
121124 Type = Models . DecoratorType . CurrentBranchHead ,
122- Name = d . Substring ( 19 ) . Trim ( ) ,
125+ Name = d . Substring ( 19 ) ,
123126 } ) ;
124127 }
125128 else if ( d . Equals ( "HEAD" ) )
@@ -128,37 +131,33 @@ private void ParseDecorators(string data)
128131 _current . Decorators . Add ( new Models . Decorator ( )
129132 {
130133 Type = Models . DecoratorType . CurrentCommitHead ,
131- Name = d . Trim ( ) ,
134+ Name = d ,
132135 } ) ;
133136 }
134137 else if ( d . StartsWith ( "refs/heads/" , StringComparison . Ordinal ) )
135138 {
136139 _current . Decorators . Add ( new Models . Decorator ( )
137140 {
138141 Type = Models . DecoratorType . LocalBranchHead ,
139- Name = d . Substring ( 11 ) . Trim ( ) ,
142+ Name = d . Substring ( 11 ) ,
140143 } ) ;
141144 }
142145 else if ( d . StartsWith ( "refs/remotes/" , StringComparison . Ordinal ) )
143146 {
144147 _current . Decorators . Add ( new Models . Decorator ( )
145148 {
146149 Type = Models . DecoratorType . RemoteBranchHead ,
147- Name = d . Substring ( 13 ) . Trim ( ) ,
150+ Name = d . Substring ( 13 ) ,
148151 } ) ;
149152 }
150153 }
151154
152155 _current . Decorators . Sort ( ( l , r ) =>
153156 {
154157 if ( l . Type != r . Type )
155- {
156158 return ( int ) l . Type - ( int ) r . Type ;
157- }
158159 else
159- {
160160 return l . Name . CompareTo ( r . Name ) ;
161- }
162161 } ) ;
163162
164163 if ( _current . IsMerged && ! _isHeadFounded )
@@ -191,10 +190,7 @@ private void MarkFirstMerged()
191190 private string _endOfBodyToken = string . Empty ;
192191 private List < Models . Commit > _commits = new List < Models . Commit > ( ) ;
193192 private Models . Commit _current = null ;
193+ private bool _findFirstMerged = false ;
194194 private bool _isHeadFounded = false ;
195- private bool _findFirstMerged = true ;
196- private int _nextPartIdx = 0 ;
197- private bool _isSubjectSet = false ;
198- private StringBuilder _bodyReader = new StringBuilder ( ) ;
199195 }
200196}
0 commit comments