mercurial/HGCommand.st
changeset 444 8987b87a562a
parent 441 032641fb1e6d
child 448 a89dd6b4acc8
child 449 d55058b5d58d
equal deleted inserted replaced
443:fe0741025e37 444:8987b87a562a
    19 "{ Package: 'stx:libscm/mercurial' }"
    19 "{ Package: 'stx:libscm/mercurial' }"
    20 
    20 
    21 Object subclass:#HGCommand
    21 Object subclass:#HGCommand
    22 	instanceVariableNames:'workingDirectory result error errors blocker errorReader
    22 	instanceVariableNames:'workingDirectory result error errors blocker errorReader
    23 		outputReader'
    23 		outputReader'
    24 	classVariableNames:'HGExecutable HGVersion'
    24 	classVariableNames:'HGCommandString HGExecutable HGExecutableArguments HGVersion'
    25 	poolDictionaries:'HGDebugFlags'
    25 	poolDictionaries:'HGDebugFlags'
    26 	category:'SCM-Mercurial-Internal'
    26 	category:'SCM-Mercurial-Internal'
    27 !
    27 !
    28 
    28 
    29 HGCommand subclass:#add
    29 HGCommand subclass:#add
   179 	poolDictionaries:''
   179 	poolDictionaries:''
   180 	privateIn:HGCommand
   180 	privateIn:HGCommand
   181 !
   181 !
   182 
   182 
   183 HGCommand subclass:#version
   183 HGCommand subclass:#version
   184 	instanceVariableNames:'executable'
   184 	instanceVariableNames:'executable arguments'
   185 	classVariableNames:''
   185 	classVariableNames:''
   186 	poolDictionaries:''
   186 	poolDictionaries:''
   187 	privateIn:HGCommand
   187 	privateIn:HGCommand
   188 !
   188 !
   189 
   189 
   232 ! !
   232 ! !
   233 
   233 
   234 !HGCommand class methodsFor:'accessing'!
   234 !HGCommand class methodsFor:'accessing'!
   235 
   235 
   236 hgCommand
   236 hgCommand
   237     "Returns absolute path to hg executable to use"
   237     "Returns hg command to use"
   238 
   238 
   239     HGExecutable isNil ifTrue:[
   239     | command |
   240         | executable |
   240     command := HGCommandString notNil ifTrue:[ HGCommandString ] ifFalse:[UserPreferences current hgCommand].
   241         executable :=  UserPreferences current hgCommand.
   241     command isNil ifTrue:[
   242         executable isNil ifTrue:[
   242         OperatingSystem isMSWINDOWSlike ifTrue:[
   243             OperatingSystem isMSWINDOWSlike ifTrue:[
   243             "/        | h |
   244                 "/        | h |
   244             "/
   245                 "/
   245             "/        h := Win32OperatingSystem registryEntry
   246                 "/        h := Win32OperatingSystem registryEntry
   246             "/                key:'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\App Paths\svn.exe'.
   247                 "/                key:'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\App Paths\svn.exe'.
   247             "/        h notNil ifTrue:[HGExecutable := h valueNamed:''].
   248                 "/        h notNil ifTrue:[HGExecutable := h valueNamed:''].
   248             "/        HGExecutable notEmptyOrNil ifTrue:[^HGExecutable]
   249                 "/        HGExecutable notEmptyOrNil ifTrue:[^HGExecutable]
   249             command := OperatingSystem pathOfCommand:'hg'.
   250                 executable := OperatingSystem pathOfCommand:'hg'.
   250         ] ifFalse:[
   251             ] ifFalse:[
   251             OperatingSystem isUNIXlike ifTrue:[
   252                 OperatingSystem isUNIXlike ifTrue:[
   252                 command := OperatingSystem pathOfCommand:'hg'.
   253                     executable := OperatingSystem pathOfCommand:'hg'.
   253             ]
   254                 ]
       
   255             ].
       
   256         ].
   254         ].
   257         executable := self hgCommandValidate: executable.
   255     ].
   258         HGExecutable := executable.
   256     ^ command
   259     ].
       
   260     ^ HGExecutable
       
   261 
   257 
   262     "
   258     "
   263      HGExecutable := nil.
   259      HGExecutable := nil.
   264      self basicNew executable
   260      self basicNew executable
   265     "
   261     "
   266 
   262 
   267     "Created: / 19-11-2012 / 21:48:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   263     "Created: / 19-11-2012 / 21:48:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   268     "Modified: / 21-02-2014 / 08:54:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   264     "Modified: / 17-07-2014 / 11:21:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   269 !
   265 !
   270 
   266 
   271 hgCommand: command
   267 hgCommand: command
   272     HGExecutable := command
   268     HGCommandString := command.
       
   269     HGExecutable := HGExecutableArguments := nil.
   273 
   270 
   274     "
   271     "
   275     HGCommand hgCommand: '/usr/src/mercurial-2.4/hg'
   272     HGCommand hgCommand: '/usr/src/mercurial-2.4/hg'
   276     HGCommand hgCommand: '/usr/bin/hg'
   273     HGCommand hgCommand: '/usr/bin/hg'
       
   274     HGCommand hgCommand: 'hg'
       
   275     HGCommand hgCommand: nil
   277     "
   276     "
   278 
   277 
   279     "Created: / 19-11-2012 / 21:49:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   278     "Created: / 19-11-2012 / 21:49:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   280     "Modified (comment): / 03-03-2013 / 12:24:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   279     "Modified: / 17-07-2014 / 11:18:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   281 !
   280 !
   282 
   281 
   283 hgCommandValidate: executable
   282 hgCommandValidate: command
   284     "/ Given a `executable`, checks whether it is a valid hg binary.
   283     "Given a `command`, checks whether it is a valid hg command.
   285     "/ Returns absolute path to hg binary or raise an
   284      Returns absolute path to hg binary and global arguments (if any)
   286     "/ HGInvalidExecutableError or HGInvalidVersionError
   285      or raise an HGInvalidExecutableError or HGInvalidVersionError
   287     "/ if `executable` is not valid hg binary.
   286      if `command` is not valid hg command."
   288     "/
   287 
   289     | path version |
   288     | tokens executable executableAsFilename arguments version |
   290 
   289 
   291     path := executable asFilename.
   290     tokens := (HGCommandParser on: command readStream) parseShellCommand.
   292     path isAbsolute ifFalse:[
   291     executable := tokens first.
   293         path := path asAbsoluteFilename.
   292     executableAsFilename := executable asFilename.
   294         path exists ifFalse:[
   293     arguments := tokens copyFrom: 2.
       
   294     executableAsFilename isAbsolute ifFalse:[
       
   295         executableAsFilename := executableAsFilename asAbsoluteFilename.
       
   296         executableAsFilename exists ifTrue:[
       
   297             executable := executableAsFilename pathName.
       
   298         ] ifFalse:[
   295             "/ Also try to find specified command along PATH, maybe somebody
   299             "/ Also try to find specified command along PATH, maybe somebody
   296             "/ just typed 'hg' in...
   300             "/ just typed 'hg' in...
   297             (executable includes: Filename separator) ifFalse:[
   301             executable  := (OperatingSystem pathOfCommand: executable).
   298                 path  := (OperatingSystem pathOfCommand: executable).
   302             executable isNil ifTrue:[
   299                 path isNil ifTrue:[
   303                 HGInvalidExecutableError raiseErrorString:('''hg'' executable (%1) not found!!' bindWith: command).
   300                     HGInvalidExecutableError raiseErrorString:('''hg'' executable (%1) not found!!' bindWith: executable).
   304                 ^ nil
   301                     ^ nil
   305             ] ifFalse:[
   302                 ].
   306                 executableAsFilename := executable asFilename.
   303                 ^ path
       
   304             ].
   307             ].
   305         ].
   308         ]
   306     ].
   309     ].
   307     path exists ifFalse:[
   310     executableAsFilename exists ifFalse:[
   308         HGInvalidExecutableError raiseErrorString:('Specified ''hg'' executable (%1) does not exists!!' bindWith: path pathName).
   311         HGInvalidExecutableError raiseErrorString:('Specified ''hg'' executable (%1) does not exists!!' bindWith: executable).
   309         ^ nil
   312         ^ nil
   310     ].
   313     ].
   311     path isDirectory ifTrue:[
   314     executableAsFilename isDirectory ifTrue:[
   312         HGInvalidExecutableError raiseErrorString:('Specified ''hg'' executable (%1) is actually a directory!!' bindWith: path pathName).
   315         HGInvalidExecutableError raiseErrorString:('Specified ''hg'' executable (%1) is actually a directory!!' bindWith: executable).
   313         ^ nil
   316         ^ nil
   314     ].
   317     ].
   315     path isExecutable ifFalse:[
   318     executableAsFilename isExecutable ifFalse:[
   316         HGInvalidExecutableError raiseErrorString:('Specified ''hg'' executable (%1) is cannot be executed!!' bindWith: path pathName).
   319         HGInvalidExecutableError raiseErrorString:('Specified ''hg'' executable (%1) is cannot be executed!!' bindWith: executable).
   317         ^ nil
   320         ^ nil
   318     ].
   321     ].
   319     [
   322     [
   320         version := self hgVersionOf: path pathName.
   323         version := self hgVersionOf: executable arguments: arguments.
   321     ] on: Error do:[:ex |
   324     ] on: Error do:[:ex |
   322         HGInvalidExecutableError newException
   325         HGInvalidExecutableError newException
   323             parameter: ex;
   326             parameter: ex;
   324             messageText: 'Failed to check version: ', ex description;
   327             messageText: 'Failed to check version: ', ex description;
   325             raise.
   328             raise.
   330             parameter: version;
   333             parameter: version;
   331             messageText: ('Unsuported Mercurial version (%1)' bindWith: (version asStringWith:$.));
   334             messageText: ('Unsuported Mercurial version (%1)' bindWith: (version asStringWith:$.));
   332             raise.
   335             raise.
   333         ^ nil
   336         ^ nil
   334     ].
   337     ].
   335     ^ path pathName
   338     ^ { executable . arguments }
   336 
   339 
   337     "Created: / 21-02-2014 / 08:50:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   340     "Created: / 21-02-2014 / 08:50:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   338     "Modified: / 21-02-2014 / 10:31:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   341     "Modified: / 17-07-2014 / 15:10:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   339 !
   342 !
   340 
   343 
   341 hgVersion
   344 hgVersion
   342     "Return mercurial version installed on this compiter"
   345     "Return mercurial version installed on this compiter"
   343 
   346 
   344     HGVersion isNil ifTrue:[
   347     HGVersion isNil ifTrue:[
   345         HGVersion := self hgVersionOf: self hgCommand
   348         HGVersion := self hgVersionOf: self hgExecutable arguments: self hgExecutableArguments
   346     ].
   349     ].
   347     ^ HGVersion
   350     ^ HGVersion
   348 
   351 
   349     "
   352     "
   350      HGCommand hgVersion
   353      HGCommand hgVersion
   351     "
   354     "
   352 
   355 
   353     "Created: / 19-11-2012 / 20:14:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   356     "Created: / 19-11-2012 / 20:14:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   354     "Modified: / 21-01-2013 / 05:07:58 / jv"
   357     "Modified: / 21-01-2013 / 05:07:58 / jv"
       
   358     "Modified: / 17-07-2014 / 15:09:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   355 !
   359 !
   356 
   360 
   357 hgVersionIsSupported
   361 hgVersionIsSupported
   358     ^ self hgVersionIsSupported:self hgVersion
   362     ^ self hgVersionIsSupported:self hgVersion
   359 
   363 
   379      HGCommand mercurialVersionIsSupported: #(1 0 0)
   383      HGCommand mercurialVersionIsSupported: #(1 0 0)
   380      HGCommand mercurialVersionIsSupported: #(2 4 nil)"
   384      HGCommand mercurialVersionIsSupported: #(2 4 nil)"
   381     "Created: / 19-11-2012 / 20:31:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   385     "Created: / 19-11-2012 / 20:31:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   382 !
   386 !
   383 
   387 
   384 hgVersionOf: hgcommand
   388 hgVersionOf: executable arguments: arguments
   385     "Return mercurial version installed on this compiter"
   389     "Return mercurial version if passed executable "
   386 
   390 
   387     ^version new
   391     ^version new
   388         executable: hgcommand;
   392         executable: executable;
       
   393         arguments: arguments;
   389         execute
   394         execute
   390 
   395 
   391     "
   396     "
   392      HGCommand hgVersion
   397      HGCommand hgVersion
   393     "
   398     "
   394 
   399 
   395     "Created: / 21-01-2013 / 05:05:01 / jv"
   400     "Created: / 17-07-2014 / 15:08:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   396 !
   401 !
   397 
   402 
   398 hgVersionsSupported
   403 hgVersionsSupported
   399     "Return a list of mercurial version supported bu this
   404     "Return a list of mercurial version supported bu this
   400      implementation"
   405      implementation"
   421 
   426 
   422     "Created: / 19-03-2008 / 12:29:59 / janfrog"
   427     "Created: / 19-03-2008 / 12:29:59 / janfrog"
   423     "Modified: / 19-03-2009 / 14:00:59 / Jan Vrany <vranyj1@fel.cvut.cz>"
   428     "Modified: / 19-03-2009 / 14:00:59 / Jan Vrany <vranyj1@fel.cvut.cz>"
   424     "Modified (format): / 27-12-2011 / 16:00:13 / dundee"
   429     "Modified (format): / 27-12-2011 / 16:00:13 / dundee"
   425     "Modified: / 17-10-2012 / 13:05:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   430     "Modified: / 17-10-2012 / 13:05:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
       
   431 ! !
       
   432 
       
   433 !HGCommand class methodsFor:'accessing-private'!
       
   434 
       
   435 hgExecutable
       
   436     "Returns absolute path to hg executable to use"
       
   437 
       
   438     HGExecutable isNil ifTrue:[
       
   439         | command executableAndArguments |
       
   440         command := self hgCommand.
       
   441         command isNil ifTrue:[
       
   442             OperatingSystem isMSWINDOWSlike ifTrue:[
       
   443                 "/        | h |
       
   444                 "/
       
   445                 "/        h := Win32OperatingSystem registryEntry
       
   446                 "/                key:'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\App Paths\svn.exe'.
       
   447                 "/        h notNil ifTrue:[HGExecutable := h valueNamed:''].
       
   448                 "/        HGExecutable notEmptyOrNil ifTrue:[^HGExecutable]
       
   449                 command := OperatingSystem pathOfCommand:'hg'.
       
   450             ] ifFalse:[
       
   451                 OperatingSystem isUNIXlike ifTrue:[
       
   452                     command := OperatingSystem pathOfCommand:'hg'.
       
   453                 ]
       
   454             ].
       
   455         ].
       
   456         executableAndArguments := self hgCommandValidate: command.
       
   457         HGExecutable := executableAndArguments first.
       
   458         HGExecutableArguments := executableAndArguments second.
       
   459     ].
       
   460     ^ HGExecutable
       
   461 
       
   462     "
       
   463      HGExecutable := nil.
       
   464      self basicNew executable
       
   465     "
       
   466 
       
   467     "Created: / 17-07-2014 / 10:16:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
       
   468     "Modified: / 17-07-2014 / 11:21:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
       
   469 !
       
   470 
       
   471 hgExecutableArguments
       
   472     "Returns an array of (global) arguments to be passed hg executable"
       
   473 
       
   474     HGExecutableArguments isNil ifTrue:[
       
   475         HGExecutable := nil.
       
   476         self hgExecutable.
       
   477     ].
       
   478     ^ HGExecutableArguments
       
   479 
       
   480 
       
   481 
       
   482     "
       
   483      HGExecutable := nil.
       
   484      self basicNew executable
       
   485     "
       
   486 
       
   487     "Created: / 17-07-2014 / 11:16:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   426 ! !
   488 ! !
   427 
   489 
   428 !HGCommand class methodsFor:'commands'!
   490 !HGCommand class methodsFor:'commands'!
   429 
   491 
   430 add
   492 add
   689     environment at:'LANG' put:'C'.
   751     environment at:'LANG' put:'C'.
   690     environment at:'LC_MESSAGES' put:'C'.
   752     environment at:'LC_MESSAGES' put:'C'.
   691 
   753 
   692         exe := self executable.
   754         exe := self executable.
   693     args := self arguments.
   755     args := self arguments.
   694         
   756 
   695     OperatingSystem isMSWINDOWSlike ifTrue:[
   757     OperatingSystem isMSWINDOWSlike ifTrue:[
   696             (exe endsWith:'.bat') ifTrue:[
   758             (exe endsWith:'.bat') ifTrue:[
   697             | cmd |
   759             | cmd |
   698             cmd := OperatingSystem pathOfCommand:'cmd'.
   760             cmd := OperatingSystem pathOfCommand:'cmd'.
   699             args := #( '/C' ) , args.
   761             args := #( '/C' ) , args.
   700             exe := cmd.
   762             exe := cmd.
   701 
   763 
   702         ].   
   764         ].
   703         args := String streamContents:[:s|
   765         args := String streamContents:[:s|
   704             args
   766             args
   705                 do:[:each | s nextPut:$"; nextPutAll: each; nextPut: $"]
   767                 do:[:each | s nextPut:$"; nextPutAll: each; nextPut: $"]
   706                 separatedBy: [ s space ]
   768                 separatedBy: [ s space ]
   707         ]
   769         ]
   819 
   881 
   820 arguments
   882 arguments
   821 
   883 
   822     ^ OrderedCollection streamContents:[:s |
   884     ^ OrderedCollection streamContents:[:s |
   823         s nextPut: self executable.
   885         s nextPut: self executable.
       
   886         s nextPutAll: self class hgExecutableArguments ? #().
   824         s nextPut: '--noninteractive'.
   887         s nextPut: '--noninteractive'.
   825         self argumentsGlobalOn:s.
   888         self argumentsGlobalOn:s.
   826         s nextPut:self command.
   889         s nextPut:self command.
   827         self argumentsCommandOn:s.
   890         self argumentsCommandOn:s.
   828     ].
   891     ].
   829 
   892 
   830     "Created: / 11-05-2011 / 07:58:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   893     "Created: / 11-05-2011 / 07:58:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   831     "Modified (format): / 27-12-2011 / 15:47:23 / dundee"
   894     "Modified (format): / 27-12-2011 / 15:47:23 / dundee"
   832     "Modified: / 16-12-2012 / 00:26:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   895     "Modified: / 17-07-2014 / 15:25:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   833 !
   896 !
   834 
   897 
   835 argumentsCommandOn:stream
   898 argumentsCommandOn:stream
   836     "Called to get command specific options"
   899     "Called to get command specific options"
   837 
   900 
   865     "Modified: / 30-09-2012 / 23:37:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   928     "Modified: / 30-09-2012 / 23:37:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   866     "Modified (comment): / 08-02-2014 / 11:41:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   929     "Modified (comment): / 08-02-2014 / 11:41:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   867 !
   930 !
   868 
   931 
   869 executable
   932 executable
   870     ^ self class hgCommand
   933     ^ self class hgExecutable
   871 
   934 
   872     "Modified: / 19-11-2012 / 21:48:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   935     "Modified: / 17-07-2014 / 10:16:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   873 !
   936 !
   874 
   937 
   875 parseError:stream
   938 parseError:stream
   876     "Parses output of 'hg' command, i.e. commit, log, update, checkout,
   939     "Parses output of 'hg' command, i.e. commit, log, update, checkout,
   877      etc."
   940      etc."
  1175 
  1238 
  1176     "
  1239     "
  1177 
  1240 
  1178     | pipe output pid environment sema args sout exec |
  1241     | pipe output pid environment sema args sout exec |
  1179 
  1242 
  1180     destination notNil ifTrue:[ 
  1243     destination notNil ifTrue:[
  1181         ^ super execute.
  1244         ^ super execute.
  1182     ].
  1245     ].
  1183 
  1246 
  1184     pipe := NonPositionableExternalStream makePipe.
  1247     pipe := NonPositionableExternalStream makePipe.
  1185     output := pipe first.
  1248     output := pipe first.
  1244         self error:'No path specified'
  1307         self error:'No path specified'
  1245     ].
  1308     ].
  1246     revision isNil ifTrue:[
  1309     revision isNil ifTrue:[
  1247         self error:'No revision specified'
  1310         self error:'No revision specified'
  1248     ].
  1311     ].
  1249     destination notNil ifTrue:[ 
  1312     destination notNil ifTrue:[
  1250         stream nextPut: '-o'.
  1313         stream nextPut: '-o'.
  1251         stream nextPut: destination asFilename pathName.
  1314         stream nextPut: destination asFilename pathName.
  1252     ].
  1315     ].
  1253 
  1316 
  1254     stream nextPut:'--rev'; nextPut: revision asString.
  1317     stream nextPut:'--rev'; nextPut: revision asString.
  2041     "Modified: / 14-01-2013 / 16:00:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
  2104     "Modified: / 14-01-2013 / 16:00:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
  2042 ! !
  2105 ! !
  2043 
  2106 
  2044 !HGCommand::version methodsFor:'accessing'!
  2107 !HGCommand::version methodsFor:'accessing'!
  2045 
  2108 
       
  2109 arguments:something
       
  2110     arguments := something.
       
  2111 !
       
  2112 
  2046 executable
  2113 executable
  2047     ^ executable notNil
  2114     ^ executable notNil
  2048         ifTrue:[executable]
  2115         ifTrue:[executable]
  2049         ifFalse:[self class hgCommand]
  2116         ifFalse:[self class hgCommand]
  2050 
  2117 
  2057 
  2124 
  2058 !HGCommand::version methodsFor:'private'!
  2125 !HGCommand::version methodsFor:'private'!
  2059 
  2126 
  2060 arguments
  2127 arguments
  2061 
  2128 
  2062     ^ Array with: self executable with: '--version'
  2129     ^ (Array with: self executable) , (arguments ? #()) , #('--version')
  2063 
  2130 
  2064     "Created: / 19-11-2012 / 20:01:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
  2131     "Created: / 19-11-2012 / 20:01:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
  2065     "Modified: / 21-02-2014 / 00:20:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
  2132     "Modified: / 17-07-2014 / 15:11:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
  2066 !
  2133 !
  2067 
  2134 
  2068 parseOutput:stream
  2135 parseOutput:stream
  2069     "Parses output of 'hg' command, i.e. commit, log, update, checkout,
  2136     "Parses output of 'hg' command, i.e. commit, log, update, checkout,
  2070      etc."
  2137      etc."