pub struct BlameOptions {
pub ignore_whitespace: bool,
pub moves: MoveDetection,
pub copies: CopyDetection,
pub ignore_revs: Arc<HashSet<Hash>>,
pub ignore_rev_precise: bool,
pub first_parent: bool,
}Expand description
Knobs controlling how blame_file_with attributes lines. The
default (no -w, detection off, empty ignore set) reproduces
blame_file’s exact-match behavior; this struct is the extension
point for the blame parity work (-w, -M, -C, ignore-revs today;
--reverse to follow).
Not Copy: Self::ignore_revs owns an Arc. It is passed by
reference (&BlameOptions) on the hot path; the Arc lets copy-source
blames share the same set without re-cloning it.
Fields§
§ignore_whitespace: boolIgnore whitespace when matching a line against its parent
revision, so a whitespace-only edit (reindent, tab↔space, spacing
tweak) does not reattribute the line. Mirrors git blame -w,
which ignores all whitespace, not just runs of it.
moves: MoveDetectionWithin-file move detection (git -M).
copies: CopyDetectionCross-file copy detection (git -C). On implies move detection
even when Self::moves is MoveDetection::Off — git’s -C
implies -M.
ignore_revs: Arc<HashSet<Hash>>Commits to skip during attribution, like git blame --ignore-rev
/ --ignore-revs-file. When a line would be credited to a commit
in this set (a mass-reformat / license-header / rename “noise”
commit), blame falls through to the previous commit that actually
changed the line. A commit whose lines have no counterpart in its
parent (a genuine insertion) stays on the ignored commit, matching
git’s default (no blame.markUnblamableLines marker).
Behind an Arc so a -C copy-source blame can share the same set
(it inherits the active ignore-revs) with an O(1) refcount bump
rather than deep-cloning the whole set per source.
ignore_rev_precise: boolRefine --ignore-rev fall-through with content matching instead of
git’s positional per-hunk guess (mkit-only, opt-in; no-op unless
Self::ignore_revs is non-empty). git pairs a fallen-through line
with whatever line sits at the same offset in the hunk, because a
textual diff is all it has; mkit hashes line content, so it can
often identify the line’s true surviving origin even when a
reformat/reorder moved it to a different offset — e.g. a
moved-and-reindented line matched to its real origin rather than to
whatever happens to sit at the same position.
The refinement is never worse than git’s positional
--ignore-rev, by construction: a line whose positional guess is
already a real parent line (Some) is only re-pointed when the
content evidence is a genuine moved block — a run of ≥ 2
file-adjacent lines matching contiguously — never for an isolated
single-line key coincidence (which could otherwise land an edited
line on an unrelated duplicate, strictly worse than positional). A
line the positional pass left unattributed (None — a genuine
insertion) may additionally be filled from a single exact-content
match anywhere in the parent, since that only ever improves on
“credited to the ignored commit”. Trivial keys (blank lines,
}-only lines, sub-3-byte tokens) are never reattributed. When no
qualifying evidence exists the result is identical to the positional
default, so every line is attributed at least as well as plain
--ignore-rev.
The default (false) keeps --ignore-rev byte-identical to git —
this is a documented divergence, not a change to the default.
first_parent: boolFollow only each commit’s first parent, like git blame --first-parent. The default (false) is git’s merge-aware walk:
at a merge, a line is credited to whichever parent’s side actually
wrote it (the first parent that still contains it), so a line merged
in from a side branch is attributed to its authoring commit rather
than the merge. With --first-parent, the walk follows the
first-parent chain only, so such a line is credited to the merge
commit — the older linear-history behavior.
Trait Implementations§
Source§impl Clone for BlameOptions
impl Clone for BlameOptions
Source§fn clone(&self) -> BlameOptions
fn clone(&self) -> BlameOptions
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for BlameOptions
impl Debug for BlameOptions
Source§impl Default for BlameOptions
impl Default for BlameOptions
Source§fn default() -> BlameOptions
fn default() -> BlameOptions
Auto Trait Implementations§
impl Freeze for BlameOptions
impl RefUnwindSafe for BlameOptions
impl Send for BlameOptions
impl Sync for BlameOptions
impl Unpin for BlameOptions
impl UnsafeUnpin for BlameOptions
impl UnwindSafe for BlameOptions
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
Source§fn with_current_context(self) -> WithContext<Self> ⓘ
fn with_current_context(self) -> WithContext<Self> ⓘ
impl<A, B, T> HttpServerConnExec<A, B> for Twhere
B: Body,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more