diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 12:41:35 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 12:41:35 +0000 |
commit | 7e5d7eea9c580ef4b41a765bde624af431942b96 (patch) | |
tree | 2c0d9ca12878fc4525650aa4e54d77a81a07cc09 /vendor/gix-mailmap | |
parent | Adding debian version 1.70.0+dfsg1-9. (diff) | |
download | rustc-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.json | 1 | ||||
-rw-r--r-- | vendor/gix-mailmap/CHANGELOG.md | 390 | ||||
-rw-r--r-- | vendor/gix-mailmap/Cargo.toml | 64 | ||||
-rw-r--r-- | vendor/gix-mailmap/src/entry.rs | 70 | ||||
-rw-r--r-- | vendor/gix-mailmap/src/lib.rs | 63 | ||||
-rw-r--r-- | vendor/gix-mailmap/src/parse.rs | 116 | ||||
-rw-r--r-- | vendor/gix-mailmap/src/snapshot/entry.rs | 90 | ||||
-rw-r--r-- | vendor/gix-mailmap/src/snapshot/mod.rs | 167 | ||||
-rw-r--r-- | vendor/gix-mailmap/src/snapshot/signature.rs | 63 | ||||
-rw-r--r-- | vendor/gix-mailmap/src/snapshot/util.rs | 104 | ||||
-rw-r--r-- | vendor/gix-mailmap/tests/fixtures/invalid.txt | 5 | ||||
-rw-r--r-- | vendor/gix-mailmap/tests/fixtures/overwrite.txt | 13 | ||||
-rw-r--r-- | vendor/gix-mailmap/tests/fixtures/typical.txt | 8 | ||||
-rw-r--r-- | vendor/gix-mailmap/tests/mailmap.rs | 2 | ||||
-rw-r--r-- | vendor/gix-mailmap/tests/parse/mod.rs | 130 | ||||
-rw-r--r-- | vendor/gix-mailmap/tests/snapshot/mod.rs | 127 |
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, + }, + } +} |