summaryrefslogtreecommitdiffstats
path: root/src/delta.rs
diff options
context:
space:
mode:
authorDan Davison <dandavison7@gmail.com>2020-07-18 15:34:43 -0400
committerDan Davison <dandavison7@gmail.com>2020-07-22 17:57:57 -0400
commitb2257cfae7eacc73e47299d90d9a8d479b3e362c (patch)
tree56b60ad41ce689042ce64c4793eec35100d8c322 /src/delta.rs
parent29bf022218f72157e1921412ae6ede598733b6fb (diff)
Format files and commits as OSC 8 hyperlinks
Closes #257
Diffstat (limited to 'src/delta.rs')
-rw-r--r--src/delta.rs51
1 files changed, 43 insertions, 8 deletions
diff --git a/src/delta.rs b/src/delta.rs
index c5ad0b41..803e36eb 100644
--- a/src/delta.rs
+++ b/src/delta.rs
@@ -1,3 +1,4 @@
+use std::borrow::Cow;
use std::io::BufRead;
use std::io::Write;
@@ -7,6 +8,8 @@ use unicode_segmentation::UnicodeSegmentation;
use crate::config::Config;
use crate::draw;
+use crate::features;
+use crate::format;
use crate::paint::Painter;
use crate::parse;
use crate::style::DecorationStyle;
@@ -60,7 +63,7 @@ where
{
let mut painter = Painter::new(writer, config);
let mut minus_file = "".to_string();
- let mut plus_file;
+ let mut plus_file = "".to_string();
let mut state = State::Unknown;
let mut source = Source::Unknown;
@@ -115,7 +118,7 @@ where
painter.set_highlighter();
if should_handle(&state, config) {
painter.emit()?;
- handle_hunk_header_line(&mut painter, &line, &raw_line, config)?;
+ handle_hunk_header_line(&mut painter, &line, &raw_line, &plus_file, config)?;
continue;
}
} else if source == Source::DiffUnified && line.starts_with("Only in ")
@@ -155,7 +158,11 @@ where
continue;
} else {
painter.emit()?;
- writeln!(painter.writer, "{}", raw_line)?;
+ writeln!(
+ painter.writer,
+ "{}",
+ format::format_raw_line(&raw_line, config)
+ )?;
}
}
@@ -240,10 +247,25 @@ fn handle_commit_meta_header_line(
draw::write_no_decoration
}
};
+ let (formatted_line, formatted_raw_line) = if config.hyperlinks {
+ (
+ Cow::from(
+ features::hyperlinks::format_commit_line_with_osc8_commit_hyperlink(line, config),
+ ),
+ Cow::from(
+ features::hyperlinks::format_commit_line_with_osc8_commit_hyperlink(
+ raw_line, config,
+ ),
+ ),
+ )
+ } else {
+ (Cow::from(line), Cow::from(raw_line))
+ };
+
draw_fn(
painter.writer,
- &format!("{}{}", line, if pad { " " } else { "" }),
- &format!("{}{}", raw_line, if pad { " " } else { "" }),
+ &format!("{}{}", formatted_line, if pad { " " } else { "" }),
+ &format!("{}{}", formatted_raw_line, if pad { " " } else { "" }),
&config.decorations_width,
config.commit_style,
decoration_ansi_term_style,
@@ -332,6 +354,7 @@ fn handle_hunk_header_line(
painter: &mut Painter,
line: &str,
raw_line: &str,
+ plus_file: &str,
config: &Config,
) -> std::io::Result<()> {
if config.hunk_header_style.is_omitted {
@@ -425,16 +448,28 @@ fn handle_hunk_header_line(
};
// Emit a single line number, or prepare for full line-numbering
if config.line_numbers {
- painter.line_numbers_data.initialize_hunk(line_numbers);
+ painter
+ .line_numbers_data
+ .initialize_hunk(line_numbers, plus_file.to_string());
} else {
let plus_line_number = line_numbers[line_numbers.len() - 1].0;
+ let formatted_plus_line_number = if config.hyperlinks {
+ features::hyperlinks::format_osc8_file_hyperlink(
+ plus_file,
+ Some(plus_line_number),
+ &format!("{}", plus_line_number),
+ config,
+ )
+ } else {
+ Cow::from(format!("{}", plus_line_number))
+ };
match config.hunk_header_style.decoration_ansi_term_style() {
Some(style) => writeln!(
painter.writer,
"{}",
- style.paint(format!("{}", plus_line_number))
+ style.paint(formatted_plus_line_number)
)?,
- None => writeln!(painter.writer, "{}", plus_line_number)?,
+ None => writeln!(painter.writer, "{}", formatted_plus_line_number)?,
}
}
Ok(())