ok/jj
1
0
Fork 0
forked from mirrors/jj

feature: add verbose flag and tracing library

This commit is contained in:
Ruben Slabbert 2022-11-20 13:38:25 +10:00
parent 3e0f6ef2b9
commit f0e4615e61
7 changed files with 172 additions and 2 deletions

View file

@ -67,6 +67,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
* `jj log` will warn if it appears that the provided path was meant to be a * `jj log` will warn if it appears that the provided path was meant to be a
revset. revset.
* The new global flag `-v/--verbose` will turn on debug logging to give
some additional insight into what is happening behind the scenes.
Note: This is not comprehensively supported by all operations yet.
### Fixed bugs ### Fixed bugs
* (#463) A bug in the export of branches to Git caused spurious conflicted * (#463) A bug in the export of branches to Git caused spurious conflicted

103
Cargo.lock generated
View file

@ -746,6 +746,8 @@ dependencies = [
"testutils", "testutils",
"textwrap 0.16.0", "textwrap 0.16.0",
"thiserror", "thiserror",
"tracing",
"tracing-subscriber",
] ]
[[package]] [[package]]
@ -779,6 +781,7 @@ dependencies = [
"testutils", "testutils",
"thiserror", "thiserror",
"thrift", "thrift",
"tracing",
"uuid", "uuid",
"version_check", "version_check",
"whoami", "whoami",
@ -868,6 +871,15 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
[[package]]
name = "matchers"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
dependencies = [
"regex-automata",
]
[[package]] [[package]]
name = "matches" name = "matches"
version = "0.1.9" version = "0.1.9"
@ -923,6 +935,16 @@ version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be"
[[package]]
name = "nu-ansi-term"
version = "0.46.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
dependencies = [
"overload",
"winapi",
]
[[package]] [[package]]
name = "num-integer" name = "num-integer"
version = "0.1.45" version = "0.1.45"
@ -1008,6 +1030,12 @@ version = "6.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff" checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff"
[[package]]
name = "overload"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
[[package]] [[package]]
name = "parking_lot" name = "parking_lot"
version = "0.12.1" version = "0.12.1"
@ -1087,6 +1115,12 @@ dependencies = [
"sha1", "sha1",
] ]
[[package]]
name = "pin-project-lite"
version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
[[package]] [[package]]
name = "pkg-config" name = "pkg-config"
version = "0.3.25" version = "0.3.25"
@ -1341,6 +1375,9 @@ name = "regex-automata"
version = "0.1.10" version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
dependencies = [
"regex-syntax",
]
[[package]] [[package]]
name = "regex-syntax" name = "regex-syntax"
@ -1436,6 +1473,15 @@ dependencies = [
"digest", "digest",
] ]
[[package]]
name = "sharded-slab"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31"
dependencies = [
"lazy_static",
]
[[package]] [[package]]
name = "signal-hook" name = "signal-hook"
version = "0.3.14" version = "0.3.14"
@ -1626,6 +1672,15 @@ dependencies = [
"syn", "syn",
] ]
[[package]]
name = "thread_local"
version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180"
dependencies = [
"once_cell",
]
[[package]] [[package]]
name = "thrift" name = "thrift"
version = "0.17.0" version = "0.17.0"
@ -1670,6 +1725,54 @@ dependencies = [
"serde", "serde",
] ]
[[package]]
name = "tracing"
version = "0.1.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
dependencies = [
"cfg-if",
"pin-project-lite",
"tracing-attributes",
"tracing-core",
]
[[package]]
name = "tracing-attributes"
version = "0.1.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "tracing-core"
version = "0.1.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a"
dependencies = [
"once_cell",
]
[[package]]
name = "tracing-subscriber"
version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70"
dependencies = [
"matchers",
"nu-ansi-term",
"once_cell",
"regex",
"sharded-slab",
"thread_local",
"tracing",
"tracing-core",
]
[[package]] [[package]]
name = "typenum" name = "typenum"
version = "1.15.0" version = "1.15.0"

View file

@ -57,6 +57,8 @@ slab = "0.4.7"
tempfile = "3.3.0" tempfile = "3.3.0"
textwrap = "0.16.0" textwrap = "0.16.0"
thiserror = "1.0.37" thiserror = "1.0.37"
tracing = "0.1.37"
tracing-subscriber = { version = "0.3.16", default-features = false, features = ["std", "ansi", "env-filter", "fmt"] }
[target.'cfg(unix)'.dependencies] [target.'cfg(unix)'.dependencies]
libc = { version = "0.2.137" } libc = { version = "0.2.137" }

View file

