2020-08-15 03:18:40 +02:00
|
|
|
package patch
|
|
|
|
|
2023-03-08 07:55:44 +02:00
|
|
|
import "fmt"
|
|
|
|
|
|
|
|
// Example hunk:
|
|
|
|
// @@ -16,2 +14,3 @@ func (f *CommitFile) Description() string {
|
|
|
|
// return f.Name
|
|
|
|
// -}
|
|
|
|
// +
|
|
|
|
// +// test
|
|
|
|
|
|
|
|
type Hunk struct {
|
|
|
|
// the line number of the first line in the old file ('16' in the above example)
|
|
|
|
oldStart int
|
|
|
|
// the line number of the first line in the new file ('14' in the above example)
|
|
|
|
newStart int
|
|
|
|
// the context at the end of the header line (' func (f *CommitFile) Description() string {' in the above example)
|
|
|
|
headerContext string
|
|
|
|
// the body of the hunk, excluding the header line
|
|
|
|
bodyLines []*PatchLine
|
2020-08-15 03:18:40 +02:00
|
|
|
}
|
|
|
|
|
2023-03-08 07:55:44 +02:00
|
|
|
// Returns the number of lines in the hunk in the original file ('2' in the above example)
|
|
|
|
func (self *Hunk) oldLength() int {
|
|
|
|
return nLinesWithKind(self.bodyLines, []PatchLineKind{CONTEXT, DELETION})
|
2020-08-15 03:18:40 +02:00
|
|
|
}
|
|
|
|
|
2023-03-08 07:55:44 +02:00
|
|
|
// Returns the number of lines in the hunk in the new file ('3' in the above example)
|
|
|
|
func (self *Hunk) newLength() int {
|
|
|
|
return nLinesWithKind(self.bodyLines, []PatchLineKind{CONTEXT, ADDITION})
|
2020-08-15 03:18:40 +02:00
|
|
|
}
|
|
|
|
|
2023-03-08 07:55:44 +02:00
|
|
|
// Returns true if the hunk contains any changes (i.e. if it's not just a context hunk).
|
|
|
|
// We'll end up with a context hunk if we're transforming a patch and one of the hunks
|
|
|
|
// has no selected lines.
|
|
|
|
func (self *Hunk) containsChanges() bool {
|
|
|
|
return nLinesWithKind(self.bodyLines, []PatchLineKind{ADDITION, DELETION}) > 0
|
2020-08-15 03:18:40 +02:00
|
|
|
}
|
|
|
|
|
2023-03-08 07:55:44 +02:00
|
|
|
// Returns the number of lines in the hunk, including the header line
|
|
|
|
func (self *Hunk) lineCount() int {
|
|
|
|
return len(self.bodyLines) + 1
|
2020-08-15 03:18:40 +02:00
|
|
|
}
|
|
|
|
|
2023-03-08 07:55:44 +02:00
|
|
|
// Returns all lines in the hunk, including the header line
|
|
|
|
func (self *Hunk) allLines() []*PatchLine {
|
|
|
|
lines := []*PatchLine{{Content: self.formatHeaderLine(), Kind: HUNK_HEADER}}
|
|
|
|
lines = append(lines, self.bodyLines...)
|
|
|
|
return lines
|
2020-08-15 03:18:40 +02:00
|
|
|
}
|
|
|
|
|
2023-03-08 07:55:44 +02:00
|
|
|
// Returns the header line, including the unified diff header and the context
|
|
|
|
func (self *Hunk) formatHeaderLine() string {
|
|
|
|
return fmt.Sprintf("%s%s", self.formatHeaderStart(), self.headerContext)
|
2020-08-15 03:18:40 +02:00
|
|
|
}
|
|
|
|
|
2023-03-08 07:55:44 +02:00
|
|
|
// Returns the first part of the header line i.e. the unified diff part (excluding any context)
|
|
|
|
func (self *Hunk) formatHeaderStart() string {
|
|
|
|
newLengthDisplay := ""
|
|
|
|
newLength := self.newLength()
|
|
|
|
// if the new length is 1, it's omitted
|
|
|
|
if newLength != 1 {
|
|
|
|
newLengthDisplay = fmt.Sprintf(",%d", newLength)
|
2020-08-15 03:18:40 +02:00
|
|
|
}
|
|
|
|
|
2023-03-08 07:55:44 +02:00
|
|
|
return fmt.Sprintf("@@ -%d,%d +%d%s @@", self.oldStart, self.oldLength(), self.newStart, newLengthDisplay)
|
2020-08-15 03:18:40 +02:00
|
|
|
}
|