From 8c8ed4ea8d5695b2417539fbeab81c8cf8b10032 Mon Sep 17 00:00:00 2001 From: Seongmin Lee Date: Mon, 6 Jul 2026 01:25:06 +0900 Subject: [PATCH] knotmirror/xrpc: `git.getMergeBase` Signed-off-by: Seongmin Lee --- knotmirror/xrpc/git_get_merge_base.go | 57 +++++++++++++++++++++++++++ knotmirror/xrpc/xrpc.go | 1 + 2 files changed, 58 insertions(+) create mode 100644 knotmirror/xrpc/git_get_merge_base.go diff --git a/knotmirror/xrpc/git_get_merge_base.go b/knotmirror/xrpc/git_get_merge_base.go new file mode 100644 index 00000000..f59722fa --- /dev/null +++ b/knotmirror/xrpc/git_get_merge_base.go @@ -0,0 +1,57 @@ +package xrpc + +import ( + "fmt" + "net/http" + "os/exec" + "strings" + + "github.com/bluesky-social/indigo/atproto/atclient" + "github.com/bluesky-social/indigo/atproto/syntax" + "tangled.org/core/api/tangled" +) + +func (x *Xrpc) GetMergeBase(w http.ResponseWriter, r *http.Request) { + var ( + repoQuery = r.URL.Query().Get("repo") + base = r.URL.Query().Get("base") + head = r.URL.Query().Get("head") + ) + + repo, err := syntax.ParseDID(repoQuery) + if err != nil { + writeJson(w, http.StatusBadRequest, atclient.ErrorBody{Name: "BadRequest", Message: fmt.Sprintf("repo parameter invalid: %s", repoQuery)}) + return + } + + if base == "" { + writeJson(w, http.StatusBadRequest, atclient.ErrorBody{Name: "BadRequest", Message: "missing base parameter"}) + return + } + if head == "" { + writeJson(w, http.StatusBadRequest, atclient.ErrorBody{Name: "BadRequest", Message: "missing head parameter"}) + return + } + + l := x.logger.With("method", "git.getMergeBase", "repo", repo, "base", base, "head", head) + l.Debug("request") + + ctx := r.Context() + + repoPath, err := x.makeRepoPath(ctx, repo) + if err != nil { + writeJson(w, http.StatusNotFound, atclient.ErrorBody{Name: "RepoNotFound", Message: fmt.Sprintf("unknown repository: %q", repo)}) + return + } + + cmd := exec.Command("git", "-C", repoPath, "merge-base", head, base) + out, err := cmd.Output() + if err != nil { + writeJson(w, http.StatusInternalServerError, atclient.ErrorBody{Name: "InternalError", Message: "failed to compute merge-base"}) + return + } + + writeJson(w, http.StatusOK, tangled.GitTempGetMergeBase_Output{ + Commit: strings.TrimSpace(string(out)), + }) +} diff --git a/knotmirror/xrpc/xrpc.go b/knotmirror/xrpc/xrpc.go index f6d308bd..aa2ebc6c 100644 --- a/knotmirror/xrpc/xrpc.go +++ b/knotmirror/xrpc/xrpc.go @@ -67,6 +67,7 @@ func (x *Xrpc) Router() http.Handler { // r.Get("/"+tangled.GitTempGetDiffNSID, x.GetDiff) // todo r.Get("/"+tangled.GitTempGetEntryNSID, x.GetEntry) // todo // r.Get("/"+tangled.GitTempGetHeadNSID, x.GetHead) // todo + r.Get("/"+tangled.GitTempGetMergeBaseNSID, x.GetMergeBase) r.Get("/"+tangled.GitTempGetTagNSID, x.GetTag) // using types.Response r.Get("/"+tangled.GitTempGetTreeNSID, x.GetTree) r.Get("/"+tangled.GitTempListBranchesNSID, x.ListBranches) // wip, unknown output -- 2.51.2