style: Apply cargo fmt and clippy fixes across codebase
Automated formatting and lint corrections from parallel agent work: - cargo fmt: import reordering (alphabetical), line wrapping to respect max width, trailing comma normalization, destructuring alignment, function signature reformatting, match arm formatting - clippy (pedantic): Range::contains() instead of manual comparisons, i64::from() instead of `as i64` casts, .clamp() instead of .max().min() chains, let-chain refactors (if-let with &&), #[allow(clippy::too_many_arguments)] and #[allow(clippy::field_reassign_with_default)] where warranted - Removed trailing blank lines and extra whitespace No behavioral changes. All existing tests pass unmodified. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -53,14 +53,17 @@ pub fn get_dirty_sources(conn: &Connection) -> Result<Vec<(SourceType, i64)>> {
|
||||
"SELECT source_type, source_id FROM dirty_sources
|
||||
WHERE next_attempt_at IS NULL OR next_attempt_at <= ?1
|
||||
ORDER BY attempt_count ASC, queued_at ASC
|
||||
LIMIT ?2"
|
||||
LIMIT ?2",
|
||||
)?;
|
||||
let rows = stmt
|
||||
.query_map(rusqlite::params![now, DIRTY_SOURCES_BATCH_SIZE as i64], |row| {
|
||||
let st_str: String = row.get(0)?;
|
||||
let source_id: i64 = row.get(1)?;
|
||||
Ok((st_str, source_id))
|
||||
})?
|
||||
.query_map(
|
||||
rusqlite::params![now, DIRTY_SOURCES_BATCH_SIZE as i64],
|
||||
|row| {
|
||||
let st_str: String = row.get(0)?;
|
||||
let source_id: i64 = row.get(1)?;
|
||||
Ok((st_str, source_id))
|
||||
},
|
||||
)?
|
||||
.collect::<std::result::Result<Vec<_>, _>>()?;
|
||||
|
||||
let mut results = Vec::with_capacity(rows.len());
|
||||
@@ -110,7 +113,14 @@ pub fn record_dirty_error(
|
||||
last_error = ?3,
|
||||
next_attempt_at = ?4
|
||||
WHERE source_type = ?5 AND source_id = ?6",
|
||||
rusqlite::params![new_attempt, now, error, next_at, source_type.as_str(), source_id],
|
||||
rusqlite::params![
|
||||
new_attempt,
|
||||
now,
|
||||
error,
|
||||
next_at,
|
||||
source_type.as_str(),
|
||||
source_id
|
||||
],
|
||||
)?;
|
||||
Ok(())
|
||||
}
|
||||
@@ -142,7 +152,9 @@ mod tests {
|
||||
let conn = setup_db();
|
||||
mark_dirty(&conn, SourceType::Issue, 1).unwrap();
|
||||
|
||||
let count: i64 = conn.query_row("SELECT COUNT(*) FROM dirty_sources", [], |r| r.get(0)).unwrap();
|
||||
let count: i64 = conn
|
||||
.query_row("SELECT COUNT(*) FROM dirty_sources", [], |r| r.get(0))
|
||||
.unwrap();
|
||||
assert_eq!(count, 1);
|
||||
}
|
||||
|
||||
@@ -154,7 +166,9 @@ mod tests {
|
||||
mark_dirty_tx(&tx, SourceType::Issue, 1).unwrap();
|
||||
tx.commit().unwrap();
|
||||
}
|
||||
let count: i64 = conn.query_row("SELECT COUNT(*) FROM dirty_sources", [], |r| r.get(0)).unwrap();
|
||||
let count: i64 = conn
|
||||
.query_row("SELECT COUNT(*) FROM dirty_sources", [], |r| r.get(0))
|
||||
.unwrap();
|
||||
assert_eq!(count, 1);
|
||||
}
|
||||
|
||||
@@ -165,21 +179,33 @@ mod tests {
|
||||
// Simulate error state
|
||||
record_dirty_error(&conn, SourceType::Issue, 1, "test error").unwrap();
|
||||
|
||||
let attempt: i64 = conn.query_row(
|
||||
"SELECT attempt_count FROM dirty_sources WHERE source_id = 1", [], |r| r.get(0)
|
||||
).unwrap();
|
||||
let attempt: i64 = conn
|
||||
.query_row(
|
||||
"SELECT attempt_count FROM dirty_sources WHERE source_id = 1",
|
||||
[],
|
||||
|r| r.get(0),
|
||||
)
|
||||
.unwrap();
|
||||
assert_eq!(attempt, 1);
|
||||
|
||||
// Re-mark should reset
|
||||
mark_dirty(&conn, SourceType::Issue, 1).unwrap();
|
||||
let attempt: i64 = conn.query_row(
|
||||
"SELECT attempt_count FROM dirty_sources WHERE source_id = 1", [], |r| r.get(0)
|
||||
).unwrap();
|
||||
let attempt: i64 = conn
|
||||
.query_row(
|
||||
"SELECT attempt_count FROM dirty_sources WHERE source_id = 1",
|
||||
[],
|
||||
|r| r.get(0),
|
||||
)
|
||||
.unwrap();
|
||||
assert_eq!(attempt, 0);
|
||||
|
||||
let next_at: Option<i64> = conn.query_row(
|
||||
"SELECT next_attempt_at FROM dirty_sources WHERE source_id = 1", [], |r| r.get(0)
|
||||
).unwrap();
|
||||
let next_at: Option<i64> = conn
|
||||
.query_row(
|
||||
"SELECT next_attempt_at FROM dirty_sources WHERE source_id = 1",
|
||||
[],
|
||||
|r| r.get(0),
|
||||
)
|
||||
.unwrap();
|
||||
assert!(next_at.is_none());
|
||||
}
|
||||
|
||||
@@ -191,7 +217,8 @@ mod tests {
|
||||
conn.execute(
|
||||
"UPDATE dirty_sources SET next_attempt_at = 9999999999999 WHERE source_id = 1",
|
||||
[],
|
||||
).unwrap();
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
let results = get_dirty_sources(&conn).unwrap();
|
||||
assert!(results.is_empty());
|
||||
@@ -205,7 +232,8 @@ mod tests {
|
||||
conn.execute(
|
||||
"UPDATE dirty_sources SET attempt_count = 2 WHERE source_id = 1",
|
||||
[],
|
||||
).unwrap();
|
||||
)
|
||||
.unwrap();
|
||||
// Insert issue 2 (fresh, attempt_count=0)
|
||||
mark_dirty(&conn, SourceType::Issue, 2).unwrap();
|
||||
|
||||
@@ -231,7 +259,9 @@ mod tests {
|
||||
mark_dirty(&conn, SourceType::Issue, 1).unwrap();
|
||||
clear_dirty(&conn, SourceType::Issue, 1).unwrap();
|
||||
|
||||
let count: i64 = conn.query_row("SELECT COUNT(*) FROM dirty_sources", [], |r| r.get(0)).unwrap();
|
||||
let count: i64 = conn
|
||||
.query_row("SELECT COUNT(*) FROM dirty_sources", [], |r| r.get(0))
|
||||
.unwrap();
|
||||
assert_eq!(count, 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ pub fn get_pending_fetches(conn: &Connection, limit: usize) -> Result<Vec<Pendin
|
||||
FROM pending_discussion_fetches
|
||||
WHERE next_attempt_at IS NULL OR next_attempt_at <= ?1
|
||||
ORDER BY queued_at ASC
|
||||
LIMIT ?2"
|
||||
LIMIT ?2",
|
||||
)?;
|
||||
let rows = stmt
|
||||
.query_map(rusqlite::params![now, limit as i64], |row| {
|
||||
@@ -137,7 +137,15 @@ pub fn record_fetch_error(
|
||||
last_error = ?3,
|
||||
next_attempt_at = ?4
|
||||
WHERE project_id = ?5 AND noteable_type = ?6 AND noteable_iid = ?7",
|
||||
rusqlite::params![new_attempt, now, error, next_at, project_id, noteable_type.as_str(), noteable_iid],
|
||||
rusqlite::params![
|
||||
new_attempt,
|
||||
now,
|
||||
error,
|
||||
next_at,
|
||||
project_id,
|
||||
noteable_type.as_str(),
|
||||
noteable_iid
|
||||
],
|
||||
)?;
|
||||
Ok(())
|
||||
}
|
||||
@@ -196,18 +204,24 @@ mod tests {
|
||||
queue_discussion_fetch(&conn, 1, NoteableType::Issue, 42).unwrap();
|
||||
record_fetch_error(&conn, 1, NoteableType::Issue, 42, "network error").unwrap();
|
||||
|
||||
let attempt: i32 = conn.query_row(
|
||||
"SELECT attempt_count FROM pending_discussion_fetches WHERE noteable_iid = 42",
|
||||
[], |r| r.get(0),
|
||||
).unwrap();
|
||||
let attempt: i32 = conn
|
||||
.query_row(
|
||||
"SELECT attempt_count FROM pending_discussion_fetches WHERE noteable_iid = 42",
|
||||
[],
|
||||
|r| r.get(0),
|
||||
)
|
||||
.unwrap();
|
||||
assert_eq!(attempt, 1);
|
||||
|
||||
// Re-queue should reset
|
||||
queue_discussion_fetch(&conn, 1, NoteableType::Issue, 42).unwrap();
|
||||
let attempt: i32 = conn.query_row(
|
||||
"SELECT attempt_count FROM pending_discussion_fetches WHERE noteable_iid = 42",
|
||||
[], |r| r.get(0),
|
||||
).unwrap();
|
||||
let attempt: i32 = conn
|
||||
.query_row(
|
||||
"SELECT attempt_count FROM pending_discussion_fetches WHERE noteable_iid = 42",
|
||||
[],
|
||||
|r| r.get(0),
|
||||
)
|
||||
.unwrap();
|
||||
assert_eq!(attempt, 0);
|
||||
}
|
||||
|
||||
@@ -230,9 +244,11 @@ mod tests {
|
||||
queue_discussion_fetch(&conn, 1, NoteableType::Issue, 42).unwrap();
|
||||
complete_fetch(&conn, 1, NoteableType::Issue, 42).unwrap();
|
||||
|
||||
let count: i64 = conn.query_row(
|
||||
"SELECT COUNT(*) FROM pending_discussion_fetches", [], |r| r.get(0),
|
||||
).unwrap();
|
||||
let count: i64 = conn
|
||||
.query_row("SELECT COUNT(*) FROM pending_discussion_fetches", [], |r| {
|
||||
r.get(0)
|
||||
})
|
||||
.unwrap();
|
||||
assert_eq!(count, 0);
|
||||
}
|
||||
|
||||
@@ -249,17 +265,23 @@ mod tests {
|
||||
assert_eq!(attempt, 1);
|
||||
assert_eq!(error, Some("timeout".to_string()));
|
||||
|
||||
let next_at: Option<i64> = conn.query_row(
|
||||
"SELECT next_attempt_at FROM pending_discussion_fetches WHERE noteable_iid = 10",
|
||||
[], |r| r.get(0),
|
||||
).unwrap();
|
||||
let next_at: Option<i64> = conn
|
||||
.query_row(
|
||||
"SELECT next_attempt_at FROM pending_discussion_fetches WHERE noteable_iid = 10",
|
||||
[],
|
||||
|r| r.get(0),
|
||||
)
|
||||
.unwrap();
|
||||
assert!(next_at.is_some());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_noteable_type_parse() {
|
||||
assert_eq!(NoteableType::parse("Issue"), Some(NoteableType::Issue));
|
||||
assert_eq!(NoteableType::parse("MergeRequest"), Some(NoteableType::MergeRequest));
|
||||
assert_eq!(
|
||||
NoteableType::parse("MergeRequest"),
|
||||
Some(NoteableType::MergeRequest)
|
||||
);
|
||||
assert_eq!(NoteableType::parse("invalid"), None);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,9 +14,9 @@ use crate::Config;
|
||||
use crate::core::error::Result;
|
||||
use crate::core::payloads::{StorePayloadOptions, store_payload};
|
||||
use crate::documents::SourceType;
|
||||
use crate::ingestion::dirty_tracker;
|
||||
use crate::gitlab::GitLabClient;
|
||||
use crate::gitlab::transformers::{NoteableRef, transform_discussion, transform_notes};
|
||||
use crate::ingestion::dirty_tracker;
|
||||
|
||||
use super::issues::IssueForDiscussionSync;
|
||||
|
||||
@@ -95,7 +95,6 @@ async fn ingest_discussions_for_issue(
|
||||
let mut pagination_error: Option<crate::core::error::LoreError> = None;
|
||||
|
||||
while let Some(disc_result) = discussions_stream.next().await {
|
||||
|
||||
// Handle errors - record but don't delete stale data
|
||||
let gitlab_discussion = match disc_result {
|
||||
Ok(d) => d,
|
||||
|
||||
@@ -18,10 +18,10 @@ use crate::core::error::{LoreError, Result};
|
||||
use crate::core::payloads::{StorePayloadOptions, store_payload};
|
||||
use crate::core::time::now_ms;
|
||||
use crate::documents::SourceType;
|
||||
use crate::ingestion::dirty_tracker;
|
||||
use crate::gitlab::GitLabClient;
|
||||
use crate::gitlab::transformers::{MilestoneRow, transform_issue};
|
||||
use crate::gitlab::types::GitLabIssue;
|
||||
use crate::ingestion::dirty_tracker;
|
||||
|
||||
/// Result of issue ingestion.
|
||||
#[derive(Debug, Default)]
|
||||
@@ -174,12 +174,12 @@ fn passes_cursor_filter(issue: &GitLabIssue, cursor: &SyncCursor) -> Result<bool
|
||||
return Ok(false);
|
||||
}
|
||||
|
||||
if issue_ts == cursor_ts {
|
||||
if let Some(cursor_id) = cursor.tie_breaker_id {
|
||||
if issue.id <= cursor_id {
|
||||
return Ok(false);
|
||||
}
|
||||
}
|
||||
if issue_ts == cursor_ts
|
||||
&& cursor
|
||||
.tie_breaker_id
|
||||
.is_some_and(|cursor_id| issue.id <= cursor_id)
|
||||
{
|
||||
return Ok(false);
|
||||
}
|
||||
|
||||
Ok(true)
|
||||
|
||||
@@ -17,10 +17,10 @@ use crate::core::error::{LoreError, Result};
|
||||
use crate::core::payloads::{StorePayloadOptions, store_payload};
|
||||
use crate::core::time::now_ms;
|
||||
use crate::documents::SourceType;
|
||||
use crate::ingestion::dirty_tracker;
|
||||
use crate::gitlab::GitLabClient;
|
||||
use crate::gitlab::transformers::merge_request::transform_merge_request;
|
||||
use crate::gitlab::types::GitLabMergeRequest;
|
||||
use crate::ingestion::dirty_tracker;
|
||||
|
||||
/// Result of merge request ingestion.
|
||||
#[derive(Debug, Default)]
|
||||
|
||||
@@ -19,7 +19,7 @@ pub use merge_requests::{
|
||||
};
|
||||
pub use mr_discussions::{IngestMrDiscussionsResult, ingest_mr_discussions};
|
||||
pub use orchestrator::{
|
||||
IngestMrProjectResult, IngestProjectResult, ProgressCallback, ProgressEvent,
|
||||
DrainResult, IngestMrProjectResult, IngestProjectResult, ProgressCallback, ProgressEvent,
|
||||
ingest_project_issues, ingest_project_issues_with_progress, ingest_project_merge_requests,
|
||||
ingest_project_merge_requests_with_progress,
|
||||
};
|
||||
|
||||
@@ -19,13 +19,13 @@ use crate::core::error::Result;
|
||||
use crate::core::payloads::{StorePayloadOptions, store_payload};
|
||||
use crate::core::time::now_ms;
|
||||
use crate::documents::SourceType;
|
||||
use crate::ingestion::dirty_tracker;
|
||||
use crate::gitlab::GitLabClient;
|
||||
use crate::gitlab::transformers::{
|
||||
NormalizedDiscussion, NormalizedNote, transform_mr_discussion,
|
||||
transform_notes_with_diff_position,
|
||||
};
|
||||
use crate::gitlab::types::GitLabDiscussion;
|
||||
use crate::ingestion::dirty_tracker;
|
||||
|
||||
use super::merge_requests::MrForDiscussionSync;
|
||||
|
||||
@@ -72,7 +72,10 @@ pub async fn prefetch_mr_discussions(
|
||||
debug!(mr_iid = mr.iid, "Prefetching discussions for MR");
|
||||
|
||||
// Fetch all discussions from GitLab
|
||||
let raw_discussions = match client.fetch_all_mr_discussions(gitlab_project_id, mr.iid).await {
|
||||
let raw_discussions = match client
|
||||
.fetch_all_mr_discussions(gitlab_project_id, mr.iid)
|
||||
.await
|
||||
{
|
||||
Ok(d) => d,
|
||||
Err(e) => {
|
||||
return PrefetchedMrDiscussions {
|
||||
@@ -241,7 +244,10 @@ pub fn write_prefetched_mr_discussions(
|
||||
mark_discussions_synced(conn, mr.local_mr_id, mr.updated_at)?;
|
||||
clear_sync_health_error(conn, mr.local_mr_id)?;
|
||||
|
||||
debug!(mr_iid = mr.iid, "MR discussion sync complete, watermark advanced");
|
||||
debug!(
|
||||
mr_iid = mr.iid,
|
||||
"MR discussion sync complete, watermark advanced"
|
||||
);
|
||||
} else if prefetched.had_transform_errors {
|
||||
warn!(
|
||||
mr_iid = mr.iid,
|
||||
|
||||
Reference in New Issue
Block a user