summaryrefslogtreecommitdiffstats
path: root/vendor/gix-mailmap
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 12:41:35 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 12:41:35 +0000
commit7e5d7eea9c580ef4b41a765bde624af431942b96 (patch)
tree2c0d9ca12878fc4525650aa4e54d77a81a07cc09 /vendor/gix-mailmap
parentAdding debian version 1.70.0+dfsg1-9. (diff)
downloadrustc-7e5d7eea9c580ef4b41a765bde624af431942b96.tar.xz
rustc-7e5d7eea9c580ef4b41a765bde624af431942b96.zip
Merging upstream version 1.70.0+dfsg2.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/gix-mailmap')
-rw-r--r--vendor/gix-mailmap/.cargo-checksum.json1
-rw-r--r--vendor/gix-mailmap/CHANGELOG.md390
-rw-r--r--vendor/gix-mailmap/Cargo.toml64
-rw-r--r--vendor/gix-mailmap/src/entry.rs70
-rw-r--r--vendor/gix-mailmap/src/lib.rs63
-rw-r--r--vendor/gix-mailmap/src/parse.rs116
-rw-r--r--vendor/gix-mailmap/src/snapshot/entry.rs90
-rw-r--r--vendor/gix-mailmap/src/snapshot/mod.rs167
-rw-r--r--vendor/gix-mailmap/src/snapshot/signature.rs63
-rw-r--r--vendor/gix-mailmap/src/snapshot/util.rs104
-rw-r--r--vendor/gix-mailmap/tests/fixtures/invalid.txt5
-rw-r--r--vendor/gix-mailmap/tests/fixtures/overwrite.txt13
-rw-r--r--vendor/gix-mailmap/tests/fixtures/typical.txt8
-rw-r--r--vendor/gix-mailmap/tests/mailmap.rs2
-rw-r--r--vendor/gix-mailmap/tests/parse/mod.rs130
-rw-r--r--vendor/gix-mailmap/tests/snapshot/mod.rs127
16 files changed, 1413 insertions, 0 deletions
diff --git a/vendor/gix-mailmap/.cargo-checksum.json b/vendor/gix-mailmap/.cargo-checksum.json
new file mode 100644
index 000000000..756c2e48f
--- /dev/null
+++ b/vendor/gix-mailmap/.cargo-checksum.json
@@ -0,0 +1 @@
+{"files":{"CHANGELOG.md":"8ca82d725b7a3fdaf62b9ac30adaa9ba5c2922dbda3d9a7926a4baa3ff86a980","Cargo.toml":"f248713e5722281d8c809c7964cfc28b093820b8498525e735181cb22dba9221","src/entry.rs":"77e63ac850b7d5d5af3c1c5184e221efb39c480dd5fd00484cad5d173a56c2db","src/lib.rs":"2dbe93c781d1f27f5b4070cb497ba75eacf12640dd560b3ca804cb8292a0bbe6","src/parse.rs":"b509a5ee86e7690b4e91f305909a28fed2077a931d91b998b4843c8dba98ceae","src/snapshot/entry.rs":"c30a21ffafdaebdb66fa5af724a6d3435e329d746f9b24efe4ae4ba9f1e19e84","src/snapshot/mod.rs":"c853a5a40bd60b62d29d1e5de528f2f9d029d07da94cf10f31a01f7bfa653d35","src/snapshot/signature.rs":"83790225f8225e6ac9f4438a1937202cb1eed0c57aed8a3f8873672bbba4dd92","src/snapshot/util.rs":"47579223fdced5ce907cb853dfe18ae983978085be5763b103ba071e538d60db","tests/fixtures/invalid.txt":"9a575f1df5c5608c2138154909eb790308a793783a16ccf9164189ed98154b1c","tests/fixtures/overwrite.txt":"ab8b622934003f16c8add329d07ca282f3cea62cbb95c479ca166f629f60bc45","tests/fixtures/typical.txt":"2fbda9e1cff5bd1b5904056f88a7a28ce086f94f203e4324f3d0fd6d301c44db","tests/mailmap.rs":"e9590a37dbd86c0d1138f5bb6a841f8830e81f5c2f65a9d972aa94090d8cda36","tests/parse/mod.rs":"74a147082d0fdd4a1aedd8d500420c35a911b77a22433cccd079e1650e130676","tests/snapshot/mod.rs":"c32d46784b94294f88e344e09482174fee8355a2dd66d03f8ec292c6fd2e2a09"},"package":"2b66aea5e52875cd4915f4957a6f4b75831a36981e2ec3f5fad9e370e444fe1a"} \ No newline at end of file
diff --git a/vendor/gix-mailmap/CHANGELOG.md b/vendor/gix-mailmap/CHANGELOG.md
new file mode 100644
index 000000000..e8402224e
--- /dev/null
+++ b/vendor/gix-mailmap/CHANGELOG.md
@@ -0,0 +1,390 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## 0.11.0 (2023-03-04)
+
+A maintenance release without user-facing changes.
+
+### Commit Statistics
+
+<csr-read-only-do-not-edit/>
+
+ - 2 commits contributed to the release.
+ - 3 days passed between releases.
+ - 0 commits were understood as [conventional](https://www.conventionalcommits.org).
+ - 0 issues like '(#ID)' were seen in commit messages
+
+### Commit Details
+
+<csr-read-only-do-not-edit/>
+
+<details><summary>view details</summary>
+
+ * **Uncategorized**
+ - Prepare changelogs prior to release ([`895e482`](https://github.com/Byron/gitoxide/commit/895e482badf01e953bb9144001eebd5e1b1c4d84))
+ - Release gix-features v0.28.0, gix-actor v0.19.0, gix-object v0.28.0, gix-diff v0.28.0, gix-traverse v0.24.0, gix-pack v0.32.0, safety bump 20 crates ([`0f411e9`](https://github.com/Byron/gitoxide/commit/0f411e93ec812592bb9d3a52b751399dd86f76f7))
+</details>
+
+## 0.10.0 (2023-03-01)
+
+<csr-id-d09656bf1eeff0449ecd53b68988dc142a97193f/>
+
+### Chore
+
+ - <csr-id-d09656bf1eeff0449ecd53b68988dc142a97193f/> replace `quick-error` with `thiserror`
+ This increases the compile time of the crate alone if there is no proc-macro
+ in the dependency tree, but will ever so slightly improve compile times for `gix`
+ as a whole.
+
+### Commit Statistics
+
+<csr-read-only-do-not-edit/>
+
+ - 6 commits contributed to the release over the course of 1 calendar day.
+ - 8 days passed between releases.
+ - 1 commit was understood as [conventional](https://www.conventionalcommits.org).
+ - 0 issues like '(#ID)' were seen in commit messages
+
+### Commit Details
+
+<csr-read-only-do-not-edit/>
+
+<details><summary>view details</summary>
+
+ * **Uncategorized**
+ - Release gix-tempfile v4.1.0, gix-lock v4.0.0, gix-ref v0.25.0, gix-config v0.17.0, gix-url v0.14.0, gix-credentials v0.10.0, gix-diff v0.27.0, gix-discover v0.14.0, gix-hashtable v0.1.2, gix-bitmap v0.2.2, gix-traverse v0.23.0, gix-index v0.13.0, gix-mailmap v0.10.0, gix-pack v0.31.0, gix-odb v0.41.0, gix-transport v0.26.0, gix-protocol v0.27.0, gix-revision v0.11.0, gix-refspec v0.8.0, gix-worktree v0.13.0, gix v0.38.0, safety bump 6 crates ([`ea9fd1d`](https://github.com/Byron/gitoxide/commit/ea9fd1d9b60e1e9e17042e9e37c06525823c40a5))
+ - Release gix-features v0.27.0, gix-actor v0.18.0, gix-quote v0.4.3, gix-attributes v0.9.0, gix-object v0.27.0, gix-ref v0.25.0, gix-config v0.17.0, gix-url v0.14.0, gix-credentials v0.10.0, gix-diff v0.27.0, gix-discover v0.14.0, gix-hashtable v0.1.2, gix-bitmap v0.2.2, gix-traverse v0.23.0, gix-index v0.13.0, gix-mailmap v0.10.0, gix-pack v0.31.0, gix-odb v0.41.0, gix-transport v0.26.0, gix-protocol v0.27.0, gix-revision v0.11.0, gix-refspec v0.8.0, gix-worktree v0.13.0, gix v0.38.0 ([`e6cc618`](https://github.com/Byron/gitoxide/commit/e6cc6184a7a49dbc2503c1c1bdd3688ca5cec5fe))
+ - Adjust manifests prior to release ([`addd789`](https://github.com/Byron/gitoxide/commit/addd78958fdd1e54eb702854e96079539d01965a))
+ - Prepare changelogs prior to release ([`94c99c7`](https://github.com/Byron/gitoxide/commit/94c99c71520f33269cc8dbc26f82a74747cc7e16))
+ - Merge branch 'adjustments-for-cargo' ([`d686d94`](https://github.com/Byron/gitoxide/commit/d686d94e1030a8591ba074757d56927a346c8351))
+ - Replace `quick-error` with `thiserror` ([`d09656b`](https://github.com/Byron/gitoxide/commit/d09656bf1eeff0449ecd53b68988dc142a97193f))
+</details>
+
+## 0.9.3 (2023-02-20)
+
+### Bug Fixes
+
+ - <csr-id-e14dc7d475373d2c266e84ff8f1826c68a34ab92/> note that crates have been renamed from `git-*` to `gix-*`.
+ This also means that the `git-*` prefixed crates of the `gitoxide` project
+ are effectively unmaintained.
+ Use the crates with the `gix-*` prefix instead.
+
+ If you were using `git-repository`, then `gix` is its substitute.
+ - <csr-id-135d317065aae87af302beb6c26bb6ca8e30b6aa/> compatibility with `bstr` v1.3, use `*.as_bytes()` instead of `.as_ref()`.
+ `as_ref()` relies on a known target type which isn't always present. However, once
+ there is only one implementation, that's no problem, but when that changes compilation
+ fails due to ambiguity.
+
+### Commit Statistics
+
+<csr-read-only-do-not-edit/>
+
+ - 2 commits contributed to the release.
+ - 3 days passed between releases.
+ - 1 commit was understood as [conventional](https://www.conventionalcommits.org).
+ - 0 issues like '(#ID)' were seen in commit messages
+
+### Commit Details
+
+<csr-read-only-do-not-edit/>
+
+<details><summary>view details</summary>
+
+ * **Uncategorized**
+ - Release gix-date v0.4.3, gix-hash v0.10.3, gix-features v0.26.5, gix-actor v0.17.2, gix-glob v0.5.5, gix-path v0.7.2, gix-quote v0.4.2, gix-attributes v0.8.3, gix-validate v0.7.3, gix-object v0.26.2, gix-ref v0.24.1, gix-config v0.16.2, gix-command v0.2.4, gix-url v0.13.3, gix-credentials v0.9.2, gix-discover v0.13.1, gix-index v0.12.4, gix-mailmap v0.9.3, gix-pack v0.30.3, gix-packetline v0.14.3, gix-transport v0.25.6, gix-protocol v0.26.4, gix-revision v0.10.4, gix-refspec v0.7.3, gix-worktree v0.12.3, gix v0.36.1 ([`9604783`](https://github.com/Byron/gitoxide/commit/96047839a20a657a559376b0b14c65aeab96acbd))
+ - Compatibility with `bstr` v1.3, use `*.as_bytes()` instead of `.as_ref()`. ([`135d317`](https://github.com/Byron/gitoxide/commit/135d317065aae87af302beb6c26bb6ca8e30b6aa))
+</details>
+
+## 0.9.2 (2023-02-17)
+
+<csr-id-f7f136dbe4f86e7dee1d54835c420ec07c96cd78/>
+<csr-id-533e887e80c5f7ede8392884562e1c5ba56fb9a8/>
+
+### New Features (BREAKING)
+
+ - <csr-id-3d8fa8fef9800b1576beab8a5bc39b821157a5ed/> upgrade edition to 2021 in most crates.
+ MSRV for this is 1.56, and we are now at 1.60 so should be compatible.
+ This isn't more than a patch release as it should break nobody
+ who is adhering to the MSRV, but let's be careful and mark it
+ breaking.
+
+ Note that `git-features` and `git-pack` are still on edition 2018
+ as they make use of a workaround to support (safe) mutable access
+ to non-overlapping entries in a slice which doesn't work anymore
+ in edition 2021.
+
+### Changed (BREAKING)
+
+ - <csr-id-99905bacace8aed42b16d43f0f04cae996cb971c/> upgrade `bstr` to `1.0.1`
+
+### New Features
+
+ - <csr-id-bd8f50bf56d98843a3e0d3c6e349451b623c51ae/> `Snapshot::resolve_cow()` allows to copy fields only if they change.
+ This generally speeds up resolution performance as it won't
+ unnecessarily copy anything anymore. Furthermore it allows the caller
+ to see which of the fields, name or email, was actually remapped.
+ - <csr-id-b1c40b0364ef092cd52d03b34f491b254816b18d/> use docsrs feature in code to show what is feature-gated automatically on docs.rs
+ - <csr-id-517677147f1c17304c62cf97a1dd09f232ebf5db/> pass --cfg docsrs when compiling for https://docs.rs
+ - <csr-id-d2388d8d80f379eccc9ee84ebe07acd67d154630/> `gix repository mailmap entries`
+ - <csr-id-77ef2cb819f21ddc5d1ee9e94b5961e3ca5b3139/> `Time::default()`
+
+### Chore
+
+ - <csr-id-f7f136dbe4f86e7dee1d54835c420ec07c96cd78/> uniformize deny attributes
+ - <csr-id-533e887e80c5f7ede8392884562e1c5ba56fb9a8/> remove default link to cargo doc everywhere
+
+### Documentation
+
+ - <csr-id-39ed9eda62b7718d5109135e5ad406fb1fe2978c/> fix typos
+
+### Commit Statistics
+
+<csr-read-only-do-not-edit/>
+
+ - 138 commits contributed to the release over the course of 328 calendar days.
+ - 10 commits were understood as [conventional](https://www.conventionalcommits.org).
+ - 6 unique issues were worked on: [#301](https://github.com/Byron/gitoxide/issues/301), [#364](https://github.com/Byron/gitoxide/issues/364), [#366](https://github.com/Byron/gitoxide/issues/366), [#450](https://github.com/Byron/gitoxide/issues/450), [#470](https://github.com/Byron/gitoxide/issues/470), [#691](https://github.com/Byron/gitoxide/issues/691)
+
+### Commit Details
+
+<csr-read-only-do-not-edit/>
+
+<details><summary>view details</summary>
+
+ * **[#301](https://github.com/Byron/gitoxide/issues/301)**
+ - Update changelogs prior to release ([`84cb256`](https://github.com/Byron/gitoxide/commit/84cb25614a5fcddff297c1713eba4efbb6ff1596))
+ * **[#364](https://github.com/Byron/gitoxide/issues/364)**
+ - More aggressive mailmap substitution for better results ([`600eb69`](https://github.com/Byron/gitoxide/commit/600eb69132c24e15fde88ac5724ee5d2105be8df))
+ - Adjust to changes in git-actor ([`e5c0200`](https://github.com/Byron/gitoxide/commit/e5c02002467a6ad2ab2330cf6f38bcebabf4ba7c))
+ * **[#366](https://github.com/Byron/gitoxide/issues/366)**
+ - `gix repository mailmap entries` ([`d2388d8`](https://github.com/Byron/gitoxide/commit/d2388d8d80f379eccc9ee84ebe07acd67d154630))
+ - Gix mailmap verify can now detect collisions ([`f89fe2f`](https://github.com/Byron/gitoxide/commit/f89fe2f867fa792db5d9e003ce342a337a6ac973))
+ - Verify universal line-endings are supported ([`f498dac`](https://github.com/Byron/gitoxide/commit/f498dacfc34c3d0b7c3bdbf100e456ad3ade419e))
+ - Fix email-only case ([`e31754d`](https://github.com/Byron/gitoxide/commit/e31754d3d9c58f82ff4fad11ed7985dffc99b586))
+ - Add all docs ([`1c768a5`](https://github.com/Byron/gitoxide/commit/1c768a5511ba4e2f7f860b48429ddd3930a6b501))
+ - Another test to validate correct merging and overwriting ([`deaeb7d`](https://github.com/Byron/gitoxide/commit/deaeb7d1730d90d06789c47adad0e25f9b74fd13))
+ - Add method to return borrowed values for new name/email ([`87fb932`](https://github.com/Byron/gitoxide/commit/87fb932239e5f5a55046f8edb073373cd4957422))
+ - Actual lookup and tests, all seems to be working ([`8116664`](https://github.com/Byron/gitoxide/commit/81166646e3ecc9ab7383de62a0a216d0229c90bd))
+ - Sketch `Snapshot` API to implement map building and signature resolution ([`1890db7`](https://github.com/Byron/gitoxide/commit/1890db73b5fd66467c66efd9ddc365871041c7c3))
+ - `Time::default()` ([`77ef2cb`](https://github.com/Byron/gitoxide/commit/77ef2cb819f21ddc5d1ee9e94b5961e3ca5b3139))
+ - Sketch of mailmap snapshot for lookups ([`d71d067`](https://github.com/Byron/gitoxide/commit/d71d0670cd89a2dac2ea84cbc538f67fef3ee451))
+ - Add typical malmap example ([`b67b0f9`](https://github.com/Byron/gitoxide/commit/b67b0f90dd947508ab9ab0b7d68ce0093ae415ae))
+ - Quickfix for unintentionally using 'unicode' feature of bytecode ([`fb5593a`](https://github.com/Byron/gitoxide/commit/fb5593a7272498ae042b6c8c7605faa3d253fa10))
+ - All tests (so far) green ([`67a2050`](https://github.com/Byron/gitoxide/commit/67a2050156cc809767ca026f467f35b552bea043))
+ - High-level parsing to deal with allowed mailmap lines ([`f458817`](https://github.com/Byron/gitoxide/commit/f458817005b884e966bcc894a0cf7c9958882ba4))
+ - Fix serde support ([`2fb4310`](https://github.com/Byron/gitoxide/commit/2fb43102cf8bbfa9c26877d81d8fd3208fc5e183))
+ - Basic testing of common cases for mailmap ([`903c526`](https://github.com/Byron/gitoxide/commit/903c5263a26d9a57d9fa9dc6649ef4ad0a6e2a94))
+ - The first empty test ([`fc47c49`](https://github.com/Byron/gitoxide/commit/fc47c497f992e0f3fbef2f55d0e3b0909cac8290))
+ - Empty git-mailmap crate ([`a30a5da`](https://github.com/Byron/gitoxide/commit/a30a5da60d67a4e52ba69727318edb9832b7cae2))
+ * **[#450](https://github.com/Byron/gitoxide/issues/450)**
+ - Upgrade `bstr` to `1.0.1` ([`99905ba`](https://github.com/Byron/gitoxide/commit/99905bacace8aed42b16d43f0f04cae996cb971c))
+ * **[#470](https://github.com/Byron/gitoxide/issues/470)**
+ - Update changelogs prior to release ([`caa7a1b`](https://github.com/Byron/gitoxide/commit/caa7a1bdef74d7d3166a7e38127a59f5ab3cfbdd))
+ * **[#691](https://github.com/Byron/gitoxide/issues/691)**
+ - Set `rust-version` to 1.64 ([`55066ce`](https://github.com/Byron/gitoxide/commit/55066ce5fd71209abb5d84da2998b903504584bb))
+ * **Uncategorized**
+ - Release gix-index v0.12.3, gix-mailmap v0.9.2, gix-chunk v0.4.1, gix-pack v0.30.2, gix-odb v0.40.2, gix-packetline v0.14.2, gix-transport v0.25.4, gix-protocol v0.26.3, gix-revision v0.10.3, gix-refspec v0.7.2, gix-worktree v0.12.2, gix v0.36.0 ([`48f5bd2`](https://github.com/Byron/gitoxide/commit/48f5bd2014fa3dda6fbd60d091065c5537f69453))
+ - Release gix-credentials v0.9.1, gix-diff v0.26.1, gix-discover v0.13.0, gix-hashtable v0.1.1, gix-bitmap v0.2.1, gix-traverse v0.22.1, gix-index v0.12.3, gix-mailmap v0.9.2, gix-chunk v0.4.1, gix-pack v0.30.2, gix-odb v0.40.2, gix-packetline v0.14.2, gix-transport v0.25.4, gix-protocol v0.26.3, gix-revision v0.10.3, gix-refspec v0.7.2, gix-worktree v0.12.2, gix v0.36.0 ([`a5869e0`](https://github.com/Byron/gitoxide/commit/a5869e0b223406820bca836e3e3a7fae2bfd9b04))
+ - Release gix-config v0.16.1, gix-command v0.2.3, gix-prompt v0.3.2, gix-url v0.13.2, gix-credentials v0.9.1, gix-diff v0.26.1, gix-discover v0.13.0, gix-hashtable v0.1.1, gix-bitmap v0.2.1, gix-traverse v0.22.1, gix-index v0.12.3, gix-mailmap v0.9.2, gix-chunk v0.4.1, gix-pack v0.30.2, gix-odb v0.40.2, gix-packetline v0.14.2, gix-transport v0.25.4, gix-protocol v0.26.3, gix-revision v0.10.3, gix-refspec v0.7.2, gix-worktree v0.12.2, gix v0.36.0 ([`41d57b9`](https://github.com/Byron/gitoxide/commit/41d57b98964094fc1528adb09f69ca824229bf25))
+ - Release gix-attributes v0.8.2, gix-config-value v0.10.1, gix-tempfile v3.0.2, gix-lock v3.0.2, gix-validate v0.7.2, gix-object v0.26.1, gix-ref v0.24.0, gix-sec v0.6.2, gix-config v0.16.1, gix-command v0.2.3, gix-prompt v0.3.2, gix-url v0.13.2, gix-credentials v0.9.1, gix-diff v0.26.1, gix-discover v0.13.0, gix-hashtable v0.1.1, gix-bitmap v0.2.1, gix-traverse v0.22.1, gix-index v0.12.3, gix-mailmap v0.9.2, gix-chunk v0.4.1, gix-pack v0.30.2, gix-odb v0.40.2, gix-packetline v0.14.2, gix-transport v0.25.4, gix-protocol v0.26.3, gix-revision v0.10.3, gix-refspec v0.7.2, gix-worktree v0.12.2, gix v0.36.0 ([`e313112`](https://github.com/Byron/gitoxide/commit/e31311257bd138b52042dea5fc40c3abab7f269b))
+ - Release gix-features v0.26.4, gix-actor v0.17.1, gix-glob v0.5.3, gix-path v0.7.1, gix-quote v0.4.1, gix-attributes v0.8.2, gix-config-value v0.10.1, gix-tempfile v3.0.2, gix-lock v3.0.2, gix-validate v0.7.2, gix-object v0.26.1, gix-ref v0.24.0, gix-sec v0.6.2, gix-config v0.16.1, gix-command v0.2.3, gix-prompt v0.3.2, gix-url v0.13.2, gix-credentials v0.9.1, gix-diff v0.26.1, gix-discover v0.13.0, gix-hashtable v0.1.1, gix-bitmap v0.2.1, gix-traverse v0.22.1, gix-index v0.12.3, gix-mailmap v0.9.2, gix-chunk v0.4.1, gix-pack v0.30.2, gix-odb v0.40.2, gix-packetline v0.14.2, gix-transport v0.25.4, gix-protocol v0.26.3, gix-revision v0.10.3, gix-refspec v0.7.2, gix-worktree v0.12.2, gix v0.36.0 ([`6efd0d3`](https://github.com/Byron/gitoxide/commit/6efd0d31fbeca31ab7319aa2ac97bb31dc4ce055))
+ - Release gix-date v0.4.2, gix-hash v0.10.2, gix-features v0.26.4, gix-actor v0.17.1, gix-glob v0.5.3, gix-path v0.7.1, gix-quote v0.4.1, gix-attributes v0.8.2, gix-config-value v0.10.1, gix-tempfile v3.0.2, gix-lock v3.0.2, gix-validate v0.7.2, gix-object v0.26.1, gix-ref v0.24.0, gix-sec v0.6.2, gix-config v0.16.1, gix-command v0.2.3, gix-prompt v0.3.2, gix-url v0.13.2, gix-credentials v0.9.1, gix-diff v0.26.1, gix-discover v0.13.0, gix-hashtable v0.1.1, gix-bitmap v0.2.1, gix-traverse v0.22.1, gix-index v0.12.3, gix-mailmap v0.9.2, gix-chunk v0.4.1, gix-pack v0.30.2, gix-odb v0.40.2, gix-packetline v0.14.2, gix-transport v0.25.4, gix-protocol v0.26.3, gix-revision v0.10.3, gix-refspec v0.7.2, gix-worktree v0.12.2, gix v0.36.0 ([`6ccc88a`](https://github.com/Byron/gitoxide/commit/6ccc88a8e4a56973b1a358cf72dc012ee3c75d56))
+ - Merge branch 'rename-crates' into inform-about-gix-rename ([`c9275b9`](https://github.com/Byron/gitoxide/commit/c9275b99ea43949306d93775d9d78c98fb86cfb1))
+ - Rename `git-testtools` to `gix-testtools` ([`b65c33d`](https://github.com/Byron/gitoxide/commit/b65c33d256cfed65d11adeff41132e3e58754089))
+ - Adjust to renaming of `git-pack` to `gix-pack` ([`1ee81ad`](https://github.com/Byron/gitoxide/commit/1ee81ad310285ee4aa118118a2be3810dbace574))
+ - Adjust to renaming of `git-odb` to `gix-odb` ([`476e2ad`](https://github.com/Byron/gitoxide/commit/476e2ad1a64e9e3f0d7c8651d5bcbee36cd78241))
+ - Adjust to renaming of `git-index` to `gix-index` ([`86db5e0`](https://github.com/Byron/gitoxide/commit/86db5e09fc58ce66b252dc13b8d7e2c48e4d5062))
+ - Adjust to renaming of `git-diff` to `gix-diff` ([`49a163e`](https://github.com/Byron/gitoxide/commit/49a163ec8b18f0e5fcd05a315de16d5d8be7650e))
+ - Adjust to renaming of `git-commitgraph` to `gix-commitgraph` ([`f1dd0a3`](https://github.com/Byron/gitoxide/commit/f1dd0a3366e31259af029da73228e8af2f414244))
+ - Adjust to renaming of `git-mailmap` to `gix-mailmap` ([`2e28c56`](https://github.com/Byron/gitoxide/commit/2e28c56bb9f70de6f97439818118d3a25859698f))
+ - Rename `git-mailmap` to `gix-mailmap` ([`501231f`](https://github.com/Byron/gitoxide/commit/501231fe0da6fdb62d644376e12d1947c6c133b5))
+ - Adjust to renaming of `git-discover` to `gix-discover` ([`53adfe1`](https://github.com/Byron/gitoxide/commit/53adfe1c34e9ea3b27067a97b5e7ac80b351c441))
+ - Adjust to renaming of `git-chunk` to `gix-chunk` ([`59194e3`](https://github.com/Byron/gitoxide/commit/59194e3a07853eae0624ebc4907478d1de4f7599))
+ - Adjust to renaming of `git-bitmap` to `gix-bitmap` ([`75f2a07`](https://github.com/Byron/gitoxide/commit/75f2a079b17489f62bc43e1f1d932307375c4f9d))
+ - Adjust to renaming for `git-protocol` to `gix-protocol` ([`823795a`](https://github.com/Byron/gitoxide/commit/823795addea3810243cab7936cd8ec0137cbc224))
+ - Adjust to renaming of `git-refspec` to `gix-refspec` ([`c958802`](https://github.com/Byron/gitoxide/commit/c9588020561577736faa065e7e5b5bb486ca8fe1))
+ - Adjust to renaming of `git-revision` to `gix-revision` ([`ee0ee84`](https://github.com/Byron/gitoxide/commit/ee0ee84607c2ffe11ee75f27a31903db68afed02))
+ - Adjust to renaming of `git-transport` to `gix-transport` ([`b2ccf71`](https://github.com/Byron/gitoxide/commit/b2ccf716dc4425bb96651d4d58806a3cc2da219e))
+ - Adjust to renaming of `git-credentials` to `gix-credentials` ([`6b18abc`](https://github.com/Byron/gitoxide/commit/6b18abcf2856f02ab938d535a65e51ac282bf94a))
+ - Adjust to renaming of `git-prompt` to `gix-prompt` ([`6a4654e`](https://github.com/Byron/gitoxide/commit/6a4654e0d10ab773dd219cb4b731c0fc1471c36d))
+ - Adjust to renaming of `git-command` to `gix-command` ([`d26b8e0`](https://github.com/Byron/gitoxide/commit/d26b8e046496894ae06b0bbfdba77196976cd975))
+ - Adjust to renaming of `git-packetline` to `gix-packetline` ([`5cbd22c`](https://github.com/Byron/gitoxide/commit/5cbd22cf42efb760058561c6c3bbcd4dab8c8be1))
+ - Adjust to renaming of `git-worktree` to `gix-worktree` ([`73a1282`](https://github.com/Byron/gitoxide/commit/73a12821b3d9b66ec1714d07dd27eb7a73e3a544))
+ - Adjust to renamining of `git-worktree` to `gix-worktree` ([`108bb1a`](https://github.com/Byron/gitoxide/commit/108bb1a634f4828853fb590e9fc125f79441dd38))
+ - Adjust to renaming of `git-url` to `gix-url` ([`b50817a`](https://github.com/Byron/gitoxide/commit/b50817aadb143e19f61f64e19b19ec1107d980c6))
+ - Adjust to renaming of `git-date` to `gix-date` ([`9a79ff2`](https://github.com/Byron/gitoxide/commit/9a79ff2d5cc74c1efad9f41e21095ae498cce00b))
+ - Adjust to renamining of `git-attributes` to `gix-attributes` ([`4a8b3b8`](https://github.com/Byron/gitoxide/commit/4a8b3b812ac26f2a2aee8ce8ca81591273383c84))
+ - Adjust to renaminig of `git-quote` to `gix-quote` ([`648025b`](https://github.com/Byron/gitoxide/commit/648025b7ca94411fdd0d90c53e5faede5fde6c8d))
+ - Adjust to renaming of `git-config` to `gix-config` ([`3a861c8`](https://github.com/Byron/gitoxide/commit/3a861c8f049f6502d3bcbdac752659aa1aeda46a))
+ - Adjust to renaming of `git-ref` to `gix-ref` ([`1f5f695`](https://github.com/Byron/gitoxide/commit/1f5f695407b034377d94b172465ff573562b3fc3))
+ - Adjust to renaming of `git-lock` to `gix-lock` ([`2028e78`](https://github.com/Byron/gitoxide/commit/2028e7884ae1821edeec81612f501e88e4722b17))
+ - Adjust to renaming of `git-tempfile` to `gix-tempfile` ([`b6cc3eb`](https://github.com/Byron/gitoxide/commit/b6cc3ebb5137084a6327af16a7d9364d8f092cc9))
+ - Adjust to renaming of `git-object` to `gix-object` ([`fc86a1e`](https://github.com/Byron/gitoxide/commit/fc86a1e710ad7bf076c25cc6f028ddcf1a5a4311))
+ - Adjust to renaming of `git-actor` to `gix-actor` ([`4dc9b44`](https://github.com/Byron/gitoxide/commit/4dc9b44dc52f2486ffa2040585c6897c1bf55df4))
+ - Adjust to renaming of `git-validate` to `gix-validate` ([`5e40ad0`](https://github.com/Byron/gitoxide/commit/5e40ad078af3d08cbc2ca81ce755c0ed8a065b4f))
+ - Adjust to renaming of `git-hash` to `gix-hash` ([`4a9d025`](https://github.com/Byron/gitoxide/commit/4a9d0257110c3efa61d08c8457c4545b200226d1))
+ - Adjust to renaming of `git-features` to `gix-features` ([`e2dd68a`](https://github.com/Byron/gitoxide/commit/e2dd68a417aad229e194ff20dbbfd77668096ec6))
+ - Adjust to renaming of `git-glob` to `gix-glob` ([`35b2a3a`](https://github.com/Byron/gitoxide/commit/35b2a3acbc8f2a03f151bc0a3863163844e0ca86))
+ - Adjust to renaming of `git-sec` to `gix-sec` ([`eabbb92`](https://github.com/Byron/gitoxide/commit/eabbb923bd5a32fc80fa80f96cfdc2ab7bb2ed17))
+ - Adapt to renaming of `git-path` to `gix-path` ([`d3bbcfc`](https://github.com/Byron/gitoxide/commit/d3bbcfccad80fc44ea8e7bf819f23adaca06ba2d))
+ - Adjust to rename of `git-config-value` to `gix-config-value` ([`622b3e1`](https://github.com/Byron/gitoxide/commit/622b3e1d0bffa0f8db73697960f9712024fac430))
+ - Release git-date v0.4.2, git-hash v0.10.2, git-features v0.26.2, git-actor v0.17.1, git-glob v0.5.3, git-path v0.7.1, git-quote v0.4.1, git-attributes v0.8.2, git-config-value v0.10.1, git-tempfile v3.0.2, git-lock v3.0.2, git-validate v0.7.2, git-object v0.26.1, git-ref v0.24.0, git-sec v0.6.2, git-config v0.16.0, git-command v0.2.3, git-prompt v0.3.2, git-url v0.13.2, git-credentials v0.9.1, git-diff v0.26.1, git-discover v0.13.0, git-hashtable v0.1.1, git-bitmap v0.2.1, git-traverse v0.22.1, git-index v0.12.3, git-mailmap v0.9.2, git-chunk v0.4.1, git-pack v0.30.2, git-odb v0.40.2, git-packetline v0.14.2, git-transport v0.25.4, git-protocol v0.26.3, git-revision v0.10.2, git-refspec v0.7.2, git-worktree v0.12.2, git-repository v0.34.0, safety bump 3 crates ([`c196d20`](https://github.com/Byron/gitoxide/commit/c196d206d57a310b1ce974a1cf0e7e6d6db5c4d6))
+ - Prepare changelogs prior to release ([`7c846d2`](https://github.com/Byron/gitoxide/commit/7c846d2102dc767366771925212712ef8cc9bf07))
+ - Merge branch 'Lioness100/main' ([`1e544e8`](https://github.com/Byron/gitoxide/commit/1e544e82455bf9ecb5e3c2146280eaf7ecd81f16))
+ - Fix typos ([`39ed9ed`](https://github.com/Byron/gitoxide/commit/39ed9eda62b7718d5109135e5ad406fb1fe2978c))
+ - Release git-date v0.4.1, git-features v0.26.1, git-glob v0.5.2, git-attributes v0.8.1, git-tempfile v3.0.1, git-ref v0.23.1, git-sec v0.6.1, git-config v0.15.1, git-prompt v0.3.1, git-url v0.13.1, git-discover v0.12.1, git-index v0.12.2, git-mailmap v0.9.1, git-pack v0.30.1, git-odb v0.40.1, git-transport v0.25.3, git-protocol v0.26.2, git-revision v0.10.1, git-refspec v0.7.1, git-worktree v0.12.1, git-repository v0.33.0 ([`5b5b380`](https://github.com/Byron/gitoxide/commit/5b5b3809faa71c658db38b40dfc410224d08a367))
+ - Prepare changelogs prior to release ([`93bef97`](https://github.com/Byron/gitoxide/commit/93bef97b3c0c75d4bf7119fdd787516e1efc77bf))
+ - Merge branch 'patch-1' ([`b93f0c4`](https://github.com/Byron/gitoxide/commit/b93f0c49fc677b6c19aea332cbfc1445ce475375))
+ - Thanks clippy ([`9e04685`](https://github.com/Byron/gitoxide/commit/9e04685dd3f109bfb27663f9dc7c04102e660bf2))
+ - Release git-ref v0.23.0, git-config v0.15.0, git-command v0.2.2, git-diff v0.26.0, git-discover v0.12.0, git-mailmap v0.9.0, git-pack v0.30.0, git-odb v0.40.0, git-transport v0.25.2, git-protocol v0.26.1, git-revision v0.10.0, git-refspec v0.7.0, git-worktree v0.12.0, git-repository v0.32.0 ([`ffb5b6a`](https://github.com/Byron/gitoxide/commit/ffb5b6a21cb415315db6fd5294940c7c6deb4538))
+ - Prepare changelogs prior to release ([`4381a03`](https://github.com/Byron/gitoxide/commit/4381a03a34c305f31713cce234c2afbf8ac60f01))
+ - Release git-date v0.4.0, git-actor v0.17.0, git-object v0.26.0, git-traverse v0.22.0, git-index v0.12.0, safety bump 15 crates ([`0e3d0a5`](https://github.com/Byron/gitoxide/commit/0e3d0a56d7e6a60c6578138f2690b4fa54a2072d))
+ - Release git-features v0.26.0, git-actor v0.16.0, git-attributes v0.8.0, git-object v0.25.0, git-ref v0.22.0, git-config v0.14.0, git-command v0.2.1, git-url v0.13.0, git-credentials v0.9.0, git-diff v0.25.0, git-discover v0.11.0, git-traverse v0.21.0, git-index v0.11.0, git-mailmap v0.8.0, git-pack v0.29.0, git-odb v0.39.0, git-transport v0.25.0, git-protocol v0.26.0, git-revision v0.9.0, git-refspec v0.6.0, git-worktree v0.11.0, git-repository v0.31.0, safety bump 24 crates ([`5ac9fbe`](https://github.com/Byron/gitoxide/commit/5ac9fbe265a5b61c533a2a6b3abfed2bdf7f89ad))
+ - Prepare changelogs prior to release ([`30d8ca1`](https://github.com/Byron/gitoxide/commit/30d8ca19284049dcfbb0de2698cafae1d1a16b0c))
+ - Release git-date v0.3.1, git-features v0.25.0, git-actor v0.15.0, git-glob v0.5.1, git-path v0.7.0, git-attributes v0.7.0, git-config-value v0.10.0, git-lock v3.0.1, git-validate v0.7.1, git-object v0.24.0, git-ref v0.21.0, git-sec v0.6.0, git-config v0.13.0, git-prompt v0.3.0, git-url v0.12.0, git-credentials v0.8.0, git-diff v0.24.0, git-discover v0.10.0, git-traverse v0.20.0, git-index v0.10.0, git-mailmap v0.7.0, git-pack v0.28.0, git-odb v0.38.0, git-packetline v0.14.1, git-transport v0.24.0, git-protocol v0.25.0, git-revision v0.8.0, git-refspec v0.5.0, git-worktree v0.10.0, git-repository v0.30.0, safety bump 26 crates ([`e6b9906`](https://github.com/Byron/gitoxide/commit/e6b9906c486b11057936da16ed6e0ec450a0fb83))
+ - Prepare chnagelogs prior to git-repository release ([`7114bbb`](https://github.com/Byron/gitoxide/commit/7114bbb6732aa8571d4ab74f28ed3e26e9fbe4d0))
+ - Merge branch 'main' into http-config ([`6b9632e`](https://github.com/Byron/gitoxide/commit/6b9632e16c416841ffff1b767ee7a6c89b421220))
+ - Release git-features v0.24.1, git-actor v0.14.1, git-index v0.9.1 ([`7893502`](https://github.com/Byron/gitoxide/commit/789350208efc9d5fc6f9bc4f113f77f9cb445156))
+ - Merge branch 'main' into http-config ([`bcd9654`](https://github.com/Byron/gitoxide/commit/bcd9654e56169799eb706646da6ee1f4ef2021a9))
+ - Release git-hash v0.10.0, git-features v0.24.0, git-date v0.3.0, git-actor v0.14.0, git-glob v0.5.0, git-path v0.6.0, git-quote v0.4.0, git-attributes v0.6.0, git-config-value v0.9.0, git-tempfile v3.0.0, git-lock v3.0.0, git-validate v0.7.0, git-object v0.23.0, git-ref v0.20.0, git-sec v0.5.0, git-config v0.12.0, git-command v0.2.0, git-prompt v0.2.0, git-url v0.11.0, git-credentials v0.7.0, git-diff v0.23.0, git-discover v0.9.0, git-bitmap v0.2.0, git-traverse v0.19.0, git-index v0.9.0, git-mailmap v0.6.0, git-chunk v0.4.0, git-pack v0.27.0, git-odb v0.37.0, git-packetline v0.14.0, git-transport v0.23.0, git-protocol v0.24.0, git-revision v0.7.0, git-refspec v0.4.0, git-worktree v0.9.0, git-repository v0.29.0, git-commitgraph v0.11.0, gitoxide-core v0.21.0, gitoxide v0.19.0, safety bump 28 crates ([`b2c301e`](https://github.com/Byron/gitoxide/commit/b2c301ef131ffe1871314e19f387cf10a8d2ac16))
+ - Prepare changelogs prior to release ([`e4648f8`](https://github.com/Byron/gitoxide/commit/e4648f827c97e9d13636d1bbdc83dd63436e6e5c))
+ - Merge branch 'version2021' ([`0e4462d`](https://github.com/Byron/gitoxide/commit/0e4462df7a5166fe85c23a779462cdca8ee013e8))
+ - Upgrade edition to 2021 in most crates. ([`3d8fa8f`](https://github.com/Byron/gitoxide/commit/3d8fa8fef9800b1576beab8a5bc39b821157a5ed))
+ - Release git-hash v0.9.11, git-features v0.23.0, git-actor v0.13.0, git-attributes v0.5.0, git-object v0.22.0, git-ref v0.17.0, git-sec v0.4.1, git-config v0.9.0, git-url v0.10.0, git-credentials v0.6.0, git-diff v0.20.0, git-discover v0.6.0, git-traverse v0.18.0, git-index v0.6.0, git-mailmap v0.5.0, git-pack v0.24.0, git-odb v0.34.0, git-packetline v0.13.1, git-transport v0.21.0, git-protocol v0.21.0, git-revision v0.6.0, git-refspec v0.3.0, git-worktree v0.6.0, git-repository v0.25.0, safety bump 24 crates ([`104d922`](https://github.com/Byron/gitoxide/commit/104d922add61ab21c534c24ce8ed37cddf3e275a))
+ - Prepare changelogs for release ([`d232567`](https://github.com/Byron/gitoxide/commit/d23256701a95284857dc8d1cb37c7c94cada973c))
+ - Merge branch 'main' into new-http-impl ([`702a161`](https://github.com/Byron/gitoxide/commit/702a161ef11fc959611bf44b70e9ffe04561c7ad))
+ - Make fmt ([`53acf25`](https://github.com/Byron/gitoxide/commit/53acf2565743eff7cead7a42011107b2fc8d7e0e))
+ - Merge branch 'diff' ([`25a7726`](https://github.com/Byron/gitoxide/commit/25a7726377fbe400ea3c4927d04e9dec99802b7b))
+ - Release git-command v0.1.0, git-prompt v0.1.0, git-url v0.9.0, git-credentials v0.5.0, git-diff v0.19.0, git-mailmap v0.4.0, git-chunk v0.3.2, git-pack v0.23.0, git-odb v0.33.0, git-packetline v0.13.0, git-transport v0.20.0, git-protocol v0.20.0, git-revision v0.5.0, git-refspec v0.2.0, git-repository v0.24.0, git-commitgraph v0.9.0, gitoxide-core v0.18.0, gitoxide v0.16.0 ([`f5c36d8`](https://github.com/Byron/gitoxide/commit/f5c36d85755d1f0f503b77d9a565fad6aecf6728))
+ - Release git-hash v0.9.10, git-features v0.22.5, git-date v0.2.0, git-actor v0.12.0, git-glob v0.4.0, git-path v0.5.0, git-quote v0.3.0, git-attributes v0.4.0, git-config-value v0.8.0, git-tempfile v2.0.5, git-validate v0.6.0, git-object v0.21.0, git-ref v0.16.0, git-sec v0.4.0, git-config v0.8.0, git-discover v0.5.0, git-traverse v0.17.0, git-index v0.5.0, git-worktree v0.5.0, git-testtools v0.9.0, git-command v0.1.0, git-prompt v0.1.0, git-url v0.9.0, git-credentials v0.5.0, git-diff v0.19.0, git-mailmap v0.4.0, git-chunk v0.3.2, git-pack v0.23.0, git-odb v0.33.0, git-packetline v0.13.0, git-transport v0.20.0, git-protocol v0.20.0, git-revision v0.5.0, git-refspec v0.2.0, git-repository v0.24.0, git-commitgraph v0.9.0, gitoxide-core v0.18.0, gitoxide v0.16.0, safety bump 28 crates ([`29a043b`](https://github.com/Byron/gitoxide/commit/29a043be6808a3e9199a9b26bd076fe843afe4f4))
+ - Thanks clippy ([`3925298`](https://github.com/Byron/gitoxide/commit/39252985ff28d6801d09ef1d30e0e462c8277f8b))
+ - Refactor ([`2f7ae74`](https://github.com/Byron/gitoxide/commit/2f7ae74ff5f7d758da9e8edd4d805f5b58f01a00))
+ - `Snapshot::resolve_cow()` allows to copy fields only if they change. ([`bd8f50b`](https://github.com/Byron/gitoxide/commit/bd8f50bf56d98843a3e0d3c6e349451b623c51ae))
+ - Merge branch 'filter-refs' ([`fd14489`](https://github.com/Byron/gitoxide/commit/fd14489f729172d615d0fa1e8dbd605e9eacf69d))
+ - Merge branch 'main' into index-from-tree ([`bc64b96`](https://github.com/Byron/gitoxide/commit/bc64b96a2ec781c72d1d4daad38aa7fb8b74f99b))
+ - Merge branch 'main' into filter-refs-by-spec ([`cfa1440`](https://github.com/Byron/gitoxide/commit/cfa144031dbcac2707ab0cec012bc35e78f9c475))
+ - Release git-date v0.0.5, git-hash v0.9.8, git-features v0.22.2, git-actor v0.11.3, git-glob v0.3.2, git-quote v0.2.1, git-attributes v0.3.2, git-tempfile v2.0.4, git-lock v2.1.1, git-validate v0.5.5, git-object v0.20.2, git-ref v0.15.2, git-sec v0.3.1, git-config v0.7.0, git-credentials v0.4.0, git-diff v0.17.2, git-discover v0.4.1, git-bitmap v0.1.2, git-index v0.4.2, git-mailmap v0.3.2, git-chunk v0.3.1, git-traverse v0.16.2, git-pack v0.21.2, git-odb v0.31.2, git-packetline v0.12.7, git-url v0.7.2, git-transport v0.19.2, git-protocol v0.19.0, git-revision v0.4.2, git-refspec v0.1.0, git-worktree v0.4.2, git-repository v0.22.0, safety bump 4 crates ([`4974eca`](https://github.com/Byron/gitoxide/commit/4974eca96d525d1ee4f8cad79bb713af7a18bf9d))
+ - Merge branch 'main' into remote-ls-refs ([`e2ee3de`](https://github.com/Byron/gitoxide/commit/e2ee3ded97e5c449933712883535b30d151c7c78))
+ - Merge branch 'docsrs-show-features' ([`31c2351`](https://github.com/Byron/gitoxide/commit/31c235140cad212d16a56195763fbddd971d87ce))
+ - Use docsrs feature in code to show what is feature-gated automatically on docs.rs ([`b1c40b0`](https://github.com/Byron/gitoxide/commit/b1c40b0364ef092cd52d03b34f491b254816b18d))
+ - Uniformize deny attributes ([`f7f136d`](https://github.com/Byron/gitoxide/commit/f7f136dbe4f86e7dee1d54835c420ec07c96cd78))
+ - Pass --cfg docsrs when compiling for https://docs.rs ([`5176771`](https://github.com/Byron/gitoxide/commit/517677147f1c17304c62cf97a1dd09f232ebf5db))
+ - Remove default link to cargo doc everywhere ([`533e887`](https://github.com/Byron/gitoxide/commit/533e887e80c5f7ede8392884562e1c5ba56fb9a8))
+ - Merge branch 'main' into remote-ls-refs ([`bd5f3e8`](https://github.com/Byron/gitoxide/commit/bd5f3e8db7e0bb4abfb7b0f79f585ab82c3a14ab))
+ - Release git-date v0.0.3, git-actor v0.11.1, git-attributes v0.3.1, git-tempfile v2.0.3, git-object v0.20.1, git-ref v0.15.1, git-config v0.6.1, git-diff v0.17.1, git-discover v0.4.0, git-bitmap v0.1.1, git-index v0.4.1, git-mailmap v0.3.1, git-traverse v0.16.1, git-pack v0.21.1, git-odb v0.31.1, git-packetline v0.12.6, git-url v0.7.1, git-transport v0.19.1, git-protocol v0.18.1, git-revision v0.4.0, git-worktree v0.4.1, git-repository v0.21.0, safety bump 5 crates ([`c96473d`](https://github.com/Byron/gitoxide/commit/c96473dce21c3464aacbc0a62d520c1a33172611))
+ - Prepare changelogs prior to reelase ([`c06ae1c`](https://github.com/Byron/gitoxide/commit/c06ae1c606b6af9c2a12021103d99c2810750d60))
+ - Merge pull request #2 from SidneyDouw/main ([`ce885ad`](https://github.com/Byron/gitoxide/commit/ce885ad4c3324c09c83751c32e014f246c748766))
+ - Merge branch 'Byron:main' into main ([`9b9ea02`](https://github.com/Byron/gitoxide/commit/9b9ea0275f8ff5862f24cf5a4ca53bb1cd610709))
+ - Merge branch 'main' into rev-parse-delegate ([`6da8250`](https://github.com/Byron/gitoxide/commit/6da82507588d3bc849217c11d9a1d398b67f2ed6))
+ - Merge branch 'main' into pathspec ([`7b61506`](https://github.com/Byron/gitoxide/commit/7b615060712565f515515e35a3e8346278ad770c))
+ - Merge branch 'kianmeng-fix-typos' ([`4e7b343`](https://github.com/Byron/gitoxide/commit/4e7b34349c0a01ad8686bbb4eb987e9338259d9c))
+ - Fix typos ([`e9fcb70`](https://github.com/Byron/gitoxide/commit/e9fcb70e429edb2974afa3f58d181f3ef14c3da3))
+ - Release git-config v0.6.0, git-credentials v0.3.0, git-diff v0.17.0, git-discover v0.3.0, git-index v0.4.0, git-mailmap v0.3.0, git-traverse v0.16.0, git-pack v0.21.0, git-odb v0.31.0, git-url v0.7.0, git-transport v0.19.0, git-protocol v0.18.0, git-revision v0.3.0, git-worktree v0.4.0, git-repository v0.20.0, git-commitgraph v0.8.0, gitoxide-core v0.15.0, gitoxide v0.13.0 ([`aa639d8`](https://github.com/Byron/gitoxide/commit/aa639d8c43f3098cc4a5b50614c5ae94a8156928))
+ - Release git-hash v0.9.6, git-features v0.22.0, git-date v0.0.2, git-actor v0.11.0, git-glob v0.3.1, git-path v0.4.0, git-attributes v0.3.0, git-tempfile v2.0.2, git-object v0.20.0, git-ref v0.15.0, git-sec v0.3.0, git-config v0.6.0, git-credentials v0.3.0, git-diff v0.17.0, git-discover v0.3.0, git-index v0.4.0, git-mailmap v0.3.0, git-traverse v0.16.0, git-pack v0.21.0, git-odb v0.31.0, git-url v0.7.0, git-transport v0.19.0, git-protocol v0.18.0, git-revision v0.3.0, git-worktree v0.4.0, git-repository v0.20.0, git-commitgraph v0.8.0, gitoxide-core v0.15.0, gitoxide v0.13.0, safety bump 22 crates ([`4737b1e`](https://github.com/Byron/gitoxide/commit/4737b1eea1d4c9a8d5a69fb63ecac5aa5d378ae5))
+ - Prepare changelog prior to release ([`3c50625`](https://github.com/Byron/gitoxide/commit/3c50625fa51350ec885b0f38ec9e92f9444df0f9))
+ - Merge pull request #1 from Byron/main ([`085e76b`](https://github.com/Byron/gitoxide/commit/085e76b121291ed9bd324139105d2bd4117bedf8))
+ - Merge branch 'main' into SidneyDouw-pathspec ([`a22b1d8`](https://github.com/Byron/gitoxide/commit/a22b1d88a21311d44509018729c3ef1936cf052a))
+ - Merge branch 'main' into git_includeif ([`598c853`](https://github.com/Byron/gitoxide/commit/598c853087fcf8f77299aa5b9803bcec705c0cd0))
+ - Release git-ref v0.13.0, git-discover v0.1.0, git-index v0.3.0, git-mailmap v0.2.0, git-traverse v0.15.0, git-pack v0.19.0, git-odb v0.29.0, git-packetline v0.12.5, git-url v0.5.0, git-transport v0.17.0, git-protocol v0.16.0, git-revision v0.2.0, git-worktree v0.2.0, git-repository v0.17.0 ([`349c590`](https://github.com/Byron/gitoxide/commit/349c5904b0dac350838a896759d51576b66880a7))
+ - Release git-hash v0.9.4, git-features v0.21.0, git-actor v0.10.0, git-glob v0.3.0, git-path v0.1.1, git-attributes v0.1.0, git-sec v0.1.0, git-config v0.3.0, git-credentials v0.1.0, git-validate v0.5.4, git-object v0.19.0, git-diff v0.16.0, git-lock v2.1.0, git-ref v0.13.0, git-discover v0.1.0, git-index v0.3.0, git-mailmap v0.2.0, git-traverse v0.15.0, git-pack v0.19.0, git-odb v0.29.0, git-packetline v0.12.5, git-url v0.5.0, git-transport v0.17.0, git-protocol v0.16.0, git-revision v0.2.0, git-worktree v0.2.0, git-repository v0.17.0, safety bump 20 crates ([`654cf39`](https://github.com/Byron/gitoxide/commit/654cf39c92d5aa4c8d542a6cadf13d4acef6a78e))
+ - Release git-diff v0.14.0, git-bitmap v0.1.0, git-index v0.2.0, git-tempfile v2.0.1, git-lock v2.0.0, git-mailmap v0.1.0, git-traverse v0.13.0, git-pack v0.17.0, git-quote v0.2.0, git-odb v0.27.0, git-packetline v0.12.4, git-url v0.4.0, git-transport v0.16.0, git-protocol v0.15.0, git-ref v0.12.0, git-worktree v0.1.0, git-repository v0.15.0, cargo-smart-release v0.9.0, safety bump 5 crates ([`e58dc30`](https://github.com/Byron/gitoxide/commit/e58dc3084cf17a9f618ae3a6554a7323e44428bf))
+ - Release git-hash v0.9.3, git-features v0.20.0, git-config v0.2.0, safety bump 12 crates ([`f0cbb24`](https://github.com/Byron/gitoxide/commit/f0cbb24b2e3d8f028be0e773f9da530da2656257))
+ - Make fmt ([`7cf3545`](https://github.com/Byron/gitoxide/commit/7cf354509b545f7e7c99e159b5989ddfbe86273d))
+ - Merge branch 'main' into mailmap ([`b2df941`](https://github.com/Byron/gitoxide/commit/b2df941feaf5ae9fa170fa49270189f3527f2eab))
+ - Thanks clippy ([`1038dab`](https://github.com/Byron/gitoxide/commit/1038dab842b32ec1359a53236b241a91427ccb65))
+ - Commit to using 'unicode' feature of bstr as git-object wants it too ([`471fa62`](https://github.com/Byron/gitoxide/commit/471fa62b142ba744541d7472464d62826f5c6b93))
+ - Thanks clippy ([`9449bc7`](https://github.com/Byron/gitoxide/commit/9449bc7243c15b3cba88f02a3742784d6fe6b363))
+ - Refactor ([`3e78ff5`](https://github.com/Byron/gitoxide/commit/3e78ff53125be2a75142534b6fd6f356b6bc8c5f))
+ - Release git-mailmap v0.0.0 ([`c43af35`](https://github.com/Byron/gitoxide/commit/c43af35c92e5093349cdabd89f655b26070e6f84))
+</details>
+
+## 0.9.1 (2023-01-10)
+
+A maintenance release without user-facing changes.
+
+## 0.9.0 (2023-01-09)
+
+A maintenance release without user-facing changes.
+
+## 0.8.0 (2022-12-30)
+
+A maintenance release without user-facing changes.
+
+## 0.7.0 (2022-12-19)
+
+A maintenance release without user-facing changes.
+
+## 0.6.0 (2022-11-21)
+
+### New Features (BREAKING)
+
+ - <csr-id-3d8fa8fef9800b1576beab8a5bc39b821157a5ed/> upgrade edition to 2021 in most crates.
+ MSRV for this is 1.56, and we are now at 1.60 so should be compatible.
+ This isn't more than a patch release as it should break nobody
+ who is adhering to the MSRV, but let's be careful and mark it
+ breaking.
+
+ Note that `gix-features` and `gix-pack` are still on edition 2018
+ as they make use of a workaround to support (safe) mutable access
+ to non-overlapping entries in a slice which doesn't work anymore
+ in edition 2021.
+
+## 0.5.0 (2022-10-10)
+
+Maintenance release without user-facing changes.
+
+## 0.4.0 (2022-09-20)
+
+### New Features
+
+ - <csr-id-bd8f50bf56d98843a3e0d3c6e349451b623c51ae/> `Snapshot::resolve_cow()` allows to copy fields only if they change.
+ This generally speeds up resolution performance as it won't
+ unnecessarily copy anything anymore. Furthermore it allows the caller
+ to see which of the fields, name or email, was actually remapped.
+
+### Changed (BREAKING)
+
+ - <csr-id-99905bacace8aed42b16d43f0f04cae996cb971c/> upgrade `bstr` to `1.0.1`
+
+## 0.3.2 (2022-08-24)
+
+<csr-id-f7f136dbe4f86e7dee1d54835c420ec07c96cd78/>
+<csr-id-533e887e80c5f7ede8392884562e1c5ba56fb9a8/>
+
+### Chore
+
+ - <csr-id-f7f136dbe4f86e7dee1d54835c420ec07c96cd78/> uniformize deny attributes
+ - <csr-id-533e887e80c5f7ede8392884562e1c5ba56fb9a8/> remove default link to cargo doc everywhere
+
+### New Features
+
+ - <csr-id-b1c40b0364ef092cd52d03b34f491b254816b18d/> use docsrs feature in code to show what is feature-gated automatically on docs.rs
+ - <csr-id-517677147f1c17304c62cf97a1dd09f232ebf5db/> pass --cfg docsrs when compiling for https://docs.rs
+
+## 0.3.1 (2022-08-17)
+
+A maintenance release without user facing changes.
+
+## 0.3.0 (2022-07-22)
+
+This is a maintenance release with no functional changes.
+
+## 0.2.0 (2022-05-18)
+
+A maintenance release without user-facing changes.
+
+## 0.1.0 (2022-04-03)
+
+### New Features
+
+ - <csr-id-d2388d8d80f379eccc9ee84ebe07acd67d154630/> `gix repository mailmap entries`
+ - <csr-id-77ef2cb819f21ddc5d1ee9e94b5961e3ca5b3139/> `Time::default()`
+
+## 0.0.0 (2022-03-26)
+
+An empty crate without any content to reserve the name for the gitoxide project.
+
diff --git a/vendor/gix-mailmap/Cargo.toml b/vendor/gix-mailmap/Cargo.toml
new file mode 100644
index 000000000..8b7d74914
--- /dev/null
+++ b/vendor/gix-mailmap/Cargo.toml
@@ -0,0 +1,64 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g., crates.io) dependencies.
+#
+# If you are reading this file be aware that the original Cargo.toml
+# will likely look very different (and much more reasonable).
+# See Cargo.toml.orig for the original contents.
+
+[package]
+edition = "2021"
+rust-version = "1.64"
+name = "gix-mailmap"
+version = "0.11.0"
+authors = ["Sebastian Thiel <sebastian.thiel@icloud.com>"]
+description = "A WIP crate of the gitoxide project for parsing mailmap files"
+license = "MIT/Apache-2.0"
+repository = "https://github.com/Byron/gitoxide"
+
+[package.metadata.docs.rs]
+all-features = true
+features = ["document-features"]
+rustdoc-args = [
+ "--cfg",
+ "docsrs",
+]
+
+[lib]
+doctest = false
+
+[dependencies.bstr]
+version = "1.3.0"
+features = [
+ "std",
+ "unicode",
+]
+default-features = false
+
+[dependencies.document-features]
+version = "0.2.0"
+optional = true
+
+[dependencies.gix-actor]
+version = "^0.19.0"
+
+[dependencies.serde]
+version = "1.0.114"
+features = ["derive"]
+optional = true
+default-features = false
+
+[dependencies.thiserror]
+version = "1.0.38"
+
+[dev-dependencies]
+
+[features]
+serde1 = [
+ "serde",
+ "bstr/serde",
+ "gix-actor/serde1",
+]
diff --git a/vendor/gix-mailmap/src/entry.rs b/vendor/gix-mailmap/src/entry.rs
new file mode 100644
index 000000000..69a0c53ee
--- /dev/null
+++ b/vendor/gix-mailmap/src/entry.rs
@@ -0,0 +1,70 @@
+use bstr::BStr;
+
+use crate::Entry;
+
+/// Access
+impl<'a> Entry<'a> {
+ /// The name to map to.
+ pub fn new_name(&self) -> Option<&'a BStr> {
+ self.new_name
+ }
+ /// The email map to.
+ pub fn new_email(&self) -> Option<&'a BStr> {
+ self.new_email
+ }
+ /// The name to look for and replace.
+ pub fn old_name(&self) -> Option<&'a BStr> {
+ self.old_name
+ }
+ /// The email to look for and replace.
+ pub fn old_email(&self) -> &'a BStr {
+ self.old_email
+ }
+}
+
+/// Constructors indicating what kind of mapping is created.
+///
+/// Only these combinations of values are valid.
+#[allow(missing_docs)]
+impl<'a> Entry<'a> {
+ pub fn change_name_by_email(proper_name: impl Into<&'a BStr>, commit_email: impl Into<&'a BStr>) -> Self {
+ Entry {
+ new_name: Some(proper_name.into()),
+ old_email: commit_email.into(),
+ ..Default::default()
+ }
+ }
+ pub fn change_email_by_email(proper_email: impl Into<&'a BStr>, commit_email: impl Into<&'a BStr>) -> Self {
+ Entry {
+ new_email: Some(proper_email.into()),
+ old_email: commit_email.into(),
+ ..Default::default()
+ }
+ }
+ pub fn change_name_and_email_by_email(
+ proper_name: impl Into<&'a BStr>,
+ proper_email: impl Into<&'a BStr>,
+ commit_email: impl Into<&'a BStr>,
+ ) -> Self {
+ Entry {
+ new_name: Some(proper_name.into()),
+ new_email: Some(proper_email.into()),
+ old_email: commit_email.into(),
+ ..Default::default()
+ }
+ }
+
+ pub fn change_name_and_email_by_name_and_email(
+ proper_name: impl Into<&'a BStr>,
+ proper_email: impl Into<&'a BStr>,
+ commit_name: impl Into<&'a BStr>,
+ commit_email: impl Into<&'a BStr>,
+ ) -> Self {
+ Entry {
+ new_name: Some(proper_name.into()),
+ new_email: Some(proper_email.into()),
+ old_name: Some(commit_name.into()),
+ old_email: commit_email.into(),
+ }
+ }
+}
diff --git a/vendor/gix-mailmap/src/lib.rs b/vendor/gix-mailmap/src/lib.rs
new file mode 100644
index 000000000..ce7a6472e
--- /dev/null
+++ b/vendor/gix-mailmap/src/lib.rs
@@ -0,0 +1,63 @@
+//! [Parse][parse()] .mailmap files as used in git repositories and remap names and emails
+//! using an [accelerated data-structure][Snapshot].
+//! ## Feature Flags
+#![cfg_attr(
+ feature = "document-features",
+ cfg_attr(doc, doc = ::document_features::document_features!())
+)]
+#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))]
+#![deny(missing_docs, rust_2018_idioms)]
+#![forbid(unsafe_code)]
+
+use bstr::BStr;
+
+///
+pub mod parse;
+
+/// Parse the given `buf` of bytes line by line into mapping [Entries][Entry].
+///
+/// Errors may occur per line, but it's up to the caller to stop iteration when
+/// one is encountered.
+pub fn parse(buf: &[u8]) -> parse::Lines<'_> {
+ parse::Lines::new(buf)
+}
+
+/// Similar to [parse()], but will skip all lines that didn't parse correctly, silently squelching all errors.
+pub fn parse_ignore_errors(buf: &[u8]) -> impl Iterator<Item = Entry<'_>> {
+ parse(buf).filter_map(Result::ok)
+}
+
+mod entry;
+
+///
+pub mod snapshot;
+
+/// A data-structure to efficiently store a list of entries for optimal, case-insensitive lookup by email and
+/// optionally name to find mappings to new names and/or emails.
+///
+/// The memory layout is efficient, even though lots of small allocations are performed to store strings of emails and names.
+#[derive(Default, Clone)]
+pub struct Snapshot {
+ /// Sorted by `old_email`
+ entries_by_old_email: Vec<snapshot::EmailEntry>,
+}
+
+/// An typical entry of a mailmap, which always contains an `old_email` by which
+/// the mapping is performed to replace the given `new_name` and `new_email`.
+///
+/// Optionally, `old_name` is also used for lookup.
+///
+/// Typically created by [parse()].
+#[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone, Copy, Default)]
+#[cfg_attr(feature = "serde1", derive(serde::Serialize, serde::Deserialize))]
+pub struct Entry<'a> {
+ #[cfg_attr(feature = "serde1", serde(borrow))]
+ /// The name to map to.
+ pub(crate) new_name: Option<&'a BStr>,
+ /// The email map to.
+ pub(crate) new_email: Option<&'a BStr>,
+ /// The name to look for and replace.
+ pub(crate) old_name: Option<&'a BStr>,
+ /// The email to look for and replace.
+ pub(crate) old_email: &'a BStr,
+}
diff --git a/vendor/gix-mailmap/src/parse.rs b/vendor/gix-mailmap/src/parse.rs
new file mode 100644
index 000000000..c6752f6f3
--- /dev/null
+++ b/vendor/gix-mailmap/src/parse.rs
@@ -0,0 +1,116 @@
+mod error {
+ use bstr::BString;
+
+ /// The error returned by [`parse()`][crate::parse()].
+ #[derive(Debug, thiserror::Error)]
+ #[allow(missing_docs)]
+ pub enum Error {
+ #[error("Line {line_number} has too many names or emails, or none at all: {line:?}")]
+ UnconsumedInput { line_number: usize, line: BString },
+ #[error("{line_number}: {line:?}: {message}")]
+ Malformed {
+ line_number: usize,
+ line: BString,
+ message: String,
+ },
+ }
+}
+
+use bstr::{BStr, ByteSlice};
+pub use error::Error;
+
+use crate::Entry;
+
+/// An iterator to parse mailmap lines on-demand.
+pub struct Lines<'a> {
+ lines: bstr::Lines<'a>,
+ line_no: usize,
+}
+
+impl<'a> Lines<'a> {
+ pub(crate) fn new(input: &'a [u8]) -> Self {
+ Lines {
+ lines: input.as_bstr().lines(),
+ line_no: 0,
+ }
+ }
+}
+
+impl<'a> Iterator for Lines<'a> {
+ type Item = Result<Entry<'a>, Error>;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ for line in self.lines.by_ref() {
+ self.line_no += 1;
+ match line.first() {
+ None => continue,
+ Some(b) if *b == b'#' => continue,
+ Some(_) => {}
+ }
+ let line = line.trim();
+ if line.is_empty() {
+ continue;
+ }
+ return parse_line(line.into(), self.line_no).into();
+ }
+ None
+ }
+}
+
+fn parse_line(line: &BStr, line_number: usize) -> Result<Entry<'_>, Error> {
+ let (name1, email1, rest) = parse_name_and_email(line, line_number)?;
+ let (name2, email2, rest) = parse_name_and_email(rest, line_number)?;
+ if !rest.trim().is_empty() {
+ return Err(Error::UnconsumedInput {
+ line_number,
+ line: line.into(),
+ });
+ }
+ Ok(match (name1, email1, name2, email2) {
+ (Some(proper_name), Some(commit_email), None, None) => Entry::change_name_by_email(proper_name, commit_email),
+ (None, Some(proper_email), None, Some(commit_email)) => {
+ Entry::change_email_by_email(proper_email, commit_email)
+ }
+ (Some(proper_name), Some(proper_email), None, Some(commit_email)) => {
+ Entry::change_name_and_email_by_email(proper_name, proper_email, commit_email)
+ }
+ (Some(proper_name), Some(proper_email), Some(commit_name), Some(commit_email)) => {
+ Entry::change_name_and_email_by_name_and_email(proper_name, proper_email, commit_name, commit_email)
+ }
+ _ => {
+ return Err(Error::Malformed {
+ line_number,
+ line: line.into(),
+ message: "Emails without a name or email to map to are invalid".into(),
+ })
+ }
+ })
+}
+
+fn parse_name_and_email(
+ line: &BStr,
+ line_number: usize,
+) -> Result<(Option<&'_ BStr>, Option<&'_ BStr>, &'_ BStr), Error> {
+ match line.find_byte(b'<') {
+ Some(start_bracket) => {
+ let email = &line[start_bracket + 1..];
+ let closing_bracket = email.find_byte(b'>').ok_or_else(|| Error::Malformed {
+ line_number,
+ line: line.into(),
+ message: "Missing closing bracket '>' in email".into(),
+ })?;
+ let email = email[..closing_bracket].trim().as_bstr();
+ if email.is_empty() {
+ return Err(Error::Malformed {
+ line_number,
+ line: line.into(),
+ message: "Email must not be empty".into(),
+ });
+ }
+ let name = line[..start_bracket].trim().as_bstr();
+ let rest = line[start_bracket + closing_bracket + 2..].as_bstr();
+ Ok(((!name.is_empty()).then_some(name), Some(email), rest))
+ }
+ None => Ok((None, None, line)),
+ }
+}
diff --git a/vendor/gix-mailmap/src/snapshot/entry.rs b/vendor/gix-mailmap/src/snapshot/entry.rs
new file mode 100644
index 000000000..51e13c4e2
--- /dev/null
+++ b/vendor/gix-mailmap/src/snapshot/entry.rs
@@ -0,0 +1,90 @@
+use bstr::BString;
+
+use crate::snapshot::util::{EncodedString, EncodedStringRef};
+
+#[derive(Clone)]
+pub(crate) struct NameEntry {
+ pub(crate) new_name: Option<BString>,
+ pub(crate) new_email: Option<BString>,
+ pub(crate) old_name: EncodedString,
+}
+
+#[derive(Clone)]
+pub(crate) struct EmailEntry {
+ pub(crate) new_name: Option<BString>,
+ pub(crate) new_email: Option<BString>,
+ pub(crate) old_email: EncodedString,
+
+ pub(crate) entries_by_old_name: Vec<NameEntry>,
+}
+
+impl EmailEntry {
+ pub fn merge(
+ &mut self,
+ crate::Entry {
+ new_name,
+ new_email,
+ old_name,
+ old_email: _,
+ }: crate::Entry<'_>,
+ ) {
+ let new_email = new_email.map(ToOwned::to_owned);
+ let new_name = new_name.map(ToOwned::to_owned);
+ match old_name {
+ None => {
+ self.new_email = new_email;
+ self.new_name = new_name;
+ }
+ Some(old_name) => {
+ let old_name: EncodedStringRef<'_> = old_name.into();
+ match self
+ .entries_by_old_name
+ .binary_search_by(|e| e.old_name.cmp_ref(old_name))
+ {
+ Ok(pos) => {
+ let entry = &mut self.entries_by_old_name[pos];
+ entry.new_name = new_name;
+ entry.new_email = new_email;
+ }
+ Err(insert_pos) => self.entries_by_old_name.insert(
+ insert_pos,
+ NameEntry {
+ new_name,
+ new_email,
+ old_name: old_name.into(),
+ },
+ ),
+ }
+ }
+ }
+ }
+}
+
+impl<'a> From<crate::Entry<'a>> for EmailEntry {
+ fn from(
+ crate::Entry {
+ new_name,
+ new_email,
+ old_name,
+ old_email,
+ }: crate::Entry<'a>,
+ ) -> Self {
+ let mut new_name = new_name.map(ToOwned::to_owned);
+ let mut new_email = new_email.map(ToOwned::to_owned);
+ let entries_by_old_name = old_name
+ .map(|name| {
+ vec![NameEntry {
+ new_name: new_name.take(),
+ new_email: new_email.take(),
+ old_name: name.into(),
+ }]
+ })
+ .unwrap_or_default();
+ EmailEntry {
+ new_name,
+ new_email,
+ old_email: old_email.into(),
+ entries_by_old_name,
+ }
+ }
+}
diff --git a/vendor/gix-mailmap/src/snapshot/mod.rs b/vendor/gix-mailmap/src/snapshot/mod.rs
new file mode 100644
index 000000000..598c9fe75
--- /dev/null
+++ b/vendor/gix-mailmap/src/snapshot/mod.rs
@@ -0,0 +1,167 @@
+use bstr::ByteSlice;
+use gix_actor::SignatureRef;
+
+use crate::Snapshot;
+
+mod signature;
+pub use signature::{ResolvedSignature, Signature};
+
+mod util;
+use util::EncodedStringRef;
+
+mod entry;
+pub(crate) use entry::EmailEntry;
+
+impl Snapshot {
+ /// Create a new snapshot from the given bytes buffer, ignoring all parse errors that may occur on a line-by-line basis.
+ ///
+ /// This is similar to what git does.
+ pub fn from_bytes(buf: &[u8]) -> Self {
+ Self::new(crate::parse_ignore_errors(buf))
+ }
+
+ /// Create a new instance from `entries`.
+ ///
+ /// These can be obtained using [crate::parse()].
+ pub fn new<'a>(entries: impl IntoIterator<Item = crate::Entry<'a>>) -> Self {
+ let mut snapshot = Self::default();
+ snapshot.merge(entries);
+ snapshot
+ }
+
+ /// Merge the given `entries` into this instance, possibly overwriting existing mappings with
+ /// new ones should they collide.
+ pub fn merge<'a>(&mut self, entries: impl IntoIterator<Item = crate::Entry<'a>>) -> &mut Self {
+ for entry in entries {
+ let old_email: EncodedStringRef<'_> = entry.old_email.into();
+ assert!(
+ entry.new_name.is_some() || entry.new_email.is_some(),
+ "BUG: encountered entry without any mapped/new name or email."
+ );
+ match self
+ .entries_by_old_email
+ .binary_search_by(|e| e.old_email.cmp_ref(old_email))
+ {
+ Ok(pos) => self.entries_by_old_email[pos].merge(entry),
+ Err(insert_pos) => {
+ self.entries_by_old_email.insert(insert_pos, entry.into());
+ }
+ };
+ }
+ self
+ }
+
+ /// Transform our acceleration structure into a list of entries.
+ ///
+ /// Note that the order is different from how they were obtained initially, and are explicitly ordered by
+ /// (old_email, old_name).
+ pub fn entries(&self) -> Vec<crate::Entry<'_>> {
+ let mut out = Vec::with_capacity(self.entries_by_old_email.len());
+ for entry in &self.entries_by_old_email {
+ if entry.new_email.is_some() || entry.new_name.is_some() {
+ out.push(crate::Entry {
+ new_name: entry.new_name.as_ref().map(|b| b.as_bstr()),
+ new_email: entry.new_email.as_ref().map(|b| b.as_bstr()),
+ old_name: None,
+ old_email: entry.old_email.as_bstr(),
+ });
+ }
+
+ for name_entry in &entry.entries_by_old_name {
+ out.push(crate::Entry {
+ new_name: name_entry.new_name.as_ref().map(|b| b.as_bstr()),
+ new_email: name_entry.new_email.as_ref().map(|b| b.as_bstr()),
+ old_name: name_entry.old_name.as_bstr().into(),
+ old_email: entry.old_email.as_bstr(),
+ });
+ }
+ }
+ out
+ }
+
+ /// Try to resolve `signature` by its contained email and name and provide resolved/mapped names as reference.
+ /// Return `None` if no such mapping was found.
+ ///
+ /// Note that opposed to what git seems to do, we also normalize the case of email addresses to match the one
+ /// given in the mailmap. That is, if `Alex@example.com` is the current email, it will be matched and replaced with
+ /// `alex@example.com`. This leads to better mapping results and saves entries in the mailmap.
+ ///
+ /// This is the fastest possible lookup as there is no allocation.
+ pub fn try_resolve_ref(&self, signature: gix_actor::SignatureRef<'_>) -> Option<ResolvedSignature<'_>> {
+ let email: EncodedStringRef<'_> = signature.email.into();
+ let pos = self
+ .entries_by_old_email
+ .binary_search_by(|e| e.old_email.cmp_ref(email))
+ .ok()?;
+ let entry = &self.entries_by_old_email[pos];
+
+ let name: EncodedStringRef<'_> = signature.name.into();
+
+ match entry.entries_by_old_name.binary_search_by(|e| e.old_name.cmp_ref(name)) {
+ Ok(pos) => {
+ let name_entry = &entry.entries_by_old_name[pos];
+ ResolvedSignature::try_new(
+ name_entry.new_email.as_ref(),
+ entry.old_email.as_bstr(),
+ signature.email,
+ name_entry.new_name.as_ref(),
+ )
+ }
+ Err(_) => ResolvedSignature::try_new(
+ entry.new_email.as_ref(),
+ entry.old_email.as_bstr(),
+ signature.email,
+ entry.new_name.as_ref(),
+ ),
+ }
+ }
+
+ /// Try to resolve `signature` by its contained email and name and provide resolved/mapped names as owned signature,
+ /// with the mapped name and/or email replaced accordingly.
+ ///
+ /// Return `None` if no such mapping was found.
+ pub fn try_resolve(&self, signature: gix_actor::SignatureRef<'_>) -> Option<gix_actor::Signature> {
+ self.try_resolve_ref(signature)
+ .map(|new| enriched_signature(signature, new).into())
+ }
+
+ /// Like [`try_resolve()`][Snapshot::try_resolve()], but always returns an owned signature, which might be a copy
+ /// of `signature` if no mapping was found.
+ ///
+ /// Note that this method will always allocate.
+ pub fn resolve(&self, signature: gix_actor::SignatureRef<'_>) -> gix_actor::Signature {
+ self.try_resolve(signature).unwrap_or_else(|| signature.to_owned())
+ }
+
+ /// Like [`try_resolve()`][Snapshot::try_resolve()], but always returns a special copy-on-write signature, which contains
+ /// changed names or emails as `Cow::Owned`, or `Cow::Borrowed` if no mapping was found.
+ pub fn resolve_cow<'a>(&self, signature: gix_actor::SignatureRef<'a>) -> Signature<'a> {
+ self.try_resolve_ref(signature)
+ .map(|new| enriched_signature(signature, new))
+ .unwrap_or_else(|| signature.into())
+ }
+}
+
+fn enriched_signature<'a>(
+ SignatureRef { name, email, time }: SignatureRef<'a>,
+ new: ResolvedSignature<'_>,
+) -> Signature<'a> {
+ match (new.email, new.name) {
+ (Some(new_email), Some(new_name)) => Signature {
+ email: new_email.to_owned().into(),
+ name: new_name.to_owned().into(),
+ time,
+ },
+ (Some(new_email), None) => Signature {
+ email: new_email.to_owned().into(),
+ name: name.into(),
+ time,
+ },
+ (None, Some(new_name)) => Signature {
+ email: email.into(),
+ name: new_name.to_owned().into(),
+ time,
+ },
+ (None, None) => unreachable!("BUG: ResolvedSignatures don't exist here when nothing is set"),
+ }
+}
diff --git a/vendor/gix-mailmap/src/snapshot/signature.rs b/vendor/gix-mailmap/src/snapshot/signature.rs
new file mode 100644
index 000000000..20488db58
--- /dev/null
+++ b/vendor/gix-mailmap/src/snapshot/signature.rs
@@ -0,0 +1,63 @@
+use std::borrow::Cow;
+
+use bstr::{BStr, BString, ByteSlice};
+
+/// A signature like [`gix_actor::Signature`], but with all string fields being a `Cow`.
+#[derive(Default, PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone)]
+#[cfg_attr(feature = "serde1", derive(serde::Serialize, serde::Deserialize))]
+pub struct Signature<'a> {
+ /// The possibly mapped name.
+ pub name: Cow<'a, BStr>,
+ /// The possibly mapped email.
+ pub email: Cow<'a, BStr>,
+ /// The time stamp at which the signature is performed.
+ pub time: gix_actor::Time,
+}
+
+impl<'a> From<Signature<'a>> for gix_actor::Signature {
+ fn from(s: Signature<'a>) -> Self {
+ gix_actor::Signature {
+ name: s.name.into_owned(),
+ email: s.email.into_owned(),
+ time: s.time,
+ }
+ }
+}
+
+impl<'a> From<gix_actor::SignatureRef<'a>> for Signature<'a> {
+ fn from(s: gix_actor::SignatureRef<'a>) -> Self {
+ Signature {
+ name: s.name.into(),
+ email: s.email.into(),
+ time: s.time,
+ }
+ }
+}
+
+/// A resolved signature with borrowed fields for a mapped `name` and/or `email`.
+pub struct ResolvedSignature<'a> {
+ /// The mapped name.
+ pub name: Option<&'a BStr>,
+ /// The mapped email.
+ pub email: Option<&'a BStr>,
+}
+
+impl<'a> ResolvedSignature<'a> {
+ pub(crate) fn try_new(
+ new_email: Option<&'a BString>,
+ matched_email: &'a BStr,
+ current_email: &'_ BStr,
+ new_name: Option<&'a BString>,
+ ) -> Option<Self> {
+ let new_email = new_email
+ .map(|n| n.as_bstr())
+ .or_else(|| (matched_email != current_email).then_some(matched_email));
+ match (new_email, new_name) {
+ (None, None) => None,
+ (new_email, new_name) => Some(ResolvedSignature {
+ email: new_email.map(|v| v.as_bstr()),
+ name: new_name.map(|v| v.as_bstr()),
+ }),
+ }
+ }
+}
diff --git a/vendor/gix-mailmap/src/snapshot/util.rs b/vendor/gix-mailmap/src/snapshot/util.rs
new file mode 100644
index 000000000..b7b97e344
--- /dev/null
+++ b/vendor/gix-mailmap/src/snapshot/util.rs
@@ -0,0 +1,104 @@
+use std::{cmp::Ordering, ops::Deref};
+
+use bstr::{BStr, BString, ByteSlice};
+
+#[cfg_attr(test, derive(Debug))]
+#[derive(Clone)]
+pub enum EncodedString {
+ Utf8(String),
+ Unknown(BString),
+}
+
+impl EncodedString {
+ pub fn as_bstr(&self) -> &BStr {
+ match self {
+ EncodedString::Utf8(v) => v.as_str().into(),
+ EncodedString::Unknown(v) => v.as_bstr(),
+ }
+ }
+ pub fn cmp_ref(&self, other: EncodedStringRef<'_>) -> Ordering {
+ match (self, other) {
+ (EncodedString::Utf8(a), EncodedStringRef::Utf8(b)) => {
+ let a = a.chars().map(|c| c.to_ascii_lowercase());
+ let b = b.chars().map(|c| c.to_ascii_lowercase());
+ a.cmp(b)
+ }
+ (EncodedString::Unknown(a), EncodedStringRef::Unknown(b)) => a.deref().as_bstr().cmp(b),
+ (EncodedString::Utf8(a), EncodedStringRef::Unknown(b)) => a.as_bytes().cmp(b.as_ref()),
+ (EncodedString::Unknown(a), EncodedStringRef::Utf8(b)) => a.deref().as_bytes().cmp(b.as_bytes()),
+ }
+ }
+}
+
+#[cfg_attr(test, derive(Debug))]
+#[derive(Clone, Copy)]
+pub enum EncodedStringRef<'a> {
+ Utf8(&'a str),
+ Unknown(&'a BStr),
+}
+
+impl<'a> From<&'a BStr> for EncodedStringRef<'a> {
+ fn from(v: &'a BStr) -> Self {
+ match v.to_str() {
+ Ok(v) => EncodedStringRef::Utf8(v),
+ Err(_) => EncodedStringRef::Unknown(v),
+ }
+ }
+}
+
+impl<'a> From<EncodedStringRef<'a>> for EncodedString {
+ fn from(v: EncodedStringRef<'a>) -> Self {
+ match v {
+ EncodedStringRef::Utf8(v) => EncodedString::Utf8(v.to_owned()),
+ EncodedStringRef::Unknown(v) => EncodedString::Unknown(v.to_owned()),
+ }
+ }
+}
+
+impl<'a> From<&'a BStr> for EncodedString {
+ fn from(v: &'a BStr) -> Self {
+ match v.to_str() {
+ Ok(v) => EncodedString::Utf8(v.to_owned()),
+ Err(_) => EncodedString::Unknown(v.to_owned()),
+ }
+ }
+}
+
+#[cfg(test)]
+mod encoded_string {
+ use std::cmp::Ordering;
+
+ use crate::snapshot::util::{EncodedString, EncodedStringRef};
+
+ #[test]
+ fn basic_ascii_case_folding() {
+ assert_eq!(
+ EncodedString::Utf8("FooBar".into()).cmp_ref(EncodedStringRef::Utf8("foobar")),
+ Ordering::Equal
+ );
+ }
+
+ #[test]
+ fn no_advanced_unicode_folding() {
+ assert_ne!(
+ EncodedString::Utf8("Masse".into()).cmp_ref(EncodedStringRef::Utf8("Maße")),
+ Ordering::Equal
+ );
+ }
+
+ #[test]
+ fn unknown_encoding_pairs_do_not_try_to_ignore_cases() {
+ assert_ne!(
+ EncodedString::Utf8("Foo".into()).cmp_ref(EncodedStringRef::Unknown("foo".into())),
+ Ordering::Equal
+ );
+ assert_ne!(
+ EncodedString::Unknown("Foo".into()).cmp_ref(EncodedStringRef::Utf8("foo")),
+ Ordering::Equal
+ );
+ assert_ne!(
+ EncodedString::Unknown("Foo".into()).cmp_ref(EncodedStringRef::Unknown("foo".into())),
+ Ordering::Equal
+ );
+ }
+}
diff --git a/vendor/gix-mailmap/tests/fixtures/invalid.txt b/vendor/gix-mailmap/tests/fixtures/invalid.txt
new file mode 100644
index 000000000..c579c5bd5
--- /dev/null
+++ b/vendor/gix-mailmap/tests/fixtures/invalid.txt
@@ -0,0 +1,5 @@
+# comment
+
+<missing closing brace
+
+just a name
diff --git a/vendor/gix-mailmap/tests/fixtures/overwrite.txt b/vendor/gix-mailmap/tests/fixtures/overwrite.txt
new file mode 100644
index 000000000..5ab9312f2
--- /dev/null
+++ b/vendor/gix-mailmap/tests/fixtures/overwrite.txt
@@ -0,0 +1,13 @@
+# overwrite previously seen values
+
+A <old-a-email>
+A-overwritten <old-a-email>
+
+B <new-b-email> <old-b-email>
+B-overwritten <new-b-email-overwritten> <old-b-email>
+
+C <new-c-email> old-C <old-c-email>
+C-overwritten <new-c-email-overwritten> old-C <old-c-email>
+
+<new-d-email> <old-d-email>
+<new-d-email-overwritten> <old-d-email>
diff --git a/vendor/gix-mailmap/tests/fixtures/typical.txt b/vendor/gix-mailmap/tests/fixtures/typical.txt
new file mode 100644
index 000000000..563b9ddd9
--- /dev/null
+++ b/vendor/gix-mailmap/tests/fixtures/typical.txt
@@ -0,0 +1,8 @@
+# from the mailmap docs
+
+Joe R. Developer <joe@example.com>
+Joe R. Developer <joe@example.com> Joe <bugs@example.com>
+
+Jane Doe <jane@example.com> <jane@laptop.(none)>
+Jane Doe <jane@example.com> <jane@desktop.(none)>
+Jane Doe <jane@example.com> Jane <bugs@example.com>
diff --git a/vendor/gix-mailmap/tests/mailmap.rs b/vendor/gix-mailmap/tests/mailmap.rs
new file mode 100644
index 000000000..58111c769
--- /dev/null
+++ b/vendor/gix-mailmap/tests/mailmap.rs
@@ -0,0 +1,2 @@
+mod parse;
+mod snapshot;
diff --git a/vendor/gix-mailmap/tests/parse/mod.rs b/vendor/gix-mailmap/tests/parse/mod.rs
new file mode 100644
index 000000000..28f33e463
--- /dev/null
+++ b/vendor/gix-mailmap/tests/parse/mod.rs
@@ -0,0 +1,130 @@
+use gix_mailmap::{parse, Entry};
+use gix_testtools::fixture_bytes;
+
+#[test]
+fn line_numbers_are_counted_correctly_in_errors() {
+ let input = fixture_bytes("invalid.txt");
+ let mut actual = gix_mailmap::parse(&input).collect::<Vec<_>>().into_iter();
+ assert_eq!(actual.len(), 2);
+
+ let err = actual.next().expect("two items left").unwrap_err();
+ assert!(matches!(err, parse::Error::Malformed { line_number: 3, .. }));
+
+ let err = actual.next().expect("one item left").unwrap_err();
+ assert!(matches!(err, parse::Error::UnconsumedInput { line_number: 5, .. }));
+}
+
+#[test]
+fn a_typical_mailmap() {
+ let input = fixture_bytes("typical.txt");
+ let actual = gix_mailmap::parse(&input).map(Result::unwrap).collect::<Vec<_>>();
+ assert_eq!(
+ actual,
+ vec![
+ Entry::change_name_by_email("Joe R. Developer", "joe@example.com"),
+ Entry::change_name_and_email_by_name_and_email(
+ "Joe R. Developer",
+ "joe@example.com",
+ "Joe",
+ "bugs@example.com"
+ ),
+ Entry::change_name_and_email_by_email("Jane Doe", "jane@example.com", "jane@laptop.(none)"),
+ Entry::change_name_and_email_by_email("Jane Doe", "jane@example.com", "jane@desktop.(none)"),
+ Entry::change_name_and_email_by_name_and_email("Jane Doe", "jane@example.com", "Jane", "bugs@example.com"),
+ ]
+ );
+}
+
+#[test]
+fn empty_lines_and_comments_are_ignored() {
+ assert!(gix_mailmap::parse(b"# comment").next().is_none());
+ assert!(gix_mailmap::parse(b"\n\r\n\t\t \n").next().is_none());
+ assert_eq!(
+ line(" # this is a name <email>"),
+ Entry::change_name_by_email("# this is a name", "email"),
+ "whitespace before hashes counts as name though"
+ );
+}
+
+#[test]
+fn windows_and_unix_line_endings_are_supported() {
+ let actual = gix_mailmap::parse(b"a <a@example.com>\n<b-new><b-old>\r\nc <c@example.com>")
+ .map(Result::unwrap)
+ .collect::<Vec<_>>();
+ assert_eq!(
+ actual,
+ vec![
+ Entry::change_name_by_email("a", "a@example.com"),
+ Entry::change_email_by_email("b-new", "b-old"),
+ Entry::change_name_by_email("c", "c@example.com")
+ ]
+ );
+}
+
+#[test]
+fn valid_entries() {
+ assert_eq!(
+ line(" \t proper name <commit-email>"),
+ Entry::change_name_by_email("proper name", "commit-email")
+ );
+ assert_eq!(
+ line(" <proper email> <commit-email> \t "),
+ Entry::change_email_by_email("proper email", "commit-email")
+ );
+ assert_eq!(
+ line(" proper name \t <proper email> \t <commit-email>"),
+ Entry::change_name_and_email_by_email("proper name", "proper email", "commit-email")
+ );
+ assert_eq!(
+ line(" proper name <proper email>\tcommit name\t<commit-email>\t"),
+ Entry::change_name_and_email_by_name_and_email("proper name", "proper email", "commit name", "commit-email")
+ );
+}
+
+#[test]
+fn error_if_there_is_just_a_name() {
+ assert!(matches!(
+ try_line("just a name"),
+ Err(parse::Error::UnconsumedInput { line_number: 1, .. })
+ ));
+}
+
+#[test]
+fn error_if_there_is_just_an_email() {
+ assert!(matches!(
+ try_line("<email>"),
+ Err(parse::Error::Malformed { line_number: 1, .. })
+ ));
+
+ assert!(matches!(
+ try_line(" \t <email>"),
+ Err(parse::Error::Malformed { line_number: 1, .. })
+ ));
+}
+
+#[test]
+fn error_if_email_is_empty() {
+ assert!(matches!(
+ try_line("hello <"),
+ Err(parse::Error::Malformed { line_number: 1, .. })
+ ));
+ assert!(matches!(
+ try_line("hello < \t"),
+ Err(parse::Error::Malformed { line_number: 1, .. })
+ ));
+ assert!(matches!(
+ try_line("hello < \t\r >"),
+ Err(parse::Error::Malformed { line_number: 1, .. })
+ ));
+}
+
+fn line(input: &str) -> Entry<'_> {
+ try_line(input).unwrap()
+}
+
+fn try_line(input: &str) -> Result<Entry<'_>, parse::Error> {
+ let mut lines = gix_mailmap::parse(input.as_bytes());
+ let res = lines.next().expect("single line");
+ assert!(lines.next().is_none(), "only one line provided");
+ res
+}
diff --git a/vendor/gix-mailmap/tests/snapshot/mod.rs b/vendor/gix-mailmap/tests/snapshot/mod.rs
new file mode 100644
index 000000000..c82297880
--- /dev/null
+++ b/vendor/gix-mailmap/tests/snapshot/mod.rs
@@ -0,0 +1,127 @@
+use gix_mailmap::Snapshot;
+use gix_testtools::fixture_bytes;
+
+#[test]
+fn try_resolve() {
+ let snapshot = Snapshot::from_bytes(&fixture_bytes("typical.txt"));
+ assert_eq!(
+ snapshot.try_resolve(signature("Foo", "Joe@example.com").to_ref()),
+ Some(signature("Joe R. Developer", "joe@example.com")),
+ "resolved signatures contain all original fields, and normalize the email as well to match the one that it was looked up with"
+ );
+ assert_eq!(
+ snapshot.try_resolve(signature("Joe", "bugs@example.com").to_ref()),
+ Some(signature("Joe R. Developer", "joe@example.com")),
+ "name and email can be mapped specifically"
+ );
+
+ assert_eq!(
+ snapshot.try_resolve(signature("Jane", "jane@laptop.(none)").to_ref()),
+ Some(signature("Jane Doe", "jane@example.com")),
+ "fix name and email by email"
+ );
+ assert_eq!(
+ snapshot.try_resolve(signature("Jane", "jane@desktop.(none)").to_ref()),
+ Some(signature("Jane Doe", "jane@example.com")),
+ "fix name and email by other email"
+ );
+
+ assert_eq!(
+ snapshot.try_resolve(signature("janE", "Bugs@example.com").to_ref()),
+ Some(signature("Jane Doe", "jane@example.com")),
+ "name and email can be mapped specifically, case insensitive matching of name"
+ );
+
+ let sig = signature("Jane", "other@example.com");
+ assert_eq!(snapshot.try_resolve(sig.to_ref()), None, "unmatched email");
+
+ assert_eq!(
+ snapshot.resolve(sig.to_ref()),
+ sig,
+ "resolution always works here, returning a copy of the original"
+ );
+
+ let sig = signature("Jean", "bugs@example.com");
+ assert_eq!(
+ snapshot.try_resolve(sig.to_ref()),
+ None,
+ "matched email, unmatched name"
+ );
+ assert_eq!(snapshot.resolve(sig.to_ref()), sig);
+
+ assert_eq!(snapshot.entries().len(), 5);
+}
+
+#[test]
+fn non_name_and_name_mappings_will_not_clash() {
+ let entries = vec![
+ // add mapping from email
+ gix_mailmap::Entry::change_name_by_email("new-name", "old-email"),
+ // add mapping from name and email
+ gix_mailmap::Entry::change_name_and_email_by_name_and_email(
+ "other-new-name",
+ "other-new-email",
+ "old-name",
+ "old-email",
+ ),
+ ];
+ for entries in vec![entries.clone().into_iter().rev().collect::<Vec<_>>(), entries] {
+ let snapshot = Snapshot::new(entries);
+
+ assert_eq!(
+ snapshot.try_resolve(signature("replace-by-email", "Old-Email").to_ref()),
+ Some(signature("new-name", "old-email")),
+ "it can match by email only, and the email is normalized"
+ );
+ assert_eq!(
+ snapshot.try_resolve(signature("old-name", "Old-Email").to_ref()),
+ Some(signature("other-new-name", "other-new-email")),
+ "it can match by email and name as well"
+ );
+
+ assert_eq!(snapshot.entries().len(), 2);
+ }
+}
+
+#[test]
+fn overwrite_entries() {
+ let snapshot = Snapshot::from_bytes(&fixture_bytes("overwrite.txt"));
+ assert_eq!(
+ snapshot.try_resolve(signature("does not matter", "old-a-email").to_ref()),
+ Some(signature("A-overwritten", "old-a-email")),
+ "email only by email"
+ );
+
+ assert_eq!(
+ snapshot.try_resolve(signature("to be replaced", "old-b-EMAIL").to_ref()),
+ Some(signature("B-overwritten", "new-b-email-overwritten")),
+ "name and email by email"
+ );
+
+ assert_eq!(
+ snapshot.try_resolve(signature("old-c", "old-C-email").to_ref()),
+ Some(signature("C-overwritten", "new-c-email-overwritten")),
+ "name and email by name and email"
+ );
+
+ assert_eq!(
+ snapshot.try_resolve(signature("unchanged", "old-d-email").to_ref()),
+ Some(signature("unchanged", "new-d-email-overwritten")),
+ "email by email"
+ );
+
+ assert_eq!(snapshot.entries().len(), 4);
+}
+
+fn signature(name: &str, email: &str) -> gix_actor::Signature {
+ gix_actor::Signature {
+ name: name.into(),
+ email: email.into(),
+ time: gix_actor::Time {
+ // marker
+ seconds_since_unix_epoch: 42,
+ offset_in_seconds: 53,
+ sign: gix_actor::Sign::Minus,
+ },
+ }
+}