Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
24037da
feat: add Git-compatible commit signature verification
Byron Jul 26, 2026
4d3afa7
feat: honor Git signature configuration in gix commit verify
Byron Jul 31, 2026
0b38be7
fix: support shell commands in external blob diffs
Byron Jul 29, 2026
3d4dc1e
feat: support lazy note lookup in gix-note
Byron Jul 30, 2026
fc26cd6
feat: support note mutation in gix-note
Byron Jul 30, 2026
f963d8e
feat: expose repository notes
Byron Jul 30, 2026
fa013bc
feat: verify visible commit signatures in tix
codex Jul 26, 2026
1480cb8
feat: present commit authorship in tix
codex Jul 26, 2026
e076b3b
feat: navigate merge ancestry with Shift in tix
codex Jul 26, 2026
a0aa7df
feat: clarify filtered history in tix
codex Jul 26, 2026
4c0126b
feat: inspect tree changes in tix
codex Jul 28, 2026
296feab
feat: enrich commit details in tix
codex Jul 30, 2026
fce6921
feat: refresh tix history when input references move
codex Aug 3, 2026
c078d83
feat: show contextual information beside the tix selection
codex Aug 4, 2026
00869b4
feat: show tree and worktree changes together
codex Aug 4, 2026
a516b42
feat: navigate tix history with mouse scrolling
codex Aug 5, 2026
c7c26ef
feat: show the selected history row in tix
codex Aug 5, 2026
4324a57
fix: keep tix open after its worktree is removed
codex Aug 5, 2026
12dd7f8
feat: coordinate tix overlay pane layout
codex Aug 6, 2026
b48dcc9
fix: select the newest tix row after watched refs change
codex Aug 6, 2026
ba2aacc
feat: group tix history display shortcuts
codex Aug 6, 2026
4e12acd
change: brighten red UI elements and omit zero diff counts
codex Aug 6, 2026
ad123ca
feat: copy selected changed paths in tix
codex Aug 6, 2026
f46333a
change: widen the default tix commit panel
codex Aug 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 87 additions & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions crate-status.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ The top-level crate that acts as hub to all functionality provided by the `gix-*
* [x] use credential helper configuration and to obtain credentials with `gix_credentials::helper::Cascade`
* **traverse**
* [x] commit graphs
* [ ] make [git-notes](https://git-scm.com/docs/git-notes) accessible
* [x] make [git-notes](https://git-scm.com/docs/git-notes) accessible
* [x] tree entries
* **diffs/changes**
* [x] tree with other tree
Expand Down Expand Up @@ -619,7 +619,7 @@ Provide a native SSH transport and authentication backend so `gix` users can shi

A mechanism to associate metadata with any object, and keep revisions of it using git itself.

* [ ] CRUD for git notes
* [x] CRUD for git notes

### gix-negotiate
* **algorithms**
Expand Down
2 changes: 1 addition & 1 deletion gitoxide-core/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ serde = ["gix/serde", "dep:serde_json", "dep:serde", "bytesize/serde"]

[dependencies]
# deselect everything else (like "performance") as this should be controllable by the parent application.
gix = { version = "^0.86.0", path = "../gix", default-features = false, features = ["merge", "blob-diff", "blame", "revision", "mailmap", "excludes", "attributes", "worktree-mutation", "credentials", "interrupt", "status", "dirwalk"] }
gix = { version = "^0.86.0", path = "../gix", default-features = false, features = ["merge", "blob-diff", "blame", "revision", "mailmap", "excludes", "attributes", "worktree-mutation", "credentials", "interrupt", "status", "dirwalk", "command"] }
gix-pack-for-configuration-only = { package = "gix-pack", version = "^0.73.0", path = "../gix-pack", default-features = false, features = ["pack-cache-lru-dynamic", "pack-cache-lru-static", "generate", "streaming-input"] }
gix-transport-configuration-only = { package = "gix-transport", version = "^0.58.1", path = "../gix-transport", default-features = false }
gix-archive-for-configuration-only = { package = "gix-archive", version = "^0.35.0", path = "../gix-archive", optional = true, features = ["tar", "tar_gz"] }
Expand Down
29 changes: 6 additions & 23 deletions gitoxide-core/src/repository/commit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,30 +19,13 @@ pub fn verify(repo: gix::Repository, rev_spec: Option<&str>) -> Result<()> {
.rev_parse_single(format!("{rev_spec}^{{commit}}").as_str())?
.object()?
.into_commit();
let (signature, signed_data) = commit
.signature()
.context("Could not parse commit to obtain signature")?
let outcome = commit
.verify_signature()
.context("Could not verify commit signature")?
.ok_or_else(|| anyhow!("Commit at {rev_spec} is not signed"))?;

let mut signature_storage = tempfile::NamedTempFile::new()?;
signature_storage.write_all(signature.as_ref())?;
let signed_storage = signature_storage.into_temp_path();

let mut cmd: std::process::Command = gix::command::prepare("gpg").into();
cmd.args(["--keyid-format=long", "--status-fd=1", "--verify"])
.arg(&signed_storage)
.arg("-")
.stdin(Stdio::piped());
gix::trace::debug!("About to execute {cmd:?}");
let mut child = cmd.spawn()?;
child
.stdin
.take()
.expect("configured")
.write_all(signed_data.to_bstring().as_ref())?;

if !child.wait()?.success() {
bail!("Command {cmd:?} failed");
std::io::stderr().write_all(&outcome.output)?;
if !outcome.is_valid() {
bail!("Commit at {rev_spec} has an invalid or untrusted signature");
}
Ok(())
}
Expand Down
1 change: 1 addition & 0 deletions gix-diff/src/blob/platform.rs
Original file line number Diff line number Diff line change
Expand Up @@ -537,6 +537,7 @@ impl Platform {
.resources()
.ok_or(prepare_diff_command::Error::SourceOrDestinationUnset)?;
let mut cmd: std::process::Command = gix_command::prepare(gix_path::from_bstring(diff_command))
.command_may_be_shell_script_disallow_manual_argument_splitting()
.with_context(context)
.env("GIT_DIFF_PATH_COUNTER", (count + 1).to_string())
.env("GIT_DIFF_PATH_TOTAL", total.to_string())
Expand Down
8 changes: 8 additions & 0 deletions gix-diff/tests/diff/blob/platform.rs
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,14 @@ fn resources_of_worktree_and_odb_and_check_link() -> crate::Result {
"in this case, there is no rename-to field as last argument, it's based on the resource paths being different"
);

let command = platform.prepare_diff_command("test --flag".into(), Default::default(), 0, 1)?;
assert!(
command
.get_args()
.any(|arg| arg.to_string_lossy().contains("test --flag")),
"configured command lines with arguments are interpreted by a shell"
);

platform.set_resource(id, EntryKind::Link, "a".into(), ResourceKind::NewOrDestination, &db)?;

// Double-inserts are fine.
Expand Down
13 changes: 13 additions & 0 deletions gix-note/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,17 @@ include = ["/src/**/*", "/LICENSE-*"]
[lib]
doctest = false

[features]
## Enable support for the SHA-1 hash by forwarding it to dependencies.
sha1 = ["gix-hash/sha1", "gix-object/sha1"]
## Enable support for the SHA-256 hash by forwarding it to dependencies.
sha256 = ["gix-hash/sha256", "gix-object/sha256"]

[dependencies]
gix-error = { version = "^0.2.5", path = "../gix-error" }
gix-hash = { version = "^0.26.0", path = "../gix-hash" }
gix-object = { version = "^0.63.0", path = "../gix-object" }

[dev-dependencies]
gix-odb = { path = "../gix-odb" }
gix-testtools = { path = "../tests/tools" }
Loading
Loading