77 lines
1.8 KiB
Go
77 lines
1.8 KiB
Go
package diff
|
|
|
|
import "bytes"
|
|
|
|
// NOTE: types are code-generated in diff.pb.go.
|
|
|
|
//go:generate protoc -I../../../.. -I ../../../../github.com/gogo/protobuf/protobuf -I. --gogo_out=. diff.proto
|
|
|
|
// Stat computes the number of lines added/changed/deleted in all
|
|
// hunks in this file's diff.
|
|
func (d *FileDiff) Stat() Stat {
|
|
total := Stat{}
|
|
for _, h := range d.Hunks {
|
|
total.add(h.Stat())
|
|
}
|
|
return total
|
|
}
|
|
|
|
// Stat computes the number of lines added/changed/deleted in this
|
|
// hunk.
|
|
func (h *Hunk) Stat() Stat {
|
|
lines := bytes.Split(h.Body, []byte{'\n'})
|
|
var last byte
|
|
st := Stat{}
|
|
for _, line := range lines {
|
|
if len(line) == 0 {
|
|
last = 0
|
|
continue
|
|
}
|
|
switch line[0] {
|
|
case '-':
|
|
if last == '+' {
|
|
st.Added--
|
|
st.Changed++
|
|
last = 0 // next line can't change this one since this is already a change
|
|
} else {
|
|
st.Deleted++
|
|
last = line[0]
|
|
}
|
|
case '+':
|
|
if last == '-' {
|
|
st.Deleted--
|
|
st.Changed++
|
|
last = 0 // next line can't change this one since this is already a change
|
|
} else {
|
|
st.Added++
|
|
last = line[0]
|
|
}
|
|
default:
|
|
last = 0
|
|
}
|
|
}
|
|
return st
|
|
}
|
|
|
|
var (
|
|
hunkPrefix = []byte("@@ ")
|
|
)
|
|
|
|
const hunkHeader = "@@ -%d,%d +%d,%d @@"
|
|
|
|
// diffTimeParseLayout is the layout used to parse the time in unified diff file
|
|
// header timestamps.
|
|
// See https://www.gnu.org/software/diffutils/manual/html_node/Detailed-Unified.html.
|
|
const diffTimeParseLayout = "2006-01-02 15:04:05 -0700"
|
|
|
|
// diffTimeFormatLayout is the layout used to format (i.e., print) the time in unified diff file
|
|
// header timestamps.
|
|
// See https://www.gnu.org/software/diffutils/manual/html_node/Detailed-Unified.html.
|
|
const diffTimeFormatLayout = "2006-01-02 15:04:05.000000000 -0700"
|
|
|
|
func (s *Stat) add(o Stat) {
|
|
s.Added += o.Added
|
|
s.Changed += o.Changed
|
|
s.Deleted += o.Deleted
|
|
}
|