@ -43,6 +43,7 @@ thrift = { git = "https://github.com/apache/thrift", rev = "4d493e867b349f347520
uuid = { version = "1.2.2", features = ["v4"] } uuid = { version = "1.2.2", features = ["v4"] }
whoami = "1.2.3" whoami = "1.2.3"
zstd = "0.11.2" zstd = "0.11.2"
tracing = "0.1.37"
[dev-dependencies] [dev-dependencies]
assert_matches = "1.5.0" assert_matches = "1.5.0"

View file

@ -1202,6 +1202,9 @@ pub struct GlobalArgs {
help_heading = "Global Options" help_heading = "Global Options"
)] )]
pub config_toml: Vec<String>, pub config_toml: Vec<String>,
/// Enable verbose logging
#[arg(long, short = 'v', global = true, help_heading = "Global Options")]
pub verbose: bool,
} }
pub fn create_ui() -> (Ui, Result<(), CommandError>) { pub fn create_ui() -> (Ui, Result<(), CommandError>) {

View file

@ -15,17 +15,49 @@
use jujutsu::cli_util::{create_ui, handle_command_result, parse_args, CommandError}; use jujutsu::cli_util::{create_ui, handle_command_result, parse_args, CommandError};
use jujutsu::commands::{default_app, run_command}; use jujutsu::commands::{default_app, run_command};
use jujutsu::ui::Ui; use jujutsu::ui::Ui;
use tracing::metadata::LevelFilter;
use tracing_subscriber::prelude::*;
use tracing_subscriber::reload::Handle;
use tracing_subscriber::EnvFilter;
fn run(ui: &mut Ui) -> Result<(), CommandError> { fn run(
ui: &mut Ui,
reload_log_filter: Handle<EnvFilter, impl tracing::Subscriber>,
) -> Result<(), CommandError> {
let app = default_app(); let app = default_app();
let (command_helper, matches) = parse_args(ui, app, std::env::args_os())?; let (command_helper, matches) = parse_args(ui, app, std::env::args_os())?;
if command_helper.global_args().verbose {
reload_log_filter
.modify(|filter| {
*filter = EnvFilter::builder()
.with_default_directive(LevelFilter::DEBUG.into())
.from_env_lossy()
})
.map_err(|err| {
CommandError::InternalError(format!("failed to enable verbose logging: {:?}", err))
})?;
tracing::debug!("verbose logging enabled");
}
run_command(ui, &command_helper, &matches) run_command(ui, &command_helper, &matches)
} }
fn main() { fn main() {
// TODO(@rslabbert): restructure logging filter setup to better handle
// having verbose logging set up as early as possible, and to support
// custom commands. See discussion on:
// https://github.com/martinvonz/jj/pull/771
let filter = EnvFilter::builder()
.with_default_directive(LevelFilter::INFO.into())
.from_env_lossy();
let (filter, reload_log_filter) = tracing_subscriber::reload::Layer::new(filter);
tracing_subscriber::registry()
.with(filter)
.with(tracing_subscriber::fmt::Layer::default().with_writer(std::io::stderr))
.init();
jujutsu::cleanup_guard::init(); jujutsu::cleanup_guard::init();
let (mut ui, result) = create_ui(); let (mut ui, result) = create_ui();
let result = result.and_then(|()| run(&mut ui)); let result = result.and_then(|()| run(&mut ui, reload_log_filter));
let exit_code = handle_command_result(&mut ui, result); let exit_code = handle_command_result(&mut ui, result);
std::process::exit(exit_code); std::process::exit(exit_code);
} }

View file

@ -254,5 +254,30 @@ fn test_help() {
--at-operation <AT_OPERATION> Operation to load the repo at [default: @] [aliases: at-op] --at-operation <AT_OPERATION> Operation to load the repo at [default: @] [aliases: at-op]
--color <WHEN> When to colorize output (always, never, auto) --color <WHEN> When to colorize output (always, never, auto)
--config-toml <TOML> Additional configuration options --config-toml <TOML> Additional configuration options
-v, --verbose Enable verbose logging
"###); "###);
} }
#[test]
fn test_verbose_logging_enabled() {
// Test that the verbose flag enabled verbose logging
let test_env = TestEnvironment::default();
let assert = test_env
.jj_cmd(test_env.env_root(), &["version", "-v"])
.assert()
.success();
let stderr = get_stderr_string(&assert);
// Split the first log line into a timestamp and the rest.
// The timestamp is constant sized so this is a robust operation.
// Example timestamp: 2022-11-20T06:24:05.477703Z
let (_timestamp, log_line) = stderr
.lines()
.next()
.expect("verbose logging on first line")
.split_at(36);
// The log format is currently Pretty so we include the terminal markup.
// Luckily, insta will print this in colour when reviewing.
insta::assert_snapshot!(log_line, @"\u{1b}[34mDEBUG\u{1b}[0m \u{1b}[2mjj\u{1b}[0m\u{1b}[2m:\u{1b}[0m verbose logging enabled");
}