Skip to main content

BlameOptions

Struct BlameOptions 

Source
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: bool

Ignore 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: MoveDetection

Within-file move detection (git -M).

§copies: CopyDetection

Cross-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: bool

Refine --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: bool

Follow 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

Source§

fn clone(&self) -> BlameOptions

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for BlameOptions

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for BlameOptions

Source§

fn default() -> BlameOptions

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromRef<T> for T
where T: Clone,

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<T> FutureExt for T

Source§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
Source§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
Source§

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more