@@ -125,6 +125,27 @@ webui.gitVersion = function() {
125
125
} )
126
126
}
127
127
128
+ webui . parseGitResponse = function ( data ) {
129
+ var matches = data . match ( / ( [ \S \s ] * ) G i t - S t d e r r - L e n g t h : \s ( \d * ) [ \r \n ] { 1 , 2 } G i t - R e t u r n - C o d e : \s ( \d * ) / ) ;
130
+ if ( ! matches || ( matches . length < 4 ) ) {
131
+ return {
132
+ output : '' ,
133
+ message : '' ,
134
+ rcode : 1
135
+ }
136
+ }
137
+ var messageData = matches [ 1 ] . replace ( / ( \r \n ) / gm, "\n" ) ;
138
+ var errorLength = parseInt ( matches [ 2 ] , 10 ) ;
139
+ var boundary = messageData . length - errorLength ;
140
+ var stdout = messageData . substring ( 0 , boundary )
141
+ var stderr = messageData . substring ( boundary ) ;
142
+ return {
143
+ output : stdout ,
144
+ message : stderr ,
145
+ rcode : matches [ 3 ]
146
+ } ;
147
+ }
148
+
128
149
webui . git_command = function ( command , callback ) {
129
150
$ . ajax ( {
130
151
url : "git-command" ,
@@ -134,32 +155,10 @@ webui.git_command = function(command, callback) {
134
155
command : command
135
156
} ) ,
136
157
success : function ( data ) {
137
- // Convention : last lines are footer meta data like headers. An empty line marks the start if the footers
138
- var footers = { } ;
139
- var fIndex = data . length ;
140
- while ( true ) {
141
- var oldFIndex = fIndex ;
142
- fIndex = data . lastIndexOf ( "\r\n" , fIndex - 1 ) ;
143
- var line = data . substring ( fIndex + 2 , oldFIndex ) ;
144
- if ( line . length > 0 ) {
145
- var footer = line . split ( ": " ) ;
146
- footers [ footer [ 0 ] ] = footer [ 1 ] ;
147
- } else {
148
- break ;
149
- }
150
- }
151
- // Trims the the data variable to remove the footers extracted in the loop.
152
- // Windows adds \r\n for every line break but the Git-Stderr-Length variable,
153
- // counts it as only one character, throwing off the message length.
154
- var trimmedData = data . substring ( 0 , fIndex ) . replace ( / ( \r \n ) / gm, "\n" ) ;
155
- var fIndex = trimmedData . length
156
-
157
- var messageLength = parseInt ( footers [ "Git-Stderr-Length" ] ) ;
158
- var messageStartIndex = fIndex - messageLength ;
159
- var message = trimmedData . substring ( messageStartIndex , fIndex ) ;
160
-
161
- var output = trimmedData . substring ( 0 , messageStartIndex ) ;
162
- var rcode = parseInt ( footers [ "Git-Return-Code" ] ) ;
158
+ var result = webui . parseGitResponse ( data ) ;
159
+ var rcode = result . rcode ;
160
+ var output = result . output ;
161
+ var message = result . message ;
163
162
164
163
if ( rcode == 0 ) {
165
164
if ( callback ) {
@@ -197,13 +196,8 @@ webui.git_command = function(command, callback) {
197
196
}
198
197
} ,
199
198
error : function ( data ) {
200
- var trimmedData = data . substring ( 0 , fIndex ) . replace ( / ( \r \n ) / gm, "\n" ) ;
201
- var fIndex = trimmedData . length
202
-
203
- var messageLength = parseInt ( footers [ "Git-Stderr-Length" ] ) ;
204
- var messageStartIndex = fIndex - messageLength ;
205
- var message = trimmedData . substring ( messageStartIndex , fIndex ) ;
206
- webui . showError ( message ) ;
199
+ var trimmedData = data . replace ( / ( \r \n ) / gm, "\n" ) ;
200
+ webui . showError ( trimmedData ) ;
207
201
} ,
208
202
} ) ;
209
203
}
@@ -233,32 +227,10 @@ webui.git = function(cmd, arg1, arg2, arg3, arg4) {
233
227
234
228
$ . post ( "git" , { command : cmd } , function ( data , status , xhr ) {
235
229
if ( xhr . status == 200 ) {
236
- // Convention : last lines are footer meta data like headers. An empty line marks the start if the footers
237
- var footers = { } ;
238
- var fIndex = data . length ;
239
- while ( true ) {
240
- var oldFIndex = fIndex ;
241
- fIndex = data . lastIndexOf ( "\r\n" , fIndex - 1 ) ;
242
- var line = data . substring ( fIndex + 2 , oldFIndex ) ;
243
- if ( line . length > 0 ) {
244
- var footer = line . split ( ": " ) ;
245
- footers [ footer [ 0 ] ] = footer [ 1 ] ;
246
- } else {
247
- break ;
248
- }
249
- }
250
- // Trims the the data variable to remove the footers extracted in the loop.
251
- // Windows adds \r\n for every line break but the Git-Stderr-Length variable,
252
- // counts it as only one character, throwing off the message length.
253
- var trimmedData = data . substring ( 0 , fIndex ) . replace ( / ( \r \n ) / gm, "\n" ) ;
254
- var fIndex = trimmedData . length
255
-
256
- var messageLength = parseInt ( footers [ "Git-Stderr-Length" ] ) ;
257
- var messageStartIndex = fIndex - messageLength ;
258
- var message = trimmedData . substring ( messageStartIndex , fIndex ) ;
259
-
260
- var output = trimmedData . substring ( 0 , messageStartIndex ) ;
261
- var rcode = parseInt ( footers [ "Git-Return-Code" ] ) ;
230
+ var result = webui . parseGitResponse ( data ) ;
231
+ var rcode = result . rcode ;
232
+ var output = result . output ;
233
+ var message = result . message ;
262
234
263
235
if ( rcode == 0 ) {
264
236
if ( callback ) {
@@ -295,15 +267,15 @@ webui.git = function(cmd, arg1, arg2, arg3, arg4) {
295
267
}
296
268
}
297
269
} else {
298
- if ( errorCallback ) {
299
- errorCallback ( message ) ;
270
+ if ( errorCallback ) {
271
+ errorCallback ( data ) ;
300
272
} else {
301
- webui . showError ( message ) ;
273
+ webui . showError ( data ) ;
302
274
}
303
275
}
304
276
} , "text" )
305
277
. fail ( function ( xhr , status , error ) {
306
- webui . showError ( "Git webui server not running " ) ;
278
+ webui . showError ( "An internal error occurred and has been logged. " ) ;
307
279
} ) ;
308
280
} ;
309
281
@@ -1401,21 +1373,17 @@ webui.StashListView = function(stashView) {
1401
1373
webui . git ( "stash list --format='%gd::%ch::%cL::%cN::%gs'" , function ( data ) {
1402
1374
var start = 0 ;
1403
1375
var count = 0 ;
1404
- while ( true ) {
1405
- var end = data . indexOf ( "\n" , start ) ;
1406
- if ( end != - 1 ) {
1407
- var len = end - start ;
1408
- } else {
1409
- break ;
1376
+ var lines = data . split ( "\n" ) ;
1377
+ for ( var i = 0 ; i < lines . length ; i ++ ) {
1378
+ if ( lines [ i ] . length == 0 ) {
1379
+ continue ;
1410
1380
}
1411
- var entry = new Entry ( self , data . substring ( start , start + len ) ) ;
1381
+ var entry = new Entry ( self , lines [ i ] ) ;
1412
1382
if ( start == 0 ) {
1413
1383
entry . select ( ) ;
1414
1384
}
1415
1385
content . appendChild ( entry . element ) ;
1416
-
1417
- start = end + 1 ;
1418
- ++ count ;
1386
+ count ++ ;
1419
1387
}
1420
1388
if ( count == 0 ) {
1421
1389
var emptyStash = $ ( '<h4 class="empty-stash">You have no stashed changes.</h4>' ) ;
@@ -1476,6 +1444,9 @@ webui.StashListView = function(stashView) {
1476
1444
self . message = ""
1477
1445
1478
1446
var pieces = data . split ( / : : | : \s / gm) ;
1447
+ if ( pieces . length < 5 ) {
1448
+ return ;
1449
+ }
1479
1450
self . stashIndex = pieces [ 0 ] . substring ( pieces [ 0 ] . indexOf ( '{' ) + 1 , pieces [ 0 ] . indexOf ( '}' ) ) ;
1480
1451
self . date = pieces [ 1 ] ;
1481
1452
self . authorEmail = pieces [ 2 ] ;
@@ -1525,6 +1496,13 @@ webui.DiffView = function(sideBySide, hunkSelectionAllowed, parent, stashedCommi
1525
1496
var self = this ;
1526
1497
1527
1498
self . update = function ( cmd , diffOpts , file , mode ) {
1499
+ if ( cmd || diffOpts || file || mode ) {
1500
+ // if new input, update all
1501
+ this . cmd = cmd
1502
+ this . diffOpts = diffOpts
1503
+ this . file = file
1504
+ this . mode = mode
1505
+ }
1528
1506
gitApplyType = mode ;
1529
1507
$ ( ".diff-stage" , self . element ) . attr ( "style" , "display:none" ) ;
1530
1508
$ ( ".diff-cancel" , self . element ) . attr ( "style" , "display:none" ) ;
@@ -1576,6 +1554,14 @@ webui.DiffView = function(sideBySide, hunkSelectionAllowed, parent, stashedCommi
1576
1554
}
1577
1555
} ;
1578
1556
1557
+ self . clear = function ( ) {
1558
+ self . refresh ( "" ) ;
1559
+ }
1560
+
1561
+ self . reRun = function ( ) {
1562
+ self . update ( this . cmd , this . diffOpts , this . file , this . mode )
1563
+ }
1564
+
1579
1565
self . refresh = function ( diff ) {
1580
1566
self . currentDiff = diff ;
1581
1567
self . diffHeader = "" ;
@@ -1789,24 +1775,24 @@ webui.DiffView = function(sideBySide, hunkSelectionAllowed, parent, stashedCommi
1789
1775
1790
1776
self . addContext = function ( ) {
1791
1777
self . context += 3 ;
1792
- self . update ( ) ;
1778
+ self . reRun ( ) ;
1793
1779
}
1794
1780
1795
1781
self . removeContext = function ( ) {
1796
1782
if ( self . context > 3 ) {
1797
1783
self . context -= 3 ;
1798
- self . update ( ) ;
1784
+ self . reRun ( ) ;
1799
1785
}
1800
1786
}
1801
1787
1802
1788
self . allContext = function ( ) {
1803
1789
self . complete = ! self . complete ;
1804
- self . update ( ) ;
1790
+ self . reRun ( ) ;
1805
1791
}
1806
1792
1807
1793
self . toggleIgnoreWhitespace = function ( ) {
1808
1794
self . ignoreWhitespace = ! self . ignoreWhitespace ;
1809
- self . update ( ) ;
1795
+ self . reRun ( ) ;
1810
1796
}
1811
1797
1812
1798
self . handleClick = function ( event ) {
@@ -1900,6 +1886,7 @@ webui.DiffView = function(sideBySide, hunkSelectionAllowed, parent, stashedCommi
1900
1886
webui . git ( "stash pop stash@{" + stashIndex + "}" , function ( output ) {
1901
1887
webui . showSuccess ( output ) ;
1902
1888
parent . stashView . update ( 0 ) ;
1889
+ self . clear ( ) ;
1903
1890
} ) ;
1904
1891
}
1905
1892
@@ -1911,6 +1898,7 @@ webui.DiffView = function(sideBySide, hunkSelectionAllowed, parent, stashedCommi
1911
1898
webui . git ( "stash drop stash@{" + stashIndex + "}" , function ( output ) {
1912
1899
webui . showSuccess ( output . substring ( output . indexOf ( "Dropped" ) ) ) ;
1913
1900
parent . stashView . update ( 0 ) ;
1901
+ self . clear ( ) ;
1914
1902
} ) ;
1915
1903
}
1916
1904
@@ -2473,7 +2461,7 @@ webui.WorkspaceView = function(mainView) {
2473
2461
self . update = function ( mode ) {
2474
2462
self . newChangedFilesView . update ( ) ;
2475
2463
if ( self . newChangedFilesView . getSelectedItemsCount ( ) == 0 ) {
2476
- self . diffView . update ( undefined , undefined , undefined , mode ) ;
2464
+ self . diffView . clear ( ) ;
2477
2465
}
2478
2466
} ;
2479
2467
0 commit comments