mirror of
https://github.com/martinvonz/jj.git
synced 2025-01-20 03:20:08 +00:00
diff: Allow setting the default level of context in config.
This commit is contained in:
parent
3268409d2f
commit
891fa88be0
6 changed files with 148 additions and 8 deletions
|
@ -73,6 +73,9 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
belonging to a remote. This option can be combined with `--tracked` or
|
belonging to a remote. This option can be combined with `--tracked` or
|
||||||
`--conflicted`.
|
`--conflicted`.
|
||||||
|
|
||||||
|
* Added the config settings `diff.color-words.context` and `diff.git.context` to
|
||||||
|
control the default number of lines of context shown.
|
||||||
|
|
||||||
### Fixed bugs
|
### Fixed bugs
|
||||||
|
|
||||||
* Error on `trunk()` revset resolution is now handled gracefully.
|
* Error on `trunk()` revset resolution is now handled gracefully.
|
||||||
|
|
|
@ -288,6 +288,22 @@
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"description": "Maximum number of removed/added word alternation to inline",
|
"description": "Maximum number of removed/added word alternation to inline",
|
||||||
"default": 3
|
"default": 3
|
||||||
|
},
|
||||||
|
"context": {
|
||||||
|
"type": "integer",
|
||||||
|
"description": "Number of lines of context to show",
|
||||||
|
"default": 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"git": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "Options for git diffs",
|
||||||
|
"properties": {
|
||||||
|
"context": {
|
||||||
|
"type": "integer",
|
||||||
|
"description": "Number of lines of context to show",
|
||||||
|
"default": 3
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,10 @@ unamend = ["unsquash"]
|
||||||
|
|
||||||
[diff.color-words]
|
[diff.color-words]
|
||||||
max-inline-alternation = 3
|
max-inline-alternation = 3
|
||||||
|
context = 3
|
||||||
|
|
||||||
|
[diff.git]
|
||||||
|
context = 3
|
||||||
|
|
||||||
[ui]
|
[ui]
|
||||||
# TODO: delete ui.allow-filesets in jj 0.26+
|
# TODO: delete ui.allow-filesets in jj 0.26+
|
||||||
|
|
|
@ -184,7 +184,7 @@ fn diff_formats_from_args(
|
||||||
formats.push(DiffFormat::NameOnly);
|
formats.push(DiffFormat::NameOnly);
|
||||||
}
|
}
|
||||||
if args.git {
|
if args.git {
|
||||||
let options = UnifiedDiffOptions::from_args(args);
|
let options = UnifiedDiffOptions::from_settings_and_args(settings, args)?;
|
||||||
formats.push(DiffFormat::Git(Box::new(options)));
|
formats.push(DiffFormat::Git(Box::new(options)));
|
||||||
}
|
}
|
||||||
if args.color_words {
|
if args.color_words {
|
||||||
|
@ -230,7 +230,7 @@ fn default_diff_format(
|
||||||
"types" => Ok(DiffFormat::Types),
|
"types" => Ok(DiffFormat::Types),
|
||||||
"name-only" => Ok(DiffFormat::NameOnly),
|
"name-only" => Ok(DiffFormat::NameOnly),
|
||||||
"git" => {
|
"git" => {
|
||||||
let options = UnifiedDiffOptions::from_args(args);
|
let options = UnifiedDiffOptions::from_settings_and_args(settings, args)?;
|
||||||
Ok(DiffFormat::Git(Box::new(options)))
|
Ok(DiffFormat::Git(Box::new(options)))
|
||||||
}
|
}
|
||||||
"color-words" => {
|
"color-words" => {
|
||||||
|
@ -520,8 +520,11 @@ impl ColorWordsDiffOptions {
|
||||||
})?),
|
})?),
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
let context = args
|
||||||
|
.context
|
||||||
|
.map_or_else(|| config.get("diff.color-words.context"), Ok)?;
|
||||||
Ok(ColorWordsDiffOptions {
|
Ok(ColorWordsDiffOptions {
|
||||||
context: args.context.unwrap_or(DEFAULT_CONTEXT_LINES),
|
context,
|
||||||
line_diff: LineDiffOptions::from_args(args),
|
line_diff: LineDiffOptions::from_args(args),
|
||||||
max_inline_alternation,
|
max_inline_alternation,
|
||||||
})
|
})
|
||||||
|
@ -1212,11 +1215,17 @@ pub struct UnifiedDiffOptions {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl UnifiedDiffOptions {
|
impl UnifiedDiffOptions {
|
||||||
fn from_args(args: &DiffFormatArgs) -> Self {
|
fn from_settings_and_args(
|
||||||
UnifiedDiffOptions {
|
settings: &UserSettings,
|
||||||
context: args.context.unwrap_or(DEFAULT_CONTEXT_LINES),
|
args: &DiffFormatArgs,
|
||||||
|
) -> Result<Self, config::ConfigError> {
|
||||||
|
let context = args
|
||||||
|
.context
|
||||||
|
.map_or_else(|| settings.config().get("diff.git.context"), Ok)?;
|
||||||
|
Ok(UnifiedDiffOptions {
|
||||||
|
context,
|
||||||
line_diff: LineDiffOptions::from_args(args),
|
line_diff: LineDiffOptions::from_args(args),
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1736,6 +1736,100 @@ fn test_diff_skipped_context() {
|
||||||
"###);
|
"###);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_diff_skipped_context_from_settings_color_words() {
|
||||||
|
let test_env = TestEnvironment::default();
|
||||||
|
test_env.jj_cmd_ok(test_env.env_root(), &["git", "init", "repo"]);
|
||||||
|
let repo_path = test_env.env_root().join("repo");
|
||||||
|
|
||||||
|
test_env.add_config(
|
||||||
|
r#"
|
||||||
|
[diff.color-words]
|
||||||
|
context = 0
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
|
||||||
|
std::fs::write(repo_path.join("file1"), "a\nb\nc\nd\ne").unwrap();
|
||||||
|
test_env.jj_cmd_ok(&repo_path, &["describe", "-m", "=== First commit"]);
|
||||||
|
|
||||||
|
test_env.jj_cmd_ok(&repo_path, &["new", "@", "-m", "=== Must show 0 context"]);
|
||||||
|
std::fs::write(repo_path.join("file1"), "a\nb\nC\nd\ne").unwrap();
|
||||||
|
|
||||||
|
let stdout = test_env.jj_cmd_success(
|
||||||
|
&repo_path,
|
||||||
|
&["log", "-Tdescription", "-p", "--no-graph", "--reversed"],
|
||||||
|
);
|
||||||
|
insta::assert_snapshot!(stdout, @r#"
|
||||||
|
=== First commit
|
||||||
|
Added regular file file1:
|
||||||
|
1: a
|
||||||
|
2: b
|
||||||
|
3: c
|
||||||
|
4: d
|
||||||
|
5: e
|
||||||
|
=== Must show 0 context
|
||||||
|
Modified regular file file1:
|
||||||
|
...
|
||||||
|
3 3: cC
|
||||||
|
...
|
||||||
|
"#);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_diff_skipped_context_from_settings_git() {
|
||||||
|
let test_env = TestEnvironment::default();
|
||||||
|
test_env.jj_cmd_ok(test_env.env_root(), &["git", "init", "repo"]);
|
||||||
|
let repo_path = test_env.env_root().join("repo");
|
||||||
|
|
||||||
|
test_env.add_config(
|
||||||
|
r#"
|
||||||
|
[diff.git]
|
||||||
|
context = 0
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
|
||||||
|
std::fs::write(repo_path.join("file1"), "a\nb\nc\nd\ne").unwrap();
|
||||||
|
test_env.jj_cmd_ok(&repo_path, &["describe", "-m", "=== First commit"]);
|
||||||
|
|
||||||
|
test_env.jj_cmd_ok(&repo_path, &["new", "@", "-m", "=== Must show 0 context"]);
|
||||||
|
std::fs::write(repo_path.join("file1"), "a\nb\nC\nd\ne").unwrap();
|
||||||
|
|
||||||
|
let stdout = test_env.jj_cmd_success(
|
||||||
|
&repo_path,
|
||||||
|
&[
|
||||||
|
"log",
|
||||||
|
"-Tdescription",
|
||||||
|
"-p",
|
||||||
|
"--git",
|
||||||
|
"--no-graph",
|
||||||
|
"--reversed",
|
||||||
|
],
|
||||||
|
);
|
||||||
|
insta::assert_snapshot!(stdout, @r#"
|
||||||
|
=== First commit
|
||||||
|
diff --git a/file1 b/file1
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..0fec236860
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/file1
|
||||||
|
@@ -1,0 +1,5 @@
|
||||||
|
+a
|
||||||
|
+b
|
||||||
|
+c
|
||||||
|
+d
|
||||||
|
+e
|
||||||
|
\ No newline at end of file
|
||||||
|
=== Must show 0 context
|
||||||
|
diff --git a/file1 b/file1
|
||||||
|
index 0fec236860..b7615dae52 100644
|
||||||
|
--- a/file1
|
||||||
|
+++ b/file1
|
||||||
|
@@ -3,1 +3,1 @@
|
||||||
|
-c
|
||||||
|
+C
|
||||||
|
"#);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_diff_skipped_context_nondefault() {
|
fn test_diff_skipped_context_nondefault() {
|
||||||
let test_env = TestEnvironment::default();
|
let test_env = TestEnvironment::default();
|
||||||
|
|
|
@ -204,7 +204,8 @@ ui.diff.format = "git"
|
||||||
|
|
||||||
In color-words diffs, changed words are displayed inline by default. Because
|
In color-words diffs, changed words are displayed inline by default. Because
|
||||||
it's difficult to read a diff line with many removed/added words, there's a
|
it's difficult to read a diff line with many removed/added words, there's a
|
||||||
threshold to switch to traditional separate-line format.
|
threshold to switch to traditional separate-line format. You can also change
|
||||||
|
the default number of lines of context shown.
|
||||||
|
|
||||||
* `max-inline-alternation`: Maximum number of removed/added word alternation to
|
* `max-inline-alternation`: Maximum number of removed/added word alternation to
|
||||||
inline. For example, `<added> ... <added>` sequence has 1 alternation, so the
|
inline. For example, `<added> ... <added>` sequence has 1 alternation, so the
|
||||||
|
@ -219,10 +220,23 @@ threshold to switch to traditional separate-line format.
|
||||||
The default is `3`.
|
The default is `3`.
|
||||||
|
|
||||||
**This parameter is experimental.** The definition is subject to change.
|
**This parameter is experimental.** The definition is subject to change.
|
||||||
|
* `context`: Number of lines of context to show in the diff. The default is `3`.
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
[diff.color-words]
|
[diff.color-words]
|
||||||
max-inline-alternation = 3
|
max-inline-alternation = 3
|
||||||
|
context = 3
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Git diff options
|
||||||
|
|
||||||
|
In git diffs you can change the default number of lines of context shown.
|
||||||
|
|
||||||
|
* `context`: Number of lines of context to show in the diff. The default is `3`.
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[diff.git]
|
||||||
|
context = 3
|
||||||
```
|
```
|
||||||
|
|
||||||
### Generating diffs by external command
|
### Generating diffs by external command
|
||||||
|
|
Loading…
Reference in a new issue