From 0a83dbcb9bd0d5a00c75b97c77a3cf2d401f7216 Mon Sep 17 00:00:00 2001 From: Sergei Gureev Date: Wed, 25 Jan 2023 22:23:34 +0200 Subject: [PATCH 1/2] feat(ops): Respect env variables when creating signatures --- src/ops.rs | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/src/ops.rs b/src/ops.rs index e31e78a..dc7ecbb 100644 --- a/src/ops.rs +++ b/src/ops.rs @@ -668,3 +668,62 @@ fn get_default_ssh_signing_key(config: &git2::Config) -> Result, Ok(Some(default_key.to_owned())) } + +/// Replacement for [`git2::Repository::signature`] that respects env variables +pub fn signature(repo: &git2::Repository) -> Result, git2::Error> { + let config_sig = repo.signature()?; + + let name = std::env::var_os("GIT_COMMITTER_NAME") + .map(|os| { + os.into_string().map_err(|os| { + git2::Error::new( + git2::ErrorCode::Unmerged, + git2::ErrorClass::Invalid, + format!( + "`GIT_COMMITTER_NAME` is not valid UTF-8: {}", + os.to_string_lossy() + ), + ) + }) + }) + .unwrap_or_else(|| { + config_sig.name().map(ToOwned::to_owned).ok_or_else(|| { + git2::Error::new( + git2::ErrorCode::Unmerged, + git2::ErrorClass::Invalid, + format!( + "name is not valid UTF-8: {}", + String::from_utf8_lossy(config_sig.name_bytes()) + ), + ) + }) + })?; + + let email = std::env::var_os("GIT_COMMITTER_EMAIL") + .map(|os| { + os.into_string().map_err(|os| { + git2::Error::new( + git2::ErrorCode::Unmerged, + git2::ErrorClass::Invalid, + format!( + "`GIT_COMMITTER_EMAIL` is not valid UTF-8: {}", + os.to_string_lossy() + ), + ) + }) + }) + .unwrap_or_else(|| { + config_sig.email().map(ToOwned::to_owned).ok_or_else(|| { + git2::Error::new( + git2::ErrorCode::Unmerged, + git2::ErrorClass::Invalid, + format!( + "email is not valid UTF-8: {}", + String::from_utf8_lossy(config_sig.email_bytes()) + ), + ) + }) + })?; + + git2::Signature::new(&name, &email, &config_sig.when()) +} From 585b1729dc48d3330c694b4055e57e1c399beaeb Mon Sep 17 00:00:00 2001 From: Sergei Gureev Date: Wed, 25 Jan 2023 22:23:34 +0200 Subject: [PATCH 2/2] fix: Use committer to select a signing key --- src/ops.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ops.rs b/src/ops.rs index dc7ecbb..2301a3c 100644 --- a/src/ops.rs +++ b/src/ops.rs @@ -117,7 +117,7 @@ pub fn cherry_pick( )); } - let mut sig = repo.signature()?; + let mut sig = signature(repo)?; if let (Some(name), Some(email)) = (sig.name(), sig.email()) { // For simple rebases, preserve the original commit time sig = git2::Signature::new(name, email, &cherry_commit.time())?.to_owned(); @@ -309,7 +309,7 @@ impl UserSign { let signing_key = config.get_string("user.signingkey").or_else( |_| -> Result<_, git2::Error> { - let sig = repo.signature()?; + let sig = signature(repo)?; Ok(sig.to_string()) }, )?; @@ -326,7 +326,7 @@ impl UserSign { let signing_key = config.get_string("user.signingkey").or_else( |_| -> Result<_, git2::Error> { - let sig = repo.signature()?; + let sig = signature(repo)?; Ok(sig.to_string()) }, )?; @@ -347,7 +347,7 @@ impl UserSign { .unwrap_or_else(|_| -> Result<_, git2::Error> { get_default_ssh_signing_key(config)?.map(Ok).unwrap_or_else( || -> Result<_, git2::Error> { - let sig = repo.signature()?; + let sig = signature(repo)?; Ok(sig.to_string()) }, )