mirror of
https://github.com/nushell/nushell.git
synced 2025-04-26 06:08:21 +02:00
make ls -lf
outputs full path in symbolic target (#13605)
# Description Fixes: #13479 # User-Facing Changes Given the following setup: ``` cd /tmp touch src_file.txt ln -s src_file.txt link1 ``` ### Before ``` ls -lf link1 | get target.0 # It outputs src_file.txt ``` ### After ``` ls -lf link1 | get target.0 # It outputs /tmp/src_file.txt ``` # Tests + Formatting Added a test for the change
This commit is contained in:
parent
48e401834d
commit
a55d172e52
@ -5,7 +5,7 @@ use nu_engine::glob_from;
|
|||||||
#[allow(deprecated)]
|
#[allow(deprecated)]
|
||||||
use nu_engine::{command_prelude::*, env::current_dir};
|
use nu_engine::{command_prelude::*, env::current_dir};
|
||||||
use nu_glob::MatchOptions;
|
use nu_glob::MatchOptions;
|
||||||
use nu_path::expand_to_real_path;
|
use nu_path::{expand_path_with, expand_to_real_path};
|
||||||
use nu_protocol::{DataSource, NuGlob, PipelineMetadata, Signals};
|
use nu_protocol::{DataSource, NuGlob, PipelineMetadata, Signals};
|
||||||
use pathdiff::diff_paths;
|
use pathdiff::diff_paths;
|
||||||
|
|
||||||
@ -412,6 +412,7 @@ fn ls_for_one_pattern(
|
|||||||
du,
|
du,
|
||||||
&signals,
|
&signals,
|
||||||
use_mime_type,
|
use_mime_type,
|
||||||
|
args.full_paths,
|
||||||
);
|
);
|
||||||
match entry {
|
match entry {
|
||||||
Ok(value) => Some(value),
|
Ok(value) => Some(value),
|
||||||
@ -522,6 +523,7 @@ pub(crate) fn dir_entry_dict(
|
|||||||
du: bool,
|
du: bool,
|
||||||
signals: &Signals,
|
signals: &Signals,
|
||||||
use_mime_type: bool,
|
use_mime_type: bool,
|
||||||
|
full_symlink_target: bool,
|
||||||
) -> Result<Value, ShellError> {
|
) -> Result<Value, ShellError> {
|
||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
if metadata.is_none() {
|
if metadata.is_none() {
|
||||||
@ -551,7 +553,23 @@ pub(crate) fn dir_entry_dict(
|
|||||||
"target",
|
"target",
|
||||||
if md.file_type().is_symlink() {
|
if md.file_type().is_symlink() {
|
||||||
if let Ok(path_to_link) = filename.read_link() {
|
if let Ok(path_to_link) = filename.read_link() {
|
||||||
|
// Actually `filename` should always have a parent because it's a symlink.
|
||||||
|
// But for safety, we check `filename.parent().is_some()` first.
|
||||||
|
if full_symlink_target && filename.parent().is_some() {
|
||||||
|
Value::string(
|
||||||
|
expand_path_with(
|
||||||
|
path_to_link,
|
||||||
|
filename
|
||||||
|
.parent()
|
||||||
|
.expect("already check the filename have a parent"),
|
||||||
|
true,
|
||||||
|
)
|
||||||
|
.to_string_lossy(),
|
||||||
|
span,
|
||||||
|
)
|
||||||
|
} else {
|
||||||
Value::string(path_to_link.to_string_lossy(), span)
|
Value::string(path_to_link.to_string_lossy(), span)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Value::string("Could not obtain target file's path", span)
|
Value::string("Could not obtain target file's path", span)
|
||||||
}
|
}
|
||||||
|
@ -808,3 +808,28 @@ fn list_inside_tilde_glob_metachars_dir() {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn list_symlink_with_full_path() {
|
||||||
|
Playground::setup("list_symlink_with_full_path", |dirs, sandbox| {
|
||||||
|
sandbox.with_files(&[EmptyFile("test_file.txt")]);
|
||||||
|
|
||||||
|
#[cfg(unix)]
|
||||||
|
let _ = std::os::unix::fs::symlink("test_file.txt", dirs.test().join("test_link1"));
|
||||||
|
#[cfg(windows)]
|
||||||
|
let _ = std::os::windows::fs::symlink_file("test_file.txt", dirs.test().join("test_link1"));
|
||||||
|
let actual = nu!(
|
||||||
|
cwd: dirs.test(),
|
||||||
|
"ls -l test_link1 | get target.0"
|
||||||
|
);
|
||||||
|
assert_eq!(actual.out, "test_file.txt");
|
||||||
|
let actual = nu!(
|
||||||
|
cwd: dirs.test(),
|
||||||
|
"ls -lf test_link1 | get target.0"
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
actual.out,
|
||||||
|
dirs.test().join("test_file.txt").to_string_lossy()
|
||||||
|
);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user