endpoint 2.0 dysnomia.ptr.pet
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

show paths in ls and add absolute path flag

dawn bba4e7b5 8fce20a8

+29 -30
+29 -30
src/cmd/ls.rs
··· 1 1 use std::{ 2 + borrow::Cow, 2 3 sync::Arc, 3 4 time::{SystemTime, UNIX_EPOCH}, 4 5 }; ··· 32 33 "show detailed information about each file", 33 34 Some('l'), 34 35 ) 36 + .switch("full-paths", "display paths as absolute paths", Some('f')) 35 37 .category(Category::FileSystem) 36 38 } 37 39 ··· 49 51 let path_arg: Option<String> = call.opt(engine_state, stack, 0)?; 50 52 let all = call.has_flag(engine_state, stack, "all")?; 51 53 let long = call.has_flag(engine_state, stack, "long")?; 54 + let full_paths = call.has_flag(engine_state, stack, "full-paths")?; 52 55 53 - let mut target_dir = get_pwd(); 56 + let pwd = get_pwd(); 57 + let mut target_dir = pwd.clone(); 54 58 if let Some(path) = path_arg { 55 59 target_dir = Arc::new( 56 60 target_dir ··· 93 97 } 94 98 Value::record(record, span) 95 99 }; 96 - const DIR_METADATA: vfs::VfsMetadata = vfs::VfsMetadata { 97 - file_type: vfs::VfsFileType::Directory, 98 - len: 0, 99 - modified: None, 100 - created: None, 101 - accessed: None, 102 - }; 103 100 104 - let dots = if all { 105 - vec![ 106 - make_record(".", &DIR_METADATA), 107 - make_record("..", &DIR_METADATA), 108 - ] 109 - } else { 110 - Vec::new() 111 - }; 112 - let entries = dots 113 - .into_iter() 114 - .chain(entries.into_iter().flat_map(move |entry| { 115 - let do_map = move || { 116 - let name = entry.filename(); 117 - if name.starts_with('.') && !all { 118 - return Ok(None); 119 - } 120 - let metadata = entry.metadata().map_err(to_shell_err(span))?; 101 + let entries = entries.into_iter().flat_map(move |entry| { 102 + let do_map = || { 103 + let name = entry.filename(); 104 + if name.starts_with('.') && !all { 105 + return Ok(None); 106 + } 107 + let metadata = entry.metadata().map_err(to_shell_err(span))?; 121 108 122 - Ok(Some(make_record(&name, &metadata))) 109 + let name = if full_paths { 110 + format!("{path}/{name}", path = target_dir.as_str()) 111 + } else { 112 + let path = target_dir 113 + .as_str() 114 + .trim_start_matches(pwd.as_str()) 115 + .trim_start_matches("/"); 116 + format!( 117 + "{path}{sep}{name}", 118 + sep = path.is_empty().then_some("").unwrap_or("/"), 119 + ) 123 120 }; 124 - do_map() 125 - .transpose() 126 - .map(|res| res.unwrap_or_else(|err| Value::error(err, span))) 127 - })); 121 + Ok(Some(make_record(&name, &metadata))) 122 + }; 123 + do_map() 124 + .transpose() 125 + .map(|res| res.unwrap_or_else(|err| Value::error(err, span))) 126 + }); 128 127 129 128 let signals = engine_state.signals().clone(); 130 129 Ok(PipelineData::list_stream(