mirror of
https://github.com/go-gitea/gitea.git
synced 2026-01-26 17:29:42 +01:00
Most potential deadlock problems should have been fixed, and new code is unlikely to cause new problems with the new design. Also raise the minimum Git version required to 2.6.0 (released in 2015)
70 lines
1.8 KiB
Go
70 lines
1.8 KiB
Go
// Copyright 2015 The Gogs Authors. All rights reserved.
|
|
// Copyright 2019 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package git
|
|
|
|
import (
|
|
"bytes"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
|
|
"code.gitea.io/gitea/modules/git/gitcmd"
|
|
)
|
|
|
|
// CommitTreeOpts represents the possible options to CommitTree
|
|
type CommitTreeOpts struct {
|
|
Parents []string
|
|
Message string
|
|
Key *SigningKey
|
|
NoGPGSign bool
|
|
AlwaysSign bool
|
|
}
|
|
|
|
// CommitTree creates a commit from a given tree id for the user with provided message
|
|
func (repo *Repository) CommitTree(author, committer *Signature, tree *Tree, opts CommitTreeOpts) (ObjectID, error) {
|
|
commitTimeStr := time.Now().Format(time.RFC3339)
|
|
|
|
// Because this may call hooks we should pass in the environment
|
|
env := append(os.Environ(),
|
|
"GIT_AUTHOR_NAME="+author.Name,
|
|
"GIT_AUTHOR_EMAIL="+author.Email,
|
|
"GIT_AUTHOR_DATE="+commitTimeStr,
|
|
"GIT_COMMITTER_NAME="+committer.Name,
|
|
"GIT_COMMITTER_EMAIL="+committer.Email,
|
|
"GIT_COMMITTER_DATE="+commitTimeStr,
|
|
)
|
|
cmd := gitcmd.NewCommand("commit-tree").AddDynamicArguments(tree.ID.String())
|
|
|
|
for _, parent := range opts.Parents {
|
|
cmd.AddArguments("-p").AddDynamicArguments(parent)
|
|
}
|
|
|
|
messageBytes := new(bytes.Buffer)
|
|
_, _ = messageBytes.WriteString(opts.Message)
|
|
_, _ = messageBytes.WriteString("\n")
|
|
|
|
if opts.Key != nil {
|
|
if opts.Key.Format != "" {
|
|
cmd.AddConfig("gpg.format", opts.Key.Format)
|
|
}
|
|
cmd.AddOptionFormat("-S%s", opts.Key.KeyID)
|
|
} else if opts.AlwaysSign {
|
|
cmd.AddOptionFormat("-S")
|
|
}
|
|
|
|
if opts.NoGPGSign {
|
|
cmd.AddArguments("--no-gpg-sign")
|
|
}
|
|
|
|
stdout, _, err := cmd.WithEnv(env).
|
|
WithDir(repo.Path).
|
|
WithStdinBytes(messageBytes.Bytes()).
|
|
RunStdString(repo.Ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return NewIDFromString(strings.TrimSpace(stdout))
|
|
}
|