Skip to main content

FixupParser

Struct FixupParser 

Source
pub struct FixupParser {
    pub mode: FixupMode,
    pub sandbox_root: SandboxRoot,
}
Expand description

Main fixup parser that handles detection and parsing of fixup plans

§Security

FixupParser uses SandboxRoot to validate all target paths before any file operations. This ensures that:

  • Paths cannot escape the workspace root via .. traversal
  • Absolute paths are rejected
  • Symlinks are rejected by default (configurable via SandboxConfig)
  • Hardlinks are rejected by default (configurable via SandboxConfig)

All path validation happens through SandboxRoot::join() which provides comprehensive security checks before any file I/O.

Fields§

§mode: FixupMode

Operating mode (preview or apply)

§sandbox_root: SandboxRoot

Sandboxed root directory for resolving and validating relative paths

Implementations§

Source§

impl FixupParser

Source

pub fn preview_changes( &self, diffs: &[UnifiedDiff], ) -> Result<FixupPreview, FixupError>

Preview changes without applying them

Line endings are normalized before calculating diff statistics (FR-FIX-010)

§Security

All target paths are validated through SandboxRoot::join() to ensure:

  • Paths cannot escape the workspace root via .. traversal
  • Absolute paths are rejected
  • Symlinks are rejected by default (configurable via SandboxConfig)
  • Hardlinks are rejected by default (configurable via SandboxConfig)
Source

pub fn apply_changes( &self, diffs: &[UnifiedDiff], ) -> Result<FixupResult, FixupError>

Apply changes to files using atomic writes (FR-FIX-005, FR-FIX-006, FR-FIX-008)

This method implements the atomic write pattern:

  1. Validate target path using SandboxPath (security check)
  2. Write to .tmp file with fsync
  3. Create .bak backup if file exists
  4. Atomic rename with Windows retry
  5. Preserve file permissions (Unix) or attributes (Windows)
  6. Record warnings if permission preservation fails
§Security

All target paths are validated through SandboxRoot::join() to ensure:

  • Paths cannot escape the workspace root via .. traversal
  • Absolute paths are rejected
  • Symlinks are rejected by default (configurable via SandboxConfig)
  • Hardlinks are rejected by default (configurable via SandboxConfig)
Source

pub fn apply_changes_with_git( &self, diffs: &[UnifiedDiff], ) -> Result<FixupResult, FixupError>

Apply changes to files (legacy git apply method - kept for compatibility)

Source§

impl FixupParser

Source

pub fn new(mode: FixupMode, base_dir: PathBuf) -> Result<Self, FixupError>

Create a new fixup parser with a sandboxed root directory.

§Arguments
  • mode - The operating mode (preview or apply)
  • base_dir - The base directory to use as a sandbox root
§Errors

Returns an error if base directory cannot be used as a sandbox root (e.g., doesn’t exist, isn’t a directory, or can’t be canonicalized).

Source

pub fn with_config( mode: FixupMode, base_dir: PathBuf, config: SandboxConfig, ) -> Result<Self, FixupError>

Create a new fixup parser with custom sandbox configuration.

§Arguments
  • mode - The operating mode (preview or apply)
  • base_dir - The base directory to use as a sandbox root
  • config - Custom sandbox configuration (e.g., to allow symlinks)
§Errors

Returns an error if base directory cannot be used as a sandbox root.

Source

pub fn base_dir(&self) -> &Path

Get the sandbox root path.

Source

pub fn has_fixup_markers(&self, content: &str) -> bool

Detect if review output contains fixup markers.

Source

pub fn detect_fixup_markers(&self, content: &str) -> Option<String>

Detect fixup markers in review output. Returns the content after the first marker if found.

Source

pub fn parse_diffs(&self, content: &str) -> Result<Vec<UnifiedDiff>, FixupError>

Parse unified diff blocks from fixup content.

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<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> 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: 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: 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, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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<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