Compare commits
2 Commits
06889ec85a
...
5c44ee91fb
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5c44ee91fb | ||
|
|
6aff96d32f |
@@ -1328,7 +1328,7 @@ fn handle_file_history(
|
|||||||
|
|
||||||
if robot_mode {
|
if robot_mode {
|
||||||
let elapsed_ms = start.elapsed().as_millis() as u64;
|
let elapsed_ms = start.elapsed().as_millis() as u64;
|
||||||
print_file_history_json(&result, elapsed_ms);
|
print_file_history_json(&result, elapsed_ms)?;
|
||||||
} else {
|
} else {
|
||||||
print_file_history(&result);
|
print_file_history(&result);
|
||||||
}
|
}
|
||||||
@@ -1384,7 +1384,7 @@ fn handle_trace(
|
|||||||
|
|
||||||
if robot_mode {
|
if robot_mode {
|
||||||
let elapsed_ms = start.elapsed().as_millis() as u64;
|
let elapsed_ms = start.elapsed().as_millis() as u64;
|
||||||
print_trace_json(&result, elapsed_ms, line_requested);
|
print_trace_json(&result, elapsed_ms, line_requested)?;
|
||||||
} else {
|
} else {
|
||||||
print_trace(&result);
|
print_trace(&result);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -821,7 +821,8 @@ fn fetch_related_entities(
|
|||||||
LEFT JOIN merge_requests mr ON er.target_entity_type = 'merge_request' AND mr.id = er.target_entity_id \
|
LEFT JOIN merge_requests mr ON er.target_entity_type = 'merge_request' AND mr.id = er.target_entity_id \
|
||||||
WHERE er.source_entity_type = ?1 AND er.source_entity_id = ?2 \
|
WHERE er.source_entity_type = ?1 AND er.source_entity_id = ?2 \
|
||||||
AND er.reference_type != 'closes' \
|
AND er.reference_type != 'closes' \
|
||||||
AND er.target_entity_iid IS NOT NULL",
|
AND er.target_entity_iid IS NOT NULL \
|
||||||
|
ORDER BY er.target_entity_type, er.target_entity_iid",
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let outgoing: Vec<RelatedEntityInfo> = out_stmt
|
let outgoing: Vec<RelatedEntityInfo> = out_stmt
|
||||||
@@ -845,7 +846,8 @@ fn fetch_related_entities(
|
|||||||
LEFT JOIN merge_requests mr ON er.source_entity_type = 'merge_request' AND mr.id = er.source_entity_id \
|
LEFT JOIN merge_requests mr ON er.source_entity_type = 'merge_request' AND mr.id = er.source_entity_id \
|
||||||
WHERE er.target_entity_type = ?1 AND er.target_entity_id = ?2 \
|
WHERE er.target_entity_type = ?1 AND er.target_entity_id = ?2 \
|
||||||
AND er.reference_type != 'closes' \
|
AND er.reference_type != 'closes' \
|
||||||
AND COALESCE(i.iid, mr.iid) IS NOT NULL",
|
AND COALESCE(i.iid, mr.iid) IS NOT NULL \
|
||||||
|
ORDER BY er.source_entity_type, COALESCE(i.iid, mr.iid)",
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let incoming: Vec<RelatedEntityInfo> = in_stmt
|
let incoming: Vec<RelatedEntityInfo> = in_stmt
|
||||||
@@ -1020,7 +1022,7 @@ pub fn handle_explain(
|
|||||||
let elapsed_ms = start.elapsed().as_millis() as u64;
|
let elapsed_ms = start.elapsed().as_millis() as u64;
|
||||||
|
|
||||||
if robot_mode {
|
if robot_mode {
|
||||||
print_explain_json(&result, elapsed_ms);
|
print_explain_json(&result, elapsed_ms)?;
|
||||||
} else {
|
} else {
|
||||||
print_explain(&result);
|
print_explain(&result);
|
||||||
}
|
}
|
||||||
@@ -1032,13 +1034,18 @@ pub fn handle_explain(
|
|||||||
// Output rendering (Task 5 fills these in fully)
|
// Output rendering (Task 5 fills these in fully)
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
pub fn print_explain_json(result: &ExplainResult, elapsed_ms: u64) {
|
pub fn print_explain_json(result: &ExplainResult, elapsed_ms: u64) -> Result<()> {
|
||||||
let response = serde_json::json!({
|
let response = serde_json::json!({
|
||||||
"ok": true,
|
"ok": true,
|
||||||
"data": result,
|
"data": result,
|
||||||
"meta": { "elapsed_ms": elapsed_ms }
|
"meta": { "elapsed_ms": elapsed_ms }
|
||||||
});
|
});
|
||||||
println!("{}", serde_json::to_string(&response).unwrap_or_default());
|
println!(
|
||||||
|
"{}",
|
||||||
|
serde_json::to_string(&response)
|
||||||
|
.map_err(|e| LoreError::Other(format!("JSON serialization failed: {e}")))?
|
||||||
|
);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn print_explain(result: &ExplainResult) {
|
pub fn print_explain(result: &ExplainResult) {
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ use tracing::info;
|
|||||||
use crate::Config;
|
use crate::Config;
|
||||||
use crate::cli::render::{self, Icons, Theme};
|
use crate::cli::render::{self, Icons, Theme};
|
||||||
use crate::core::db::create_connection;
|
use crate::core::db::create_connection;
|
||||||
use crate::core::error::Result;
|
use crate::core::error::{LoreError, Result};
|
||||||
use crate::core::file_history::resolve_rename_chain;
|
use crate::core::file_history::resolve_rename_chain;
|
||||||
use crate::core::paths::get_db_path;
|
use crate::core::paths::get_db_path;
|
||||||
use crate::core::project::resolve_project;
|
use crate::core::project::resolve_project;
|
||||||
@@ -391,7 +391,7 @@ pub fn print_file_history(result: &FileHistoryResult) {
|
|||||||
|
|
||||||
// ── Robot (JSON) output ─────────────────────────────────────────────────────
|
// ── Robot (JSON) output ─────────────────────────────────────────────────────
|
||||||
|
|
||||||
pub fn print_file_history_json(result: &FileHistoryResult, elapsed_ms: u64) {
|
pub fn print_file_history_json(result: &FileHistoryResult, elapsed_ms: u64) -> Result<()> {
|
||||||
let output = serde_json::json!({
|
let output = serde_json::json!({
|
||||||
"ok": true,
|
"ok": true,
|
||||||
"data": {
|
"data": {
|
||||||
@@ -409,5 +409,10 @@ pub fn print_file_history_json(result: &FileHistoryResult, elapsed_ms: u64) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
println!("{}", serde_json::to_string(&output).unwrap_or_default());
|
println!(
|
||||||
|
"{}",
|
||||||
|
serde_json::to_string(&output)
|
||||||
|
.map_err(|e| LoreError::Other(format!("JSON serialization failed: {e}")))?
|
||||||
|
);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
use crate::cli::render::{Icons, Theme};
|
use crate::cli::render::{Icons, Theme};
|
||||||
|
use crate::core::error::{LoreError, Result};
|
||||||
use crate::core::trace::{TraceChain, TraceResult};
|
use crate::core::trace::{TraceChain, TraceResult};
|
||||||
|
|
||||||
/// Parse a path with optional `:line` suffix.
|
/// Parse a path with optional `:line` suffix.
|
||||||
@@ -152,7 +153,11 @@ fn truncate_body(body: &str, max: usize) -> String {
|
|||||||
format!("{}...", &body[..boundary])
|
format!("{}...", &body[..boundary])
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn print_trace_json(result: &TraceResult, elapsed_ms: u64, line_requested: Option<u32>) {
|
pub fn print_trace_json(
|
||||||
|
result: &TraceResult,
|
||||||
|
elapsed_ms: u64,
|
||||||
|
line_requested: Option<u32>,
|
||||||
|
) -> Result<()> {
|
||||||
// Truncate discussion bodies for token efficiency in robot mode
|
// Truncate discussion bodies for token efficiency in robot mode
|
||||||
let chains: Vec<serde_json::Value> = result
|
let chains: Vec<serde_json::Value> = result
|
||||||
.trace_chains
|
.trace_chains
|
||||||
@@ -205,7 +210,12 @@ pub fn print_trace_json(result: &TraceResult, elapsed_ms: u64, line_requested: O
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
println!("{}", serde_json::to_string(&output).unwrap_or_default());
|
println!(
|
||||||
|
"{}",
|
||||||
|
serde_json::to_string(&output)
|
||||||
|
.map_err(|e| LoreError::Other(format!("JSON serialization failed: {e}")))?
|
||||||
|
);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|||||||
@@ -40,7 +40,11 @@ fn setup() -> Connection {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn get_discussion_id(conn: &Connection) -> i64 {
|
fn get_discussion_id(conn: &Connection) -> i64 {
|
||||||
conn.query_row("SELECT id FROM discussions LIMIT 1", [], |row| row.get(0))
|
conn.query_row(
|
||||||
|
"SELECT id FROM discussions ORDER BY id LIMIT 1",
|
||||||
|
[],
|
||||||
|
|row| row.get(0),
|
||||||
|
)
|
||||||
.unwrap()
|
.unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -786,7 +786,11 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn get_mr_discussion_id(conn: &Connection) -> i64 {
|
fn get_mr_discussion_id(conn: &Connection) -> i64 {
|
||||||
conn.query_row("SELECT id FROM discussions LIMIT 1", [], |row| row.get(0))
|
conn.query_row(
|
||||||
|
"SELECT id FROM discussions ORDER BY id LIMIT 1",
|
||||||
|
[],
|
||||||
|
|row| row.get(0),
|
||||||
|
)
|
||||||
.unwrap()
|
.unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -242,14 +242,16 @@ mod tests {
|
|||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let project_id: i64 = conn
|
let project_id: i64 = conn
|
||||||
.query_row("SELECT id FROM projects LIMIT 1", [], |row| row.get(0))
|
.query_row("SELECT id FROM projects ORDER BY id LIMIT 1", [], |row| {
|
||||||
|
row.get(0)
|
||||||
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
enqueue_job(&conn, project_id, "issue", 42, 100, "resource_events", None).unwrap();
|
enqueue_job(&conn, project_id, "issue", 42, 100, "resource_events", None).unwrap();
|
||||||
|
|
||||||
let job_id: i64 = conn
|
let job_id: i64 = conn
|
||||||
.query_row(
|
.query_row(
|
||||||
"SELECT id FROM pending_dependent_fetches LIMIT 1",
|
"SELECT id FROM pending_dependent_fetches ORDER BY id LIMIT 1",
|
||||||
[],
|
[],
|
||||||
|row| row.get(0),
|
|row| row.get(0),
|
||||||
)
|
)
|
||||||
@@ -301,7 +303,9 @@ mod tests {
|
|||||||
let (conn, _job_id) = setup_db_with_job();
|
let (conn, _job_id) = setup_db_with_job();
|
||||||
|
|
||||||
let project_id: i64 = conn
|
let project_id: i64 = conn
|
||||||
.query_row("SELECT id FROM projects LIMIT 1", [], |row| row.get(0))
|
.query_row("SELECT id FROM projects ORDER BY id LIMIT 1", [], |row| {
|
||||||
|
row.get(0)
|
||||||
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let jobs = claim_jobs(&conn, "resource_events", project_id, 10).unwrap();
|
let jobs = claim_jobs(&conn, "resource_events", project_id, 10).unwrap();
|
||||||
assert_eq!(jobs.len(), 1);
|
assert_eq!(jobs.len(), 1);
|
||||||
|
|||||||
Reference in New Issue
Block a user