2
2
3
3
var stream = require ( "stream" )
4
4
, util = require ( "util" )
5
+ , path = require ( "path" )
5
6
;
6
7
7
8
module . exports = function createParser ( callback , opts , logs ) {
@@ -45,11 +46,13 @@ Parser.prototype.pipe = function( dest, opts ) {
45
46
Parser . prototype . write = function ( data ) {
46
47
var parser = this ;
47
48
48
- var lines = "" . split . call ( data , / [ \n \r ] + / )
49
- , revInfo
50
- ;
49
+ var lines = "" . split . call ( data , / [ \n \r ] + / ) ;
51
50
52
51
lines . forEach ( function ( line ) {
52
+ var revInfo
53
+ , actionInfo
54
+ ;
55
+
53
56
switch ( whatIsLine ( line ) ) {
54
57
case "sep" :
55
58
break ;
@@ -62,7 +65,9 @@ Parser.prototype.write = function( data ) {
62
65
parser . results . revs [ parser . currRev ] = revInfo ;
63
66
break ;
64
67
case "action" :
65
- updateFileInfo ( parseActionInfo ( line ) ) ;
68
+ actionInfo = parseActionInfo ( line ) ;
69
+ actionInfo . rev = parser . currRev ;
70
+ updateFileInfo ( parser , actionInfo ) ;
66
71
break ;
67
72
default :
68
73
// Assume revision message
@@ -71,43 +76,6 @@ Parser.prototype.write = function( data ) {
71
76
}
72
77
}
73
78
} ) ;
74
-
75
- function updateFileInfo ( actionInfo ) {
76
- var fileInfo ;
77
-
78
- if ( ! parser . results . files [ actionInfo . file ] ) {
79
- parser . results . files [ actionInfo . file ] = { revs : [ ] } ;
80
- Object . defineProperty ( parser . results . files [ actionInfo . file ] , "lastAction" , {
81
- enumerable : true
82
- , get : function ( ) {
83
- var lastRev = fileInfo . revs [ fileInfo . revs . length - 1 ]
84
- , actions = parser . results . revs [ lastRev ] . actions
85
- , lastAction = actions . length - 1
86
- ;
87
-
88
- while ( ~ lastAction && actions [ lastAction ] . file != actionInfo . file ) {
89
- lastAction -- ;
90
- }
91
-
92
- return actions [ lastAction ] ;
93
- }
94
- } ) ;
95
- }
96
- fileInfo = parser . results . files [ actionInfo . file ] ;
97
-
98
- fileInfo . revs . unshift ( parser . currRev ) ;
99
-
100
- parser . results . revs [ parser . currRev ] . actions . unshift ( actionInfo ) ;
101
-
102
- parser . emit ( "action" , {
103
- action : actionInfo . action
104
- , file : actionInfo . file
105
- , rev : parser . currRev
106
- } ) ;
107
-
108
- // Test to also add all files in ADDED directories
109
- return fileInfo ;
110
- }
111
79
} ;
112
80
Parser . prototype . end = function ( chunk ) {
113
81
if ( ! this . _ended ) {
@@ -174,10 +142,10 @@ var sepTest = /^-+$|^Changed paths:$/
174
142
function parseRevInfo ( line ) {
175
143
var revMatch = revMatcher . exec ( line ) ;
176
144
return {
177
- rev : revMatch [ 1 ]
145
+ rev : Number ( revMatch [ 1 ] )
178
146
, author : revMatch [ 2 ]
179
147
, timestamp : revMatch [ 3 ]
180
- , actions : [ ]
148
+ , actions : { }
181
149
, message : ""
182
150
} ;
183
151
}
@@ -190,6 +158,57 @@ function parseActionInfo( line ) {
190
158
} ;
191
159
}
192
160
161
+ function updateFileInfo ( parser , actionInfo ) {
162
+ var fileInfo ;
163
+
164
+ if ( ! parser . results . files [ actionInfo . file ] ) {
165
+ parser . results . files [ actionInfo . file ] = { revs : [ ] } ;
166
+
167
+ Object . defineProperty ( parser . results . files [ actionInfo . file ] , "lastAction" , {
168
+ enumerable : true
169
+ , get : function ( ) {
170
+ var lastRev = fileInfo . revs [ fileInfo . revs . length - 1 ]
171
+ , lastAction = parser . results . revs [ lastRev ] . actions [ actionInfo . file ]
172
+ , pathName
173
+ , pathInfo
174
+ , lastPathRev
175
+ , lastPathAction
176
+ , pathSplit = actionInfo . file . split ( path . sep )
177
+ ;
178
+
179
+ while ( lastAction . action !== "D" && pathSplit . pop ( ) ) {
180
+ pathName = pathSplit . join ( path . sep ) ;
181
+ pathInfo = parser . results . files [ pathName ] ;
182
+
183
+ if ( ! pathInfo ) continue ;
184
+
185
+ lastPathAction = pathInfo . lastAction ;
186
+
187
+ if ( lastPathAction . rev > lastRev && lastPathAction . action === "D" ) {
188
+ lastAction = lastPathAction ;
189
+ }
190
+ }
191
+
192
+ return lastAction ;
193
+ }
194
+ } ) ;
195
+ }
196
+
197
+ fileInfo = parser . results . files [ actionInfo . file ] ;
198
+
199
+ fileInfo . revs . unshift ( parser . currRev ) ;
200
+
201
+ parser . results . revs [ parser . currRev ] . actions [ actionInfo . file ] = actionInfo ;
202
+
203
+ parser . emit ( "action" , {
204
+ action : actionInfo . action
205
+ , file : actionInfo . file
206
+ , rev : parser . currRev
207
+ } ) ;
208
+
209
+ return fileInfo ;
210
+ }
211
+
193
212
function whatIsLine ( line ) {
194
213
if ( actionTest . test ( line ) ) {
195
214
return "action" ;
0 commit comments