mirror of
https://relay.ngit.dev/npub15qydau2hjma6ngxkl2cyar74wzyjshvl65za5k5rl69264ar2exs5cyejr/ngit-grasp.git
synced 2026-10-05 15:08:24 +00:00
fix: improve 'not our ref' error messages and warn about multi-OID fetch bug
When git fetch fails with 'upload-pack: not our ref', git stops at the first missing OID and doesn't attempt to fetch remaining OIDs. This means if we request 5 OIDs and the first is missing, we never try the other 4 (which may exist on the remote). Changes: - Parse missing OID from stderr for clearer error messages - Single OID case: 'remote missing only oid requested: <oid>' - Multi OID case: Log WARNING and indicate other OIDs weren't attempted - Identifies the bug that needs retry logic to fetch OIDs individually
This commit is contained in:
@@ -408,7 +408,45 @@ impl SyncContext for RealSyncContext {
|
||||
}
|
||||
}
|
||||
|
||||
Err(anyhow::anyhow!("git fetch failed: {}", stderr))
|
||||
// Check for "not our ref" errors and provide a clearer error message
|
||||
let error_msg = if stderr.contains("upload-pack: not our ref") {
|
||||
// Parse out the missing OID from stderr (git only reports one at a time)
|
||||
let missing_oid = stderr
|
||||
.lines()
|
||||
.find_map(|line| {
|
||||
if line.contains("not our ref") {
|
||||
// Extract the OID from lines like:
|
||||
// "fatal: remote error: upload-pack: not our ref <oid>"
|
||||
line.split("not our ref").nth(1).map(|s| s.trim().to_string())
|
||||
} else {
|
||||
None
|
||||
}
|
||||
});
|
||||
|
||||
let total_requested = missing_oids.len();
|
||||
|
||||
if let Some(oid) = missing_oid {
|
||||
if total_requested > 1 {
|
||||
// BUG: Git stops at first missing OID, so we don't know if the others exist
|
||||
// We need retry logic to fetch remaining OIDs individually
|
||||
tracing::warn!(
|
||||
url = %url,
|
||||
missing_oid = %oid,
|
||||
total_requested = total_requested,
|
||||
"Git fetch failed on first missing OID - other requested OIDs may exist but were not fetched. Retry logic needed."
|
||||
);
|
||||
format!("remote missing oid {} (BUG: {} other oids not attempted)", oid, total_requested - 1)
|
||||
} else {
|
||||
format!("remote missing only oid requested: {}", oid)
|
||||
}
|
||||
} else {
|
||||
format!("git fetch failed: {}", stderr)
|
||||
}
|
||||
} else {
|
||||
format!("git fetch failed: {}", stderr)
|
||||
};
|
||||
|
||||
Err(anyhow::anyhow!("{}", error_msg))
|
||||
}
|
||||
Err(e) => Err(anyhow::anyhow!("git fetch command error: {}", e)),
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user