From 2885c5b4d27d913c04fa680d46ce5d9febe5643d Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Sun, 7 Jun 2026 08:29:52 +0000 Subject: internal/testgit: CommitTree should accept identities --- internal/testgit/command.go | 16 +++++++++++++++ internal/testgit/commit.go | 49 +++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 61 insertions(+), 4 deletions(-) diff --git a/internal/testgit/command.go b/internal/testgit/command.go index a7d8651a..dc960877 100644 --- a/internal/testgit/command.go +++ b/internal/testgit/command.go @@ -3,6 +3,8 @@ package testgit import ( "io" "os/exec" + "slices" + "strings" "testing" ) @@ -34,3 +36,17 @@ func (repo *Repo) Run( return cmd.Output() //nolint:wrapcheck } + +func setEnv(env []string, key string, value string) []string { + prefix := key + "=" + i := slices.IndexFunc(env, func(entry string) bool { + return strings.HasPrefix(entry, prefix) + }) + if i >= 0 { + env[i] = prefix + value + + return env + } + + return append(env, prefix+value) +} diff --git a/internal/testgit/commit.go b/internal/testgit/commit.go index 09a5438d..b33b8904 100644 --- a/internal/testgit/commit.go +++ b/internal/testgit/commit.go @@ -8,19 +8,60 @@ import ( "lindenii.org/go/furgit/object/id" ) +// CommitTreeIdentity configures an author or committer identity +// for [Repo.CommitTree]. +type CommitTreeIdentity struct { + Name string + Email string +} + +// CommitTreeOptions configures [Repo.CommitTree]. +type CommitTreeOptions struct { + Message string + Author CommitTreeIdentity + Committer CommitTreeIdentity + AuthorDate string + CommitterDate string +} + // CommitTree creates a commit object from a tree and optional parents, // and returns its object ID. -func (repo *Repo) CommitTree(tb testing.TB, tree id.ObjectID, message string, parents ...id.ObjectID) (id.ObjectID, error) { +func (repo *Repo) CommitTree( + tb testing.TB, + tree id.ObjectID, + opts CommitTreeOptions, + parents ...id.ObjectID, +) (id.ObjectID, error) { tb.Helper() - args := []string{"commit-tree", tree.String()} + args := []string{"commit-tree"} for _, parent := range parents { args = append(args, "-p", parent.String()) } - args = append(args, "-m", message) + args = append(args, "-m", opts.Message, "--end-of-options", tree.String()) + + cmd := repo.Command(tb, "git", args...) + if opts.Author.Name != "" { + cmd.Env = setEnv(cmd.Env, "GIT_AUTHOR_NAME", opts.Author.Name) + } + if opts.Author.Email != "" { + cmd.Env = setEnv(cmd.Env, "GIT_AUTHOR_EMAIL", opts.Author.Email) + } + if opts.AuthorDate != "" { + cmd.Env = setEnv(cmd.Env, "GIT_AUTHOR_DATE", opts.AuthorDate) + } + if opts.Committer.Name != "" { + cmd.Env = setEnv(cmd.Env, "GIT_COMMITTER_NAME", opts.Committer.Name) + } + if opts.Committer.Email != "" { + cmd.Env = setEnv(cmd.Env, "GIT_COMMITTER_EMAIL", opts.Committer.Email) + } + if opts.CommitterDate != "" { + cmd.Env = setEnv(cmd.Env, "GIT_COMMITTER_DATE", opts.CommitterDate) + } - stdout, err := repo.Run(tb, nil, "git", args...) + stdout, err := cmd.Output() if err != nil { return id.ObjectID{}, fmt.Errorf("commit-tree: %w", err) } -- cgit v1.3.1-10-gc9f91