In Git2 error fixing, opening the repo is still currently unavailable.

This commit is contained in:
2026-01-30 18:29:11 +08:00
parent 2a57946421
commit 1cbb01ccc4
10 changed files with 42 additions and 19 deletions

View File

@@ -64,7 +64,7 @@ pub struct ChangelogCommand {
impl ChangelogCommand {
pub async fn execute(&self) -> Result<()> {
let repo = find_repo(".")?;
let repo = find_repo(std::env::current_dir()?.as_path())?;
let manager = ConfigManager::new()?;
let config = manager.config();

View File

@@ -77,7 +77,7 @@ pub struct CommitCommand {
impl CommitCommand {
pub async fn execute(&self) -> Result<()> {
// Find git repository
let repo = find_repo(".")?;
let repo = find_repo(std::env::current_dir()?.as_path())?;
// Check for changes
let status = repo.status_summary()?;

View File

@@ -1,10 +1,10 @@
use anyhow::{bail, Context, Result};
use anyhow::{bail, Result};
use clap::{Parser, Subcommand};
use colored::Colorize;
use dialoguer::{Confirm, Input, Select};
use crate::config::manager::ConfigManager;
use crate::config::{CommitFormat, LlmConfig};
use crate::config::CommitFormat;
/// Mask API key with asterisks for security
fn mask_api_key(key: Option<&str>) -> String {
@@ -821,9 +821,16 @@ impl ConfigCommand {
if client.is_available().await {
println!("{} LLM connection successful!", "".green());
// Test generation
// Test generation with a sample diff
println!("Testing generation...");
match client.generate_commit_message("test", crate::config::CommitFormat::Conventional).await {
let sample_diff = r#"diff --git a/src/main.rs b/src/main.rs
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,3 +1,4 @@
fn main() {
+ println!("Hello, World!");
}"#;
match client.generate_commit_message(sample_diff, crate::config::CommitFormat::Conventional).await {
Ok(response) => {
println!("{} Generation test passed", "".green());
println!("Response: {}", response.description.dimmed());

View File

@@ -352,7 +352,7 @@ impl ProfileCommand {
async fn set_repo(&self, name: &str) -> Result<()> {
let mut manager = ConfigManager::new()?;
let repo = find_repo(".")?;
let repo = find_repo(std::env::current_dir()?.as_path())?;
let repo_path = repo.path().to_string_lossy().to_string();
@@ -381,7 +381,7 @@ impl ProfileCommand {
profile.apply_global()?;
println!("{} Applied profile '{}' globally", "".green(), profile.name.cyan());
} else {
let repo = find_repo(".")?;
let repo = find_repo(std::env::current_dir()?.as_path())?;
profile.apply_to_repo(repo.inner())?;
println!("{} Applied profile '{}' to current repository", "".green(), profile.name.cyan());
}

View File

@@ -61,7 +61,7 @@ pub struct TagCommand {
impl TagCommand {
pub async fn execute(&self) -> Result<()> {
let repo = find_repo(".")?;
let repo = find_repo(std::env::current_dir()?.as_path())?;
let manager = ConfigManager::new()?;
let config = manager.config();

View File

@@ -1,6 +1,6 @@
use anyhow::{bail, Context, Result};
use git2::{Repository, Signature, StatusOptions, DiffOptions};
use std::path::Path;
use std::path::{Path, PathBuf};
pub mod changelog;
pub mod commit;
@@ -19,13 +19,27 @@ pub struct GitRepo {
impl GitRepo {
/// Open a git repository
pub fn open<P: AsRef<Path>>(path: P) -> Result<Self> {
let path = path.as_ref().canonicalize()
.unwrap_or_else(|_| path.as_ref().to_path_buf());
let path = path.as_ref();
if let Ok(repo) = Repository::discover(&path) {
return Ok(Self {
repo,
path: path.to_path_buf()
});
}
if let Ok(repo) = Repository::open(path) {
return Ok(Self { repo, path: path.to_path_buf() });
}
let repo = Repository::open(&path)
.with_context(|| format!("Failed to open git repository: {:?}", path))?;
Ok(Self { repo, path })
// 如果依然失败,给出明确的错误提示
bail!(
"Failed to open git repository at '{:?}'. Please ensure:\n\
1. The directory is set as safe (run: git config --global --add safe.directory \"{}\")\n\
2. The path is correct and contains a valid '.git' folder.",
path,
path.display()
)
}
/// Get repository path