From 24d66ad693eee6df6df37be8b64d594221a6221e Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Wed, 12 Feb 2025 01:42:38 +0800 Subject: [PATCH] repo_commit: Fix format_patch handling of root commits --- git_format_patch.go | 13 ++----------- git_misc.go | 30 ++++++++++++++++++++++++++++++ handle_repo_commit.go | 29 ++--------------------------- diff --git a/git_format_patch.go b/git_format_patch.go index 1f282fa440054efd54f958008f39b0960562bfd6..4f37e92e9fb01bccb0023ce828322fdfdc704bff 100644 --- a/git_format_patch.go +++ b/git_format_patch.go @@ -2,7 +2,6 @@ package main import ( "bytes" - "errors" "fmt" "strings" "time" @@ -11,18 +10,10 @@ "github.com/go-git/go-git/v5/plumbing/object" "go.lindenii.runxiyu.org/lindenii-common/misc" ) -var err_get_patch = errors.New("Failed to get patch from commit") - func format_patch_from_commit(commit *object.Commit) (string, error) { - parent, err := commit.Parent(0) + _, patch, err := get_patch_from_commit(commit) if err != nil { - return "", err - } - - var patch *object.Patch - patch, err = parent.Patch(commit) - if err != nil { - return "", misc.Wrap_one_error(err_get_patch, err) + return "", misc.Wrap_one_error(err_getting_patch_of_commit, err) } var buf bytes.Buffer diff --git a/git_misc.go b/git_misc.go index 851fb683f03ed66ce924dea9170edfa7975994c8..c6ec9f9212154db252ac99ee2ecc32496ccde9b9 100644 --- a/git_misc.go +++ b/git_misc.go @@ -13,6 +13,9 @@ "go.lindenii.runxiyu.org/lindenii-common/misc" ) var err_unsafe_path = errors.New("Unsafe path") +var err_getting_commit_tree = errors.New("Error getting commit tree") +var err_getting_patch_of_commit = errors.New("Error getting patch of commit") +var err_getting_parent_commit_object = errors.New("Error getting parent commit object") func open_git_repo(group_name, repo_name string) (*git.Repository, error) { group_name, group_name_ok := misc.Sanitize_path(group_name) @@ -82,3 +85,30 @@ } } return recent_commits, err } + +func get_patch_from_commit(commit_object *object.Commit) (parent_commit_hash plumbing.Hash, patch *object.Patch, ret_err error) { + parent_commit_object, err := commit_object.Parent(0) + if errors.Is(err, object.ErrParentNotFound) { + commit_tree, err := commit_object.Tree() + if err != nil { + ret_err = misc.Wrap_one_error(err_getting_commit_tree, err) + return + } + patch, err = (&object.Tree{}).Patch(commit_tree) + if err != nil { + ret_err = misc.Wrap_one_error(err_getting_patch_of_commit, err) + return + } + } else if err != nil { + ret_err = misc.Wrap_one_error(err_getting_parent_commit_object, err) + return + } else { + parent_commit_hash = parent_commit_object.Hash + patch, err = parent_commit_object.Patch(commit_object) + if err != nil { + ret_err = misc.Wrap_one_error(err_getting_patch_of_commit, err) + return + } + } + return +} diff --git a/handle_repo_commit.go b/handle_repo_commit.go index 03a7cd4b92dca385a2d5d10415451b6223bf0d8a..aeea380317c734f3b17f8d334c15465201141abc 100644 --- a/handle_repo_commit.go +++ b/handle_repo_commit.go @@ -1,14 +1,12 @@ package main import ( - "errors" "net/http" "strings" "github.com/go-git/go-git/v5/plumbing" "github.com/go-git/go-git/v5/plumbing/filemode" "github.com/go-git/go-git/v5/plumbing/format/diff" - "github.com/go-git/go-git/v5/plumbing/object" "go.lindenii.runxiyu.org/lindenii-common/misc" ) @@ -53,31 +51,8 @@ data["commit_object"] = commit_object data["commit_id"] = commit_id_string - var patch *object.Patch - parent_commit_object, err := commit_object.Parent(0) - if errors.Is(err, object.ErrParentNotFound) { - commit_tree, err := commit_object.Tree() - if err != nil { - _, _ = w.Write([]byte("Error getting commit tree (for comparing against an empty tree): " + err.Error())) - return - } - patch, err = (&object.Tree{}).Patch(commit_tree) - if err != nil { - _, _ = w.Write([]byte("Error getting patch of commit: " + err.Error())) - return - } - } else if err != nil { - _, _ = w.Write([]byte("Error getting parent commit object: " + err.Error())) - return - } else { - data["parent_commit_hash"] = parent_commit_object.Hash.String() - - patch, err = parent_commit_object.Patch(commit_object) - if err != nil { - _, _ = w.Write([]byte("Error getting patch of commit: " + err.Error())) - return - } - } + parent_commit_hash, patch, err := get_patch_from_commit(commit_object) + data["parent_commit_hash"] = parent_commit_hash.String() data["patch"] = patch // TODO: Remove unnecessary context -- 2.48.1