style: 格式化代码并优化导入顺序
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
use anyhow::{bail, Result};
|
||||
use anyhow::{Result, bail};
|
||||
use clap::Parser;
|
||||
use colored::Colorize;
|
||||
use dialoguer::{Confirm, Input, Select};
|
||||
@@ -6,11 +6,11 @@ use semver::Version;
|
||||
use std::path::PathBuf;
|
||||
|
||||
use crate::config::{Language, manager::ConfigManager};
|
||||
use crate::git::{find_repo, GitRepo};
|
||||
use crate::generator::ContentGenerator;
|
||||
use crate::git::tag::{
|
||||
bump_version, get_latest_version, suggest_version_bump, TagBuilder, VersionBump,
|
||||
TagBuilder, VersionBump, bump_version, get_latest_version, suggest_version_bump,
|
||||
};
|
||||
use crate::git::{GitRepo, find_repo};
|
||||
use crate::i18n::Messages;
|
||||
|
||||
/// Generate and create Git tags
|
||||
@@ -83,30 +83,37 @@ impl TagCommand {
|
||||
} else if let Some(bump_str) = &self.bump {
|
||||
// Calculate bumped version
|
||||
let prefix = &config.tag.version_prefix;
|
||||
let latest = get_latest_version(&repo, prefix)?
|
||||
.unwrap_or_else(|| Version::new(0, 0, 0));
|
||||
|
||||
let latest =
|
||||
get_latest_version(&repo, prefix)?.unwrap_or_else(|| Version::new(0, 0, 0));
|
||||
|
||||
let bump = VersionBump::from_str(bump_str)?;
|
||||
let new_version = bump_version(&latest, bump, None);
|
||||
|
||||
|
||||
format!("{}{}", prefix, new_version)
|
||||
} else {
|
||||
// Interactive mode
|
||||
self.select_version_interactive(&repo, &config.tag.version_prefix, &messages).await?
|
||||
self.select_version_interactive(&repo, &config.tag.version_prefix, &messages)
|
||||
.await?
|
||||
};
|
||||
|
||||
// Validate tag name (if it looks like a version)
|
||||
if tag_name.starts_with('v') || tag_name.chars().next().map(|c| c.is_ascii_digit()).unwrap_or(false) {
|
||||
if tag_name.starts_with('v')
|
||||
|| tag_name
|
||||
.chars()
|
||||
.next()
|
||||
.map(|c| c.is_ascii_digit())
|
||||
.unwrap_or(false)
|
||||
{
|
||||
let version_str = tag_name.trim_start_matches('v');
|
||||
if let Err(e) = crate::utils::validators::validate_semver(version_str) {
|
||||
println!("{}: {}", "Warning".yellow(), e);
|
||||
|
||||
|
||||
if !self.yes {
|
||||
let proceed = Confirm::new()
|
||||
.with_prompt("Proceed with this tag name anyway?")
|
||||
.default(true)
|
||||
.interact()?;
|
||||
|
||||
|
||||
if !proceed {
|
||||
bail!("{}", messages.tag_cancelled());
|
||||
}
|
||||
@@ -120,7 +127,10 @@ impl TagCommand {
|
||||
} else if let Some(msg) = &self.message {
|
||||
Some(msg.clone())
|
||||
} else if self.generate || (config.tag.auto_generate && !self.yes) {
|
||||
Some(self.generate_tag_message(&repo, &tag_name, &messages).await?)
|
||||
Some(
|
||||
self.generate_tag_message(&repo, &tag_name, &messages)
|
||||
.await?,
|
||||
)
|
||||
} else if !self.yes {
|
||||
Some(self.input_message_interactive(&tag_name, &messages)?)
|
||||
} else {
|
||||
@@ -188,12 +198,17 @@ impl TagCommand {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn select_version_interactive(&self, repo: &GitRepo, prefix: &str, messages: &Messages) -> Result<String> {
|
||||
async fn select_version_interactive(
|
||||
&self,
|
||||
repo: &GitRepo,
|
||||
prefix: &str,
|
||||
messages: &Messages,
|
||||
) -> Result<String> {
|
||||
loop {
|
||||
let latest = get_latest_version(repo, prefix)?;
|
||||
|
||||
|
||||
println!("\n{}", messages.version_selection().bold());
|
||||
|
||||
|
||||
if let Some(ref version) = latest {
|
||||
println!("{} {}{}", messages.latest_version(), prefix, version);
|
||||
} else {
|
||||
@@ -220,36 +235,46 @@ impl TagCommand {
|
||||
// Auto-detect
|
||||
let commits = repo.get_commits(50)?;
|
||||
let bump = suggest_version_bump(&commits);
|
||||
let version = latest.as_ref()
|
||||
let version = latest
|
||||
.as_ref()
|
||||
.map(|v| bump_version(v, bump, None))
|
||||
.unwrap_or_else(|| Version::new(0, 1, 0));
|
||||
|
||||
println!("{} {:?} → {}{}", messages.suggested_bump(), bump, prefix, version);
|
||||
|
||||
|
||||
println!(
|
||||
"{} {:?} → {}{}",
|
||||
messages.suggested_bump(),
|
||||
bump,
|
||||
prefix,
|
||||
version
|
||||
);
|
||||
|
||||
let confirm = Confirm::new()
|
||||
.with_prompt(messages.use_this_version())
|
||||
.default(true)
|
||||
.interact()?;
|
||||
|
||||
|
||||
if confirm {
|
||||
return Ok(format!("{}{}", prefix, version));
|
||||
}
|
||||
// User rejected, continue the loop
|
||||
}
|
||||
1 => {
|
||||
let version = latest.as_ref()
|
||||
let version = latest
|
||||
.as_ref()
|
||||
.map(|v| bump_version(v, VersionBump::Major, None))
|
||||
.unwrap_or_else(|| Version::new(1, 0, 0));
|
||||
return Ok(format!("{}{}", prefix, version));
|
||||
}
|
||||
2 => {
|
||||
let version = latest.as_ref()
|
||||
let version = latest
|
||||
.as_ref()
|
||||
.map(|v| bump_version(v, VersionBump::Minor, None))
|
||||
.unwrap_or_else(|| Version::new(0, 1, 0));
|
||||
return Ok(format!("{}{}", prefix, version));
|
||||
}
|
||||
3 => {
|
||||
let version = latest.as_ref()
|
||||
let version = latest
|
||||
.as_ref()
|
||||
.map(|v| bump_version(v, VersionBump::Patch, None))
|
||||
.unwrap_or_else(|| Version::new(0, 0, 1));
|
||||
return Ok(format!("{}{}", prefix, version));
|
||||
@@ -272,7 +297,12 @@ impl TagCommand {
|
||||
}
|
||||
}
|
||||
|
||||
async fn generate_tag_message(&self, repo: &GitRepo, version: &str, messages: &Messages) -> Result<String> {
|
||||
async fn generate_tag_message(
|
||||
&self,
|
||||
repo: &GitRepo,
|
||||
version: &str,
|
||||
messages: &Messages,
|
||||
) -> Result<String> {
|
||||
let manager = ConfigManager::new()?;
|
||||
let language = manager.get_language().unwrap_or(Language::English);
|
||||
|
||||
@@ -290,17 +320,19 @@ impl TagCommand {
|
||||
println!("{}", messages.ai_generating_tag(commits.len()));
|
||||
|
||||
let generator = ContentGenerator::new_with_think(&manager, self.think).await?;
|
||||
generator.generate_tag_message(version, &commits, language).await
|
||||
generator
|
||||
.generate_tag_message(version, &commits, language)
|
||||
.await
|
||||
}
|
||||
|
||||
fn input_message_interactive(&self, version: &str, messages: &Messages) -> Result<String> {
|
||||
let default_msg = format!("Release {}", version);
|
||||
|
||||
|
||||
let use_editor = Confirm::new()
|
||||
.with_prompt(messages.open_editor())
|
||||
.default(false)
|
||||
.interact()?;
|
||||
|
||||
|
||||
if use_editor {
|
||||
crate::utils::editor::edit_content(&default_msg)
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user