@@ -98,6 +98,7 @@ func runInput(input string, priv bool) {
98
98
var exitCode uint8
99
99
var err error
100
100
var cont bool
101
+ var newline bool
101
102
// save incase it changes while prompting (For some reason)
102
103
currentRunner := runnerMode
103
104
if currentRunner .Type () == rt .StringType {
@@ -108,9 +109,9 @@ func runInput(input string, priv bool) {
108
109
cmdFinish (0 , input , priv )
109
110
return
110
111
}
111
- input , exitCode , cont , err = handleSh (input )
112
+ input , exitCode , cont , newline , err = handleSh (input )
112
113
case "hybridRev" :
113
- _ , _ , _ , err = handleSh (input )
114
+ _ , _ , _ , _ , err = handleSh (input )
114
115
if err == nil {
115
116
cmdFinish (0 , input , priv )
116
117
return
@@ -119,12 +120,12 @@ func runInput(input string, priv bool) {
119
120
case "lua" :
120
121
input , exitCode , err = handleLua (input )
121
122
case "sh" :
122
- input , exitCode , cont , err = handleSh (input )
123
+ input , exitCode , cont , newline , err = handleSh (input )
123
124
}
124
125
} else {
125
126
// can only be a string or function so
126
127
var runnerErr error
127
- input , exitCode , cont , runnerErr , err = runLuaRunner (currentRunner , input )
128
+ input , exitCode , cont , newline , runnerErr , err = runLuaRunner (currentRunner , input )
128
129
if err != nil {
129
130
fmt .Fprintln (os .Stderr , err )
130
131
cmdFinish (124 , input , priv )
@@ -137,7 +138,7 @@ func runInput(input string, priv bool) {
137
138
}
138
139
139
140
if cont {
140
- input , err = reprompt (input )
141
+ input , err = reprompt (input , newline )
141
142
if err == nil {
142
143
goto rerun
143
144
} else if err == io .EOF {
@@ -155,26 +156,28 @@ func runInput(input string, priv bool) {
155
156
cmdFinish (exitCode , input , priv )
156
157
}
157
158
158
- func reprompt (input string ) (string , error ) {
159
+ func reprompt (input string , newline bool ) (string , error ) {
159
160
for {
160
- in , err := continuePrompt (strings .TrimSuffix (input , "\\ " ))
161
+ /*
162
+ if strings.HasSuffix(input, "\\") {
163
+ input = strings.TrimSuffix(input, "\\") + "\n"
164
+ }
165
+ */
166
+ in , err := continuePrompt (input , newline )
161
167
if err != nil {
162
168
lr .SetPrompt (fmtPrompt (prompt ))
163
169
return input , err
164
170
}
165
171
166
- if strings .HasSuffix (in , "\\ " ) {
167
- continue
168
- }
169
172
return in , nil
170
173
}
171
174
}
172
175
173
- func runLuaRunner (runr rt.Value , userInput string ) (input string , exitCode uint8 , continued bool , runnerErr , err error ) {
176
+ func runLuaRunner (runr rt.Value , userInput string ) (input string , exitCode uint8 , continued bool , newline bool , runnerErr , err error ) {
174
177
term := rt .NewTerminationWith (l .MainThread ().CurrentCont (), 3 , false )
175
178
err = rt .Call (l .MainThread (), runr , []rt.Value {rt .StringValue (userInput )}, term )
176
179
if err != nil {
177
- return "" , 124 , false , nil , err
180
+ return "" , 124 , false , false , nil , err
178
181
}
179
182
180
183
var runner * rt.Table
@@ -202,6 +205,10 @@ func runLuaRunner(runr rt.Value, userInput string) (input string, exitCode uint8
202
205
if c , ok := runner .Get (rt .StringValue ("continue" )).TryBool (); ok {
203
206
continued = c
204
207
}
208
+
209
+ if nl , ok := runner .Get (rt .StringValue ("newline" )).TryBool (); ok {
210
+ newline = nl
211
+ }
205
212
return
206
213
}
207
214
@@ -232,35 +239,40 @@ func handleLua(input string) (string, uint8, error) {
232
239
return cmdString , 125 , err
233
240
}
234
241
235
- func handleSh (cmdString string ) (input string , exitCode uint8 , cont bool , runErr error ) {
242
+ func handleSh (cmdString string ) (input string , exitCode uint8 , cont bool , newline bool , runErr error ) {
236
243
shRunner := hshMod .Get (rt .StringValue ("runner" )).AsTable ().Get (rt .StringValue ("sh" ))
237
244
var err error
238
- input , exitCode , cont , runErr , err = runLuaRunner (shRunner , cmdString )
245
+ input , exitCode , cont , newline , runErr , err = runLuaRunner (shRunner , cmdString )
239
246
if err != nil {
240
247
runErr = err
241
248
}
242
249
return
243
250
}
244
251
245
- func execSh (cmdString string ) (string , uint8 , bool , error ) {
252
+ func execSh (cmdString string ) (input string , exitcode uint8 , cont bool , newline bool , e error ) {
246
253
_ , _ , err := execCommand (cmdString , nil )
247
254
if err != nil {
248
255
// If input is incomplete, start multiline prompting
249
256
if syntax .IsIncomplete (err ) {
250
257
if ! interactive {
251
- return cmdString , 126 , false , err
258
+ return cmdString , 126 , false , false , err
259
+ }
260
+
261
+ newline := false
262
+ if strings .Contains (err .Error (), "unclosed here-document" ) {
263
+ newline = true
252
264
}
253
- return cmdString , 126 , true , err
265
+ return cmdString , 126 , true , newline , err
254
266
} else {
255
267
if code , ok := interp .IsExitStatus (err ); ok {
256
- return cmdString , code , false , nil
268
+ return cmdString , code , false , false , nil
257
269
} else {
258
- return cmdString , 126 , false , err
270
+ return cmdString , 126 , false , false , err
259
271
}
260
272
}
261
273
}
262
274
263
- return cmdString , 0 , false , nil
275
+ return cmdString , 0 , false , false , nil
264
276
}
265
277
266
278
// Run command in sh interpreter
0 commit comments