Mirror of @tangled.org/core. Running on a Raspberry Pi Zero 2 (Please be gentle).

knotserver: git: format-patch for ref comparisons

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

+38 -2
+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 ··· 122 118 Patch: patch.String(), 123 119 Diff: diffs, 124 120 }, nil 121 + } 122 + 123 + // FormatPatch generates a git-format-patch output between two commits, 124 + // and returns the raw format-patch series, a parsed FormatPatch and an error. 125 + func (g *GitRepo) FormatPatch(base, commit2 *object.Commit) (string, []patchutil.FormatPatch, error) { 126 + var stdout bytes.Buffer 127 + cmd := exec.Command( 128 + "git", 129 + "-C", 130 + g.path, 131 + "format-patch", 132 + fmt.Sprintf("%s..%s", base.Hash.String(), commit2.Hash.String()), 133 + "--stdout", 134 + ) 135 + cmd.Stdout = &stdout 136 + cmd.Stderr = os.Stderr 137 + err := cmd.Run() 138 + if err != nil { 139 + return "", nil, err 140 + } 141 + 142 + formatPatch, err := patchutil.ExtractPatches(stdout.String()) 143 + if err != nil { 144 + return "", nil, err 145 + } 146 + 147 + return stdout.String(), formatPatch, nil 125 148 } 126 149 127 150 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