repos / git-pr

a self-hosted git collaboration server
git clone https://github.com/picosh/git-pr.git

commit
b023fc7
parent
a1d2ffa
author
Eric Bower
date
2024-12-26 00:07:14 -0500 EST
refactor: return range diff header

This will allow us to generate different outputs directly in our
templates using the RangeDiffHeader struct
2 files changed,  +68, -16
M web.go
M range_diff.go
+67, -15
  1@@ -32,7 +32,7 @@ func NewPatchRange(patch *Patch) *PatchRange {
  2 }
  3 
  4 type RangeDiffOutput struct {
  5-	Header string
  6+	Header *RangeDiffHeader
  7 	Order  int
  8 	Diff   []diffmatchpatch.Diff
  9 	Type   string
 10@@ -42,10 +42,11 @@ func output(a []*PatchRange, b []*PatchRange) []*RangeDiffOutput {
 11 	outputs := []*RangeDiffOutput{}
 12 	for i, patchA := range a {
 13 		if patchA.Matching == -1 {
 14+			hdr := NewRangeDiffHeader(patchA, nil, i+1, -1)
 15 			outputs = append(
 16 				outputs,
 17 				&RangeDiffOutput{
 18-					Header: outputPairHeader(patchA, nil, i+1, -1),
 19+					Header: hdr,
 20 					Type:   "rm",
 21 					Order:  i + 1,
 22 				},
 23@@ -55,10 +56,11 @@ func output(a []*PatchRange, b []*PatchRange) []*RangeDiffOutput {
 24 
 25 	for j, patchB := range b {
 26 		if patchB.Matching == -1 {
 27+			hdr := NewRangeDiffHeader(nil, patchB, -1, j+1)
 28 			outputs = append(
 29 				outputs,
 30 				&RangeDiffOutput{
 31-					Header: outputPairHeader(nil, patchB, -1, j+1),
 32+					Header: hdr,
 33 					Type:   "add",
 34 					Order:  j + 1,
 35 				},
 36@@ -67,26 +69,23 @@ func output(a []*PatchRange, b []*PatchRange) []*RangeDiffOutput {
 37 		}
 38 		patchA := a[patchB.Matching]
 39 		if patchB.ContentSha == patchA.ContentSha {
 40+			hdr := NewRangeDiffHeader(patchA, patchB, patchB.Matching+1, patchA.Matching+1)
 41 			outputs = append(
 42 				outputs,
 43 				&RangeDiffOutput{
 44-					Header: outputPairHeader(patchA, patchB, patchB.Matching+1, patchA.Matching+1),
 45+					Header: hdr,
 46 					Type:   "equal",
 47 					Order:  patchA.Matching + 1,
 48 				},
 49 			)
 50 		} else {
 51-			header := fmt.Sprintf(
 52-				"%d:  %s ! %d:  %s %s",
 53-				patchA.Matching+1, truncateSha(patchA.CommitSha),
 54-				patchB.Matching+1, truncateSha(patchB.CommitSha), patchB.Title,
 55-			)
 56+			hdr := NewRangeDiffHeader(patchA, patchB, patchB.Matching+1, patchA.Matching+1)
 57 			diff := outputDiff(patchA, patchB)
 58 			outputs = append(
 59 				outputs,
 60 				&RangeDiffOutput{
 61 					Order:  patchA.Matching + 1,
 62-					Header: header,
 63+					Header: hdr,
 64 					Diff:   diff,
 65 					Type:   "diff",
 66 				},
 67@@ -132,14 +131,67 @@ func outputDiff(patchA, patchB *PatchRange) []diffmatchpatch.Diff {
 68 	return diffs
 69 }
 70 
 71-func outputPairHeader(a *PatchRange, b *PatchRange, aIndex, bIndex int) string {
 72+// RangeDiffHeader is a header combining old and new change pairs.
 73+type RangeDiffHeader struct {
 74+	OldIdx       int
 75+	OldSha       string
 76+	NewIdx       int
 77+	NewSha       string
 78+	Title        string
 79+	ContentEqual bool
 80+}
 81+
 82+func NewRangeDiffHeader(a *PatchRange, b *PatchRange, aIndex, bIndex int) *RangeDiffHeader {
 83+	hdr := &RangeDiffHeader{}
 84 	if a == nil {
 85-		return fmt.Sprintf("-:  ------- > %d:  %s %s\n", bIndex, truncateSha(b.CommitSha), b.Title)
 86+		hdr.NewIdx = bIndex
 87+		hdr.NewSha = b.CommitSha
 88+		hdr.Title = b.Title
 89+		return hdr
 90 	}
 91 	if b == nil {
 92-		return fmt.Sprintf("%d:  %s < -:  ------- %s\n", aIndex, truncateSha(a.CommitSha), a.Title)
 93+		hdr.OldIdx = aIndex
 94+		hdr.OldSha = a.CommitSha
 95+		hdr.Title = a.Title
 96+		return hdr
 97+	}
 98+
 99+	hdr.OldIdx = aIndex
100+	hdr.NewIdx = bIndex
101+	hdr.OldSha = a.CommitSha
102+	hdr.NewSha = b.CommitSha
103+
104+	if a.ContentSha == b.ContentSha {
105+		hdr.Title = a.Title
106+		hdr.ContentEqual = true
107+	} else {
108+		hdr.Title = b.Title
109+	}
110+
111+	return hdr
112+}
113+
114+func (hdr *RangeDiffHeader) String() string {
115+	if hdr.OldIdx == 0 {
116+		return fmt.Sprintf("-:  ------- > %d:  %s %s\n", hdr.NewIdx, truncateSha(hdr.NewSha), hdr.Title)
117+	}
118+	if hdr.NewIdx == 0 {
119+		return fmt.Sprintf("%d:  %s < -:  ------- %s\n", hdr.OldIdx, truncateSha(hdr.OldSha), hdr.Title)
120+	}
121+	if hdr.ContentEqual {
122+		return fmt.Sprintf(
123+			"%d:  %s = %d:  %s %s\n",
124+			hdr.OldIdx, truncateSha(hdr.OldSha),
125+			hdr.NewIdx, truncateSha(hdr.NewSha),
126+			hdr.Title,
127+		)
128 	}
129-	return fmt.Sprintf("%d:  %s = %d:  %s %s\n", aIndex, truncateSha(a.CommitSha), bIndex, truncateSha(b.CommitSha), a.Title)
130+	return fmt.Sprintf(
131+		"%d:  %s ! %d:  %s %s",
132+		hdr.OldIdx, truncateSha(hdr.OldSha),
133+		hdr.NewIdx, truncateSha(hdr.NewSha),
134+		hdr.Title,
135+	)
136 }
137 
138 func RangeDiff(a []*Patch, b []*Patch) []*RangeDiffOutput {
139@@ -159,7 +211,7 @@ func RangeDiff(a []*Patch, b []*Patch) []*RangeDiffOutput {
140 func RangeDiffToStr(diffs []*RangeDiffOutput) string {
141 	output := ""
142 	for _, diff := range diffs {
143-		output += diff.Header
144+		output += diff.Header.String()
145 		for _, d := range diff.Diff {
146 			switch d.Type {
147 			case diffmatchpatch.DiffEqual:
M web.go
+1, -1
1@@ -612,7 +612,7 @@ func createPrDetail(page string) http.HandlerFunc {
2 					if rdiff.Type == "add" {
3 						for _, patch := range patches {
4 							commSha := truncateSha(patch.CommitSha)
5-							if strings.Contains(rdiff.Header, commSha) {
6+							if strings.Contains(rdiff.Header.String(), commSha) {
7 								reviewIDs = append(reviewIDs, patch.ID)
8 								break
9 							}