gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. // Copyright 2024 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package repository
  4. import (
  5. "context"
  6. "fmt"
  7. "os"
  8. "time"
  9. repo_model "code.gitea.io/gitea/models/repo"
  10. user_model "code.gitea.io/gitea/models/user"
  11. "code.gitea.io/gitea/modules/git/gitcmd"
  12. "code.gitea.io/gitea/modules/log"
  13. repo_module "code.gitea.io/gitea/modules/repository"
  14. "code.gitea.io/gitea/modules/setting"
  15. asymkey_service "code.gitea.io/gitea/services/asymkey"
  16. )
  17. // initRepoCommit temporarily changes with work directory.
  18. func initRepoCommit(ctx context.Context, tmpPath string, repo *repo_model.Repository, u *user_model.User, defaultBranch string) (err error) {
  19. commitTimeStr := time.Now().Format(time.RFC3339)
  20. sig := u.NewGitSig()
  21. // Because this may call hooks we should pass in the environment
  22. env := append(os.Environ(),
  23. "GIT_AUTHOR_NAME="+sig.Name,
  24. "GIT_AUTHOR_EMAIL="+sig.Email,
  25. "GIT_AUTHOR_DATE="+commitTimeStr,
  26. "GIT_COMMITTER_DATE="+commitTimeStr,
  27. )
  28. committerName := sig.Name
  29. committerEmail := sig.Email
  30. if stdout, _, err := gitcmd.NewCommand("add", "--all").
  31. RunStdString(ctx, &gitcmd.RunOpts{Dir: tmpPath}); err != nil {
  32. log.Error("git add --all failed: Stdout: %s\nError: %v", stdout, err)
  33. return fmt.Errorf("git add --all: %w", err)
  34. }
  35. cmd := gitcmd.NewCommand("commit", "--message=Initial commit").
  36. AddOptionFormat("--author='%s <%s>'", sig.Name, sig.Email)
  37. sign, key, signer, _ := asymkey_service.SignInitialCommit(ctx, tmpPath, u)
  38. if sign {
  39. if key.Format != "" {
  40. cmd.AddConfig("gpg.format", key.Format)
  41. }
  42. cmd.AddOptionFormat("-S%s", key.KeyID)
  43. if repo.GetTrustModel() == repo_model.CommitterTrustModel || repo.GetTrustModel() == repo_model.CollaboratorCommitterTrustModel {
  44. // need to set the committer to the KeyID owner
  45. committerName = signer.Name
  46. committerEmail = signer.Email
  47. }
  48. } else {
  49. cmd.AddArguments("--no-gpg-sign")
  50. }
  51. env = append(env,
  52. "GIT_COMMITTER_NAME="+committerName,
  53. "GIT_COMMITTER_EMAIL="+committerEmail,
  54. )
  55. if stdout, _, err := cmd.
  56. RunStdString(ctx, &gitcmd.RunOpts{Dir: tmpPath, Env: env}); err != nil {
  57. log.Error("Failed to commit: %v: Stdout: %s\nError: %v", cmd.LogString(), stdout, err)
  58. return fmt.Errorf("git commit: %w", err)
  59. }
  60. if len(defaultBranch) == 0 {
  61. defaultBranch = setting.Repository.DefaultBranch
  62. }
  63. if stdout, _, err := gitcmd.NewCommand("push", "origin").AddDynamicArguments("HEAD:"+defaultBranch).
  64. RunStdString(ctx, &gitcmd.RunOpts{Dir: tmpPath, Env: repo_module.InternalPushingEnvironment(u, repo)}); err != nil {
  65. log.Error("Failed to push back to HEAD: Stdout: %s\nError: %v", stdout, err)
  66. return fmt.Errorf("git push: %w", err)
  67. }
  68. return nil
  69. }