diff options
| author | DanConwayDev <DanConwayDev@protonmail.com> | 2024-01-22 00:00:00 +0000 |
|---|---|---|
| committer | DanConwayDev <DanConwayDev@protonmail.com> | 2024-01-22 00:00:00 +0000 |
| commit | c543b2f25b6893e5dce6111bc12d9812099251ba (patch) | |
| tree | ed1f04f81aad072a55ced335f94a6746cc4021e6 /src/git.rs | |
| parent | 675d44b8349078f2d231ca37a1621254a4c50ab5 (diff) | |
feat(git): apply pgp sig event tag to commit
to maintain correct commit ids which is required to apply multiple
commits
its noted that no tests are written and the scenario where the author
and committer differ has not been tested
clearly the validate_patch_applied function has code that corrects an
error where the author / committer 'signatures' do not apply correctly.
this will not be fixed under a pgp signed commit scenario.
Diffstat (limited to 'src/git.rs')
| -rw-r--r-- | src/git.rs | 53 |
1 files changed, 45 insertions, 8 deletions
| @@ -465,14 +465,51 @@ fn apply_patch(git_repo: &Repo, patch: &nostr::Event) -> Result<()> { | |||
| 465 | index.add_all(["."], git2::IndexAddOption::DEFAULT, None)?; | 465 | index.add_all(["."], git2::IndexAddOption::DEFAULT, None)?; |
| 466 | index.write()?; | 466 | index.write()?; |
| 467 | 467 | ||
| 468 | git_repo.git_repo.commit( | 468 | let pgp_sig = if let Ok(pgp_sig) = tag_value(patch, "commit-sig") { |
| 469 | Some("HEAD"), | 469 | if pgp_sig.is_empty() { |
| 470 | &extract_sig_from_patch_tags(&patch.tags, "author")?, | 470 | None |
| 471 | &extract_sig_from_patch_tags(&patch.tags, "committer")?, | 471 | } else { |
| 472 | tag_value(patch, "description")?.as_str(), | 472 | Some(pgp_sig) |
| 473 | &git_repo.git_repo.find_tree(index.write_tree()?)?, | 473 | } |
| 474 | &[&prev_oid], | 474 | } else { |
| 475 | )?; | 475 | None |
| 476 | }; | ||
| 477 | |||
| 478 | if let Some(pgp_sig) = pgp_sig { | ||
| 479 | let commit_buff = git_repo.git_repo.commit_create_buffer( | ||
| 480 | &extract_sig_from_patch_tags(&patch.tags, "author")?, | ||
| 481 | &extract_sig_from_patch_tags(&patch.tags, "committer")?, | ||
| 482 | tag_value(patch, "description")?.as_str(), | ||
| 483 | &git_repo.git_repo.find_tree(index.write_tree()?)?, | ||
| 484 | &[&prev_oid], | ||
| 485 | )?; | ||
| 486 | let gpg_commit_id = git_repo.git_repo.commit_signed( | ||
| 487 | commit_buff.as_str().unwrap(), | ||
| 488 | pgp_sig.as_str(), | ||
| 489 | None, | ||
| 490 | )?; | ||
| 491 | git_repo.git_repo.reset( | ||
| 492 | &git_repo.git_repo.find_object(gpg_commit_id, None)?, | ||
| 493 | git2::ResetType::Mixed, | ||
| 494 | None, | ||
| 495 | )?; | ||
| 496 | if gpg_commit_id.to_string().eq(&tag_value(patch, "commit")?) { | ||
| 497 | return Ok(()); | ||
| 498 | } | ||
| 499 | } else { | ||
| 500 | git_repo.git_repo.commit( | ||
| 501 | Some("HEAD"), | ||
| 502 | &extract_sig_from_patch_tags(&patch.tags, "author")?, | ||
| 503 | &extract_sig_from_patch_tags(&patch.tags, "committer")?, | ||
| 504 | tag_value(patch, "description")?.as_str(), | ||
| 505 | &git_repo.git_repo.find_tree(index.write_tree()?)?, | ||
| 506 | &[&prev_oid], | ||
| 507 | )?; | ||
| 508 | } | ||
| 509 | validate_patch_applied(git_repo, patch) | ||
| 510 | } | ||
| 511 | |||
| 512 | fn validate_patch_applied(git_repo: &Repo, patch: &nostr::Event) -> Result<()> { | ||
| 476 | // end of stage and commit | 513 | // end of stage and commit |
| 477 | // check commit applied | 514 | // check commit applied |
| 478 | if git_repo | 515 | if git_repo |