Skip to content

Commit

Permalink
Add "jj debug config-schema" command to output JSON schema
Browse files Browse the repository at this point in the history
Extends TOML/JSON schema changes from #966 to allow jj to output the
schema directly. Context in #879.
  • Loading branch information
dbarnett committed Jan 3, 2023
1 parent 01e656e commit 39a4362
Show file tree
Hide file tree
Showing 5 changed files with 71 additions and 1 deletion.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
* `jj config list` command prints values from config (with other subcommands
coming soon).

* `jj debug config-schema` command prints out JSON (and TOML) schema
for jj config files.

### Fixed bugs

* When sharing the working copy with a Git repo, we used to forget to export
Expand Down
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ libc = { version = "0.2.139" }
assert_cmd = "2.0.7"
criterion = "0.4.0"
criterion_bencher_compat = "0.4.0"
insta = "1.23.0"
insta = { version = "1.23.0", features = ["filters"] }
predicates = "2.1.5"
regex = "1.7.0"
test-case = "2.2.2"
Expand Down
10 changes: 10 additions & 0 deletions src/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -999,6 +999,7 @@ struct GitExportArgs {}
enum DebugCommands {
Completion(DebugCompletionArgs),
Mangen(DebugMangenArgs),
ConfigSchema(DebugConfigSchemaArgs),
#[command(name = "resolverev")]
ResolveRev(DebugResolveRevArgs),
#[command(name = "workingcopy")]
Expand Down Expand Up @@ -1043,6 +1044,10 @@ struct DebugCompletionArgs {
#[derive(clap::Args, Clone, Debug)]
struct DebugMangenArgs {}

/// Print the JSON schema for jj's TOML config format.
#[derive(clap::Args, Clone, Debug)]
struct DebugConfigSchemaArgs {}

/// Resolve a revision identifier to its full ID
#[derive(clap::Args, Clone, Debug)]
struct DebugResolveRevArgs {
Expand Down Expand Up @@ -3174,6 +3179,11 @@ fn cmd_debug(
man.render(&mut buf)?;
ui.stdout_formatter().write_all(&buf)?;
}
DebugCommands::ConfigSchema(_config_schema_matches) => {
// TODO(#879): Consider generating entire schema dynamically vs. using static file.
let buf = include_bytes!("config-schema.json");
ui.stdout_formatter().write_all(buf)?;
}
DebugCommands::ResolveRev(resolve_matches) => {
let workspace_command = command.workspace_helper(ui)?;
let commit = workspace_command.resolve_single_rev(&resolve_matches.revision)?;
Expand Down
56 changes: 56 additions & 0 deletions tests/test_debug_command.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
// Copyright 2022 The Jujutsu Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

use insta::assert_snapshot;
use regex::Regex;

use crate::common::TestEnvironment;

pub mod common;

#[test]
fn test_debug_config_schema() {
let test_env = TestEnvironment::default();
let stdout = test_env.jj_cmd_success(test_env.env_root(), &["debug", "config-schema"]);
let expected_schema_re = Regex::new(r"(?s)^\{\n.*\n\}\n").unwrap();
assert!(
expected_schema_re.is_match(&stdout),
"output didn't match format {expected_schema_re:?}:\n{stdout}"
);
}

#[test]
fn test_debug_index() {
let test_env = TestEnvironment::default();
test_env.jj_cmd_success(test_env.env_root(), &["init", "repo", "--git"]);
let workspace_path = test_env.env_root().join("repo");
let stdout = test_env.jj_cmd_success(&workspace_path, &["debug", "index"]);
insta::with_settings!(
{filters => vec![
(r" Name: [0-9a-z]+", " Name: [hash]"),
]},
{
assert_snapshot!(stdout, @r###"
Number of commits: 2
Number of merges: 0
Max generation number: 1
Number of heads: 1
Number of changes: 2
Stats per level:
Level 0:
Number of commits: 2
Name: [hash]
"###)
});
}

0 comments on commit 39a4362

Please sign in to comment.