diff --git a/Cargo.lock b/Cargo.lock index 04481683b9..2432b32dc3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -96,6 +96,12 @@ dependencies = [ "libc", ] +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + [[package]] name = "anstream" version = "0.6.14" @@ -749,6 +755,12 @@ dependencies = [ "toml 0.7.8", ] +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + [[package]] name = "cbc" version = "0.1.2" @@ -832,6 +844,33 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + [[package]] name = "cipher" version = "0.4.4" @@ -1073,6 +1112,42 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "criterion" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" +dependencies = [ + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "is-terminal", + "itertools 0.10.5", + "num-traits", + "once_cell", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools 0.10.5", +] + [[package]] name = "crossbeam-channel" version = "0.5.13" @@ -2002,7 +2077,7 @@ dependencies = [ "gitbutler-serde", "gix", "hex", - "itertools", + "itertools 0.13.0", "lazy_static", "md5", "serde", @@ -2016,6 +2091,7 @@ version = "0.0.0" dependencies = [ "anyhow", "bstr", + "criterion", "diffy", "git2", "git2-hooks", @@ -2040,7 +2116,7 @@ dependencies = [ "gix", "glob", "hex", - "itertools", + "itertools 0.13.0", "md5", "once_cell", "pretty_assertions", @@ -2079,7 +2155,7 @@ dependencies = [ "anyhow", "git2", "gitbutler-project", - "itertools", + "itertools 0.13.0", "tracing", ] @@ -2216,7 +2292,7 @@ dependencies = [ "gitbutler-repo", "gitbutler-serde", "gix", - "itertools", + "itertools 0.13.0", "pretty_assertions", "serde", "strum", @@ -2335,7 +2411,7 @@ dependencies = [ "gitbutler-reference", "gitbutler-url", "gitbutler-user", - "itertools", + "itertools 0.13.0", "tracing", ] @@ -2374,6 +2450,7 @@ dependencies = [ "gitbutler-testsupport", "gitbutler-user", "gitbutler-watcher", + "gix", "log", "once_cell", "open 5.3.0", @@ -2474,48 +2551,48 @@ dependencies = [ [[package]] name = "gix" version = "0.64.0" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ - "gix-actor 0.31.5 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-attributes 0.22.3 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-actor 0.31.5 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-attributes 0.22.3 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "gix-command", - "gix-commitgraph 0.24.3 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-commitgraph 0.24.3 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "gix-config", "gix-credentials", "gix-date 0.9.0", "gix-diff", "gix-dir", "gix-discover 0.33.0", - "gix-features 0.38.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-features 0.38.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "gix-filter", - "gix-fs 0.11.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-glob 0.16.4 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-hashtable 0.5.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-ignore 0.11.3 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-index 0.33.1 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-lock 14.0.0 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-fs 0.11.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-glob 0.16.4 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-hashtable 0.5.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-ignore 0.11.3 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-index 0.33.1 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-lock 14.0.0 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "gix-macros", "gix-negotiate", - "gix-object 0.42.3 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-object 0.42.3 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "gix-odb", "gix-pack", - "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "gix-pathspec", "gix-prompt", "gix-ref 0.45.0", "gix-refspec", "gix-revision", - "gix-revwalk 0.13.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-sec 0.10.7 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-revwalk 0.13.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-sec 0.10.7 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "gix-submodule", - "gix-tempfile 14.0.1 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-trace 0.1.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-traverse 0.39.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-tempfile 14.0.1 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-trace 0.1.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-traverse 0.39.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "gix-url", - "gix-utils 0.1.12 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-validate 0.8.5 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-worktree 0.34.1 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-utils 0.1.12 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-validate 0.8.5 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-worktree 0.34.1 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "once_cell", "smallvec", "thiserror", @@ -2538,11 +2615,11 @@ dependencies = [ [[package]] name = "gix-actor" version = "0.31.5" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bstr", "gix-date 0.9.0", - "gix-utils 0.1.12 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-utils 0.1.12 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "itoa 1.0.11", "thiserror", "winnow 0.6.16", @@ -2568,13 +2645,13 @@ dependencies = [ [[package]] name = "gix-attributes" version = "0.22.3" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bstr", - "gix-glob 0.16.4 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-quote 0.4.12 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-trace 0.1.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-glob 0.16.4 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-quote 0.4.12 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-trace 0.1.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "kstring", "smallvec", "thiserror", @@ -2593,7 +2670,7 @@ dependencies = [ [[package]] name = "gix-bitmap" version = "0.2.11" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "thiserror", ] @@ -2610,7 +2687,7 @@ dependencies = [ [[package]] name = "gix-chunk" version = "0.4.8" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "thiserror", ] @@ -2618,11 +2695,11 @@ dependencies = [ [[package]] name = "gix-command" version = "0.3.8" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bstr", - "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-trace 0.1.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-trace 0.1.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "shell-words", ] @@ -2643,12 +2720,12 @@ dependencies = [ [[package]] name = "gix-commitgraph" version = "0.24.3" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bstr", - "gix-chunk 0.4.8 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-features 0.38.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-chunk 0.4.8 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-features 0.38.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "memmap2", "thiserror", ] @@ -2656,15 +2733,15 @@ dependencies = [ [[package]] name = "gix-config" version = "0.38.0" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bstr", "gix-config-value", - "gix-features 0.38.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-glob 0.16.4 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-features 0.38.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-glob 0.16.4 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "gix-ref 0.45.0", - "gix-sec 0.10.7 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-sec 0.10.7 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "memchr", "once_cell", "smallvec", @@ -2676,11 +2753,11 @@ dependencies = [ [[package]] name = "gix-config-value" version = "0.14.7" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bitflags 2.6.0", "bstr", - "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "libc", "thiserror", ] @@ -2688,15 +2765,15 @@ dependencies = [ [[package]] name = "gix-credentials" version = "0.24.4" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bstr", "gix-command", "gix-config-value", - "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "gix-prompt", - "gix-sec 0.10.7 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-trace 0.1.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-sec 0.10.7 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-trace 0.1.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "gix-url", "thiserror", ] @@ -2716,7 +2793,7 @@ dependencies = [ [[package]] name = "gix-date" version = "0.9.0" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bstr", "itoa 1.0.11", @@ -2727,30 +2804,30 @@ dependencies = [ [[package]] name = "gix-diff" version = "0.44.1" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bstr", - "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-object 0.42.3 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-object 0.42.3 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "thiserror", ] [[package]] name = "gix-dir" version = "0.6.0" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bstr", "gix-discover 0.33.0", - "gix-fs 0.11.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-ignore 0.11.3 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-index 0.33.1 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-object 0.42.3 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-fs 0.11.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-ignore 0.11.3 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-index 0.33.1 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-object 0.42.3 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "gix-pathspec", - "gix-trace 0.1.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-utils 0.1.12 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-worktree 0.34.1 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-trace 0.1.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-utils 0.1.12 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-worktree 0.34.1 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "thiserror", ] @@ -2773,15 +2850,15 @@ dependencies = [ [[package]] name = "gix-discover" version = "0.33.0" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bstr", "dunce", - "gix-fs 0.11.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-fs 0.11.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "gix-ref 0.45.0", - "gix-sec 0.10.7 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-sec 0.10.7 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "thiserror", ] @@ -2803,14 +2880,14 @@ dependencies = [ [[package]] name = "gix-features" version = "0.38.2" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "crc32fast", "crossbeam-channel", "flate2", - "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-trace 0.1.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-utils 0.1.12 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-trace 0.1.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-utils 0.1.12 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "libc", "once_cell", "parking_lot 0.12.3", @@ -2823,19 +2900,19 @@ dependencies = [ [[package]] name = "gix-filter" version = "0.11.3" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bstr", "encoding_rs", - "gix-attributes 0.22.3 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-attributes 0.22.3 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "gix-command", - "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-object 0.42.3 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-object 0.42.3 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "gix-packetline-blocking", - "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-quote 0.4.12 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-trace 0.1.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-utils 0.1.12 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-quote 0.4.12 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-trace 0.1.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-utils 0.1.12 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "smallvec", "thiserror", ] @@ -2854,11 +2931,11 @@ dependencies = [ [[package]] name = "gix-fs" version = "0.11.2" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "fastrand 2.1.0", - "gix-features 0.38.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-utils 0.1.12 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-features 0.38.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-utils 0.1.12 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", ] [[package]] @@ -2876,12 +2953,12 @@ dependencies = [ [[package]] name = "gix-glob" version = "0.16.4" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bitflags 2.6.0", "bstr", - "gix-features 0.38.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-features 0.38.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", ] [[package]] @@ -2897,7 +2974,7 @@ dependencies = [ [[package]] name = "gix-hash" version = "0.14.2" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "faster-hex", "thiserror", @@ -2917,9 +2994,9 @@ dependencies = [ [[package]] name = "gix-hashtable" version = "0.5.2" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ - "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "hashbrown 0.14.5", "parking_lot 0.12.3", ] @@ -2940,12 +3017,12 @@ dependencies = [ [[package]] name = "gix-ignore" version = "0.11.3" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bstr", - "gix-glob 0.16.4 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-trace 0.1.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-glob 0.16.4 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-trace 0.1.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "unicode-bom", ] @@ -2980,21 +3057,21 @@ dependencies = [ [[package]] name = "gix-index" version = "0.33.1" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bitflags 2.6.0", "bstr", "filetime", "fnv", - "gix-bitmap 0.2.11 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-features 0.38.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-fs 0.11.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-lock 14.0.0 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-object 0.42.3 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-traverse 0.39.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-utils 0.1.12 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-validate 0.8.5 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-bitmap 0.2.11 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-features 0.38.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-fs 0.11.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-lock 14.0.0 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-object 0.42.3 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-traverse 0.39.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-utils 0.1.12 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-validate 0.8.5 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "hashbrown 0.14.5", "itoa 1.0.11", "libc", @@ -3018,17 +3095,17 @@ dependencies = [ [[package]] name = "gix-lock" version = "14.0.0" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ - "gix-tempfile 14.0.1 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-utils 0.1.12 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-tempfile 14.0.1 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-utils 0.1.12 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "thiserror", ] [[package]] name = "gix-macros" version = "0.1.5" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "proc-macro2", "quote", @@ -3038,14 +3115,14 @@ dependencies = [ [[package]] name = "gix-negotiate" version = "0.13.2" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bitflags 2.6.0", - "gix-commitgraph 0.24.3 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-commitgraph 0.24.3 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "gix-date 0.9.0", - "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-object 0.42.3 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-revwalk 0.13.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-object 0.42.3 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-revwalk 0.13.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "smallvec", "thiserror", ] @@ -3072,15 +3149,15 @@ dependencies = [ [[package]] name = "gix-object" version = "0.42.3" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bstr", - "gix-actor 0.31.5 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-actor 0.31.5 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "gix-date 0.9.0", - "gix-features 0.38.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-utils 0.1.12 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-validate 0.8.5 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-features 0.38.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-utils 0.1.12 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-validate 0.8.5 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "itoa 1.0.11", "smallvec", "thiserror", @@ -3090,17 +3167,17 @@ dependencies = [ [[package]] name = "gix-odb" version = "0.61.1" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "arc-swap", "gix-date 0.9.0", - "gix-features 0.38.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-fs 0.11.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-object 0.42.3 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-features 0.38.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-fs 0.11.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-object 0.42.3 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "gix-pack", - "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-quote 0.4.12 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-quote 0.4.12 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "parking_lot 0.12.3", "tempfile", "thiserror", @@ -3109,28 +3186,29 @@ dependencies = [ [[package]] name = "gix-pack" version = "0.51.1" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "clru", - "gix-chunk 0.4.8 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-features 0.38.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-hashtable 0.5.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-object 0.42.3 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-chunk 0.4.8 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-features 0.38.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-hashtable 0.5.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-object 0.42.3 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "memmap2", "smallvec", "thiserror", + "uluru", ] [[package]] name = "gix-packetline-blocking" version = "0.17.4" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bstr", "faster-hex", - "gix-trace 0.1.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-trace 0.1.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "thiserror", ] @@ -3150,10 +3228,10 @@ dependencies = [ [[package]] name = "gix-path" version = "0.10.9" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bstr", - "gix-trace 0.1.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-trace 0.1.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "home", "once_cell", "thiserror", @@ -3162,21 +3240,21 @@ dependencies = [ [[package]] name = "gix-pathspec" version = "0.7.6" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bitflags 2.6.0", "bstr", - "gix-attributes 0.22.3 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-attributes 0.22.3 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "gix-config-value", - "gix-glob 0.16.4 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-glob 0.16.4 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "thiserror", ] [[package]] name = "gix-prompt" version = "0.8.6" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "gix-command", "gix-config-value", @@ -3199,10 +3277,10 @@ dependencies = [ [[package]] name = "gix-quote" version = "0.4.12" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bstr", - "gix-utils 0.1.12 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-utils 0.1.12 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "thiserror", ] @@ -3231,18 +3309,18 @@ dependencies = [ [[package]] name = "gix-ref" version = "0.45.0" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" -dependencies = [ - "gix-actor 0.31.5 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-features 0.38.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-fs 0.11.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-lock 14.0.0 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-object 0.42.3 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-tempfile 14.0.1 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-utils 0.1.12 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-validate 0.8.5 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" +dependencies = [ + "gix-actor 0.31.5 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-features 0.38.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-fs 0.11.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-lock 14.0.0 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-object 0.42.3 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-tempfile 14.0.1 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-utils 0.1.12 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-validate 0.8.5 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "memmap2", "thiserror", "winnow 0.6.16", @@ -3251,12 +3329,12 @@ dependencies = [ [[package]] name = "gix-refspec" version = "0.23.1" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bstr", - "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "gix-revision", - "gix-validate 0.8.5 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-validate 0.8.5 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "smallvec", "thiserror", ] @@ -3264,13 +3342,13 @@ dependencies = [ [[package]] name = "gix-revision" version = "0.27.2" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bstr", "gix-date 0.9.0", - "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-object 0.42.3 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-revwalk 0.13.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-object 0.42.3 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-revwalk 0.13.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "thiserror", ] @@ -3292,13 +3370,13 @@ dependencies = [ [[package]] name = "gix-revwalk" version = "0.13.2" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ - "gix-commitgraph 0.24.3 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-commitgraph 0.24.3 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "gix-date 0.9.0", - "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-hashtable 0.5.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-object 0.42.3 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-hashtable 0.5.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-object 0.42.3 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "smallvec", "thiserror", ] @@ -3318,10 +3396,10 @@ dependencies = [ [[package]] name = "gix-sec" version = "0.10.7" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bitflags 2.6.0", - "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "libc", "windows-sys 0.52.0", ] @@ -3329,11 +3407,11 @@ dependencies = [ [[package]] name = "gix-submodule" version = "0.12.0" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bstr", "gix-config", - "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "gix-pathspec", "gix-refspec", "gix-url", @@ -3358,9 +3436,9 @@ dependencies = [ [[package]] name = "gix-tempfile" version = "14.0.1" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ - "gix-fs 0.11.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-fs 0.11.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "libc", "once_cell", "parking_lot 0.12.3", @@ -3402,7 +3480,7 @@ checksum = "f924267408915fddcd558e3f37295cc7d6a3e50f8bd8b606cee0808c3915157e" [[package]] name = "gix-trace" version = "0.1.9" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" [[package]] name = "gix-traverse" @@ -3424,15 +3502,15 @@ dependencies = [ [[package]] name = "gix-traverse" version = "0.39.2" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bitflags 2.6.0", - "gix-commitgraph 0.24.3 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-commitgraph 0.24.3 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "gix-date 0.9.0", - "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-hashtable 0.5.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-object 0.42.3 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-revwalk 0.13.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-hashtable 0.5.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-object 0.42.3 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-revwalk 0.13.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "smallvec", "thiserror", ] @@ -3440,11 +3518,11 @@ dependencies = [ [[package]] name = "gix-url" version = "0.27.4" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bstr", - "gix-features 0.38.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-features 0.38.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", "home", "thiserror", "url", @@ -3463,7 +3541,7 @@ dependencies = [ [[package]] name = "gix-utils" version = "0.1.12" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bstr", "fastrand 2.1.0", @@ -3483,7 +3561,7 @@ dependencies = [ [[package]] name = "gix-validate" version = "0.8.5" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bstr", "thiserror", @@ -3511,19 +3589,19 @@ dependencies = [ [[package]] name = "gix-worktree" version = "0.34.1" -source = "git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c#12313f2720bb509cb8fa5d7033560823beafb91c" +source = "git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa#29898e3010bd3332418c683f2ac96aff5c8e72fa" dependencies = [ "bstr", - "gix-attributes 0.22.3 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-features 0.38.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-fs 0.11.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-glob 0.16.4 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-ignore 0.11.3 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-index 0.33.1 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-object 0.42.3 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", - "gix-validate 0.8.5 (git+https://github.com/Byron/gitoxide?rev=12313f2720bb509cb8fa5d7033560823beafb91c)", + "gix-attributes 0.22.3 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-features 0.38.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-fs 0.11.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-glob 0.16.4 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-hash 0.14.2 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-ignore 0.11.3 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-index 0.33.1 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-object 0.42.3 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-path 0.10.9 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", + "gix-validate 0.8.5 (git+https://github.com/Byron/gitoxide?rev=29898e3010bd3332418c683f2ac96aff5c8e72fa)", ] [[package]] @@ -4209,6 +4287,17 @@ dependencies = [ "once_cell", ] +[[package]] +name = "is-terminal" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "is-wsl" version = "0.4.0" @@ -4231,6 +4320,15 @@ version = "1.70.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.13.0" @@ -4981,6 +5079,12 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "oorandom" +version = "11.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" + [[package]] name = "open" version = "3.2.0" @@ -5399,6 +5503,34 @@ dependencies = [ "time", ] +[[package]] +name = "plotters" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a15b6eccb8484002195a3e44fe65a4ce8e93a625797a063735536fd59cb01cf3" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "414cec62c6634ae900ea1c56128dfe87cf63e7caece0852ec76aba307cebadb7" + +[[package]] +name = "plotters-svg" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81b30686a7d9c3e010b84284bdd26a29f2138574f52f5eb6f794fc0ad924e705" +dependencies = [ + "plotters-backend", +] + [[package]] name = "png" version = "0.17.13" @@ -5585,7 +5717,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18bec9b0adc4eba778b33684b7ba3e7137789434769ee3ce3930463ef904cfca" dependencies = [ "anyhow", - "itertools", + "itertools 0.13.0", "proc-macro2", "quote", "syn 2.0.68", @@ -7276,6 +7408,16 @@ dependencies = [ "time-core", ] +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + [[package]] name = "tinyvec" version = "1.6.1" @@ -7603,6 +7745,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "uluru" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c8a2469e56e6e5095c82ccd3afb98dad95f7af7929aab6d8ba8d6e0f73657da" +dependencies = [ + "arrayvec", +] + [[package]] name = "unicode-bidi" version = "0.3.15" @@ -8085,7 +8236,7 @@ checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" dependencies = [ "windows-implement 0.57.0", "windows-interface 0.57.0", - "windows-result 0.1.2", + "windows-result 0.1.1", "windows-targets 0.52.6", ] @@ -8164,9 +8315,9 @@ checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" [[package]] name = "windows-result" -version = "0.1.2" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +checksum = "749f0da9cc72d82e600d8d2e44cadd0b9eedb9038f71a1c58556ac1c5791813b" dependencies = [ "windows-targets 0.52.6", ] diff --git a/Cargo.toml b/Cargo.toml index 78e05b197a..a133d4dea9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -34,7 +34,7 @@ resolver = "2" [workspace.dependencies] # Add the `tracing` or `tracing-detail` features to see more of gitoxide in the logs. Useful to see which programs it invokes. -gix = { git = "https://github.com/Byron/gitoxide", rev = "12313f2720bb509cb8fa5d7033560823beafb91c", default-features = false, features = [] } +gix = { git = "https://github.com/Byron/gitoxide", rev = "29898e3010bd3332418c683f2ac96aff5c8e72fa", default-features = false, features = [] } git2 = { version = "0.18.3", features = [ "vendored-openssl", "vendored-libgit2", diff --git a/crates/gitbutler-branch-actions/Cargo.toml b/crates/gitbutler-branch-actions/Cargo.toml index 82c5a5a83b..7226a900a1 100644 --- a/crates/gitbutler-branch-actions/Cargo.toml +++ b/crates/gitbutler-branch-actions/Cargo.toml @@ -43,7 +43,17 @@ reqwest = { version = "0.12.4", features = ["json"] } once_cell = "1.19" pretty_assertions = "1.4" gitbutler-testsupport.workspace = true +gix = { workspace = true, features = ["max-performance-safe"] } gitbutler-git = { workspace = true, features = ["test-askpass-path"] } glob = "0.3.1" serial_test = "3.1.1" tempfile = "3.10" +criterion = "0.5.1" + +[features] +## Only enabled when benchmark runs are performed. +benches = ["gitbutler-git/benches"] + +[[bench]] +name = "branches" +harness = false \ No newline at end of file diff --git a/crates/gitbutler-branch-actions/benches/README.md b/crates/gitbutler-branch-actions/benches/README.md new file mode 100644 index 0000000000..67300abd6e --- /dev/null +++ b/crates/gitbutler-branch-actions/benches/README.md @@ -0,0 +1,13 @@ +To run benchmarks, add the `benches` feature. + +```shell +cargo bench --features benches +``` + +It's used to get past a safety check in `gitbutler-git`. + +For faster compile times, specify the benchmark file directly, i.e. + +```shell +cargo bench --bench branches --features benches +``` diff --git a/crates/gitbutler-branch-actions/benches/branches.rs b/crates/gitbutler-branch-actions/benches/branches.rs new file mode 100644 index 0000000000..1098799c8f --- /dev/null +++ b/crates/gitbutler-branch-actions/benches/branches.rs @@ -0,0 +1,54 @@ +use criterion::{black_box, criterion_group, criterion_main, Criterion, Throughput}; +use gitbutler_branch_actions::list_branches; +use gitbutler_command_context::CommandContext; +use gitbutler_project::Project; + +pub fn fixture_project(name: &str, script: &str) -> Project { + gitbutler_testsupport::read_only::fixture_project(script, name).unwrap() +} + +pub fn benchmark_list_branches(c: &mut Criterion) { + const NUM_BRANCHES: u64 = 300; + for (bench_name, num_references, (repo_name, script_name)) in [ + ( + "list-branches[many local branches]", + NUM_BRANCHES, + ("many-local", "branch-benches.sh"), + ), + ( + "list-branches[tiny repo]", + 3, + ("one-vbranch-on-integration-two-remotes", "for-listing.sh"), + ), + ( + "list-branches[many local branches [packed]]", + NUM_BRANCHES, + ("many-local-packed", "branch-benches.sh"), + ), + ( + "list-branches[many local branches [tracked]]", + NUM_BRANCHES * 2, + ("many-local-tracked", "branch-benches.sh"), + ), + ( + "list-branches[many local branches [tracked & packed]]", + NUM_BRANCHES * 2, + ("many-local-tracked-packed", "branch-benches.sh"), + ), + ] { + let mut group = c.benchmark_group(bench_name); + let project = fixture_project(repo_name, script_name); + let ctx = CommandContext::open(&project).unwrap(); + group.throughput(Throughput::Elements(num_references)); + group + .bench_function("no filter", |b| { + b.iter(|| list_branches(black_box(&ctx), None, None)) + }) + .bench_function("name-filter rejecting all", |b| { + b.iter(|| list_branches(black_box(&ctx), None, Some(vec!["not available".into()]))) + }); + } +} + +criterion_group!(benches, benchmark_list_branches); +criterion_main!(benches); diff --git a/crates/gitbutler-branch-actions/src/branch.rs b/crates/gitbutler-branch-actions/src/branch.rs index beff2bccb7..c2fb8f094a 100644 --- a/crates/gitbutler-branch-actions/src/branch.rs +++ b/crates/gitbutler-branch-actions/src/branch.rs @@ -1,4 +1,15 @@ +use crate::VirtualBranchesExt; +use anyhow::{Context, Result}; +use bstr::{BStr, BString, ByteSlice}; use core::fmt; +use gitbutler_branch::{Branch as GitButlerBranch, BranchId, ReferenceExtGix, Target}; +use gitbutler_command_context::CommandContext; +use gitbutler_reference::normalize_branch_name; +use gix::prelude::ObjectIdExt; +use gix::reference::Category; +use serde::{Deserialize, Serialize}; +use std::borrow::Cow; +use std::collections::BTreeSet; use std::{ cmp::max, collections::{HashMap, HashSet}, @@ -6,49 +17,41 @@ use std::{ vec, }; -use anyhow::{Context, Result}; -use bstr::{BString, ByteSlice}; -use gitbutler_branch::{Branch as GitButlerBranch, BranchId, ReferenceExt, Target}; -use gitbutler_command_context::CommandContext; -use gitbutler_reference::normalize_branch_name; -use serde::{Deserialize, Serialize}; - -use crate::VirtualBranchesExt; - /// Returns a list of branches associated with this project. pub fn list_branches( ctx: &CommandContext, filter: Option, filter_branch_names: Option>, ) -> Result> { + let mut repo = gix::open(ctx.repository().path())?; + repo.object_cache_size_if_unset(1024 * 1024); let has_filter = filter.is_some(); let filter = filter.unwrap_or_default(); let vb_handle = ctx.project().virtual_branches(); + let platform = repo.references()?; let mut branches: Vec = vec![]; - for (branch, branch_type) in ctx.repository().branches(None)?.filter_map(Result::ok) { + for reference in platform.all()?.filter_map(Result::ok) { // Loosely match on branch names if let Some(branch_names) = &filter_branch_names { - let has_matching_name = branch_names.iter().any(|branch_name| { - if let Ok(Some(name)) = branch.name() { - name.ends_with(&branch_name.0) - } else { - false - } - }); + let has_matching_name = branch_names + .iter() + .any(|branch_name| reference.name().as_bstr().ends_with_str(&branch_name.0)); if !has_matching_name { continue; } } - match branch_type { - git2::BranchType::Local => { - branches.push(GroupBranch::Local(branch)); - } - git2::BranchType::Remote => { - branches.push(GroupBranch::Remote(branch)); - } + let is_local_branch = match reference.name().category() { + Some(Category::LocalBranch) => true, + Some(Category::RemoteBranch) => false, + _ => continue, }; + branches.push(if is_local_branch { + GroupBranch::Local(reference) + } else { + GroupBranch::Remote(reference) + }); } let virtual_branches = vb_handle.list_all_branches()?; @@ -56,7 +59,7 @@ pub fn list_branches( for branch in virtual_branches { branches.push(GroupBranch::Virtual(branch)); } - let mut branches = combine_branches(branches, ctx, vb_handle.get_default_target()?)?; + let mut branches = combine_branches(branches, &repo, vb_handle.get_default_target()?)?; // Apply the filter branches.retain(|branch| !has_filter || matches_all(branch, filter)); @@ -73,7 +76,7 @@ pub fn list_branches( return true; } - // If the virtual virtual branch has a local branch, keep the grouping + // If the virtual branch has a local branch, keep the grouping if branch.has_local { return true; }; @@ -111,11 +114,11 @@ fn matches_all(branch: &BranchListing, filter: BranchListingFilter) -> bool { fn combine_branches( group_branches: Vec, - ctx: &CommandContext, + repo: &gix::Repository, target_branch: Target, ) -> Result> { - let repo = ctx.repository(); - let remotes = repo.remotes()?; + let remotes = repo.remote_names(); + let packed = repo.refs.cached_packed_buffer()?; // Group branches by identity let mut groups: HashMap> = HashMap::new(); @@ -134,8 +137,14 @@ fn combine_branches( Ok(groups .into_iter() .filter_map(|(identity, group_branches)| { - let res = - branch_group_to_branch(&identity, group_branches, repo, &remotes, &target_branch); + let res = branch_group_to_branch( + &identity, + group_branches, + repo, + packed.as_ref().map(|p| &***p), + &remotes, + &target_branch, + ); match res { Ok(branch_entry) => branch_entry, Err(err) => { @@ -155,17 +164,22 @@ fn combine_branches( fn branch_group_to_branch( identity: &BranchIdentity, group_branches: Vec, - repo: &git2::Repository, - remotes: &git2::string_array::StringArray, + repo: &gix::Repository, + packed: Option<&gix::refs::packed::Buffer>, + remotes: &BTreeSet>, target: &Target, ) -> Result> { - let mut vbranches = group_branches - .iter() - .filter_map(|branch| match branch { - GroupBranch::Virtual(vb) => Some(vb), - _ => None, - }) - .collect::>(); + let (local_branches, remote_branches, mut vbranches) = + group_branches + .into_iter() + .fold((Vec::new(), Vec::new(), Vec::new()), |mut acc, item| { + match item { + GroupBranch::Local(branch) => acc.0.push(branch), + GroupBranch::Remote(branch) => acc.1.push(branch), + GroupBranch::Virtual(branch) => acc.2.push(branch), + } + acc + }); let virtual_branch = if vbranches.len() > 1 { vbranches.sort_by_key(|virtual_branch| virtual_branch.updated_timestamp_ms); @@ -174,25 +188,10 @@ fn branch_group_to_branch( vbranches.first() }; - let remote_branches: Vec<&git2::Branch> = group_branches - .iter() - .filter_map(|branch| match branch { - GroupBranch::Remote(gb) => Some(gb), - _ => None, - }) - .collect(); - let local_branches: Vec<&git2::Branch> = group_branches - .iter() - .filter_map(|branch| match branch { - GroupBranch::Local(gb) => Some(gb), - _ => None, - }) - .collect(); - if virtual_branch.is_none() && local_branches .iter() - .any(|b| b.get().given_name(remotes).as_deref().ok() == Some(target.branch.branch())) + .any(|b| b.name().given_name(remotes).as_deref().ok() == Some(target.branch.branch())) { return Ok(None); } @@ -204,12 +203,11 @@ fn branch_group_to_branch( in_workspace: branch.in_workspace, }); + // TODO(ST): keep the type alive, don't reduce to BString let mut remotes: Vec = Vec::new(); for branch in remote_branches.iter() { - if let Some(name) = branch.get().name() { - if let Ok(remote_name) = repo.branch_remote_name(name) { - remotes.push(remote_name.as_bstr().into()); - } + if let Some(remote_name) = branch.remote_name(gix::remote::Direction::Fetch) { + remotes.push(remote_name.as_bstr().into()); } } @@ -218,21 +216,22 @@ fn branch_group_to_branch( // The head commit for which we calculate statistics. // If there is a virtual branch let's get it's head. Alternatively, pick the first local branch and use it's head. // If there are no local branches, pick the first remote branch. - let head = if let Some(vbranch) = virtual_branch { - Some(vbranch.head) - } else if let Some(branch) = local_branches.first().cloned() { - branch.get().peel_to_commit().ok().map(|c| c.id()) - } else if let Some(branch) = remote_branches.first().cloned() { - branch.get().peel_to_commit().ok().map(|c| c.id()) + let head_commit = if let Some(vbranch) = virtual_branch { + Some(git2_to_gix_object_id(vbranch.head).attach(repo)) + } else if let Some(mut branch) = local_branches.into_iter().next() { + branch.peel_to_id_in_place_packed(packed).ok() + } else if let Some(mut branch) = remote_branches.into_iter().next() { + branch.peel_to_id_in_place_packed(packed).ok() } else { None } .context("Could not get any valid reference in order to build branch stats")?; - let head_commit = repo.find_commit(head)?; - // If this was a virtual branch and there was never any remote set, use the virtual branch name as the identity + let head = gix_to_git2_oid(head_commit.detach()); + let head_commit = head_commit.object()?.try_into_commit()?; + let head_commit = head_commit.decode()?; let last_modified_ms = max( - (head_commit.time().seconds() * 1000) as u128, + (head_commit.time().seconds * 1000) as u128, virtual_branch.map_or(0, |x| x.updated_timestamp_ms), ); let last_commiter = head_commit.author().into(); @@ -248,30 +247,37 @@ fn branch_group_to_branch( })) } +fn gix_to_git2_oid(id: gix::ObjectId) -> git2::Oid { + git2::Oid::from_bytes(id.as_bytes()).expect("always valid") +} + +fn git2_to_gix_object_id(id: git2::Oid) -> gix::ObjectId { + gix::ObjectId::try_from(id.as_bytes()).expect("git2 oid is always valid") +} + /// A sum type of branch that can be a plain git branch or a virtual branch #[allow(clippy::large_enum_variant)] enum GroupBranch<'a> { - Local(git2::Branch<'a>), - Remote(git2::Branch<'a>), + Local(gix::Reference<'a>), + Remote(gix::Reference<'a>), Virtual(GitButlerBranch), } impl fmt::Debug for GroupBranch<'_> { fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - GroupBranch::Local(branch) | GroupBranch::Remote(branch) => { - let reference = branch.get(); - let target = reference - .target() - .expect("Failed to reference target in debug formatting"); - let name = reference - .name() - .expect("Failed to get reference name in debug"); - formatter - .debug_struct("GroupBranch::Local/Remote") - .field("0", &&format!("id: {}, name: {}", target, name).as_str()) - .finish() - } + GroupBranch::Local(branch) | GroupBranch::Remote(branch) => formatter + .debug_struct("GroupBranch::Local/Remote") + .field( + "0", + &format!( + "id: {:?}, name: {}", + branch.target(), + branch.name().as_bstr() + ) + .as_str(), + ) + .finish(), GroupBranch::Virtual(branch) => formatter .debug_struct("GroupBranch::Virtal") .field("0", branch) @@ -284,10 +290,11 @@ impl GroupBranch<'_> { /// A name identifier for the branch. When multiple branches (e.g. virtual, local, remote) have the same identity, /// they are grouped together under the same `Branch` entry. /// `None` means an identity could not be obtained, which makes this branch odd enough to ignore. - fn identity(&self, remotes: &git2::string_array::StringArray) -> Option { + fn identity(&self, remotes: &BTreeSet>) -> Option { match self { - GroupBranch::Local(branch) => branch.get().given_name(remotes).ok(), - GroupBranch::Remote(branch) => branch.get().given_name(remotes).ok(), + GroupBranch::Local(branch) | GroupBranch::Remote(branch) => { + branch.name().given_name(remotes).ok() + } // The identity of a Virtual branch is derived from the source refname, upstream or the branch given name, in that order GroupBranch::Virtual(branch) => { let name_from_source = branch.source_refname.as_ref().and_then(|n| n.branch()); @@ -354,7 +361,7 @@ pub struct BranchListing { /// The head of interest for the branch group, used for calculating branch statistics. /// If there is a virtual branch, a local branch and remote branches, the head is determined in the following order: /// 1. The head of the virtual branch - /// 2. The head of the local branch + /// 2. The head of the first local branch /// 3. The head of the first remote branch #[serde(skip)] pub head: git2::Oid, @@ -363,6 +370,7 @@ pub struct BranchListing { /// Represents a "commit author" or "signature", based on the data from the git history #[derive(Debug, Clone, Serialize, PartialEq, Eq, Hash)] pub struct Author { + // TODO(ST): use `BString` here to not degenerate information /// The name of the author as configured in the git config pub name: Option, /// The email of the author as configured in the git config @@ -403,6 +411,15 @@ impl From> for Author { } } +impl From> for Author { + fn from(value: gix::actor::SignatureRef<'_>) -> Self { + Author { + name: Some(value.name.to_string()), + email: Some(value.email.to_string()), + } + } +} + /// Represents a reference to an associated virtual branch #[derive(Debug, Clone, Serialize, PartialEq)] #[serde(rename_all = "camelCase")] diff --git a/crates/gitbutler-branch-actions/tests/fixtures/branch-benches.sh b/crates/gitbutler-branch-actions/tests/fixtures/branch-benches.sh new file mode 100644 index 0000000000..a0ddda67eb --- /dev/null +++ b/crates/gitbutler-branch-actions/tests/fixtures/branch-benches.sh @@ -0,0 +1,96 @@ +#!/usr/bin/env bash +set -eu -o pipefail +CLI=${1:?The first argument is the GitButler CLI} + +git init remote +(cd remote + echo first > file + git add . && git commit -m "init" +) + +function init-virtual() { + $CLI project add --switch-to-integration "$(git rev-parse --symbolic-full-name @{u})" + $CLI branch create virtual +} + +function pack-refs() { + git pack-refs --prune --all + git config core.precomposeUnicode false +} + +function unpack-packed-refs() { + local git_dir=$(git rev-parse --git-dir) + local packed_refs_file="$git_dir/packed-refs" + + if [[ ! -f "$packed_refs_file" ]]; then + echo "No packed-refs file found." + return 1 + fi + + while IFS= read -r line; do + # Skip comments and peel lines + [[ "$line" =~ ^# ]] && continue + [[ "$line" =~ ^\^ ]] && continue + + # Split line into hash and ref + hash=$(echo "$line" | awk '{print $1}') + ref=$(echo "$line" | awk '{print $2}') + + # Skip invalid lines + [[ -z "$hash" || -z "$ref" ]] && continue + + # Create directory for the ref if it does not exist + ref_dir=$(dirname "$git_dir/$ref") + mkdir -p "$ref_dir" + + # Write the hash to the ref file + echo "$hash" > "$git_dir/$ref" + done < "$packed_refs_file" + + rm $packed_refs_file + + git config core.precomposeUnicode false +} + + +export GITBUTLER_CLI_DATA_DIR=../user/gitbutler/app-data +branch_count=300 +git clone remote many-local +(cd many-local + init-virtual + + for name in $(seq $branch_count); do + git branch "$name" + done + unpack-packed-refs +) + +git clone remote many-local-packed +(cd many-local-packed + init-virtual + + for name in $(seq $branch_count); do + git branch "$name" + done + pack-refs +) + +git clone many-local many-local-tracked +(cd many-local-tracked + init-virtual + + for name in $(seq $branch_count); do + git branch --track "$name" + done + unpack-packed-refs +) + +git clone many-local-packed many-local-tracked-packed +(cd many-local-tracked-packed + init-virtual + + for name in $(seq $branch_count); do + git branch --track "$name" + done + pack-refs +) diff --git a/crates/gitbutler-branch-actions/tests/virtual_branches/list.rs b/crates/gitbutler-branch-actions/tests/virtual_branches/list.rs index 0ff16469ec..83e0321e5a 100644 --- a/crates/gitbutler-branch-actions/tests/virtual_branches/list.rs +++ b/crates/gitbutler-branch-actions/tests/virtual_branches/list.rs @@ -125,7 +125,7 @@ fn one_branch_on_integration_multiple_remotes() -> Result<()> { &list[0], ExpectedBranchListing { identity: "main".into(), - remotes: vec!["other-remote", "origin"], + remotes: vec!["origin", "other-remote"], virtual_branch_given_name: Some("main"), virtual_branch_in_workspace: true, has_local: true, diff --git a/crates/gitbutler-branch/src/lib.rs b/crates/gitbutler-branch/src/lib.rs index e758c6b30d..04cf5a1447 100644 --- a/crates/gitbutler-branch/src/lib.rs +++ b/crates/gitbutler-branch/src/lib.rs @@ -6,7 +6,7 @@ use bstr::ByteSlice; mod branch_ext; pub use branch_ext::BranchExt; mod reference_ext; -pub use reference_ext::ReferenceExt; +pub use reference_ext::{ReferenceExt, ReferenceExtGix}; mod dedup; pub use dedup::{dedup, dedup_fmt}; mod file_ownership; diff --git a/crates/gitbutler-branch/src/reference_ext.rs b/crates/gitbutler-branch/src/reference_ext.rs index 9f687a3ee7..f7e693cf19 100644 --- a/crates/gitbutler-branch/src/reference_ext.rs +++ b/crates/gitbutler-branch/src/reference_ext.rs @@ -1,5 +1,9 @@ -use anyhow::Result; +use anyhow::{Context, Result}; +use bstr::{BStr, ByteSlice}; +use gix::refs::Category; use itertools::Itertools; +use std::borrow::Cow; +use std::collections::BTreeSet; pub trait ReferenceExt { /// Fetches a branches name without the remote name attached @@ -13,6 +17,19 @@ pub trait ReferenceExt { fn given_name(&self, remotes: &git2::string_array::StringArray) -> Result; } +// TODO(ST): replace the original with this one. +pub trait ReferenceExtGix { + /// Fetches a branches name without the remote name attached + /// + /// refs/heads/my-branch -> my-branch + /// refs/remotes/origin/my-branch -> my-branch + /// refs/remotes/Byron/gitbutler/my-branch -> my-branch (where the remote is Byron/gitbutler) + /// + /// An ideal implementation wouldn't require us to list all the references, + /// but there doesn't seem to be a libgit2 solution to this. + fn given_name(&self, remotes: &BTreeSet>) -> Result; +} + impl<'repo> ReferenceExt for git2::Reference<'repo> { fn given_name(&self, remotes: &git2::string_array::StringArray) -> Result { if self.is_remote() { @@ -46,3 +63,35 @@ impl<'repo> ReferenceExt for git2::Reference<'repo> { } } } + +impl ReferenceExtGix for &gix::refs::FullNameRef { + // TODO: make this `identity()`, and use `BranchIdentity` type. + fn given_name(&self, remotes: &BTreeSet>) -> Result { + let (category, shorthand_name) = self + .category_and_short_name() + .context("Branch could not be categorized")?; + if !matches!(category, Category::RemoteBranch) { + return Ok(shorthand_name.to_string()); + } + + let longest_remote = remotes + .iter() + .rfind(|reference_name| shorthand_name.starts_with(reference_name)) + .ok_or(anyhow::anyhow!( + "Failed to find remote branch's corresponding remote" + ))?; + + let shorthand_name: &BStr = shorthand_name + .strip_prefix(longest_remote.as_bytes()) + .and_then(|str| str.strip_prefix(b"/")) + .ok_or(anyhow::anyhow!( + "Failed to cut remote name {} off of shorthand name {}", + longest_remote, + shorthand_name + ))? + .into(); + + // TODO(correctness): this should be `BString`, but can't change it yet. + Ok(shorthand_name.to_string()) + } +} diff --git a/crates/gitbutler-cli/Cargo.toml b/crates/gitbutler-cli/Cargo.toml index c2b56e17bf..eefae0adcc 100644 --- a/crates/gitbutler-cli/Cargo.toml +++ b/crates/gitbutler-cli/Cargo.toml @@ -17,7 +17,7 @@ gitbutler-reference.workspace = true gitbutler-branch-actions.workspace = true gitbutler-branch.workspace = true gitbutler-diff.workspace = true -gix.workspace = true +gix = { workspace = true, features = ["max-performance-safe"] } dirs-next = "2.0.0" clap = { version = "4.5.13", features = ["derive", "env"] } anyhow = "1.0.86" diff --git a/crates/gitbutler-git/Cargo.toml b/crates/gitbutler-git/Cargo.toml index 0e51a625f1..7a7028f399 100644 --- a/crates/gitbutler-git/Cargo.toml +++ b/crates/gitbutler-git/Cargo.toml @@ -24,6 +24,8 @@ serde = ["dep:serde"] tokio = ["dep:tokio"] ## a flag that is needed for integration tests that run this code to work. test-askpass-path = [] +## a flag to indicate benchmarks are run +benches = [] [dependencies] thiserror.workspace = true diff --git a/crates/gitbutler-git/src/lib.rs b/crates/gitbutler-git/src/lib.rs index d3df78d517..8edc158a23 100644 --- a/crates/gitbutler-git/src/lib.rs +++ b/crates/gitbutler-git/src/lib.rs @@ -9,8 +9,12 @@ #![allow(unknown_lints)] #![cfg_attr(windows, feature(windows_by_handle))] -#[cfg(all(not(debug_assertions), feature = "test-askpass-path"))] -compile_error!("BUG: in production code this flag should not be set, nor do we run test with `cargo test --release`"); +#[cfg(all( + not(debug_assertions), + not(feature = "benches"), + feature = "test-askpass-path" +))] +compile_error!("BUG: in production code this flag should not be set, nor do we run test with `cargo test --release`. Benches must use `--features benches`"); mod error; pub(crate) mod executor; diff --git a/crates/gitbutler-tauri/Cargo.toml b/crates/gitbutler-tauri/Cargo.toml index 027a903062..975f08869b 100644 --- a/crates/gitbutler-tauri/Cargo.toml +++ b/crates/gitbutler-tauri/Cargo.toml @@ -29,6 +29,7 @@ dirs = "5.0.1" fslock.workspace = true futures.workspace = true git2.workspace = true +gix = { workspace = true, features = ["max-performance-safe"] } once_cell = "1.19" reqwest = { version = "0.12.4", features = ["json"] } serde.workspace = true diff --git a/crates/gitbutler-testsupport/src/lib.rs b/crates/gitbutler-testsupport/src/lib.rs index a6d2e8269f..90af71f646 100644 --- a/crates/gitbutler-testsupport/src/lib.rs +++ b/crates/gitbutler-testsupport/src/lib.rs @@ -103,6 +103,12 @@ pub mod read_only { /// /// Returns the project that is strictly for read-only use. pub fn fixture(script_name: &str, project_directory: &str) -> anyhow::Result { + let project = fixture_project(script_name, project_directory)?; + CommandContext::open(&project) + } + + /// Like [`fixture()`], but will return only the `Project` at `project_directory` after executing `script_name`. + pub fn fixture_project(script_name: &str, project_directory: &str) -> anyhow::Result { static IS_VALID_PROJECT: Lazy>> = Lazy::new(|| Mutex::new(Default::default())); @@ -128,7 +134,7 @@ pub mod read_only { ..Default::default() } }; - CommandContext::open(&project) + Ok(project) } }