+31
knotserver/git/diff.go
+31
knotserver/git/diff.go
···
1
package git
2
3
import (
4
"fmt"
5
"log"
6
"strings"
7
8
"github.com/bluekeyes/go-gitdiff/gitdiff"
9
"github.com/go-git/go-git/v5/plumbing"
10
"github.com/go-git/go-git/v5/plumbing/object"
11
"tangled.sh/tangled.sh/core/types"
12
)
13
···
118
Patch: patch.String(),
119
Diff: diffs,
120
}, nil
121
}
122
123
func (g *GitRepo) MergeBase(commit1, commit2 *object.Commit) (*object.Commit, error) {
···
1
package git
2
3
import (
4
+
"bytes"
5
"fmt"
6
"log"
7
+
"os"
8
+
"os/exec"
9
"strings"
10
11
"github.com/bluekeyes/go-gitdiff/gitdiff"
12
"github.com/go-git/go-git/v5/plumbing"
13
"github.com/go-git/go-git/v5/plumbing/object"
14
+
"tangled.sh/tangled.sh/core/patchutil"
15
"tangled.sh/tangled.sh/core/types"
16
)
17
···
122
Patch: patch.String(),
123
Diff: diffs,
124
}, nil
125
+
}
126
+
127
+
// FormatPatch generates a git-format-patch output between two commits,
128
+
// and returns the raw format-patch series, a parsed FormatPatch and an error.
129
+
func (g *GitRepo) FormatPatch(base, commit2 *object.Commit) (string, []patchutil.FormatPatch, error) {
130
+
var stdout bytes.Buffer
131
+
cmd := exec.Command(
132
+
"git",
133
+
"-C",
134
+
g.path,
135
+
"format-patch",
136
+
fmt.Sprintf("%s..%s", base.Hash.String(), commit2.Hash.String()),
137
+
"--stdout",
138
+
)
139
+
cmd.Stdout = &stdout
140
+
cmd.Stderr = os.Stderr
141
+
err := cmd.Run()
142
+
if err != nil {
143
+
return "", nil, err
144
+
}
145
+
146
+
formatPatch, err := patchutil.ExtractPatches(stdout.String())
147
+
if err != nil {
148
+
return "", nil, err
149
+
}
150
+
151
+
return stdout.String(), formatPatch, nil
152
}
153
154
func (g *GitRepo) MergeBase(commit1, commit2 *object.Commit) (*object.Commit, error) {
+7
-2
knotserver/routes.go
+7
-2
knotserver/routes.go
···
808
return
809
}
810
811
-
difftree, err := gr.DiffTree(mergeBase, commit2)
812
if err != nil {
813
l.Error("error comparing revisions", "msg", err.Error())
814
writeError(w, "error comparing revisions", http.StatusBadRequest)
815
return
816
}
817
818
-
writeJSON(w, types.RepoDiffTreeResponse{difftree})
819
return
820
}
821
···
808
return
809
}
810
811
+
rawPatch, formatPatch, err := gr.FormatPatch(mergeBase, commit2)
812
if err != nil {
813
l.Error("error comparing revisions", "msg", err.Error())
814
writeError(w, "error comparing revisions", http.StatusBadRequest)
815
return
816
}
817
818
+
writeJSON(w, types.RepoFormatPatchResponse{
819
+
Rev1: commit1.Hash.String(),
820
+
Rev2: commit2.Hash.String(),
821
+
FormatPatch: formatPatch,
822
+
Patch: rawPatch,
823
+
})
824
return
825
}
826