feat(changelog): 添加 --no-generate 标志以支持纯模板生成
- 新增 `--no-generate` 参数,强制使用模板生成而非 AI - 调整 `--yes` 参数仅跳过交互提示,不改变生成行为 - 统一使用工具函数替代 println 输出
This commit is contained in:
@@ -115,7 +115,8 @@ fn test_stage_all_removes_ignored_tracked_files() {
|
||||
write_file(repo_path, "__pycache__/foo.pyc", "modified bytecode");
|
||||
|
||||
let repo = GitRepo::open(repo_path).expect("Failed to open repo");
|
||||
let removed = repo.stage_all().expect("stage_all should succeed");
|
||||
let messages = quicommit::i18n::Messages::new(quicommit::config::Language::English);
|
||||
let removed = repo.stage_all(&messages).expect("stage_all should succeed");
|
||||
|
||||
assert!(
|
||||
removed.iter().any(|f| f == "__pycache__/foo.pyc"),
|
||||
@@ -142,7 +143,8 @@ fn test_stage_all_no_ignored_files_returns_empty() {
|
||||
write_file(repo_path, "src/main.rs", "fn main() {}");
|
||||
|
||||
let repo = GitRepo::open(repo_path).expect("Failed to open repo");
|
||||
let removed = repo.stage_all().expect("stage_all should succeed");
|
||||
let messages = quicommit::i18n::Messages::new(quicommit::config::Language::English);
|
||||
let removed = repo.stage_all(&messages).expect("stage_all should succeed");
|
||||
|
||||
assert!(
|
||||
removed.is_empty(),
|
||||
|
||||
@@ -258,6 +258,190 @@ mod config_command {
|
||||
.success()
|
||||
.stdout(predicate::str::contains("config.toml"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_no_color_disables_ansi() {
|
||||
let temp_dir = TempDir::new().unwrap();
|
||||
let config_path = temp_dir.path().join("config.toml");
|
||||
|
||||
let mut cmd = cargo_bin_cmd!("quicommit");
|
||||
cmd.args(&["init", "--yes", "--config", config_path.to_str().unwrap()]);
|
||||
cmd.assert().success();
|
||||
|
||||
let mut cmd = cargo_bin_cmd!("quicommit");
|
||||
cmd.args(&[
|
||||
"config",
|
||||
"show",
|
||||
"--no-color",
|
||||
"--config",
|
||||
config_path.to_str().unwrap(),
|
||||
]);
|
||||
|
||||
let output = cmd.output().unwrap();
|
||||
assert!(output.status.success());
|
||||
let stdout = String::from_utf8_lossy(&output.stdout);
|
||||
assert!(
|
||||
!stdout.contains("\x1b["),
|
||||
"ANSI color codes present despite --no-color"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_emoji_switch_precedence() {
|
||||
let temp_dir = TempDir::new().unwrap();
|
||||
let config_path = temp_dir.path().join("config.toml");
|
||||
|
||||
let mut cmd = cargo_bin_cmd!("quicommit");
|
||||
cmd.env_remove("NO_COLOR");
|
||||
cmd.args(&["init", "--yes", "--config", config_path.to_str().unwrap()]);
|
||||
cmd.assert().success();
|
||||
|
||||
let set_format = |extra: &[&str], cfg: &std::path::Path| {
|
||||
let mut c = cargo_bin_cmd!("quicommit");
|
||||
c.env_remove("NO_COLOR");
|
||||
c.args(&["config", "set", "commit.format", "conventional"])
|
||||
.args(extra)
|
||||
.args(&["--config", cfg.to_str().unwrap()]);
|
||||
c.output().unwrap()
|
||||
};
|
||||
|
||||
// Default (config true): decorations shown
|
||||
let out = set_format(&[], &config_path);
|
||||
assert!(out.status.success());
|
||||
assert!(String::from_utf8_lossy(&out.stdout).contains("✓"));
|
||||
|
||||
// Config output.emoji=false: no decorations
|
||||
let mut cmd = cargo_bin_cmd!("quicommit");
|
||||
cmd.env_remove("NO_COLOR");
|
||||
cmd.args(&[
|
||||
"config",
|
||||
"set",
|
||||
"output.emoji",
|
||||
"false",
|
||||
"--config",
|
||||
config_path.to_str().unwrap(),
|
||||
]);
|
||||
cmd.assert().success();
|
||||
|
||||
let out = set_format(&[], &config_path);
|
||||
assert!(out.status.success());
|
||||
assert!(!String::from_utf8_lossy(&out.stdout).contains("✓"));
|
||||
|
||||
// Explicit --emoji overrides config false
|
||||
let out = set_format(&["--emoji"], &config_path);
|
||||
assert!(out.status.success());
|
||||
assert!(String::from_utf8_lossy(&out.stdout).contains("✓"));
|
||||
|
||||
// Config back to true, then --no-emoji overrides
|
||||
let mut cmd = cargo_bin_cmd!("quicommit");
|
||||
cmd.env_remove("NO_COLOR");
|
||||
cmd.args(&[
|
||||
"config",
|
||||
"set",
|
||||
"output.emoji",
|
||||
"true",
|
||||
"--config",
|
||||
config_path.to_str().unwrap(),
|
||||
]);
|
||||
cmd.assert().success();
|
||||
|
||||
let out = set_format(&["--no-emoji"], &config_path);
|
||||
assert!(out.status.success());
|
||||
assert!(!String::from_utf8_lossy(&out.stdout).contains("✓"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_chinese_output_smoke() {
|
||||
let temp_dir = TempDir::new().unwrap();
|
||||
let repo_path = temp_dir.path().to_path_buf();
|
||||
setup_test_repo_with_file(&repo_path, "test.txt", "content");
|
||||
|
||||
let config_path = repo_path.join("config.toml");
|
||||
init_quicommit(&repo_path, &config_path);
|
||||
|
||||
let mut cmd = cargo_bin_cmd!("quicommit");
|
||||
cmd.env_remove("NO_COLOR");
|
||||
cmd.args(&[
|
||||
"config",
|
||||
"set",
|
||||
"language.output_language",
|
||||
"zh",
|
||||
"--config",
|
||||
config_path.to_str().unwrap(),
|
||||
]);
|
||||
cmd.assert().success();
|
||||
|
||||
let mut cmd = cargo_bin_cmd!("quicommit");
|
||||
cmd.env_remove("NO_COLOR");
|
||||
cmd.args(&[
|
||||
"commit",
|
||||
"--manual",
|
||||
"-m",
|
||||
"feat: 中文冒烟",
|
||||
"--dry-run",
|
||||
"--yes",
|
||||
"--config",
|
||||
config_path.to_str().unwrap(),
|
||||
])
|
||||
.current_dir(&repo_path);
|
||||
|
||||
cmd.assert()
|
||||
.success()
|
||||
.stdout(predicate::str::contains("试运行"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_rust_log_env() {
|
||||
let temp_dir = TempDir::new().unwrap();
|
||||
let config_path = temp_dir.path().join("config.toml");
|
||||
|
||||
let mut cmd = cargo_bin_cmd!("quicommit");
|
||||
cmd.env_remove("NO_COLOR");
|
||||
cmd.args(&["init", "--yes", "--config", config_path.to_str().unwrap()]);
|
||||
cmd.assert().success();
|
||||
|
||||
let mut cmd = cargo_bin_cmd!("quicommit");
|
||||
cmd.env_remove("NO_COLOR");
|
||||
cmd.env("RUST_LOG", "debug");
|
||||
cmd.args(&["config", "path", "--config", config_path.to_str().unwrap()]);
|
||||
|
||||
cmd.assert()
|
||||
.success()
|
||||
.stdout(predicate::str::contains("Starting quicommit"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_auto_generate_defaults_true() {
|
||||
// Documents the unified --yes semantics (issue 05): with default
|
||||
// config, --yes still AI-generates; deterministic output needs
|
||||
// --no-generate (changelog) or -m (tag).
|
||||
let temp_dir = TempDir::new().unwrap();
|
||||
let config_path = temp_dir.path().join("config.toml");
|
||||
|
||||
let mut cmd = cargo_bin_cmd!("quicommit");
|
||||
cmd.env_remove("NO_COLOR");
|
||||
cmd.args(&["init", "--yes", "--config", config_path.to_str().unwrap()]);
|
||||
cmd.assert().success();
|
||||
|
||||
for key in [
|
||||
"commit.auto_generate",
|
||||
"tag.auto_generate",
|
||||
"changelog.auto_generate",
|
||||
] {
|
||||
let mut cmd = cargo_bin_cmd!("quicommit");
|
||||
cmd.env_remove("NO_COLOR");
|
||||
cmd.args(&[
|
||||
"config",
|
||||
"get",
|
||||
key,
|
||||
"--config",
|
||||
config_path.to_str().unwrap(),
|
||||
]);
|
||||
cmd.assert()
|
||||
.success()
|
||||
.stdout(predicate::str::contains("true"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mod commit_command {
|
||||
@@ -438,6 +622,8 @@ mod tag_command {
|
||||
"tag",
|
||||
"--name",
|
||||
"v0.1.0",
|
||||
"-m",
|
||||
"Release v0.1.0",
|
||||
"--dry-run",
|
||||
"--yes",
|
||||
"--config",
|
||||
@@ -469,6 +655,8 @@ mod tag_command {
|
||||
"--think",
|
||||
"--name",
|
||||
"v0.2.0",
|
||||
"-m",
|
||||
"Release v0.2.0",
|
||||
"--dry-run",
|
||||
"--yes",
|
||||
"--config",
|
||||
@@ -528,6 +716,7 @@ mod changelog_command {
|
||||
"changelog",
|
||||
"--dry-run",
|
||||
"--yes",
|
||||
"--no-generate",
|
||||
"--config",
|
||||
config_path.to_str().unwrap(),
|
||||
])
|
||||
|
||||
Reference in New Issue
Block a user