patch

package
v0.0.0-...-00ab8b8 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 15, 2024 License: MIT Imports: 11 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func ExpandRange

func ExpandRange(start int, end int) []int

helper function that takes a start and end index and returns a slice of all indexes inbetween (inclusive)

Types

type FormatViewOpts

type FormatViewOpts struct {
	// line indices for tagged lines (e.g. lines added to a custom patch)
	IncLineIndices *set.Set[int]
}

type Hunk

type Hunk struct {
	// contains filtered or unexported fields
}

type Patch

type Patch struct {
	// contains filtered or unexported fields
}

func Parse

func Parse(patchStr string) *Patch

func (*Patch) ContainsChanges

func (self *Patch) ContainsChanges() bool

func (*Patch) FormatPlain

func (self *Patch) FormatPlain() string

Returns the patch as a plain string

func (*Patch) FormatRangePlain

func (self *Patch) FormatRangePlain(startIdx int, endIdx int) string

Returns a range of lines from the patch as a plain string (range is inclusive)

func (*Patch) FormatView

func (self *Patch) FormatView(opts FormatViewOpts) string

Returns the patch as a string with ANSI color codes for displaying in a view

func (*Patch) GetNextChangeIdx

func (self *Patch) GetNextChangeIdx(idx int) int

Returns the patch line index of the next change (i.e. addition or deletion).

func (*Patch) HunkContainingLine

func (self *Patch) HunkContainingLine(idx int) int

Returns hunk index containing the line at the given patch line index

func (*Patch) HunkCount

func (self *Patch) HunkCount() int

Returns the number of hunks of the patch

func (*Patch) HunkEndIdx

func (self *Patch) HunkEndIdx(hunkIndex int) int

Returns the patch line index of the last line in the given hunk

func (*Patch) HunkStartIdx

func (self *Patch) HunkStartIdx(hunkIndex int) int

Returns the patch line index of the first line in the given hunk

func (*Patch) LineCount

func (self *Patch) LineCount() int

Returns the length of the patch in lines

func (*Patch) LineNumberOfLine

func (self *Patch) LineNumberOfLine(idx int) int

Takes a line index in the patch and returns the line number in the new file. If the line is a header line, returns 1. If the line is a hunk header line, returns the first file line number in that hunk. If the line is out of range below, returns the last file line number in the last hunk.

func (*Patch) Lines

func (self *Patch) Lines() []*PatchLine

Returns the lines of the patch

func (*Patch) Transform

func (self *Patch) Transform(opts TransformOpts) *Patch

Returns a new patch with the specified transformation applied (e.g. only selecting a subset of changes). Leaves the original patch unchanged.

type PatchBuilder

type PatchBuilder struct {
	// To is the commit sha if we're dealing with files of a commit, or a stash ref for a stash
	To   string
	From string

	// CanRebase tells us whether we're allowed to modify our commits. CanRebase should be true for commits of the currently checked out branch and false for everything else
	// TODO: move this out into a proper mode struct in the gui package: it doesn't really belong here
	CanRebase bool

	Log *logrus.Entry
	// contains filtered or unexported fields
}

PatchBuilder manages the building of a patch for a commit to be applied to another commit (or the working tree, or removed from the current commit). We also support building patches from things like stashes, for which there is less flexibility

func NewPatchBuilder

func NewPatchBuilder(log *logrus.Entry, loadFileDiff loadFileDiffFunc) *PatchBuilder

func (*PatchBuilder) Active

func (p *PatchBuilder) Active() bool

func (*PatchBuilder) AddFileLineRange

func (p *PatchBuilder) AddFileLineRange(filename string, firstLineIdx, lastLineIdx int) error

func (*PatchBuilder) AddFileWhole

func (p *PatchBuilder) AddFileWhole(filename string) error

func (*PatchBuilder) AllFilesInPatch

func (p *PatchBuilder) AllFilesInPatch() []string

func (*PatchBuilder) GetFileIncLineIndices

func (p *PatchBuilder) GetFileIncLineIndices(filename string) ([]int, error)

func (*PatchBuilder) GetFileStatus

func (p *PatchBuilder) GetFileStatus(filename string, parent string) PatchStatus

func (*PatchBuilder) IsEmpty

func (p *PatchBuilder) IsEmpty() bool

func (*PatchBuilder) NewPatchRequired

func (p *PatchBuilder) NewPatchRequired(from string, to string, reverse bool) bool

if any of these things change we'll need to reset and start a new patch

func (*PatchBuilder) PatchToApply

func (p *PatchBuilder) PatchToApply(reverse bool) string

func (*PatchBuilder) RemoveFile

func (p *PatchBuilder) RemoveFile(filename string) error

func (*PatchBuilder) RemoveFileLineRange

func (p *PatchBuilder) RemoveFileLineRange(filename string, firstLineIdx, lastLineIdx int) error

func (*PatchBuilder) RenderAggregatedPatch

func (p *PatchBuilder) RenderAggregatedPatch(plain bool) string

func (*PatchBuilder) RenderPatchForFile

func (p *PatchBuilder) RenderPatchForFile(filename string, plain bool, reverse bool) string

func (*PatchBuilder) Reset

func (p *PatchBuilder) Reset()

clears the patch

func (*PatchBuilder) Start

func (p *PatchBuilder) Start(from, to string, reverse bool, canRebase bool)

type PatchLine

type PatchLine struct {
	Kind    PatchLineKind
	Content string // something like '+ hello' (note the first character is not removed)
}

type PatchLineKind

type PatchLineKind int
const (
	PATCH_HEADER PatchLineKind = iota
	HUNK_HEADER
	ADDITION
	DELETION
	CONTEXT
	NEWLINE_MESSAGE
)

type PatchStatus

type PatchStatus int
const (
	// UNSELECTED is for when the commit file has not been added to the patch in any way
	UNSELECTED PatchStatus = iota
	// WHOLE is for when you want to add the whole diff of a file to the patch,
	// including e.g. if it was deleted
	WHOLE
	// PART is for when you're only talking about specific lines that have been modified
	PART
)

type TransformOpts

type TransformOpts struct {
	// Create a patch that will applied in reverse with `git apply --reverse`.
	// This affects how unselected lines are treated when only parts of a hunk
	// are selected: usually, for unselected lines we change '-' lines to
	// context lines and remove '+' lines, but when Reverse is true we need to
	// turn '+' lines into context lines and remove '-' lines.
	Reverse bool

	// If set, we will replace the original header with one referring to this file name.
	// For staging/unstaging lines we don't want the original header because
	// it makes git confused e.g. when dealing with deleted/added files
	// but with building and applying patches the original header gives git
	// information it needs to cleanly apply patches
	FileNameOverride string

	// The indices of lines that should be included in the patch.
	IncludedLineIndices []int
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL