forked from tangled.org/core
Monorepo for Tangled

knotserver: git: format-patch for ref comparisons

authored by anirudh.fi and committed by oppi.li e1357392 01c324e2

Changed files
+38 -2
knotserver
+31
knotserver/git/diff.go
··· 1 1 package git 2 2 3 3 import ( 4 + "bytes" 4 5 "fmt" 5 6 "log" 7 + "os" 8 + "os/exec" 6 9 "strings" 7 10 8 11 "github.com/bluekeyes/go-gitdiff/gitdiff" 9 12 "github.com/go-git/go-git/v5/plumbing" 10 13 "github.com/go-git/go-git/v5/plumbing/object" 14 + "tangled.sh/tangled.sh/core/patchutil" 11 15 "tangled.sh/tangled.sh/core/types" 12 16 ) 13 17 ··· 118 122 Patch: patch.String(), 119 123 Diff: diffs, 120 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 121 152 } 122 153 123 154 func (g *GitRepo) MergeBase(commit1, commit2 *object.Commit) (*object.Commit, error) {
+7 -2
knotserver/routes.go
··· 808 808 return 809 809 } 810 810 811 - difftree, err := gr.DiffTree(mergeBase, commit2) 811 + rawPatch, formatPatch, err := gr.FormatPatch(mergeBase, commit2) 812 812 if err != nil { 813 813 l.Error("error comparing revisions", "msg", err.Error()) 814 814 writeError(w, "error comparing revisions", http.StatusBadRequest) 815 815 return 816 816 } 817 817 818 - writeJSON(w, types.RepoDiffTreeResponse{difftree}) 818 + writeJSON(w, types.RepoFormatPatchResponse{ 819 + Rev1: commit1.Hash.String(), 820 + Rev2: commit2.Hash.String(), 821 + FormatPatch: formatPatch, 822 + Patch: rawPatch, 823 + }) 819 824 return 820 825 } 821 826