forked from tangled.org/core
this repo has no description

knotserver: git: format-patch for ref comparisons

Changed files
+38 -2
knotserver
+31
knotserver/git/diff.go
···
package git
import (
+
"bytes"
"fmt"
"log"
+
"os"
+
"os/exec"
"strings"
"github.com/bluekeyes/go-gitdiff/gitdiff"
"github.com/go-git/go-git/v5/plumbing"
"github.com/go-git/go-git/v5/plumbing/object"
+
"tangled.sh/tangled.sh/core/patchutil"
"tangled.sh/tangled.sh/core/types"
)
···
Patch: patch.String(),
Diff: diffs,
}, nil
+
}
+
+
// FormatPatch generates a git-format-patch output between two commits,
+
// and returns the raw format-patch series, a parsed FormatPatch and an error.
+
func (g *GitRepo) FormatPatch(base, commit2 *object.Commit) (string, []patchutil.FormatPatch, error) {
+
var stdout bytes.Buffer
+
cmd := exec.Command(
+
"git",
+
"-C",
+
g.path,
+
"format-patch",
+
fmt.Sprintf("%s..%s", base.Hash.String(), commit2.Hash.String()),
+
"--stdout",
+
)
+
cmd.Stdout = &stdout
+
cmd.Stderr = os.Stderr
+
err := cmd.Run()
+
if err != nil {
+
return "", nil, err
+
}
+
+
formatPatch, err := patchutil.ExtractPatches(stdout.String())
+
if err != nil {
+
return "", nil, err
+
}
+
+
return stdout.String(), formatPatch, nil
}
func (g *GitRepo) MergeBase(commit1, commit2 *object.Commit) (*object.Commit, error) {
+7 -2
knotserver/routes.go
···
return
}
-
difftree, err := gr.DiffTree(mergeBase, commit2)
+
rawPatch, formatPatch, err := gr.FormatPatch(mergeBase, commit2)
if err != nil {
l.Error("error comparing revisions", "msg", err.Error())
writeError(w, "error comparing revisions", http.StatusBadRequest)
return
}
-
writeJSON(w, types.RepoDiffTreeResponse{difftree})
+
writeJSON(w, types.RepoFormatPatchResponse{
+
Rev1: commit1.Hash.String(),
+
Rev2: commit2.Hash.String(),
+
FormatPatch: formatPatch,
+
Patch: rawPatch,
+
})
return
}