128
128
< span id ="123 "> 123</ span >
129
129
< span id ="124 "> 124</ span >
130
130
< span id ="125 "> 125</ span >
131
+ < span id ="126 "> 126</ span >
132
+ < span id ="127 "> 127</ span >
133
+ < span id ="128 "> 128</ span >
134
+ < span id ="129 "> 129</ span >
135
+ < span id ="130 "> 130</ span >
136
+ < span id ="131 "> 131</ span >
137
+ < span id ="132 "> 132</ span >
138
+ < span id ="133 "> 133</ span >
139
+ < span id ="134 "> 134</ span >
140
+ < span id ="135 "> 135</ span >
141
+ < span id ="136 "> 136</ span >
142
+ < span id ="137 "> 137</ span >
143
+ < span id ="138 "> 138</ span >
144
+ < span id ="139 "> 139</ span >
145
+ < span id ="140 "> 140</ span >
146
+ < span id ="141 "> 141</ span >
147
+ < span id ="142 "> 142</ span >
148
+ < span id ="143 "> 143</ span >
131
149
</ pre > < pre class ="rust "> < code > < span class ="kw "> use</ span > < span class ="ident "> std::env</ span > ;
132
150
< span class ="kw "> use</ span > < span class ="ident "> std::io::Write</ span > ;
133
- < span class ="kw "> use</ span > < span class ="ident "> std::io</ span > ::{< span class ="ident "> BufWriter</ span > , < span class ="prelude-ty "> Result</ span > };
151
+ < span class ="kw "> use</ span > < span class ="ident "> std::io</ span > ::{< span class ="ident "> BufWriter</ span > , < span class ="ident "> Error</ span > , < span class ="ident "> ErrorKind</ span > , < span class ="prelude-ty "> Result</ span > };
152
+ < span class ="kw "> use</ span > < span class ="ident "> std::path::Path</ span > ;
134
153
< span class ="kw "> use</ span > < span class ="ident "> std::process</ span > ::{< span class ="ident "> Child</ span > , < span class ="ident "> Command</ span > , < span class ="ident "> Stdio</ span > };
135
154
< span class ="kw "> use</ span > < span class ="ident "> uucore::crash</ span > ;
155
+ < span class ="kw "> use</ span > < span class ="ident "> uucore::fs</ span > ;
156
+ < span class ="kw "> use</ span > < span class ="ident "> uucore::fs::FileInformation</ span > ;
136
157
137
158
< span class ="doccomment "> /// A writer that writes to a shell_process' stdin</ span >
138
159
< span class ="doccomment "> ///</ span >
196
217
< span class ="doccomment "> ///</ span >
197
218
< span class ="doccomment "> /// * `command` - The shell command to execute</ span >
198
219
< span class ="doccomment "> /// * `filepath` - Path of the output file (forwarded to command as $FILE)</ span >
199
- < span class ="kw "> fn</ span > < span class ="ident "> new</ span > (< span class ="ident "> command</ span > : < span class ="kw-2 "> &</ span > < span class ="ident "> str</ span > , < span class ="ident "> filepath</ span > : < span class ="kw-2 "> &</ span > < span class ="ident "> str</ span > ) -> < span class ="self "> Self</ span > {
220
+ < span class ="kw "> fn</ span > < span class ="ident "> new</ span > (< span class ="ident "> command</ span > : < span class ="kw-2 "> &</ span > < span class ="ident "> str</ span > , < span class ="ident "> filepath</ span > : < span class ="kw-2 "> &</ span > < span class ="ident "> str</ span > ) -> < span class ="prelude-ty " > Result </ span > < span class =" op " > < </ span > < span class =" self "> Self</ span > < span class =" op " > > </ span > {
200
221
< span class ="comment "> // set $FILE, save previous value (if there was one)</ span >
201
222
< span class ="kw "> let</ span > < span class ="ident "> _with_env_var_set</ span > < span class ="op "> =</ span > < span class ="ident "> WithEnvVarSet::new</ span > (< span class ="string "> "FILE"</ span > , < span class ="ident "> filepath</ span > );
202
223
205
226
.< span class ="ident "> arg</ span > (< span class ="string "> "-c"</ span > )
206
227
.< span class ="ident "> arg</ span > (< span class ="ident "> command</ span > )
207
228
.< span class ="ident "> stdin</ span > (< span class ="ident "> Stdio::piped</ span > ())
208
- .< span class ="ident "> spawn</ span > ()
209
- .< span class ="ident "> expect</ span > (< span class ="string "> "Couldn't spawn filter command"</ span > );
229
+ .< span class ="ident "> spawn</ span > ()< span class ="question-mark "> ?</ span > ;
210
230
211
- < span class ="self "> Self</ span > { < span class ="ident "> shell_process</ span > }
231
+ < span class ="prelude-val " > Ok </ span > ( < span class =" self "> Self</ span > { < span class ="ident "> shell_process</ span > })
212
232
}
213
233
}
214
234
237
257
< span class ="kw "> pub</ span > < span class ="kw "> fn</ span > < span class ="ident "> instantiate_current_writer</ span > (
238
258
< span class ="ident "> filter</ span > : < span class ="kw-2 "> &</ span > < span class ="prelude-ty "> Option</ span > < span class ="op "> <</ span > < span class ="ident "> String</ span > < span class ="op "> ></ span > ,
239
259
< span class ="ident "> filename</ span > : < span class ="kw-2 "> &</ span > < span class ="ident "> str</ span > ,
240
- ) -> < span class ="ident "> BufWriter</ span > < span class ="op "> <</ span > < span class ="ident "> Box</ span > < span class ="op "> <</ span > < span class ="kw "> dyn</ span > < span class ="ident "> Write</ span > < span class ="op "> ></ span > < span class ="op "> ></ span > {
260
+ ) -> < span class ="prelude-ty " > Result </ span > < span class =" op " > < </ span > < span class =" ident "> BufWriter</ span > < span class ="op "> <</ span > < span class ="ident "> Box</ span > < span class ="op "> <</ span > < span class ="kw "> dyn</ span > < span class ="ident "> Write</ span > < span class =" op " > > </ span > < span class ="op "> ></ span > < span class ="op "> ></ span > {
241
261
< span class ="kw "> match</ span > < span class ="ident "> filter</ span > {
242
- < span class ="prelude-val "> None</ span > => < span class ="ident "> BufWriter::new</ span > (< span class ="ident "> Box::new</ span > (
262
+ < span class ="prelude-val "> None</ span > => < span class ="prelude-val " > Ok </ span > ( < span class =" ident "> BufWriter::new</ span > (< span class ="ident "> Box::new</ span > (
243
263
< span class ="comment "> // write to the next file</ span >
244
264
< span class ="ident "> std::fs::OpenOptions::new</ span > ()
245
265
.< span class ="ident "> write</ span > (< span class ="bool-val "> true</ span > )
246
266
.< span class ="ident "> create</ span > (< span class ="bool-val "> true</ span > )
267
+ .< span class ="ident "> truncate</ span > (< span class ="bool-val "> true</ span > )
247
268
.< span class ="ident "> open</ span > (< span class ="ident "> std::path::Path::new</ span > (< span class ="kw-2 "> &</ span > < span class ="ident "> filename</ span > ))
248
- .< span class ="ident "> unwrap</ span > (),
249
- ) < span class ="kw "> as</ span > < span class ="ident "> Box</ span > < span class ="op "> <</ span > < span class ="kw "> dyn</ span > < span class ="ident "> Write</ span > < span class ="op "> ></ span > ),
250
- < span class ="prelude-val "> Some</ span > (< span class ="kw-2 "> ref</ span > < span class ="ident "> filter_command</ span > ) => < span class ="ident "> BufWriter::new</ span > (< span class ="ident "> Box::new</ span > (
269
+ .< span class ="ident "> map_err</ span > (< span class ="op "> |</ span > < span class ="kw "> _</ span > < span class ="op "> |</ span > {
270
+ < span class ="ident "> Error::new</ span > (
271
+ < span class ="ident "> ErrorKind::Other</ span > ,
272
+ < span class ="macro "> format!</ span > (< span class ="string "> "unable to open '{}'; aborting"</ span > , < span class ="ident "> filename</ span > ),
273
+ )
274
+ })< span class ="question-mark "> ?</ span > ,
275
+ ) < span class ="kw "> as</ span > < span class ="ident "> Box</ span > < span class ="op "> <</ span > < span class ="kw "> dyn</ span > < span class ="ident "> Write</ span > < span class ="op "> ></ span > )),
276
+ < span class ="prelude-val "> Some</ span > (< span class ="kw-2 "> ref</ span > < span class ="ident "> filter_command</ span > ) => < span class ="prelude-val "> Ok</ span > (< span class ="ident "> BufWriter::new</ span > (< span class ="ident "> Box::new</ span > (
251
277
< span class ="comment "> // spawn a shell command and write to it</ span >
252
- < span class ="ident "> FilterWriter::new</ span > (< span class ="ident "> filter_command</ span > , < span class ="ident "> filename</ span > ),
253
- ) < span class ="kw "> as</ span > < span class ="ident "> Box</ span > < span class ="op "> <</ span > < span class ="kw "> dyn</ span > < span class ="ident "> Write</ span > < span class ="op "> ></ span > ),
278
+ < span class ="ident "> FilterWriter::new</ span > (< span class ="ident "> filter_command</ span > , < span class ="ident "> filename</ span > )< span class =" question-mark " > ? </ span > ,
279
+ ) < span class ="kw "> as</ span > < span class ="ident "> Box</ span > < span class ="op "> <</ span > < span class ="kw "> dyn</ span > < span class ="ident "> Write</ span > < span class ="op "> ></ span > )) ,
254
280
}
255
281
}
282
+
283
+ < span class ="kw "> pub</ span > < span class ="kw "> fn</ span > < span class ="ident "> paths_refer_to_same_file</ span > (< span class ="ident "> p1</ span > : < span class ="kw-2 "> &</ span > < span class ="ident "> str</ span > , < span class ="ident "> p2</ span > : < span class ="kw-2 "> &</ span > < span class ="ident "> str</ span > ) -> < span class ="ident "> bool</ span > {
284
+ < span class ="comment "> // We have to take symlinks and relative paths into account.</ span >
285
+ < span class ="kw "> let</ span > < span class ="ident "> p1</ span > < span class ="op "> =</ span > < span class ="kw "> if</ span > < span class ="ident "> p1</ span > < span class ="op "> ==</ span > < span class ="string "> "-"</ span > {
286
+ < span class ="ident "> FileInformation::from_file</ span > (< span class ="kw-2 "> &</ span > < span class ="ident "> std::io::stdin</ span > ())
287
+ } < span class ="kw "> else</ span > {
288
+ < span class ="ident "> FileInformation::from_path</ span > (< span class ="ident "> Path::new</ span > (< span class ="kw-2 "> &</ span > < span class ="ident "> p1</ span > ), < span class ="bool-val "> true</ span > )
289
+ };
290
+ < span class ="ident "> fs::infos_refer_to_same_file</ span > (< span class ="ident "> p1</ span > , < span class ="ident "> FileInformation::from_path</ span > (< span class ="ident "> Path::new</ span > (< span class ="ident "> p2</ span > ), < span class ="bool-val "> true</ span > ))
291
+ }
256
292
</ code > </ pre > </ div >
257
293
</ section > </ div > </ main > < div id ="rustdoc-vars " data-root-path ="../../../ " data-current-crate ="uu_split " data-themes ="ayu,dark,light " data-resource-suffix ="" data-rustdoc-version ="1.62.1 (e092d0b6b 2022-07-16) " > </ div >
258
294
</ body > </ html >
0 commit comments