fix(fctool): 修复 git tools 中的类型不匹配问题
- blob.rs: 修复 resolve_oid 返回 commit OID 而非 blob OID 的问题 - tree.rs: 修复 git_tree_ls_exec 直接传递 commit OID 给 tree_list 的问题 - 所有修改使类型合约与 git domain API 匹配
This commit is contained in:
parent
d1ade2c3c3
commit
13523762aa
@ -16,8 +16,8 @@ async fn git_blob_info_exec(
|
|||||||
let oid = p.get("oid").and_then(|v| v.as_str()).ok_or("missing oid")?;
|
let oid = p.get("oid").and_then(|v| v.as_str()).ok_or("missing oid")?;
|
||||||
|
|
||||||
let domain = ctx.open_repo(project_name, repo_name).await?;
|
let domain = ctx.open_repo(project_name, repo_name).await?;
|
||||||
let commit_oid = resolve_oid(&domain, oid)?;
|
let blob_oid = git::commit::types::CommitOid::new(oid);
|
||||||
let info = domain.blob_get(&commit_oid).map_err(|e| e.to_string())?;
|
let info = domain.blob_get(&blob_oid).map_err(|e| e.to_string())?;
|
||||||
|
|
||||||
Ok(serde_json::json!({
|
Ok(serde_json::json!({
|
||||||
"oid": info.oid.to_string(),
|
"oid": info.oid.to_string(),
|
||||||
@ -37,10 +37,10 @@ async fn git_blob_exists_exec(
|
|||||||
let oid = p.get("oid").and_then(|v| v.as_str()).ok_or("missing oid")?;
|
let oid = p.get("oid").and_then(|v| v.as_str()).ok_or("missing oid")?;
|
||||||
|
|
||||||
let domain = ctx.open_repo(project_name, repo_name).await?;
|
let domain = ctx.open_repo(project_name, repo_name).await?;
|
||||||
let commit_oid = resolve_oid(&domain, oid)?;
|
let blob_oid = git::commit::types::CommitOid::new(oid);
|
||||||
let exists = domain.blob_exists(&commit_oid);
|
let exists = domain.blob_exists(&blob_oid);
|
||||||
|
|
||||||
Ok(serde_json::json!({ "oid": commit_oid.to_string(), "exists": exists }))
|
Ok(serde_json::json!({ "oid": blob_oid.to_string(), "exists": exists }))
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn git_blob_content_exec(
|
async fn git_blob_content_exec(
|
||||||
@ -55,8 +55,8 @@ async fn git_blob_content_exec(
|
|||||||
let max_size = p.get("max_size").and_then(|v| v.as_u64()).unwrap_or(1_048_576) as usize; // 1MB default
|
let max_size = p.get("max_size").and_then(|v| v.as_u64()).unwrap_or(1_048_576) as usize; // 1MB default
|
||||||
|
|
||||||
let domain = ctx.open_repo(project_name, repo_name).await?;
|
let domain = ctx.open_repo(project_name, repo_name).await?;
|
||||||
let commit_oid = resolve_oid(&domain, oid)?;
|
let blob_oid = git::commit::types::CommitOid::new(oid);
|
||||||
let blob = domain.blob_content(&commit_oid).map_err(|e| e.to_string())?;
|
let blob = domain.blob_content(&blob_oid).map_err(|e| e.to_string())?;
|
||||||
|
|
||||||
if blob.size > max_size {
|
if blob.size > max_size {
|
||||||
return Err(format!(
|
return Err(format!(
|
||||||
@ -109,18 +109,6 @@ async fn git_blob_create_exec(
|
|||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn resolve_oid(
|
|
||||||
domain: &git::GitDomain,
|
|
||||||
rev: &str,
|
|
||||||
) -> Result<git::commit::types::CommitOid, String> {
|
|
||||||
if rev.len() == 40 && rev.chars().all(|c| c.is_ascii_hexdigit()) {
|
|
||||||
Ok(git::commit::types::CommitOid::new(rev))
|
|
||||||
} else if let Ok(Some(oid)) = domain.ref_target(rev) {
|
|
||||||
Ok(oid)
|
|
||||||
} else {
|
|
||||||
domain.commit_get_prefix(rev).map_err(|e| e.to_string()).map(|m| m.oid)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn register_git_tools(registry: &mut ToolRegistry) {
|
pub fn register_git_tools(registry: &mut ToolRegistry) {
|
||||||
// git_blob_info
|
// git_blob_info
|
||||||
|
|||||||
@ -47,16 +47,11 @@ async fn git_log_exec(ctx: GitToolCtx, args: serde_json::Value) -> Result<serde_
|
|||||||
Ok(serde_json::to_value(result).map_err(|e| e.to_string())?)
|
Ok(serde_json::to_value(result).map_err(|e| e.to_string())?)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Resolve a rev string to commit metadata. Tries full OID first (exactly 40 hex chars),
|
/// Resolve a rev string to commit metadata using the full rev-parse machinery
|
||||||
/// then reference name resolution (branch, tag, HEAD), then hex prefix lookup.
|
/// (branch names, tags, HEAD, hex prefixes, etc.).
|
||||||
fn resolve_commit(domain: &git::GitDomain, rev: &str) -> Result<git::commit::types::CommitMeta, String> {
|
fn resolve_commit(domain: &git::GitDomain, rev: &str) -> Result<git::commit::types::CommitMeta, String> {
|
||||||
if rev.len() == 40 && rev.chars().all(|c| c.is_ascii_hexdigit()) {
|
let oid = domain.resolve_rev(rev).map_err(|e| e.to_string())?;
|
||||||
domain.commit_get(&git::commit::types::CommitOid::new(rev)).map_err(|e| e.to_string())
|
domain.commit_get(&oid).map_err(|e| e.to_string())
|
||||||
} else if let Ok(Some(oid)) = domain.ref_target(rev) {
|
|
||||||
domain.commit_get(&oid).map_err(|e| e.to_string())
|
|
||||||
} else {
|
|
||||||
domain.commit_get_prefix(rev).map_err(|e| e.to_string())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn git_show_exec(ctx: GitToolCtx, args: serde_json::Value) -> Result<serde_json::Value, String> {
|
async fn git_show_exec(ctx: GitToolCtx, args: serde_json::Value) -> Result<serde_json::Value, String> {
|
||||||
|
|||||||
@ -5,16 +5,10 @@ use agent::{ToolDefinition, ToolHandler, ToolParam, ToolRegistry, ToolSchema};
|
|||||||
use base64::Engine;
|
use base64::Engine;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
/// Resolve a rev string to a commit OID. Tries full OID first (exactly 40 hex chars),
|
/// Resolve a rev string to a commit OID using the full rev-parse machinery
|
||||||
/// then reference name resolution (branch, tag, HEAD), then hex prefix lookup.
|
/// (branch names, tags, HEAD, hex prefixes, etc.).
|
||||||
fn resolve_commit_oid(domain: &git::GitDomain, rev: &str) -> Result<git::commit::types::CommitOid, String> {
|
fn resolve_commit_oid(domain: &git::GitDomain, rev: &str) -> Result<git::commit::types::CommitOid, String> {
|
||||||
if rev.len() == 40 && rev.chars().all(|c| c.is_ascii_hexdigit()) {
|
domain.resolve_rev(rev).map_err(|e| e.to_string())
|
||||||
Ok(git::commit::types::CommitOid::new(rev))
|
|
||||||
} else if let Ok(Some(oid)) = domain.ref_target(rev) {
|
|
||||||
Ok(oid)
|
|
||||||
} else {
|
|
||||||
domain.commit_get_prefix(rev).map_err(|e| e.to_string()).map(|m| m.oid)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn git_file_content_exec(ctx: GitToolCtx, args: serde_json::Value) -> Result<serde_json::Value, String> {
|
async fn git_file_content_exec(ctx: GitToolCtx, args: serde_json::Value) -> Result<serde_json::Value, String> {
|
||||||
@ -54,14 +48,18 @@ async fn git_tree_ls_exec(ctx: GitToolCtx, args: serde_json::Value) -> Result<se
|
|||||||
let rev = p.get("rev").and_then(|v| v.as_str()).map(|s| s.to_string()).unwrap_or_else(|| "HEAD".to_string());
|
let rev = p.get("rev").and_then(|v| v.as_str()).map(|s| s.to_string()).unwrap_or_else(|| "HEAD".to_string());
|
||||||
|
|
||||||
let domain = ctx.open_repo(project_name, repo_name).await?;
|
let domain = ctx.open_repo(project_name, repo_name).await?;
|
||||||
let commit_oid = resolve_commit_oid(&domain, &rev).map_err(|e| e.to_string())?;
|
let commit_oid = resolve_commit_oid(&domain, &rev)?;
|
||||||
|
|
||||||
|
// Get tree OID from commit
|
||||||
|
let commit_meta = domain.commit_get(&commit_oid).map_err(|e| e.to_string())?;
|
||||||
|
let tree_oid = &commit_meta.tree_id;
|
||||||
|
|
||||||
let entries = match dir_path {
|
let entries = match dir_path {
|
||||||
Some(ref dp) => {
|
Some(ref dp) => {
|
||||||
let entry = domain.tree_entry_by_path(&commit_oid, dp).map_err(|e| e.to_string())?;
|
let entry = domain.tree_entry_by_path(tree_oid, dp).map_err(|e| e.to_string())?;
|
||||||
domain.tree_list(&entry.oid).map_err(|e| e.to_string())?
|
domain.tree_list(&entry.oid).map_err(|e| e.to_string())?
|
||||||
}
|
}
|
||||||
None => domain.tree_list(&commit_oid).map_err(|e| e.to_string())?,
|
None => domain.tree_list(tree_oid).map_err(|e| e.to_string())?,
|
||||||
};
|
};
|
||||||
|
|
||||||
let result: Vec<_> = entries.iter().map(|e| {
|
let result: Vec<_> = entries.iter().map(|e| {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user