提交 c53a0156 编写于 作者: B Benjamin Sago

Extract symlink stuff into its own method

上级 449592c1
...@@ -84,46 +84,55 @@ impl<'a> File<'a> { ...@@ -84,46 +84,55 @@ impl<'a> File<'a> {
/// The "file name view" is what's displayed in the column and lines /// The "file name view" is what's displayed in the column and lines
/// views, but *not* in the grid view. /// views, but *not* in the grid view.
/// ///
/// It consists of the file name coloured in the appropriate style, and, /// It consists of the file name coloured in the appropriate style,
/// if it's a symlink, an arrow pointing to the file it links to, also /// with special formatting for a symlink.
pub fn file_name_view(&self) -> Cell {
if self.stat.kind == io::FileType::Symlink {
self.symlink_file_name_view()
}
else {
Cell {
length: 0, // This length is ignored (rightmost column)
text: self.file_colour().paint(&*self.name).to_string(),
}
}
}
/// If this file is a symlink, returns a string displaying its name,
/// and an arrow pointing to the file it links to, which is also
/// coloured in the appropriate style. /// coloured in the appropriate style.
/// ///
/// If the symlink target doesn't exist, then instead of displaying /// If the symlink target doesn't exist, then instead of displaying
/// an error, highlight the target and arrow in red. The error would /// an error, highlight the target and arrow in red. The error would
/// be shown out of context, and it's almost always because the /// be shown out of context, and it's almost always because the
/// target doesn't exist. /// target doesn't exist.
pub fn file_name_view(&self) -> Cell { fn symlink_file_name_view(&self) -> Cell {
let name = &*self.name; let name = &*self.name;
let style = self.file_colour(); let style = self.file_colour();
if self.stat.kind == io::FileType::Symlink { if let Ok(path) = fs::readlink(&self.path) {
match fs::readlink(&self.path) { let target_path = match self.dir {
Ok(path) => { Some(dir) => dir.path.join(path),
let target_path = match self.dir { None => path,
Some(dir) => dir.path.join(path), };
None => path,
}; match self.target_file(&target_path) {
Ok(file) => Cell {
match self.target_file(&target_path) { length: 0, // These lengths are never actually used...
Ok(file) => Cell { text: format!("{} {} {}{}{}",
length: 0, // These lengths are never actually used... style.paint(name),
text: format!("{} {} {}{}{}", GREY.paint("=>"),
style.paint(name), Cyan.paint(target_path.dirname_str().unwrap()),
GREY.paint("=>"), Cyan.paint("/"),
Cyan.paint(target_path.dirname_str().unwrap()), file.file_colour().paint(file.name.as_slice())),
Cyan.paint("/"), },
file.file_colour().paint(file.name.as_slice())), Err(filename) => Cell {
}, length: 0, // ...because the rightmost column lengths are ignored!
Err(filename) => Cell { text: format!("{} {} {}",
length: 0, // ...because the rightmost column lengths are ignored! style.paint(name),
text: format!("{} {} {}", Red.paint("=>"),
style.paint(name), Red.underline().paint(filename.as_slice())),
Red.paint("=>"), },
Red.underline().paint(filename.as_slice())),
},
}
}
Err(_) => Cell::paint(style, name),
} }
} }
else { else {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册