@@ -66,11 +66,20 @@ func parseRunRequest(args []string) (runRequest, int) {
6666 return runRequest {}, 2
6767 }
6868 if ! hasSeparator {
69- fmt .Fprintln (os .Stderr , "run command requires '--' separator before target command" )
69+ fmt .Fprintln (
70+ os .Stderr ,
71+ formatUsageError (
72+ "run command requires '--' separator before target command" ,
73+ "use `derun run [flags] -- <command> [args...]`" ,
74+ ),
75+ )
7076 return runRequest {}, 2
7177 }
7278 if len (commandArgs ) == 0 {
73- fmt .Fprintln (os .Stderr , "run command requires target command" )
79+ fmt .Fprintln (
80+ os .Stderr ,
81+ formatUsageError ("run command requires target command" , "provide a command after `--`" ),
82+ )
7483 return runRequest {}, 2
7584 }
7685 if err := validateRetentionDuration (request .retentionDuration ); err != nil {
@@ -85,18 +94,18 @@ func parseRunRequest(args []string) (runRequest, int) {
8594func initRunRuntime (request runRequest ) (* runRuntime , int ) {
8695 stateRoot , err := resolveStateRootForRun ()
8796 if err != nil {
88- fmt .Fprintf (os .Stderr , "resolve state root: %v \n " , err )
97+ fmt .Fprintln (os .Stderr , formatRuntimeError ( "resolve state root" , err ) )
8998 return nil , 1
9099 }
91100
92101 store , err := state .New (stateRoot )
93102 if err != nil {
94- fmt .Fprintf (os .Stderr , "init state store: %v \n " , err )
103+ fmt .Fprintln (os .Stderr , formatRuntimeError ( "initialize state store" , err ) )
95104 return nil , 1
96105 }
97106 logger , err := logging .New (stateRoot )
98107 if err != nil {
99- fmt .Fprintf (os .Stderr , "init logger: %v \n " , err )
108+ fmt .Fprintln (os .Stderr , formatRuntimeError ( "initialize logger" , err ) )
100109 return nil , 1
101110 }
102111
@@ -121,7 +130,7 @@ func prepareSession(runtimeState *runRuntime, request runRequest) (*preparedRunS
121130 if sessionID == "" {
122131 sessionID , err = generateUniqueSessionID (runtimeState .store , runtimeState .logger )
123132 if err != nil {
124- fmt .Fprintf (os .Stderr , "generate session id: %v \n " , err )
133+ fmt .Fprintln (os .Stderr , formatRuntimeError ( "generate session id" , err ) )
125134 return nil , 1
126135 }
127136 } else {
@@ -132,30 +141,42 @@ func prepareSession(runtimeState *runRuntime, request runRequest) (*preparedRunS
132141 "session_id" : sessionID ,
133142 "reason" : string (sessionIDRejectionReasonInvalid ),
134143 })
135- fmt .Fprintf (os .Stderr , "invalid session id: %s\n " , sessionID )
144+ fmt .Fprintln (
145+ os .Stderr ,
146+ formatUsageError (
147+ fmt .Sprintf ("invalid session id %q" , sessionID ),
148+ "use a unique path-safe id (for example: 01J0S444444444444444444444)" ,
149+ ),
150+ )
136151 return nil , 2
137152 }
138- fmt .Fprintf (os .Stderr , "check session metadata: %v \n " , err )
153+ fmt .Fprintln (os .Stderr , formatRuntimeError ( "check session metadata" , err ) )
139154 return nil , 1
140155 }
141156 if hasMetadata {
142157 runtimeState .logger .Event ("session_id_rejected" , map [string ]any {
143158 "session_id" : sessionID ,
144159 "reason" : string (sessionIDRejectionReasonMetadataExists ),
145160 })
146- fmt .Fprintf (os .Stderr , "session id already exists: %s\n " , sessionID )
161+ fmt .Fprintln (
162+ os .Stderr ,
163+ formatUsageError (
164+ fmt .Sprintf ("session id already exists %q" , sessionID ),
165+ "omit `--session-id` or choose a different id" ,
166+ ),
167+ )
147168 return nil , 2
148169 }
149170 }
150171
151172 if err := runtimeState .store .EnsureSessionDir (sessionID ); err != nil {
152- fmt .Fprintf (os .Stderr , "prepare session directory: %v \n " , err )
173+ fmt .Fprintln (os .Stderr , formatRuntimeError ( "prepare session directory" , err ) )
153174 return nil , 1
154175 }
155176
156177 workingDir , err := os .Getwd ()
157178 if err != nil {
158- fmt .Fprintf (os .Stderr , "resolve working directory: %v \n " , err )
179+ fmt .Fprintln (os .Stderr , formatRuntimeError ( "resolve working directory" , err ) )
159180 return nil , 1
160181 }
161182
@@ -174,7 +195,7 @@ func prepareSession(runtimeState *runRuntime, request runRequest) (*preparedRunS
174195 PID : 0 ,
175196 }
176197 if err := runtimeState .store .WriteMeta (meta ); err != nil {
177- fmt .Fprintf (os .Stderr , "write metadata: %v \n " , err )
198+ fmt .Fprintln (os .Stderr , formatRuntimeError ( "write session metadata " , err ) )
178199 return nil , 1
179200 }
180201
@@ -202,7 +223,7 @@ func executeTransport(runtimeState *runRuntime, preparedSession *preparedRunSess
202223 }
203224 preparedSession .meta .PID = pid
204225 if err := runtimeState .store .WriteMeta (preparedSession .meta ); err != nil {
205- return fmt .Errorf ("write meta file: %w" , err )
226+ return fmt .Errorf ("failed to write session metadata file: %w" , err )
206227 }
207228 return nil
208229 }
@@ -237,7 +258,7 @@ func executeTransport(runtimeState *runRuntime, preparedSession *preparedRunSess
237258 preparedSession .transportMode = contracts .DerunTransportModePipe
238259 preparedSession .meta .TransportMode = preparedSession .transportMode
239260 if err := runtimeState .store .WriteMeta (preparedSession .meta ); err != nil {
240- fmt .Fprintf (os .Stderr , "write fallback metadata: %v \n " , err )
261+ fmt .Fprintln (os .Stderr , formatRuntimeError ( "write fallback metadata" , err ) )
241262 return runExecutionResult {}, 1
242263 }
243264 result , runErr = runPipe ()
@@ -281,7 +302,7 @@ func persistFinalState(runtimeState *runRuntime, preparedSession *preparedRunSes
281302 }
282303
283304 if err := runtimeState .store .WriteFinal (final ); err != nil {
284- fmt .Fprintf (os .Stderr , "write final metadata: %v \n " , err )
305+ fmt .Fprintln (os .Stderr , formatRuntimeError ( "write final metadata" , err ) )
285306 return 1
286307 }
287308
@@ -290,7 +311,7 @@ func persistFinalState(runtimeState *runRuntime, preparedSession *preparedRunSes
290311
291312func resolveRunExitCode (execution runExecutionResult ) int {
292313 if execution .runErr != nil {
293- fmt .Fprintf (os .Stderr , "run command: %v \n " , execution .runErr )
314+ fmt .Fprintln (os .Stderr , formatRuntimeError ( "execute command" , execution .runErr ) )
294315 return 1
295316 }
296317 if execution .runResult .SignalNum > 0 {
0 commit comments