mirror of
https://github.com/martinvonz/jj.git
synced 2024-10-23 23:10:01 +00:00
cli: improve snapshot.max-new-file-size
error message
For new users this results in a significantly better error output, that actually shows them how to solve the problem, and why it happened. Signed-off-by: Austin Seipp <aseipp@pobox.com> Change-Id: Ide0c86fdfb40d66f970ceaef7b60a71392d2cd4b
This commit is contained in:
parent
493020c0a6
commit
1d99ff6aef
2 changed files with 42 additions and 8 deletions
|
@ -296,11 +296,41 @@ impl From<OpsetEvaluationError> for CommandError {
|
|||
impl From<SnapshotError> for CommandError {
|
||||
fn from(err: SnapshotError) -> Self {
|
||||
match err {
|
||||
SnapshotError::NewFileTooLarge { .. } => {
|
||||
user_error_with_message("Failed to snapshot the working copy", err).hinted(
|
||||
r#"Increase the value of the `snapshot.max-new-file-size` config option if you
|
||||
want this file to be snapshotted. Otherwise add it to your `.gitignore` file."#,
|
||||
)
|
||||
SnapshotError::NewFileTooLarge {
|
||||
path,
|
||||
size,
|
||||
max_size,
|
||||
} => {
|
||||
// if the size difference is < 1KiB, then show exact bytes.
|
||||
// otherwise, show in human-readable form; this avoids weird cases
|
||||
// where a file is 400 bytes too large but the error says something
|
||||
// like '1.0MiB, maximum size allowed is ~1.0MiB'
|
||||
let size_diff = size.0 - max_size.0;
|
||||
let err_str = if size_diff <= 1024 {
|
||||
format!(
|
||||
"it is {} bytes too large; the maximum size allowed is {} bytes ({}).",
|
||||
size_diff, max_size.0, max_size,
|
||||
)
|
||||
} else {
|
||||
format!("it is {}; the maximum size allowed is ~{}.", size, max_size,)
|
||||
};
|
||||
|
||||
user_error(format!(
|
||||
"Failed to snapshot the working copy\nThe file '{}' is too large to be \
|
||||
snapshotted: {}",
|
||||
path.display(),
|
||||
err_str,
|
||||
))
|
||||
.hinted(format!(
|
||||
"This is to prevent large files from being added on accident. You can fix \
|
||||
this error by:
|
||||
- Adding the file to `.gitignore`
|
||||
- Run `jj config set --repo snapshot.max-new-file-size {}`
|
||||
This will increase the maximum file size allowed for new files, in this repository only.
|
||||
- Run `jj --config-toml 'snapshot.max-new-file-size={}' st`
|
||||
This will increase the maximum file size allowed for new files, for this command only.",
|
||||
size.0, size.0
|
||||
))
|
||||
}
|
||||
err => internal_error_with_message("Failed to snapshot the working copy", err),
|
||||
}
|
||||
|
|
|
@ -25,8 +25,12 @@ fn test_snapshot_large_file() {
|
|||
let stderr = test_env.jj_cmd_failure(&repo_path, &["files"]);
|
||||
insta::assert_snapshot!(stderr, @r###"
|
||||
Error: Failed to snapshot the working copy
|
||||
Caused by: New file $TEST_ENV/repo/large of size ~13.0B exceeds snapshot.max-new-file-size (10.0B)
|
||||
Hint: Increase the value of the `snapshot.max-new-file-size` config option if you
|
||||
want this file to be snapshotted. Otherwise add it to your `.gitignore` file.
|
||||
The file '$TEST_ENV/repo/large' is too large to be snapshotted: it is 3 bytes too large; the maximum size allowed is 10 bytes (10.0B).
|
||||
Hint: This is to prevent large files from being added on accident. You can fix this error by:
|
||||
- Adding the file to `.gitignore`
|
||||
- Run `jj config set --repo snapshot.max-new-file-size 13`
|
||||
This will increase the maximum file size allowed for new files, in this repository only.
|
||||
- Run `jj --config-toml 'snapshot.max-new-file-size=13' st`
|
||||
This will increase the maximum file size allowed for new files, for this command only.
|
||||
"###);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue