Skip to content

Commit 421e8f6

Browse files
committed
Extract commit_with_signature, sign_buffer, and signatures
1 parent 91524f7 commit 421e8f6

File tree

18 files changed

+333
-304
lines changed

18 files changed

+333
-304
lines changed

crates/gitbutler-branch-actions/src/branch_manager/branch_removal.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use gitbutler_oxidize::gix_to_git2_oid;
99
use gitbutler_oxidize::{git2_to_gix_object_id, GixRepositoryExt};
1010
use gitbutler_project::access::WorktreeWritePermission;
1111
use gitbutler_reference::{normalize_branch_name, ReferenceName, Refname};
12+
use gitbutler_repo::committing::RepositoryExt as _;
1213
use gitbutler_repo::RepositoryExt;
1314
use gitbutler_repo::SignaturePurpose;
1415
use gitbutler_repo_actions::RepoActionsExt;

crates/gitbutler-branch-actions/src/integration.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ use gitbutler_error::error::Marker;
1111
use gitbutler_operating_modes::OPEN_WORKSPACE_REFS;
1212
use gitbutler_oxidize::{git2_to_gix_object_id, gix_to_git2_oid, GixRepositoryExt};
1313
use gitbutler_project::access::WorktreeWritePermission;
14+
use gitbutler_repo::committing::RepositoryExt as _;
1415
use gitbutler_repo::logging::{LogUntil, RepositoryExt as _};
15-
use gitbutler_repo::RepositoryExt;
1616
use gitbutler_repo::SignaturePurpose;
1717
use gitbutler_stack::{Stack, VirtualBranchesHandle};
1818
use tracing::instrument;

