mercurial/HGCommand.st
branchhg-command-server-support
changeset 232 718711b15cea
parent 231 eb0f01855893
child 233 d9a8bb2aaa0b
--- a/mercurial/HGCommand.st	Sun Mar 03 12:29:14 2013 +0000
+++ b/mercurial/HGCommand.st	Sun Mar 03 19:43:56 2013 +0000
@@ -12,7 +12,8 @@
 "{ Package: 'stx:libscm/mercurial' }"
 
 Object subclass:#HGCommand
-	instanceVariableNames:'workingDirectory result error workers blocker errors'
+	instanceVariableNames:'workingDirectory result error errors blocker errorReader
+		outputReader'
 	classVariableNames:'HGExecutable HGVersion Debugging Tracing'
 	poolDictionaries:''
 	category:'SCM-Mercurial-Internal'
@@ -458,6 +459,14 @@
 
 !HGCommand methodsFor:'accessing'!
 
+errors
+    ^ errors
+!
+
+result
+    ^ result
+!
+
 workingDirectory
     ^workingDirectory notNil ifTrue:[
         workingDirectory
@@ -516,8 +525,8 @@
 execute
     | stdoutPipe stdout stderrPipe stderr pid environment status args spin |
 
-    workers := OrderedCollection new.
-    errors := SharedQueue new.
+    self initialize.
+    blocker := (Semaphore new:-2) name: 'Waiting for hg command to finish'.
 
     stdoutPipe := NonPositionableExternalStream makePipe.
     stdout := stdoutPipe first.
@@ -541,7 +550,7 @@
         ]
     ].
 
-    blocker := (Semaphore new:-2) name: 'Waiting for hg command to finish'.
+
     Processor monitor:[
         Tracing ifTrue:[
             Logger log: 'cmd: executing: ' , (args isString ifTrue:[args] ifFalse:[args asStringWith:' ']) severity: #trace facility: 'HG'.
@@ -572,8 +581,8 @@
         stdout := stdout contents asString readStream.
         stderr := stderr contents asString readStream.
     ].
-    self spawn: [ self parseError:  stderr ].
-    self spawn: [ result := self parseOutput: stdout ].
+    self spawnErrorReaderOn: stderr.
+    self spawnOutputReaderOn: stdout.
 
     spin := SemaphoreSet with: blocker with: errors readSemaphore.
 
@@ -589,15 +598,31 @@
     ].
     ^self status: status result: result
 
-    "
-        SVNv2::Command info: 'https://swing.fit.cvut.cz/svn/stx/libsvn'
-    "
-
     "Created: / 11-05-2011 / 07:45:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 17-12-2011 / 19:22:00 / dundee"
     "Modified (format): / 27-12-2011 / 15:53:54 / dundee"
     "Modified: / 14-11-2012 / 13:41:57 / jv"
-    "Modified (format): / 04-02-2013 / 23:40:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 03-03-2013 / 19:11:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!HGCommand methodsFor:'initialization'!
+
+initialize
+    "Invoked when a new instance is created."
+
+    "/ please change as required (and remove this comment)
+    "/ workingDirectory := nil.
+    "/ result := nil.
+    "/ error := nil.
+    "/ workers := nil.
+    "/ errors := nil.
+
+    errors := SharedQueue new.
+
+
+    "/ super initialize.   -- commented since inherited method does nothing
+
+    "Modified: / 03-03-2013 / 19:11:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !HGCommand methodsFor:'private'!
@@ -686,24 +711,40 @@
     "Modified: / 04-02-2013 / 14:14:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-spawn:aBlock
+spawn:block name: name
     "Spawn a new background thread executing given block"
 
     | worker |
 
-    worker := [ aBlock on: Error do:[:ex|self propagate:ex] ] newProcess.
-    workers add: worker.
+    worker := [ block on: Error do:[:ex|self propagate:ex] ] newProcess.
     worker addExitAction:[
         Tracing ifTrue:[
-            Logger log: 'command parser finished' severity: #trace facility: 'HG'.
+            Logger log: 'cmd: worker ''', name , ''' finished' severity: #trace facility: 'HG'.
         ].
-        blocker signal.
-        workers remove: worker
+        blocker notNil ifTrue:[blocker signal].
     ].
     worker resume.
+    worker name: name.
+    ^worker
 
-    "Created: / 04-02-2013 / 11:55:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 04-02-2013 / 21:59:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 03-03-2013 / 16:56:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 03-03-2013 / 19:12:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+spawnErrorReaderOn: stderr
+    errorReader isNil ifTrue:[
+        errorReader := self spawn: [ self parseError:  stderr ] name: 'Error reader'
+    ].
+
+    "Created: / 03-03-2013 / 16:59:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+spawnOutputReaderOn: stdout
+    outputReader isNil ifTrue:[    
+        outputReader := self spawn: [ result := self parseOutput: stdout ] name: 'Output reader'.
+    ]
+
+    "Created: / 03-03-2013 / 17:00:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 status: status result: res