ATProto Browser

ATProto Browser

Experimental browser for the Atmosphere

Record data

{
  "uri": "at://did:plc:qfpnj4og54vl56wngdriaxug/sh.tangled.repo.pull/3lm5mu7zj3a22",
  "cid": "bafyreicyofgklqzpealtussbshvd74ako3f4wtca3qeehbnzjjbkcghqum",
  "value": {
    "$type": "sh.tangled.repo.pull",
    "patch": "diff --git a/knotserver/git/diff.go b/knotserver/git/diff.go\nindex 59db755ee1c33ee453321cb134dbe0846f5944aa..3ee87b9853441f2e8f287b24d00614af44d83f30 100644\n--- a/knotserver/git/diff.go\n+++ b/knotserver/git/diff.go\n@@ -86,17 +86,7 @@\n \treturn &nd, nil\n }\n \n-func (g *GitRepo) DiffTree(rev1, rev2 string) (*types.DiffTree, error) {\n-\tcommit1, err := g.resolveRevision(rev1)\n-\tif err != nil {\n-\t\treturn nil, fmt.Errorf(\"Invalid revision: %s\", rev1)\n-\t}\n-\n-\tcommit2, err := g.resolveRevision(rev2)\n-\tif err != nil {\n-\t\treturn nil, fmt.Errorf(\"Invalid revision: %s\", rev2)\n-\t}\n-\n+func (g *GitRepo) DiffTree(commit1, commit2 *object.Commit) (*types.DiffTree, error) {\n \ttree1, err := commit1.Tree()\n \tif err != nil {\n \t\treturn nil, err\n@@ -130,7 +120,29 @@ \t\tDiff:  diffs,\n \t}, nil\n }\n \n-func (g *GitRepo) resolveRevision(revStr string) (*object.Commit, error) {\n+func (g *GitRepo) MergeBase(commit1, commit2 *object.Commit) (*object.Commit, error) {\n+\tisAncestor, err := commit1.IsAncestor(commit2)\n+\tif err != nil {\n+\t\treturn nil, err\n+\t}\n+\n+\tif isAncestor {\n+\t\treturn commit1, nil\n+\t}\n+\n+\tmergeBase, err := commit1.MergeBase(commit2)\n+\tif err != nil {\n+\t\treturn nil, err\n+\t}\n+\n+\tif len(mergeBase) == 0 {\n+\t\treturn nil, fmt.Errorf(\"failed to find a merge-base\")\n+\t}\n+\n+\treturn mergeBase[0], nil\n+}\n+\n+func (g *GitRepo) ResolveRevision(revStr string) (*object.Commit, error) {\n \trev, err := g.r.ResolveRevision(plumbing.Revision(revStr))\n \tif err != nil {\n \t\treturn nil, fmt.Errorf(\"resolving revision %s: %w\", revStr, err)\ndiff --git a/knotserver/routes.go b/knotserver/routes.go\nindex 4d1b7323300725c085e00452d02c02102572367f..c56d9c3645cf76f6d0be0c97722200c22558dc5e 100644\n--- a/knotserver/routes.go\n+++ b/knotserver/routes.go\n@@ -775,7 +775,28 @@ \t\tnotFound(w)\n \t\treturn\n \t}\n \n-\tdifftree, err := gr.DiffTree(rev1, rev2)\n+\tcommit1, err := gr.ResolveRevision(rev1)\n+\tif err != nil {\n+\t\tl.Error(\"error resolving revision 1\", \"msg\", err.Error())\n+\t\twriteError(w, fmt.Sprintf(\"error resolving revision %s\", rev1), http.StatusBadRequest)\n+\t\treturn\n+\t}\n+\n+\tcommit2, err := gr.ResolveRevision(rev2)\n+\tif err != nil {\n+\t\tl.Error(\"error resolving revision 2\", \"msg\", err.Error())\n+\t\twriteError(w, fmt.Sprintf(\"error resolving revision %s\", rev2), http.StatusBadRequest)\n+\t\treturn\n+\t}\n+\n+\tmergeBase, err := gr.MergeBase(commit1, commit2)\n+\tif err != nil {\n+\t\tl.Error(\"failed to find merge-base\", \"msg\", err.Error())\n+\t\twriteError(w, \"failed to calculate diff\", http.StatusBadRequest)\n+\t\treturn\n+\t}\n+\n+\tdifftree, err := gr.DiffTree(mergeBase, commit2)\n \tif err != nil {\n \t\tl.Error(\"error comparing revisions\", \"msg\", err.Error())\n \t\twriteError(w, \"error comparing revisions\", http.StatusBadRequest)\n",
    "title": "knotserver: use common ancestor to calculate diffs",
    "pullId": 28,
    "source": {
      "branch": "compare-merge-base"
    },
    "targetRepo": "at://did:plc:wshs7t2adsemcrrd4snkeqli/sh.tangled.repo/3liuighjy2h22",
    "targetBranch": "master"
  }
}