crates/gitbutler-branch-actions/src/virtual.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ use gitbutler_oxidize::{
2828
use gitbutler_project::access::WorktreeWritePermission;
2929
use gitbutler_reference::{normalize_branch_name, Refname, RemoteRefname};
3030
use gitbutler_repo::{
31+
committing::RepositoryExt as _,
3132
logging::{LogUntil, RepositoryExt as _},
3233
rebase::{cherry_rebase, cherry_rebase_group},
3334
RepositoryExt,

crates/gitbutler-branch-actions/tests/extra/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use gitbutler_branch_actions::{
2020
};
2121
use gitbutler_commit::{commit_ext::CommitExt, commit_headers::CommitHeadersV2};
2222
use gitbutler_reference::{Refname, RemoteRefname};
23-
use gitbutler_repo::RepositoryExt;
23+
use gitbutler_repo::committing::RepositoryExt as _;
2424
use gitbutler_stack::{BranchOwnershipClaims, Target, VirtualBranchesHandle};
2525
use gitbutler_testsupport::{commit_all, virtual_branches::set_test_target, Case, Suite};
2626
use pretty_assertions::assert_eq;

crates/gitbutler-edit-mode/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ use gitbutler_operating_modes::{
2121
use gitbutler_oxidize::{git2_to_gix_object_id, gix_to_git2_index, GixRepositoryExt};
2222
use gitbutler_project::access::{WorktreeReadPermission, WorktreeWritePermission};
2323
use gitbutler_reference::{ReferenceName, Refname};
24+
use gitbutler_repo::committing::RepositoryExt as _;
25+
use gitbutler_repo::identity::RepositoryExt as _;
2426
use gitbutler_repo::{rebase::cherry_rebase, RepositoryExt};
2527
use gitbutler_repo::{signature, SignaturePurpose};
2628
use gitbutler_stack::{Stack, VirtualBranchesHandle};

crates/gitbutler-repo-actions/src/repository.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ use gitbutler_stack::{Stack, StackId};
1010

1111
use crate::askpass;
1212
use gitbutler_repo::{
13+
committing::RepositoryExt as _,
1314
credentials,
15+
identity::RepositoryExt as _,
1416
logging::{LogUntil, RepositoryExt as _},
1517
RepositoryExt,
1618
};

crates/gitbutler-repo/src/commands.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::{remote::GitRemote, Config, RepositoryExt};
1+
use crate::{remote::GitRemote, sigining::sign_buffer, Config, RepositoryExt};
22
use anyhow::{bail, Result};
33
use base64::engine::Engine as _;
44
use git2::Oid;
@@ -138,7 +138,7 @@ impl RepoCommands for Project {
138138

139139
fn check_signing_settings(&self) -> Result<bool> {
140140
let ctx = CommandContext::open(self)?;
141-
let signed = ctx.repo().sign_buffer(b"test");
141+
let signed = sign_buffer(ctx.repo(), b"test");
142142
match signed {
143143
Ok(_) => Ok(true),
144144
Err(e) => Err(e),
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
use anyhow::{anyhow, Result};
2+
use gitbutler_commit::commit_headers::CommitHeadersV2;
3+
use gitbutler_config::git::{GbConfig, GitConfig as _};
4+
use gitbutler_error::error::Code;
5+
use gitbutler_oxidize::{git2_signature_to_gix_signature, git2_to_gix_object_id, gix_to_git2_oid};
6+
use gitbutler_reference::Refname;
7+
use gix::objs::WriteTo as _;
8+
9+
use crate::sigining::sign_buffer;
10+
11+
pub trait RepositoryExt {
12+
#[allow(clippy::too_many_arguments)]
13+
fn commit_with_signature(
14+
&self,
15+
update_ref: Option<&Refname>,
16+
author: &git2::Signature<'_>,
17+
committer: &git2::Signature<'_>,
18+
message: &str,
19+
tree: &git2::Tree<'_>,
20+
parents: &[&git2::Commit<'_>],
21+
commit_headers: Option<CommitHeadersV2>,
22+
) -> Result<git2::Oid>;
23+
}
24+
25+
impl RepositoryExt for git2::Repository {
26+
#[allow(clippy::too_many_arguments)]
27+
fn commit_with_signature(
28+
&self,
29+
update_ref: Option<&Refname>,
30+
author: &git2::Signature<'_>,
31+
committer: &git2::Signature<'_>,
32+
message: &str,
33+
tree: &git2::Tree<'_>,
34+
parents: &[&git2::Commit<'_>],
35+
commit_headers: Option<CommitHeadersV2>,
36+
) -> Result<git2::Oid> {
37+
let repo = gix::open(self.path())?;
38+
let mut commit = gix::objs::Commit {
39+
message: message.into(),
40+
tree: git2_to_gix_object_id(tree.id()),
41+
author: git2_signature_to_gix_signature(author),
42+
committer: git2_signature_to_gix_signature(committer),
43+
encoding: None,
44+
parents: parents
45+
.iter()
46+
.map(|commit| git2_to_gix_object_id(commit.id()))
47+
.collect(),
48+
extra_headers: commit_headers.unwrap_or_default().into(),
49+
};
50+
51+
if self.gb_config()?.sign_commits.unwrap_or(false) {
52+
let mut buf = Vec::new();
53+
commit.write_to(&mut buf)?;
54+
let signature = sign_buffer(self, &buf);
55+
match signature {
56+
Ok(signature) => {
57+
commit.extra_headers.push(("gpgsig".into(), signature));
58+
}
59+
Err(e) => {
60+
// If signing fails, set the "gitbutler.signCommits" config to false before erroring out
61+
self.set_gb_config(GbConfig {
62+
sign_commits: Some(false),
63+
..GbConfig::default()
64+
})?;
65+
return Err(
66+
anyhow!("Failed to sign commit: {}", e).context(Code::CommitSigningFailed)
67+
);
68+
}
69+
}
70+
}
71+
// TODO: extra-headers should be supported in `gix` directly.
72+
let oid = gix_to_git2_oid(repo.write_object(&commit)?);
73+
74+
// update reference
75+
if let Some(refname) = update_ref {
76+
self.reference(&refname.to_string(), oid, true, message)?;
77+
}
78+
Ok(oid)
79+
}
80+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
use anyhow::{Context as _, Result};
2+
use gitbutler_error::error::Code;
3+
use gitbutler_oxidize::gix_to_git2_signature;
4+
5+
use crate::{Config, SignaturePurpose};
6+
7+
pub trait RepositoryExt {
8+
fn signatures(&self) -> Result<(git2::Signature, git2::Signature)>;
9+
}
10+
11+
impl RepositoryExt for git2::Repository {
12+
fn signatures(&self) -> Result<(git2::Signature, git2::Signature)> {
13+
let repo = gix::open(self.path())?;
14+
15+
let author = repo
16+
.author()
17+
.transpose()?
18+
.map(gix_to_git2_signature)
19+
.transpose()?
20+
.context("No author is configured in Git")
21+
.context(Code::AuthorMissing)?;
22+
23+
let config: Config = self.into();
24+
let committer = if config.user_real_comitter()? {
25+
repo.committer()
26+
.transpose()?
27+
.map(gix_to_git2_signature)
28+
.unwrap_or_else(|| crate::signature(SignaturePurpose::Committer))
29+
} else {
30+
crate::signature(SignaturePurpose::Committer)
31+
}?;
32+
33+
Ok((author, committer))
34+
}
35+
}

crates/gitbutler-repo/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ pub use config::Config;
1616

1717
pub mod temporary_workdir;
1818

19+
pub mod committing;
20+
pub mod identity;
1921
pub mod logging;
22+
mod sigining;
2023

2124
use gitbutler_oxidize::gix_to_git2_signature;
2225
pub const GITBUTLER_COMMIT_AUTHOR_NAME: &str = "GitButler";

0 commit comments

Comments
 (0)