From 7b7e20e60c1c6b858ae0c4eb78d414912263642f Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Sun, 06 Apr 2025 01:30:02 +0800 Subject: [PATCH] oldgit: Separate some go-git stuff into here --- git_format_patch.go => internal/oldgit/fmtpatch.go | 8 ++++---- git_misc.go | 32 -------------------------------- http_handle_repo_commit.go | 5 +++-- internal/oldgit/patch.go | 39 +++++++++++++++++++++++++++++++++++++++ diff --git a/git_format_patch.go b/internal/oldgit/fmtpatch.go rename from git_format_patch.go rename to internal/oldgit/fmtpatch.go index 5628ce13c82a4fc3a186dee168483b51ffdcc63b..79be5d870f8705a342292c87532a161ef808c6fe 100644 --- a/git_format_patch.go +++ b/internal/oldgit/fmtpatch.go @@ -1,7 +1,7 @@ // SPDX-License-Identifier: AGPL-3.0-only // SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu -package forge +package oldgit import ( "bytes" @@ -12,16 +12,16 @@ "github.com/go-git/go-git/v5/plumbing/object" ) -// fmtCommitPatch formats a commit object as if it was returned by +// FmtCommitPatch formats a commit object as if it was returned by // git-format-patch. -func fmtCommitPatch(commit *object.Commit) (final string, err error) { +func FmtCommitPatch(commit *object.Commit) (final string, err error) { var patch *object.Patch var buf bytes.Buffer var author object.Signature var date string var commitTitle, commitDetails string - if _, patch, err = commitToPatch(commit); err != nil { + if _, patch, err = CommitToPatch(commit); err != nil { return "", err } diff --git a/git_misc.go b/git_misc.go index 40247f1bc2db1b78128f8e9c5341b9500785d768..83ee11c1a38d755008f0ce46e0b807ad94bee81a 100644 --- a/git_misc.go +++ b/git_misc.go @@ -10,7 +10,6 @@ "io" "iter" "github.com/go-git/go-git/v5" - "github.com/go-git/go-git/v5/plumbing" "github.com/go-git/go-git/v5/plumbing/object" "github.com/jackc/pgx/v5/pgtype" ) @@ -86,34 +85,3 @@ } } }, &err } - -// commitToPatch creates an [object.Patch] from the first parent of a given -// [object.Commit]. -// -// TODO: This function should be deprecated as it only diffs with the first -// parent and does not correctly handle merge commits. -func commitToPatch(commit *object.Commit) (parentCommitHash plumbing.Hash, patch *object.Patch, err error) { - var parentCommit *object.Commit - var commitTree *object.Tree - - parentCommit, err = commit.Parent(0) - switch { - case errors.Is(err, object.ErrParentNotFound): - if commitTree, err = commit.Tree(); err != nil { - return - } - if patch, err = nullTree.Patch(commitTree); err != nil { - return - } - case err != nil: - return - default: - parentCommitHash = parentCommit.Hash - if patch, err = parentCommit.Patch(commit); err != nil { - return - } - } - return -} - -var nullTree object.Tree //nolint:gochecknoglobals diff --git a/http_handle_repo_commit.go b/http_handle_repo_commit.go index 196489fec4800f38115cef39c51ee57a2e756371..22ee20d1e4365851d463249c82d9e99eb685d629 100644 --- a/http_handle_repo_commit.go +++ b/http_handle_repo_commit.go @@ -14,6 +14,7 @@ "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/forge/internal/misc" + "go.lindenii.runxiyu.org/forge/internal/oldgit" "go.lindenii.runxiyu.org/forge/internal/web" ) @@ -52,7 +53,7 @@ return } if commitIDStrSpecNoSuffix != commitIDStrSpec { var patchStr string - if patchStr, err = fmtCommitPatch(commitObj); err != nil { + if patchStr, err = oldgit.FmtCommitPatch(commitObj); err != nil { web.ErrorPage500(s.templates, writer, params, "Error formatting patch: "+err.Error()) return } @@ -69,7 +70,7 @@ params["commit_object"] = commitObj params["commit_id"] = commitIDStr - parentCommitHash, patch, err = commitToPatch(commitObj) + parentCommitHash, patch, err = oldgit.CommitToPatch(commitObj) if err != nil { web.ErrorPage500(s.templates, writer, params, "Error getting patch from commit: "+err.Error()) return diff --git a/internal/oldgit/patch.go b/internal/oldgit/patch.go new file mode 100644 index 0000000000000000000000000000000000000000..329bdfb8b9bd9062503cf24ef1d348a6bafb2d37 --- /dev/null +++ b/internal/oldgit/patch.go @@ -0,0 +1,39 @@ +package oldgit + +import ( + "errors" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/object" +) + +// CommitToPatch creates an [object.Patch] from the first parent of a given +// [object.Commit]. +// +// TODO: This function should be deprecated as it only diffs with the first +// parent and does not correctly handle merge commits. +func CommitToPatch(commit *object.Commit) (parentCommitHash plumbing.Hash, patch *object.Patch, err error) { + var parentCommit *object.Commit + var commitTree *object.Tree + + parentCommit, err = commit.Parent(0) + switch { + case errors.Is(err, object.ErrParentNotFound): + if commitTree, err = commit.Tree(); err != nil { + return + } + if patch, err = NullTree.Patch(commitTree); err != nil { + return + } + case err != nil: + return + default: + parentCommitHash = parentCommit.Hash + if patch, err = parentCommit.Patch(commit); err != nil { + return + } + } + return +} + +var NullTree object.Tree //nolint:gochecknoglobals -- 2.48.1