118
|
1 |
"{ Package: 'cvut:stx/goodies/libsvn' }"
|
|
2 |
|
|
3 |
Object subclass:#OSProcess
|
|
4 |
instanceVariableNames:'executable arguments environment workdir stdin stdout stderr
|
|
5 |
exitValue runningLock'
|
|
6 |
classVariableNames:''
|
|
7 |
poolDictionaries:''
|
|
8 |
category:'OS-Support'
|
|
9 |
!
|
|
10 |
|
|
11 |
|
|
12 |
!OSProcess class methodsFor:'private'!
|
|
13 |
|
|
14 |
asShellQuotedArgument: anObject
|
|
15 |
|
|
16 |
| aString unquotedStream quotedStream |
|
|
17 |
aString := anObject asString.
|
|
18 |
|
|
19 |
(aString first = $' and: [aString last = $'])
|
|
20 |
ifTrue:[^aString].
|
|
21 |
|
|
22 |
(aString first = $" and: [aString last = $"])
|
|
23 |
ifTrue:[^aString].
|
|
24 |
|
|
25 |
(aString allSatisfy:
|
|
26 |
[:char|char isSeparator not and: [(#($" $< $> $& $# $; $\) includes: char) not]])
|
|
27 |
ifTrue:[^aString].
|
|
28 |
|
|
29 |
unquotedStream := aString readStream.
|
|
30 |
quotedStream := (String new: aString size + 10) writeStream.
|
|
31 |
quotedStream nextPut: $".
|
|
32 |
[ unquotedStream atEnd ] whileFalse:
|
|
33 |
[|char|
|
|
34 |
char := unquotedStream next.
|
|
35 |
(#($" $\) includes: char) ifTrue:[quotedStream nextPut: $\].
|
|
36 |
quotedStream nextPut: char].
|
|
37 |
quotedStream nextPut: $".
|
|
38 |
^quotedStream contents.
|
|
39 |
|
|
40 |
"
|
|
41 |
OSProcess asShellQuotedArgument: 'Hello' .
|
|
42 |
OSProcess asShellQuotedArgument: 'Hello world'
|
|
43 |
OSProcess asShellQuotedArgument: 'Hello'' world'
|
|
44 |
OSProcess asShellQuotedArgument: 'Hello
|
|
45 |
World'
|
|
46 |
"
|
|
47 |
|
|
48 |
"Created: / 10-10-2008 / 12:32:18 / Jan Vrany <vranyj1@fel.cvut.cz>"
|
|
49 |
"Modified: / 02-06-2009 / 19:41:05 / Jan Vrany <vranyj1@fel.cvut.cz>"
|
|
50 |
! !
|
|
51 |
|
|
52 |
!OSProcess methodsFor:'accessing'!
|
|
53 |
|
|
54 |
arguments
|
|
55 |
^ arguments ? #()
|
|
56 |
|
|
57 |
"Created: / 15-03-2008 / 18:09:37 / janfrog"
|
|
58 |
!
|
|
59 |
|
|
60 |
arguments:something
|
|
61 |
arguments := something.
|
|
62 |
|
|
63 |
"Created: / 15-03-2008 / 18:09:37 / janfrog"
|
|
64 |
!
|
|
65 |
|
|
66 |
environment
|
|
67 |
^ environment
|
|
68 |
|
|
69 |
"Created: / 15-03-2008 / 18:09:37 / janfrog"
|
|
70 |
!
|
|
71 |
|
|
72 |
environment:something
|
|
73 |
environment := something.
|
|
74 |
|
|
75 |
"Created: / 15-03-2008 / 18:09:37 / janfrog"
|
|
76 |
!
|
|
77 |
|
|
78 |
executable
|
|
79 |
^ executable
|
|
80 |
|
|
81 |
"Created: / 15-03-2008 / 18:09:37 / janfrog"
|
|
82 |
!
|
|
83 |
|
|
84 |
executable:something
|
|
85 |
executable := something.
|
|
86 |
|
|
87 |
"Created: / 15-03-2008 / 18:09:37 / janfrog"
|
|
88 |
!
|
|
89 |
|
|
90 |
exitValue
|
|
91 |
|
|
92 |
self waitFor.
|
|
93 |
^exitValue
|
|
94 |
|
|
95 |
"Created: / 15-03-2008 / 18:08:00 / janfrog"
|
|
96 |
"Modified: / 19-04-2008 / 12:25:56 / Jan Vrany <vranyj1@fel.cvut.cz>"
|
|
97 |
!
|
|
98 |
|
|
99 |
stderr
|
|
100 |
^ stderr ? Stderr
|
|
101 |
|
|
102 |
"Created: / 15-03-2008 / 18:21:05 / janfrog"
|
|
103 |
!
|
|
104 |
|
|
105 |
stderr:something
|
|
106 |
stderr := something.
|
|
107 |
|
|
108 |
"Created: / 15-03-2008 / 18:21:05 / janfrog"
|
|
109 |
!
|
|
110 |
|
|
111 |
stdin
|
|
112 |
^ stdin ? Stdin
|
|
113 |
|
|
114 |
"Created: / 15-03-2008 / 18:21:05 / janfrog"
|
|
115 |
!
|
|
116 |
|
|
117 |
stdin:something
|
|
118 |
stdin := something.
|
|
119 |
|
|
120 |
"Created: / 15-03-2008 / 18:21:05 / janfrog"
|
|
121 |
!
|
|
122 |
|
|
123 |
stdout
|
|
124 |
^ stdout ? Transcript
|
|
125 |
|
|
126 |
"Created: / 15-03-2008 / 18:21:05 / janfrog"
|
|
127 |
!
|
|
128 |
|
|
129 |
stdout:something
|
|
130 |
stdout := something.
|
|
131 |
|
|
132 |
"Created: / 15-03-2008 / 18:21:05 / janfrog"
|
|
133 |
!
|
|
134 |
|
|
135 |
workdir
|
|
136 |
^ workdir ? Filename defaultDirectory
|
|
137 |
|
|
138 |
"Created: / 15-03-2008 / 18:09:37 / janfrog"
|
|
139 |
!
|
|
140 |
|
|
141 |
workdir:aStringOrFilename
|
|
142 |
workdir := aStringOrFilename asString.
|
|
143 |
|
|
144 |
"Created: / 15-03-2008 / 18:09:37 / janfrog"
|
|
145 |
"Modified: / 09-04-2009 / 17:32:25 / Jan Vrany <vranyj1@fel.cvut.cz>"
|
|
146 |
! !
|
|
147 |
|
|
148 |
!OSProcess methodsFor:'conversion'!
|
|
149 |
|
|
150 |
asShellCommandString
|
|
151 |
|
|
152 |
| cmdStream |
|
|
153 |
cmdStream := String new writeStream.
|
|
154 |
cmdStream nextPutAll:self executable.
|
|
155 |
self arguments do:
|
|
156 |
[:arg|
|
|
157 |
cmdStream space.
|
|
158 |
cmdStream nextPutAll:(self asShellQuotedArgument: arg)].
|
|
159 |
|
|
160 |
^cmdStream contents utf8Encoded
|
|
161 |
|
|
162 |
"Created: / 19-03-2008 / 12:34:59 / janfrog"
|
|
163 |
"Modified: / 31-03-2008 / 14:09:05 / janfrog"
|
|
164 |
"Modified: / 23-03-2009 / 10:09:55 / Jan Vrany <vranyj1@fel.cvut.cz>"
|
|
165 |
! !
|
|
166 |
|
|
167 |
!OSProcess methodsFor:'operations'!
|
|
168 |
|
|
169 |
execute
|
|
170 |
"
|
|
171 |
self synchronized:
|
|
172 |
[runningLock
|
|
173 |
ifNotNil:[self error:'Process already running']
|
|
174 |
ifNil:[runningLock := Semaphore new:0]].
|
|
175 |
[["
|
|
176 |
(OperatingSystem
|
|
177 |
executeCommand: self asShellCommandString
|
|
178 |
inputFrom: self stdin
|
|
179 |
outputTo: self stdout
|
|
180 |
errorTo: self stderr
|
|
181 |
auxFrom: nil
|
|
182 |
environment: nil
|
|
183 |
inDirectory: self workdir asString
|
|
184 |
lineWise: (self stdout = self stderr)
|
|
185 |
onError:[:value|exitValue := value code.false])
|
|
186 |
ifTrue:[exitValue := 0]
|
|
187 |
"
|
|
188 |
] ensure:[runningLock signalForAll. runningLock := nil]] fork
|
|
189 |
"
|
|
190 |
|
|
191 |
"Created: / 15-03-2008 / 18:11:20 / janfrog"
|
|
192 |
"Modified: / 19-03-2008 / 12:35:05 / janfrog"
|
|
193 |
"Modified: / 08-06-2008 / 19:15:45 / Jan Vrany <vranyj1@fel.cvut.cz>"
|
|
194 |
!
|
|
195 |
|
|
196 |
waitFor
|
|
197 |
|
|
198 |
"| lock |
|
|
199 |
self synchronized:
|
|
200 |
[runningLock
|
|
201 |
ifNil:[^self]
|
|
202 |
ifNotNil:[lock := runningLock]].
|
|
203 |
lock wait"
|
|
204 |
|
|
205 |
"Created: / 15-03-2008 / 18:32:41 / janfrog"
|
|
206 |
"Modified: / 08-06-2008 / 19:15:22 / Jan Vrany <vranyj1@fel.cvut.cz>"
|
|
207 |
! !
|
|
208 |
|
|
209 |
!OSProcess methodsFor:'private'!
|
|
210 |
|
|
211 |
asShellQuotedArgument:arg
|
|
212 |
^ self class asShellQuotedArgument:arg
|
|
213 |
|
|
214 |
"Created: / 10-10-2008 / 12:32:18 / Jan Vrany <vranyj1@fel.cvut.cz>"
|
|
215 |
! !
|
|
216 |
|
|
217 |
!OSProcess class methodsFor:'documentation'!
|
|
218 |
|
|
219 |
version
|
126
|
220 |
^ 'Header: /cvs/stx/cvut/stx/goodies/libsvn/OSProcess.st,v 1.5 2009/09/28 09:33:25 fm Exp '
|
|
221 |
!
|
|
222 |
|
|
223 |
version_SVN
|
|
224 |
^'Id: OSProcess.st 88 2009-06-15 12:12:29Z vranyj1 '
|
118
|
225 |
! !
|