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

cli: load [template-aliases] section and pass around aliases table

This commit is contained in:
Yuya Nishihara 2023-02-12 17:53:09 +09:00
parent 9d356b8094
commit d0715a0935
5 changed files with 74 additions and 4 deletions

View file

@ -59,7 +59,7 @@ use tracing_subscriber::prelude::*;
use crate::config::{AnnotatedValue, CommandNameAndArgs, LayeredConfigs};
use crate::formatter::{Formatter, PlainTextFormatter};
use crate::merge_tools::{ConflictResolveError, DiffEditError};
use crate::template_parser::{self, TemplateParseError};
use crate::template_parser::{self, TemplateAliasesMap, TemplateParseError};
use crate::templater::Template;
use crate::ui::{ColorChoice, Ui};
@ -464,6 +464,7 @@ pub struct WorkspaceCommandHelper {
workspace: Workspace,
repo: Arc<ReadonlyRepo>,
revset_aliases_map: RevsetAliasesMap,
template_aliases_map: TemplateAliasesMap,
may_update_working_copy: bool,
working_copy_shared_with_git: bool,
}
@ -479,6 +480,7 @@ impl WorkspaceCommandHelper {
repo: Arc<ReadonlyRepo>,
) -> Result<Self, CommandError> {
let revset_aliases_map = load_revset_aliases(ui, &settings)?;
let template_aliases_map = load_template_aliases(ui, &settings)?;
let loaded_at_head = &global_args.at_operation == "@";
let may_update_working_copy = loaded_at_head && !global_args.ignore_working_copy;
let mut working_copy_shared_with_git = false;
@ -498,6 +500,7 @@ impl WorkspaceCommandHelper {
workspace,
repo,
revset_aliases_map,
template_aliases_map,
may_update_working_copy,
working_copy_shared_with_git,
})
@ -804,6 +807,7 @@ impl WorkspaceCommandHelper {
self.repo.as_repo_ref(),
self.workspace_id(),
template_text,
&self.template_aliases_map,
)
}
@ -825,6 +829,7 @@ impl WorkspaceCommandHelper {
let template = parse_commit_summary_template(
self.repo.as_repo_ref(),
self.workspace_id(),
&self.template_aliases_map,
&self.settings,
);
template.format(commit, formatter)
@ -957,6 +962,7 @@ impl WorkspaceCommandHelper {
let summary_template = parse_commit_summary_template(
self.repo.as_repo_ref(),
&workspace_id,
&self.template_aliases_map,
&self.settings,
);
let stats = update_working_copy(
@ -1106,6 +1112,7 @@ impl WorkspaceCommandTransaction<'_> {
let template = parse_commit_summary_template(
self.tx.repo().as_repo_ref(),
self.helper.workspace_id(),
&self.helper.template_aliases_map,
&self.helper.settings,
);
template.format(commit, formatter)
@ -1520,9 +1527,29 @@ pub fn update_working_copy(
pub const DESCRIPTION_PLACEHOLDER_TEMPLATE: &str =
r#"label("description", "(no description set)")"#;
fn load_template_aliases(
ui: &mut Ui,
settings: &UserSettings,
) -> Result<TemplateAliasesMap, CommandError> {
const TABLE_KEY: &str = "template-aliases";
let mut aliases_map = TemplateAliasesMap::new();
let table = settings.config().get_table(TABLE_KEY)?;
for (decl, value) in table.into_iter().sorted_by(|a, b| a.0.cmp(&b.0)) {
let r = value
.into_string()
.map_err(|e| e.to_string())
.and_then(|v| aliases_map.insert(&decl, v).map_err(|e| e.to_string()));
if let Err(s) = r {
writeln!(ui.warning(), r#"Failed to load "{TABLE_KEY}.{decl}": {s}"#)?;
}
}
Ok(aliases_map)
}
fn parse_commit_summary_template<'a>(
repo: RepoRef<'a>,
workspace_id: &WorkspaceId,
aliases_map: &TemplateAliasesMap,
settings: &UserSettings,
) -> Box<dyn Template<Commit> + 'a> {
// TODO: Better to parse template early (at e.g. WorkspaceCommandHelper::new())
@ -1533,7 +1560,9 @@ fn parse_commit_summary_template<'a>(
.config()
.get_string("template.commit_summary")
.ok()
.and_then(|s| template_parser::parse_commit_template(repo, workspace_id, &s).ok())
.and_then(|s| {
template_parser::parse_commit_template(repo, workspace_id, &s, aliases_map).ok()
})
.unwrap_or_else(|| {
let s = format!(
r#"
@ -1541,7 +1570,7 @@ fn parse_commit_summary_template<'a>(
if(description, description.first_line(), {DESCRIPTION_PLACEHOLDER_TEMPLATE})
"#,
);
template_parser::parse_commit_template(repo, workspace_id, &s).unwrap()
template_parser::parse_commit_template(repo, workspace_id, &s, aliases_map).unwrap()
})
}

View file

@ -292,6 +292,13 @@
"type": "string"
}
},
"template-aliases": {
"type": "object",
"description": "Custom symbols/function aliases that can used in templates",
"additionalProperties": {
"type": "string"
}
},
"aliases": {
"type": "object",
"description": "Custom subcommand aliases to be supported by the jj command",

View file

@ -7,3 +7,6 @@ fetch = "origin"
[revset-aliases]
# Placeholder: added by user
[template-aliases]
# Placeholder: added by user

View file

@ -938,6 +938,7 @@ pub fn parse_commit_template<'a>(
repo: RepoRef<'a>,
workspace_id: &WorkspaceId,
template_text: &str,
_aliases_map: &TemplateAliasesMap,
) -> TemplateParseResult<Box<dyn Template<Commit> + 'a>> {
let node = parse_template(template_text)?;
let expression = build_expression(&node, &|name, span| {

View file

@ -14,7 +14,7 @@
use std::path::Path;
use crate::common::TestEnvironment;
use crate::common::{get_stderr_string, get_stdout_string, TestEnvironment};
pub mod common;
@ -388,6 +388,36 @@ fn test_templater_separate_function() {
render(r#"separate(author, "X", "Y", "Z")"#), @"X <>Y <>Z");
}
#[test]
fn test_templater_bad_alias_decl() {
let test_env = TestEnvironment::default();
test_env.jj_cmd_success(test_env.env_root(), &["init", "repo", "--git"]);
let repo_path = test_env.env_root().join("repo");
// TODO: test alias substitution of parsable one
test_env.add_config(
r###"
[template-aliases]
'badfn(a, a)' = 'a'
"###,
);
// Invalid declaration should be warned and ignored.
let assert = test_env
.jj_cmd(&repo_path, &["log", "--no-graph", "-r@-", "-Tcommit_id"])
.assert()
.success();
insta::assert_snapshot!(get_stdout_string(&assert), @"0000000000000000000000000000000000000000");
insta::assert_snapshot!(get_stderr_string(&assert), @r###"
Failed to load "template-aliases.badfn(a, a)": --> 1:7
|
1 | badfn(a, a)
| ^--^
|
= Redefinition of function parameter
"###);
}
fn get_template_output(
test_env: &TestEnvironment,
repo_path: &Path,