From 1fbe4366a0c29a293ab162be547402cc0a9892bf Mon Sep 17 00:00:00 2001 From: Carlo Cabrera Date: Sun, 10 Nov 2024 23:31:01 +0800 Subject: [PATCH] Support setting `GIT_COMMITTER_NAME` and `GIT_COMMITTER_EMAIL` Our autobump workflow sets the author and committer to the user who triggered the workflow, defaulting to @BrewTestBot for scheduled runs. This can be confusing for maintainers when GitHub shows up as "Unverified" because the commit is signed with @BrewTestBot's key.[^1] Let's fix that by configuring our autobump workflow to always commit as @BrewTestBot, so that the committer matches the GPG signature. To do that, we need to add support for setting `GIT_COMMITTER_NAME` and `GIT_COMMITTER_EMAIL`. [^1]: See, for example, Homebrew/homebrew-core#197234. --- Library/Homebrew/env_config.rb | 12 ++++++++++-- .../sorbet/rbi/dsl/homebrew/env_config.rbi | 6 ++++++ Library/Homebrew/utils/git.rb | 15 ++++++++++++--- Library/Homebrew/utils/github.rb | 1 + 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/Library/Homebrew/env_config.rb b/Library/Homebrew/env_config.rb index a3b3124e36f0f..e201d223984cd 100644 --- a/Library/Homebrew/env_config.rb +++ b/Library/Homebrew/env_config.rb @@ -273,11 +273,19 @@ module EnvConfig HOMEBREW_GITHUB_PACKAGES_USER: { description: "Use this username when accessing the GitHub Packages Registry (where bottles may be stored).", }, + HOMEBREW_GIT_COMMITTER_EMAIL: { + description: "Set the Git committer email to this value.", + }, + HOMEBREW_GIT_COMMITTER_NAME: { + description: "Set the Git committer name to this value.", + }, HOMEBREW_GIT_EMAIL: { - description: "Set the Git author and committer email to this value.", + description: "Set the Git author name and, if `HOMEBREW_GIT_COMMITTER_EMAIL` is unset, committer email to " \ + "this value.", }, HOMEBREW_GIT_NAME: { - description: "Set the Git author and committer name to this value.", + description: "Set the Git author name and, if `HOMEBREW_GIT_COMMITTER_NAME` is unset, committer name to " \ + "this value.", }, HOMEBREW_GIT_PATH: { description: "Linux only: Set this value to a new enough `git` executable for Homebrew to use.", diff --git a/Library/Homebrew/sorbet/rbi/dsl/homebrew/env_config.rbi b/Library/Homebrew/sorbet/rbi/dsl/homebrew/env_config.rbi index d8e7fbb8b290b..31f11f8b65778 100644 --- a/Library/Homebrew/sorbet/rbi/dsl/homebrew/env_config.rbi +++ b/Library/Homebrew/sorbet/rbi/dsl/homebrew/env_config.rbi @@ -160,6 +160,12 @@ module Homebrew::EnvConfig sig { returns(T.nilable(::String)) } def ftp_proxy; end + sig { returns(T.nilable(::String)) } + def git_committer_email; end + + sig { returns(T.nilable(::String)) } + def git_committer_name; end + sig { returns(T.nilable(::String)) } def git_email; end diff --git a/Library/Homebrew/utils/git.rb b/Library/Homebrew/utils/git.rb index cd7649f7defd1..994ae07ca263a 100644 --- a/Library/Homebrew/utils/git.rb +++ b/Library/Homebrew/utils/git.rb @@ -119,10 +119,19 @@ def self.set_name_email!(author: true, committer: true) ENV["GIT_COMMITTER_NAME"] = Homebrew::EnvConfig.git_name if committer end - return unless Homebrew::EnvConfig.git_email + if Homebrew::EnvConfig.git_committer_name && committer + ENV["GIT_COMMITTER_NAME"] = Homebrew::EnvConfig.git_committer_name + end + + if Homebrew::EnvConfig.git_email + ENV["GIT_AUTHOR_EMAIL"] = Homebrew::EnvConfig.git_email if author + ENV["GIT_COMMITTER_EMAIL"] = Homebrew::EnvConfig.git_email if committer + end + + return unless committer + return unless Homebrew::EnvConfig.git_committer_email - ENV["GIT_AUTHOR_EMAIL"] = Homebrew::EnvConfig.git_email if author - ENV["GIT_COMMITTER_EMAIL"] = Homebrew::EnvConfig.git_email if committer + ENV["GIT_COMMITTER_EMAIL"] = Homebrew::EnvConfig.git_committer_email end def self.setup_gpg! diff --git a/Library/Homebrew/utils/github.rb b/Library/Homebrew/utils/github.rb index 903116d46d255..64d1186ed25cf 100644 --- a/Library/Homebrew/utils/github.rb +++ b/Library/Homebrew/utils/github.rb @@ -756,6 +756,7 @@ def self.create_bump_pr(info, args:) safe_system "git", "add", *changed_files safe_system "git", "checkout", "--no-track", "-b", branch, "#{remote}/#{remote_branch}" unless args.commit? + Utils::Git.set_name_email! safe_system "git", "commit", "--no-edit", "--verbose", "--message=#{commit_message}", "--", *changed_files