Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tracking Issue for Provider API #96024

Open
1 of 7 tasks
yaahc opened this issue Apr 13, 2022 · 53 comments
Open
1 of 7 tasks

Tracking Issue for Provider API #96024

yaahc opened this issue Apr 13, 2022 · 53 comments
Assignees
Labels
B-RFC-approved Blocker: Approved by a merged RFC but not yet implemented. B-RFC-implemented Blocker: Approved by a merged RFC and implemented. B-unstable Blocker: Implemented in the nightly compiler and unstable. C-tracking-issue Category: A tracking issue for an RFC or an unstable feature. T-libs-api Relevant to the library API team, which will review and decide on the PR/issue.

Comments

@yaahc
Copy link
Member

yaahc commented Apr 13, 2022

Feature gate: #![feature(provide_any)]

This is a tracking issue for RFC 3192

This RFC proposes extending the any module of the core library with a generic API for objects to provide type-based access to data. (In contrast to the existing APIs which provides type-driven downcasting, the proposed extension integrates downcasting into data access to provide a safer and more ergonomic API).

The initial motivating use case for this API is to provide the necessary functionality to add generic member access to the Error trait to generalize extracting context like Backtrace and to make it possible to move the Error trait into core while leaving Backtrace in std.

Public API

// core::any
pub trait Provider {
    fn provide<'a>(&'a self, demand: &mut Demand<'a>);
}

pub fn request_value<'a, T>(provider: &'a (impl Provider + ?Sized)) -> Option<T>
where
    T: 'static;

pub fn request_ref<'a, T>(provider: &'a (impl Provider + ?Sized)) -> Option<&'a T>
where
    T: 'static + ?Sized;

#[repr(transparent)]
pub struct Demand<'a>(_);

impl<'a> Demand<'a> {
    pub fn provide_value<T>(&mut self, value: T) -> &mut Self
    where
        T: 'static;

    pub fn provide_value_with<T>(&mut self, fulfil: impl FnOnce() -> T) -> &mut Self
    where
        T: 'static;

    pub fn provide_ref<T: ?Sized + 'static>(&mut self, value: &'a T) -> &mut Self;

    pub fn provide_ref_with<T: ?Sized + 'static>(
        &mut self,
        fulfil: impl FnOnce() -> &'a T,
    ) -> &mut Self;

    pub fn would_be_satisfied_by_value_of<T>(&self) -> bool
    where
        T: 'static;

    pub fn would_be_satisfied_by_ref_of<T>(&self) -> bool
    where
        T: ?Sized + 'static,
}

impl<'a> fmt::Debug for Demand<'a> {}

// core::error
impl<E> Provider for E
where
    E: Error + ?Sized;

Steps / History

  • Implementation: Add the Provider api to core::any #91970
  • Delete the Provider trait and merge its functionality into Error.
  • Pick either demand or request and use that name consistently.
  • LLVM is unable to optimize multiple .provide_* calls into a switch table because each call fetches the type id from Erased::type_id separately each time and the compiler doesn't know that these calls all return the same value. This should be fixed. See Add provide_any module to core rfcs#3192 (comment) for one possible solution (although alternative solutions may be possible).
  • Final comment period (FCP)
  • Stabilization PR

Unresolved Questions

  • Should the APIs be named demand_* or request_*?
@yaahc yaahc added T-libs-api Relevant to the library API team, which will review and decide on the PR/issue. C-tracking-issue Category: A tracking issue for an RFC or an unstable feature. B-RFC-approved Blocker: Approved by a merged RFC but not yet implemented. labels Apr 13, 2022
@yaahc
Copy link
Member Author

yaahc commented Jul 8, 2022

#98912 updates the request_* functions to have an APIT (arg position impl trait) parameter instead of a standard generic parameter to remove unnecessary inferred parameters while turbofishing.

Callers change:

let obj: Box<dyn Provider> = Box::new(SomeConcreteType { some_string: "hello".to_owned() });

// From
assert_eq!(&**request_ref::<String, _>(&*obj).unwrap(), "hello");

// To
assert_eq!(&**request_ref::<String>(&*obj).unwrap(), "hello");

@dtolnay
Copy link
Member

dtolnay commented Aug 31, 2022

One minor thing that weirds me out about this API is this impl:

impl<E> Provider for E
where
E: Error + ?Sized,

Since this is a blanket impl (Self type is a generic parameter), it is the one blanket impl that Provider is ever going to be able to have, at least absent some far-future negative impls feature in the language. Any other blanket impl would be considered overlapping and violate coherence.

But it's a blanket impl of core::any::Provider, which is envisioned as being as general-purpose as the Any trait, for types which implement core::error::Error, which is a much narrower use case. In some sense this relationship is saying that "Errors are the one true canonical/privileged implementers of the Provider trait; any other application of Provider is second-class".

I am wondering which one of the following would be feasible:

  1. Yes, errors are the one privileged application of Provider, and while Provider may be useful for some other things sometimes, all of those are second-class.

    a. Maybe move Provider to core::error to double down on this view?

  2. Remove the blanket impl. What are the things that make the blanket impl necessary for usability of this API, and can those be mitigated a different way?

@yaahc
Copy link
Member Author

yaahc commented Aug 31, 2022

We could go back to what we had before we move Error into core which was a provide impl just on dyn Error which caused some other paper cuts but I can't remember exactly what those issues were.

@thomcc
Copy link
Member

thomcc commented Aug 31, 2022

Another issue for the provider API that matters for non-error cases is the lack of support for &mut.

I think the initial proposal did support this, at some cost to complexity. While I don't know that we need to support it out of the gate (I've wanted it multiple times when playing around with the API), it would be good to be sure we know it would look like, so that if we want to add it in the future, that we have not painted ourselves into a corner where we cannot do so.

@yaahc
Copy link
Member Author

yaahc commented Aug 31, 2022

@thomcc I believe all we have to do is expose the tag APIs to support those cases. We didn't change the impl, only the exposed API.

matthiaskrgr added a commit to matthiaskrgr/rust that referenced this issue Sep 1, 2022
Add additional methods to the Demand type

This adds on to the original tracking issue rust-lang#96024

r? `@yaahc`
Dylan-DPC added a commit to Dylan-DPC/rust that referenced this issue Sep 1, 2022
Add additional methods to the Demand type

This adds on to the original tracking issue rust-lang#96024

r? ``@yaahc``
Dylan-DPC added a commit to Dylan-DPC/rust that referenced this issue Sep 1, 2022
Add additional methods to the Demand type

This adds on to the original tracking issue rust-lang#96024

r? ```@yaahc```
Dylan-DPC added a commit to Dylan-DPC/rust that referenced this issue Sep 1, 2022
Add additional methods to the Demand type

This adds on to the original tracking issue rust-lang#96024

r? ````@yaahc````
Dylan-DPC added a commit to Dylan-DPC/rust that referenced this issue Sep 1, 2022
Add additional methods to the Demand type

This adds on to the original tracking issue rust-lang#96024

r? `````@yaahc`````
Dylan-DPC added a commit to Dylan-DPC/rust that referenced this issue Sep 1, 2022
Add additional methods to the Demand type

This adds on to the original tracking issue rust-lang#96024

r? ``````@yaahc``````
Dylan-DPC added a commit to Dylan-DPC/rust that referenced this issue Sep 2, 2022
Add additional methods to the Demand type

This adds on to the original tracking issue rust-lang#96024

r? `@yaahc`
Dylan-DPC added a commit to Dylan-DPC/rust that referenced this issue Sep 2, 2022
Add additional methods to the Demand type

This adds on to the original tracking issue rust-lang#96024

r? ``@yaahc``
Dylan-DPC added a commit to Dylan-DPC/rust that referenced this issue Sep 2, 2022
Add additional methods to the Demand type

This adds on to the original tracking issue rust-lang#96024

r? ```@yaahc```
Dylan-DPC added a commit to Dylan-DPC/rust that referenced this issue Sep 2, 2022
Add additional methods to the Demand type

This adds on to the original tracking issue rust-lang#96024

r? ````@yaahc````
GuillaumeGomez added a commit to GuillaumeGomez/rust that referenced this issue Sep 2, 2022
Add additional methods to the Demand type

This adds on to the original tracking issue rust-lang#96024

r? `````@yaahc`````
dbanty referenced this issue in knope-dev/knope Sep 4, 2022
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [thiserror](https://github.com/dtolnay/thiserror) | dependencies | patch | `1.0.32` -> `1.0.33` |

---

### Release Notes

<details>
<summary>dtolnay/thiserror</summary>

### [`v1.0.33`](https://github.com/dtolnay/thiserror/releases/tag/1.0.33)

[Compare Source](https://github.com/dtolnay/thiserror/compare/1.0.32...1.0.33)

-   Expose backtraces via the new "generic member access" API on the Error trait ([https://github.com/rust-lang/rust/issues/99301](https://github.com/rust-lang/rust/issues/99301), [https://github.com/rust-lang/rust/issues/96024](https://github.com/rust-lang/rust/issues/96024))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, click this checkbox.

---

This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://app.renovatebot.com/dashboard#github/knope-dev/knope).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzMi4xODQuMiIsInVwZGF0ZWRJblZlciI6IjMyLjE4NC4yIn0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
@jakobhellermann
Copy link
Contributor

Another issue for the provider API that matters for non-error cases is the lack of support for &mut.

I believe all we have to do is expose the tag APIs to support those cases. We didn't change the impl, only the exposed API.

Is this something that just hasn't been implemented yet or was there an active decision to not expose &mut references for now?
I'm thinking we could just add

pub fn request_ref<'a, T>(provider: &'a (impl Provider + ?Sized)) -> Option<&'a T>
where
    T: 'static + ?Sized,
{
    request_by_type_tag::<'a, tags::Ref<tags::MaybeSizedValue<T>>>(provider)
}

+pub fn request_ref_mut<'a, T>(provider: &'a (impl Provider + ?Sized)) -> Option<&'a mut T>
+where
+    T: 'static + ?Sized,
+{
+    request_by_type_tag::<'a, tags::RefMut<tags::MaybeSizedValue<T>>>(provider)
+}

mod tags {
     pub struct Ref<I>(PhantomData<I>);
 
     impl<'a, I: MaybeSizedType<'a>> Type<'a> for Ref<I> {
         type Reified = &'a I::Reified;
     }
+    
+    pub struct RefMut<I>(PhantomData<I>);
+
+    impl<'a, I: MaybeSizedType<'a>> Type<'a> for RefMut<I> {
+        type Reified = &'a mut I::Reified;
+    }
}

but maybe I'm missing something.

@waynr
Copy link
Contributor

waynr commented Jul 9, 2023

If the Provider trait and core::any::request_* drop out, how can non-Error userspace code create a Demand/Request?

One idea I had while working on my PR was to add a constructor to Request, eg

  impl<T> Serialize for StringSet<T> where T: Serialize {
      fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
      where
          S: serde::Serializer,
      {
          let request = Request::new_tagged<serde_dynamo::StringSetSerializer>();
          if let Some(string_set_serializer) = serializer.provide(request) {
              self.0.serialize(string_set_serializer)
          } else {
              self.0.serialize(serializer)
          }
      }
  }

I'm still fairly new to this stuff but I believe this should be possible with a definition of Request::new_tagged that looks something like this:

impl Request {
  pub fn new_tagged<'a, I>() -> Self<I:Reified>
  where
    I: tags::Type<'a>,
  {
    let mut tagged = core::any::TaggedOption<'a, I>(None);
    tagged.as_request()
  }
}

With this approach, Serializer itself would have add the provide method, similar to Error in my PR.

It's not totally clear to me if that would work for your case, I'm just offering a suggestion that would keep in line with the maintainer's request to leave out the Provider trait.

@bryanburgers
Copy link
Contributor

If the Provider trait and core::any::request_* drop out, how can non-Error userspace code create a Demand/Request?

One idea I had while working on my PR was to add a constructor to Request, eg

  impl<T> Serialize for StringSet<T> where T: Serialize {
      fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
      where
          S: serde::Serializer,
      {
          let request = Request::new_tagged<serde_dynamo::StringSetSerializer>();
          if let Some(string_set_serializer) = serializer.provide(request) {
              self.0.serialize(string_set_serializer)
          } else {
              self.0.serialize(serializer)
          }
      }
  }

I'm still fairly new to this stuff but I believe this should be possible with a definition of Request::new_tagged that looks something like this:

impl Request {
  pub fn new_tagged<'a, I>() -> Self<I:Reified>
  where
    I: tags::Type<'a>,
  {
    let mut tagged = core::any::TaggedOption<'a, I>(None);
    tagged.as_request()
  }
}

With this approach, Serializer itself would have add the provide method, similar to Error in my PR.

It's not totally clear to me if that would work for your case, I'm just offering a suggestion that would keep in line with the maintainer's request to leave out the Provider trait.

Would tags::Type need to be added to the public API, then?

@waynr
Copy link
Contributor

waynr commented Jul 9, 2023

Would tags::Type need to be added to the public API, then?

I forgot about that, but I think you're right. The core::any::tags module along with the core::any::TaggedOption type would probably need to be exposed publicly. This is because the Request type itself doesn't provide any methods for accessing the contents of a request, just methods for providing a response to any types that a "provider" (not the trait, just the general term for any type with a method that takes a Request for the sake of fulfilling it) is able to respond with.

Kind of strangely, I don't think Request is or was ever exposed directly to the user requesting a value/ref (as opposed to the user writing an Error implementation). The user requesting a value/ref is meant to use <dyn Error>.request_value or <dyn Error>.request_ref both of which as a matter of implementation detail end up constructing a TaggedOption, turning that into a Request, then responding with an Option<T>.

So because core::any::TaggedOption and core::any::tags are private to the standard library and because my PR removes the Provider trait, we can only implement methods like request_value and request_ref for types in the standard library; prior to my PR the Provider trait made it possible for request_value and request_ref to be implemented for all types that implement Provider.

@waynr
Copy link
Contributor

waynr commented Jul 10, 2023

@bryanburgers just to follow up, I don't think it's likely in the scope of provide_any or error_generic_member_access that it will be possible to construct Request instances as I mentioned in my previous comments or to use them except in relation to the core::error::Error trait. For reference:

Although my opinion doesn't mean much since I am still new to contributing here, I think it's better to keep the API impact of features like this small initially.

As for your original question:

how can non-Error userspace code create a Demand/Request?

One option you could consider is this dyno crate which offers a very similar API. Would that work for you? I'm sure it would be easier to be enthusiastic about a standard library Provider type than an experimental third-party crate 🙃

@waynr
Copy link
Contributor

waynr commented Jul 10, 2023

Not sure what the proper etiquette is for proposing this, but after seeing agreement from @Amanieu in zulip I would like to propose closing this tracking issue in favor of merging what's left of the Provider API into the error_generic_member_access RFC which I have volunteered to update (I'll be opening a PR against that PR shortly after submitting this comment).

The major motivation behind merging these two issues is that the libs meeting has decided to leave out the Provider trait. Without that, all provide_any provides is the Request type which for the foreseeable future will only be used in the Error trait updates proposed in the error_generic_member_access RFC; which anyway already mentions a Request type more or less identical to what has been discussed here.

Merging the two issues would involve the following steps:

Anyone have any objections to this? I kind of feel awkward jumping in and suggesting it as a newcomer, but again I've had some supportive responses in zulip. I'm happy to take on all this work for the near future as I am currently unemployed anyway.

@Amanieu
Copy link
Member

Amanieu commented Jul 15, 2023

Anyone have any objections to this? I kind of feel awkward jumping in and suggesting it as a newcomer, but again I've had some supportive responses in zulip. I'm happy to take on all this work for the near future as I am currently unemployed anyway.

No objections, this sounds like a good plan. Let me know if you need help with anything.

@waynr
Copy link
Contributor

waynr commented Jul 15, 2023

@Amanieu okay cool, sounds like we've given folks long enough to object. I can't do much keyboard work at the moment because i recently smashed one of my fingers (by mistake of course 🙃) and it needs a few more days to a week to heal before I'm back to my full typing speed. But for now I'll try to assign both tracking issues to myself and start making some of the changes that don't require as much keyboard work.

@waynr
Copy link
Contributor

waynr commented Jul 15, 2023

@rustbot claim

@waynr
Copy link
Contributor

waynr commented Jul 29, 2023

@yaahc I think we've captured everything but

LLVM is unable to optimize multiple .provide_* calls into a switch table because each call fetches the type id from Erased::type_id separately each time and the compiler doesn't know that these calls all return the same value. This should be fixed. See Add provide_any module to core rfcs#3192 (comment) for one possible solution (although alternative solutions may be possible).

in the TODOs for the error_generic_member_access tracking issue so we should be able to close this tracking issue, right?

bors referenced this issue in rust-lang/cargo Aug 1, 2023
chore(deps): update compatible

[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [anyhow](https://github.com/dtolnay/anyhow) | workspace.dependencies | patch | `1.0.47` -> `1.0.72` |
| [base64](https://github.com/marshallpierce/rust-base64) | workspace.dependencies | patch | `0.21.0` -> `0.21.2` |
| [bytesize](https://github.com/hyunsik/bytesize) | workspace.dependencies | minor | `1.0` -> `1.2` |
| [clap](https://github.com/clap-rs/clap) | workspace.dependencies | minor | `4.2.0` -> `4.3.19` |
| [core-foundation](https://github.com/servo/core-foundation-rs) | workspace.dependencies | patch | `0.9.0` -> `0.9.3` |
| [filetime](https://github.com/alexcrichton/filetime) | workspace.dependencies | patch | `0.2.9` -> `0.2.21` |
| [flate2](https://github.com/rust-lang/flate2-rs) | workspace.dependencies | patch | `1.0.3` -> `1.0.26` |
| [git2](https://github.com/rust-lang/git2-rs) | workspace.dependencies | patch | `0.17.1` -> `0.17.2` |
| [glob](https://github.com/rust-lang/glob) | workspace.dependencies | patch | `0.3.0` -> `0.3.1` |
| [handlebars](https://github.com/sunng87/handlebars-rust) | workspace.dependencies | minor | `3.2.1` -> `3.5.5` |
| [hex](https://github.com/KokaKiwi/rust-hex) | workspace.dependencies | patch | `0.4.2` -> `0.4.3` |
| [http-auth](https://github.com/scottlamb/http-auth) | workspace.dependencies | patch | `0.1.6` -> `0.1.8` |
| [humantime](https://github.com/tailhook/humantime) | workspace.dependencies | minor | `2.0.0` -> `2.1.0` |
| [ignore](https://github.com/BurntSushi/ripgrep/tree/master/crates/ignore) ([source](https://github.com/BurntSushi/ripgrep)) | workspace.dependencies | patch | `0.4.7` -> `0.4.20` |
| [im-rc](http://immutable.rs/) ([source](https://github.com/bodil/im-rs)) | workspace.dependencies | minor | `15.0.0` -> `15.1.0` |
| [lazy_static](https://github.com/rust-lang-nursery/lazy-static.rs) | workspace.dependencies | minor | `1.3.0` -> `1.4.0` |
| [lazycell](https://github.com/indiv0/lazycell) | workspace.dependencies | minor | `1.2.0` -> `1.3.0` |
| [libc](https://github.com/rust-lang/libc) | workspace.dependencies | patch | `0.2.144` -> `0.2.147` |
| [libgit2-sys](https://github.com/rust-lang/git2-rs) | workspace.dependencies | patch | `0.15.1` -> `0.15.2+1.6.4` |
| [log](https://github.com/rust-lang/log) | workspace.dependencies | patch | `0.4.17` -> `0.4.19` |
| [memchr](https://github.com/BurntSushi/memchr) | workspace.dependencies | minor | `2.1.3` -> `2.5.0` |
| [os_info](https://github.com/stanislav-tkach/os_info) | workspace.dependencies | minor | `3.5.0` -> `3.7.0` |
| [pasetors](https://github.com/brycx/pasetors) | workspace.dependencies | patch | `0.6.4` -> `0.6.7` |
| [percent-encoding](https://github.com/servo/rust-url) | workspace.dependencies | minor | `2.0` -> `2.3` |
| [pkg-config](https://github.com/rust-lang/pkg-config-rs) | workspace.dependencies | patch | `0.3.19` -> `0.3.27` |
| [pretty_assertions](https://github.com/rust-pretty-assertions/rust-pretty-assertions) | workspace.dependencies | minor | `1.3.0` -> `1.4.0` |
| [proptest](https://proptest-rs.github.io/proptest/proptest/index.html) ([source](https://github.com/proptest-rs/proptest)) | workspace.dependencies | minor | `1.1.0` -> `1.2.0` |
| [pulldown-cmark](https://github.com/raphlinus/pulldown-cmark) | workspace.dependencies | patch | `0.9.2` -> `0.9.3` |
| [rustfix](https://github.com/rust-lang-nursery/rustfix) | workspace.dependencies | patch | `0.6.0` -> `0.6.1` |
| [security-framework](https://lib.rs/crates/security_framework) ([source](https://github.com/kornelski/rust-security-framework)) | workspace.dependencies | minor | `2.0.0` -> `2.9.2` |
| [semver](https://github.com/dtolnay/semver) | workspace.dependencies | patch | `1.0.3` -> `1.0.18` |
| [serde](https://serde.rs) ([source](https://github.com/serde-rs/serde)) | workspace.dependencies | patch | `1.0.123` -> `1.0.180` |
| [serde_ignored](https://github.com/dtolnay/serde-ignored) | workspace.dependencies | patch | `0.1.0` -> `0.1.9` |
| [serde_json](https://github.com/serde-rs/json) | workspace.dependencies | patch | `1.0.59` -> `1.0.104` |
| [sha2](https://github.com/RustCrypto/hashes) | workspace.dependencies | patch | `0.10.6` -> `0.10.7` |
| [shell-escape](https://github.com/sfackler/shell-escape) | workspace.dependencies | patch | `0.1.4` -> `0.1.5` |
| [snapbox](https://github.com/assert-rs/trycmd/tree/main/crates/snapbox) ([source](https://github.com/assert-rs/trycmd)) | workspace.dependencies | patch | `0.4.0` -> `0.4.11` |
| [strip-ansi-escapes](https://github.com/luser/strip-ansi-escapes) | workspace.dependencies | patch | `0.1.0` -> `0.1.1` |
| [syn](https://github.com/dtolnay/syn) | workspace.dependencies | patch | `2.0.14` -> `2.0.28` |
| [tar](https://github.com/alexcrichton/tar-rs) | workspace.dependencies | patch | `0.4.38` -> `0.4.39` |
| [tempfile](https://stebalien.com/projects/tempfile-rs/) ([source](https://github.com/Stebalien/tempfile)) | workspace.dependencies | minor | `3.1.0` -> `3.7.0` |
| [termcolor](https://github.com/BurntSushi/termcolor) | workspace.dependencies | minor | `1.1.2` -> `1.2.0` |
| [thiserror](https://github.com/dtolnay/thiserror) | workspace.dependencies | patch | `1.0.40` -> `1.0.44` |
| [toml](https://github.com/toml-rs/toml) | workspace.dependencies | patch | `0.7.0` -> `0.7.6` |
| [toml_edit](https://github.com/toml-rs/toml) | workspace.dependencies | patch | `0.19.0` -> `0.19.14` |
| [unicode-width](https://github.com/unicode-rs/unicode-width) | workspace.dependencies | patch | `0.1.5` -> `0.1.10` |
| [unicode-xid](https://github.com/unicode-rs/unicode-xid) | workspace.dependencies | patch | `0.2.0` -> `0.2.4` |
| [url](https://github.com/servo/rust-url) | workspace.dependencies | minor | `2.2.2` -> `2.4.0` |
| [varisat](https://jix.one/project/varisat/) ([source](https://github.com/jix/varisat)) | workspace.dependencies | patch | `0.2.1` -> `0.2.2` |
| [walkdir](https://github.com/BurntSushi/walkdir) | workspace.dependencies | patch | `2.3.1` -> `2.3.3` |

---

### Release Notes

<details>
<summary>dtolnay/anyhow (anyhow)</summary>

### [`v1.0.72`](https://github.com/dtolnay/anyhow/releases/tag/1.0.72)

[Compare Source](https://github.com/dtolnay/anyhow/compare/1.0.71...1.0.72)

-   Documentation improvements

### [`v1.0.71`](https://github.com/dtolnay/anyhow/releases/tag/1.0.71)

[Compare Source](https://github.com/dtolnay/anyhow/compare/1.0.70...1.0.71)

-   Documentation improvements

### [`v1.0.70`](https://github.com/dtolnay/anyhow/releases/tag/1.0.70)

[Compare Source](https://github.com/dtolnay/anyhow/compare/1.0.69...1.0.70)

-   Update syn dependency to 2.x

### [`v1.0.69`](https://github.com/dtolnay/anyhow/releases/tag/1.0.69)

[Compare Source](https://github.com/dtolnay/anyhow/compare/1.0.68...1.0.69)

-   Documentation improvements

### [`v1.0.68`](https://github.com/dtolnay/anyhow/releases/tag/1.0.68)

[Compare Source](https://github.com/dtolnay/anyhow/compare/1.0.67...1.0.68)

-   Opt out of `-Zrustdoc-scrape-examples` on docs.rs for now

### [`v1.0.67`](https://github.com/dtolnay/anyhow/releases/tag/1.0.67)

[Compare Source](https://github.com/dtolnay/anyhow/compare/1.0.66...1.0.67)

-   Improve the backtrace captured when `context()` is used on an `Option` ([#&#8203;280](https://github.com/dtolnay/anyhow/issues/280))

### [`v1.0.66`](https://github.com/dtolnay/anyhow/releases/tag/1.0.66)

[Compare Source](https://github.com/dtolnay/anyhow/compare/1.0.65...1.0.66)

-   Reduce unhelpful backtrace frames in backtraces captured during a `context` call ([#&#8203;279](https://github.com/dtolnay/anyhow/issues/279))

### [`v1.0.65`](https://github.com/dtolnay/anyhow/releases/tag/1.0.65)

[Compare Source](https://github.com/dtolnay/anyhow/compare/1.0.64...1.0.65)

-   <code>impl <a href="https://doc.rust-lang.org/std/any/trait.Provider.html">Provider</a> for anyhow::Error</code>

### [`v1.0.64`](https://github.com/dtolnay/anyhow/releases/tag/1.0.64)

[Compare Source](https://github.com/dtolnay/anyhow/compare/1.0.63...1.0.64)

-   Correctly propagate Backtrace when using `#[source] anyhow::Error` with [thiserror](https://github.com/dtolnay/thiserror) crate ([#&#8203;231](https://github.com/dtolnay/anyhow/issues/231))

### [`v1.0.63`](https://github.com/dtolnay/anyhow/releases/tag/1.0.63)

[Compare Source](https://github.com/dtolnay/anyhow/compare/1.0.62...1.0.63)

-   Expose backtraces via the new "generic member access" API on the Error trait ([https://github.com/rust-lang/rust/issues/99301](https://github.com/rust-lang/rust/issues/99301), [https://github.com/rust-lang/rust/issues/96024](https://github.com/rust-lang/rust/issues/96024))

### [`v1.0.62`](https://github.com/dtolnay/anyhow/releases/tag/1.0.62)

[Compare Source](https://github.com/dtolnay/anyhow/compare/1.0.61...1.0.62)

-   Fix extra rebuilding when interleaving command-line `cargo` invocations with IDE builds ([#&#8203;261](https://github.com/dtolnay/anyhow/issues/261))

### [`v1.0.61`](https://github.com/dtolnay/anyhow/releases/tag/1.0.61)

[Compare Source](https://github.com/dtolnay/anyhow/compare/1.0.60...1.0.61)

-   Work around rust-analyzer builds poisoning all subsequent command-line cargo builds ([#&#8203;252](https://github.com/dtolnay/anyhow/issues/252))

### [`v1.0.60`](https://github.com/dtolnay/anyhow/releases/tag/1.0.60)

[Compare Source](https://github.com/dtolnay/anyhow/compare/1.0.59...1.0.60)

-   Propagate `--target` to rustc invocation when deciding about backtrace support ([#&#8203;249](https://github.com/dtolnay/anyhow/issues/249), thanks [`@&#8203;RalfJung](https://github.com/RalfJung))`

### [`v1.0.59`](https://github.com/dtolnay/anyhow/releases/tag/1.0.59)

[Compare Source](https://github.com/dtolnay/anyhow/compare/1.0.58...1.0.59)

-   Update crates.io metadata to include `no-std` category

### [`v1.0.58`](https://github.com/dtolnay/anyhow/releases/tag/1.0.58)

[Compare Source](https://github.com/dtolnay/anyhow/compare/1.0.57...1.0.58)

-   Fix some broken links in documentation

### [`v1.0.57`](https://github.com/dtolnay/anyhow/releases/tag/1.0.57)

[Compare Source](https://github.com/dtolnay/anyhow/compare/1.0.56...1.0.57)

-   Remove a `log4rs`-specific workaround from `bail!` macro implementation

### [`v1.0.56`](https://github.com/dtolnay/anyhow/releases/tag/1.0.56)

[Compare Source](https://github.com/dtolnay/anyhow/compare/1.0.55...1.0.56)

-   Add `must_use` warning when an Error created by `anyhow!` is not used, perhaps because the programmer meant to write `bail!` instead ([#&#8203;229](https://github.com/dtolnay/anyhow/issues/229))

### [`v1.0.55`](https://github.com/dtolnay/anyhow/releases/tag/1.0.55)

[Compare Source](https://github.com/dtolnay/anyhow/compare/1.0.54...1.0.55)

-   Documentation improvements

### [`v1.0.54`](https://github.com/dtolnay/anyhow/releases/tag/1.0.54)

[Compare Source](https://github.com/dtolnay/anyhow/compare/1.0.53...1.0.54)

-   Construct more helpful error message from `ensure!` when the expression involves a negative literal const generic as the first generic argument of a method call ([#&#8203;224](https://github.com/dtolnay/anyhow/issues/224))

### [`v1.0.53`](https://github.com/dtolnay/anyhow/releases/tag/1.0.53)

[Compare Source](https://github.com/dtolnay/anyhow/compare/1.0.52...1.0.53)

-   Retrigger docs.rs build to work around rustdoc regression ([https://github.com/rust-lang/rust/issues/92331](https://github.com/rust-lang/rust/issues/92331))

### [`v1.0.52`](https://github.com/dtolnay/anyhow/releases/tag/1.0.52)

[Compare Source](https://github.com/dtolnay/anyhow/compare/1.0.51...1.0.52)

-   Reduce overhead of backtrace capture in the case that backtraces are not enabled ([#&#8203;212](https://github.com/dtolnay/anyhow/issues/212))

### [`v1.0.51`](https://github.com/dtolnay/anyhow/releases/tag/1.0.51)

[Compare Source](https://github.com/dtolnay/anyhow/compare/1.0.50...1.0.51)

-   Show doc for `Ok` fn

### [`v1.0.50`](https://github.com/dtolnay/anyhow/releases/tag/1.0.50)

[Compare Source](https://github.com/dtolnay/anyhow/compare/1.0.49...1.0.50)

-   Recognize more types of expressions in `ensure!` macro ([#&#8203;199](https://github.com/dtolnay/anyhow/issues/199), [#&#8203;200](https://github.com/dtolnay/anyhow/issues/200), [#&#8203;202](https://github.com/dtolnay/anyhow/issues/202), [#&#8203;203](https://github.com/dtolnay/anyhow/issues/203), [#&#8203;204](https://github.com/dtolnay/anyhow/issues/204), [#&#8203;205](https://github.com/dtolnay/anyhow/issues/205), [#&#8203;206](https://github.com/dtolnay/anyhow/issues/206))

### [`v1.0.49`](https://github.com/dtolnay/anyhow/releases/tag/1.0.49)

[Compare Source](https://github.com/dtolnay/anyhow/compare/1.0.48...1.0.49)

-   Add a function `anyhow::Ok(v)` equivalent to `Ok::<_, anyhow::Error>(v)` ([#&#8203;192](https://github.com/dtolnay/anyhow/issues/192))

### [`v1.0.48`](https://github.com/dtolnay/anyhow/releases/tag/1.0.48)

[Compare Source](https://github.com/dtolnay/anyhow/compare/1.0.47...1.0.48)

-   Include a `Debug` rendering of lhs and rhs in `ensure!` messages ([#&#8203;193](https://github.com/dtolnay/anyhow/issues/193), [#&#8203;194](https://github.com/dtolnay/anyhow/issues/194), [#&#8203;195](https://github.com/dtolnay/anyhow/issues/195), [#&#8203;196](https://github.com/dtolnay/anyhow/issues/196), [#&#8203;197](https://github.com/dtolnay/anyhow/issues/197), [#&#8203;198](https://github.com/dtolnay/anyhow/issues/198))

##### Example:

    ```rust
    ensure!(flags.len() <= 40);
    ```

    ```rust
    ensure!(kind == Kind::File);
    ```

    Before:

    ```console
    Condition failed: `flags.len() <= 40`
    Condition failed: `kind == Kind::File`
    ```

    After:

    ```console
    Condition failed: `flags.len() <= 40` (99 vs 40)
    Condition failed: `kind == Kind::File` (Symlink vs File)
    ```

</details>

<details>
<summary>marshallpierce/rust-base64 (base64)</summary>

### [`v0.21.2`](https://github.com/marshallpierce/rust-base64/blob/HEAD/RELEASE-NOTES.md#0212)

[Compare Source](https://github.com/marshallpierce/rust-base64/compare/v0.21.1...v0.21.2)

-   Rollback MSRV to 1.57.0 -- only dev dependencies need 1.60, not the main code

### [`v0.21.1`](https://github.com/marshallpierce/rust-base64/blob/HEAD/RELEASE-NOTES.md#0211)

[Compare Source](https://github.com/marshallpierce/rust-base64/compare/v0.21.0...v0.21.1)

-   Remove the possibility of panicking during decoded length calculations
-   `DecoderReader` no longer sometimes erroneously ignores padding  [#&#8203;226](https://github.com/marshallpierce/rust-base64/issues/226)

#### Breaking changes

-   `Engine.internal_decode` return type changed
-   Update MSRV to 1.60.0

</details>

<details>
<summary>hyunsik/bytesize (bytesize)</summary>

### [`v1.2.0`](https://github.com/hyunsik/bytesize/releases/tag/v1.2.0): Release 1.2.0

[Compare Source](https://github.com/hyunsik/bytesize/compare/v1.1.0...v1.2.0)

#### Changes

-   serde improvements [#&#8203;29](https://github.com/hyunsik/bytesize/issues/29) ([`@&#8203;joeroback](https://github.com/joeroback))`

### [`v1.1.0`](https://github.com/hyunsik/bytesize/releases/tag/v1.1.0): Release 1.1.0

#### Changes

-   ByteSize: Hash [#&#8203;23](https://github.com/hyunsik/bytesize/issues/23) ([`@&#8203;matklad](https://github.com/matklad))`
-   add AddAssign operator to ByteSize [#&#8203;22](https://github.com/hyunsik/bytesize/issues/22) ([`@&#8203;pmnoxx](https://github.com/pmnoxx))`
-   ByteSize constants [#&#8203;21](https://github.com/hyunsik/bytesize/issues/21) ([`@&#8203;pmnoxx](https://github.com/pmnoxx))`
-   Implement the FromStr trait for ByteSize [#&#8203;20](https://github.com/hyunsik/bytesize/issues/20) ([`@&#8203;jRimbault](https://github.com/jRimbault))`
-   Padding for Display trait for ByteSize [#&#8203;19](https://github.com/hyunsik/bytesize/issues/19) ([`@&#8203;acheronfail](https://github.com/acheronfail))`

### [`v1.0.1`](https://github.com/hyunsik/bytesize/compare/release-1.0.0...release-1.0.1)

[Compare Source](https://github.com/hyunsik/bytesize/compare/release-1.0.0...release-1.0.1)

</details>

<details>
<summary>clap-rs/clap (clap)</summary>

### [`v4.3.19`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#4319---2023-07-21)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.3.18...v4.3.19)

##### Fixes

-   *(parse)* Respect `value_terminator` even in the presence of later multiple-value positional arguments

### [`v4.3.18`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#4318---2023-07-21)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.3.17...v4.3.18)

##### Fixes

-   *(parse)* Suggest `--` in fewer places where it won't work

### [`v4.3.17`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#4317---2023-07-19)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.3.16...v4.3.17)

##### Fixes

-   *(help)* Address a regression in wrapping `PossibleValue` descriptions in `--help`

### [`v4.3.16`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#4316---2023-07-18)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.3.15...v4.3.16)

##### Fixes

-   Don't assert when stateful value parsers fail on defaults (e.g. checking if a path exists)

### [`v4.3.15`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#4315---2023-07-18)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.3.14...v4.3.15)

##### Features

-   *(unstable-styles)* Re-export `anstyle`

##### Documentation

-   *(unstable-styles)* Provide more examples

### [`v4.3.14`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#4314---2023-07-17)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.3.13...v4.3.14)

##### Features

-   `ArgAction::HelpShort` and `ArgAction::HelpLong` for explicitly specifying which style of help to display

##### Fixes

-   Skip `[OPTIONS]` in usage if a help or version `ArgAction` is used

### [`v4.3.13`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#4313---2023-07-17)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.3.12...v4.3.13)

### [`v4.3.12`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#4312---2023-07-14)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.3.11...v4.3.12)

##### Fixes

-   *(derive)* Don't error on enum variant field attributes

### [`v4.3.11`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#4311---2023-07-05)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.3.10...v4.3.11)

##### Features

-   *(derive)* Support fields wrapped in `num::Wrapping`, `Box`, or `Arc`
-   *(derive)* Support `Box<str>`, `Box<OsStr>`, and `Box<Path>`

### [`v4.3.10`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#4310---2023-06-30)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.3.9...v4.3.10)

##### Performance

-   Drop a dependency, reducing binary size by 1.3 KiB

### [`v4.3.9`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#439---2023-06-28)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.3.8...v4.3.9)

##### Fixes

-   `Command::ignore_errors` no longer masks help/version

### [`v4.3.8`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#438---2023-06-23)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.3.7...v4.3.8)

##### Fixes

-   Error on ambiguity with `infer_long_arg`, rather than arbitrarily picking one, matching the documentation and subcommand's behavior

### [`v4.3.7`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#437---2023-06-23)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.3.6...v4.3.7)

##### Documentation

-   Further clarify magic behavior in derive tutorial
-   Further clarify derive API's relationship to builder within the tutorial

### [`v4.3.6`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#436---2023-06-23)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.3.5...v4.3.6)

##### Documentation

-   Suggest `clio`

### [`v4.3.5`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#435---2023-06-20)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.3.4...v4.3.5)

-   `ColorChoice::possible_values` is added to simplify things for builder users

##### Fixes

-   `ColorChoice::to_possible_value` no longer includes descriptions, encouraging shorter help where possible

### [`v4.3.4`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#434---2023-06-14)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.3.3...v4.3.4)

##### Features

-   Add `Error::exit_code`

### [`v4.3.3`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#433---2023-06-09)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.3.2...v4.3.3)

##### Features

-   `Command::defer` for delayed initialization of subcommands to reduce startup times of large applications like deno

### [`v4.3.2`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#432---2023-06-05)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.3.1...v4.3.2)

##### Fixes

-   *(derive)* Don't produce `unused_equalifications` warnings when someone brings a clap type into scope

### [`v4.3.1`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#4319---2023-07-21)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.3.0...v4.3.1)

##### Fixes

-   *(parse)* Respect `value_terminator` even in the presence of later multiple-value positional arguments

### [`v4.3.0`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#430---2023-05-19)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.2.7...v4.3.0)

##### Fixes

-   *(assert)* Allow multiple, value-terminated, positional arguments
-   *(assert)* Clear up language on `last` assertion
-   *(parser)* Correctly assign values to arguments when using multiple, value-termianted, positional arguments
-   *(parser)* Ensure `value_terminator` has higher precedence than `allow_hyphen_values`
-   *(help)* Only use next-line-help on subcommand list when explicitly specified, not just with `--help`
-   *(help)* Correctly align possible values list
-   *(help)* Don't waste code, vertical space in moving possible value descriptions to next line

### [`v4.2.7`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#427---2023-05-02)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.2.6...v4.2.7)

##### Fixes

-   Correctly track remaining length for iterators provided by `ArgMatches`

### [`v4.2.6`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#426---2023-05-02)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.2.5...v4.2.6)

##### Features

-   `impl Eq<std::any::TypeId> for clap_builder::util::AnyValueId`

### [`v4.2.5`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#425---2023-04-27)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.2.4...v4.2.5)

##### Fixes

-   Improve panic when a group requires a non-existent ID

### [`v4.2.4`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#424---2023-04-19)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.2.3...v4.2.4)

##### Documentation

-   Corrected docs for `Command::style`

### [`v4.2.3`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#423---2023-04-18)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.2.2...v4.2.3)

##### Features

-   `Command::styles` for theming help/errors (behind `unstable-styles`)

### [`v4.2.2`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#422---2023-04-13)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.2.1...v4.2.2)

##### Internal

-   Update dependencies

### [`v4.2.1`](https://github.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#421---2023-03-28)

[Compare Source](https://github.com/clap-rs/clap/compare/v4.2.0...v4.2.1)

##### Fixes

-   Don't highlight uninteresting parts of the error message

</details>

<details>
<summary>servo/core-foundation-rs (core-foundation)</summary>

### [`v0.9.3`](https://github.com/servo/core-foundation-rs/compare/core-foundation-v0.9.2...core-foundation-v0.9.3)

[Compare Source](https://github.com/servo/core-foundation-rs/compare/core-foundation-v0.9.2...core-foundation-v0.9.3)

### [`v0.9.2`](https://github.com/servo/core-foundation-rs/compare/core-foundation-v0.9.1...core-foundation-v0.9.2)

[Compare Source](https://github.com/servo/core-foundation-rs/compare/core-foundation-v0.9.1...core-foundation-v0.9.2)

### [`v0.9.1`](https://github.com/servo/core-foundation-rs/compare/core-foundation-v0.9.0...core-foundation-v0.9.1)

[Compare Source](https://github.com/servo/core-foundation-rs/compare/core-foundation-v0.9.0...core-foundation-v0.9.1)

</details>

<details>
<summary>alexcrichton/filetime (filetime)</summary>

### [`v0.2.21`](https://github.com/alexcrichton/filetime/compare/0.2.20...0.2.21)

[Compare Source](https://github.com/alexcrichton/filetime/compare/0.2.20...0.2.21)

### [`v0.2.20`](https://github.com/alexcrichton/filetime/compare/0.2.19...0.2.20)

[Compare Source](https://github.com/alexcrichton/filetime/compare/0.2.19...0.2.20)

### [`v0.2.19`](https://github.com/alexcrichton/filetime/compare/0.2.18...0.2.19)

[Compare Source](https://github.com/alexcrichton/filetime/compare/0.2.18...0.2.19)

### [`v0.2.18`](https://github.com/alexcrichton/filetime/compare/0.2.17...0.2.18)

[Compare Source](https://github.com/alexcrichton/filetime/compare/0.2.17...0.2.18)

### [`v0.2.14`](https://github.com/alexcrichton/filetime/compare/0.2.13...0.2.14)

[Compare Source](https://github.com/alexcrichton/filetime/compare/0.2.13...0.2.14)

### [`v0.2.13`](https://github.com/alexcrichton/filetime/compare/0.2.12...0.2.13)

[Compare Source](https://github.com/alexcrichton/filetime/compare/0.2.12...0.2.13)

### [`v0.2.12`](https://github.com/alexcrichton/filetime/compare/0.2.11...0.2.12)

[Compare Source](https://github.com/alexcrichton/filetime/compare/0.2.11...0.2.12)

### [`v0.2.11`](https://github.com/alexcrichton/filetime/compare/0.2.10...0.2.11)

[Compare Source](https://github.com/alexcrichton/filetime/compare/0.2.10...0.2.11)

### [`v0.2.10`](https://github.com/alexcrichton/filetime/compare/0.2.9...0.2.10)

[Compare Source](https://github.com/alexcrichton/filetime/compare/0.2.9...0.2.10)

</details>

<details>
<summary>rust-lang/flate2-rs (flate2)</summary>

### [`v1.0.26`](https://github.com/rust-lang/flate2-rs/releases/tag/1.0.26)

[Compare Source](https://github.com/rust-lang/flate2-rs/compare/1.0.25...1.0.26)

#### What's Changed

-   Add decompress file example by [`@&#8203;MichaelMcDonnell](https://github.com/MichaelMcDonnell)` in [https://github.com/rust-lang/flate2-rs/pull/329](https://github.com/rust-lang/flate2-rs/pull/329)
-   Remove `extern crate`s by [`@&#8203;JohnTitor](https://github.com/JohnTitor)` in [https://github.com/rust-lang/flate2-rs/pull/331](https://github.com/rust-lang/flate2-rs/pull/331)
-   Make clippy happy + a few more cleanups by [`@&#8203;nyurik](https://github.com/nyurik)` in [https://github.com/rust-lang/flate2-rs/pull/285](https://github.com/rust-lang/flate2-rs/pull/285)
-   Fix left-overs on decoder docs by [`@&#8203;JohnTitor](https://github.com/JohnTitor)` in [https://github.com/rust-lang/flate2-rs/pull/333](https://github.com/rust-lang/flate2-rs/pull/333)
-   Mention MSRV policy by [`@&#8203;JohnTitor](https://github.com/JohnTitor)` in [https://github.com/rust-lang/flate2-rs/pull/332](https://github.com/rust-lang/flate2-rs/pull/332)
-   Bump miniz-oxide to prevent assertion failure by [`@&#8203;softdevca](https://github.com/softdevca)` in [https://github.com/rust-lang/flate2-rs/pull/335](https://github.com/rust-lang/flate2-rs/pull/335)
-   Enable all-features, Use doc_auto_cfg on docs.rs by [`@&#8203;wcampbell0x2a](https://github.com/wcampbell0x2a)` in [https://github.com/rust-lang/flate2-rs/pull/336](https://github.com/rust-lang/flate2-rs/pull/336)
-   Fix a typo in doc for write::GzDecoder by [`@&#8203;yestyle](https://github.com/yestyle)` in [https://github.com/rust-lang/flate2-rs/pull/337](https://github.com/rust-lang/flate2-rs/pull/337)
-   Fixed overflow bug in crc combine by [`@&#8203;AntonJMLarsson](https://github.com/AntonJMLarsson)` in [https://github.com/rust-lang/flate2-rs/pull/330](https://github.com/rust-lang/flate2-rs/pull/330)
-   Added feature for enabling default zlib-sys features by [`@&#8203;taco-paco](https://github.com/taco-paco)` in [https://github.com/rust-lang/flate2-rs/pull/322](https://github.com/rust-lang/flate2-rs/pull/322)
-   Add write::MultiGzDecoder for multi-member gzip data by [`@&#8203;jongiddy](https://github.com/jongiddy)` in [https://github.com/rust-lang/flate2-rs/pull/325](https://github.com/rust-lang/flate2-rs/pull/325)
-   gha: Upgrade to windows-2022 by [`@&#8203;JohnTitor](https://github.com/JohnTitor)` in [https://github.com/rust-lang/flate2-rs/pull/343](https://github.com/rust-lang/flate2-rs/pull/343)
-   gha: Specify tag instead of branch on actions/checkout by [`@&#8203;JohnTitor](https://github.com/JohnTitor)` in [https://github.com/rust-lang/flate2-rs/pull/342](https://github.com/rust-lang/flate2-rs/pull/342)
-   Prepare 1.0.26 release by [`@&#8203;JohnTitor](https://github.com/JohnTitor)` in [https://github.com/rust-lang/flate2-rs/pull/341](https://github.com/rust-lang/flate2-rs/pull/341)

#### New Contributors

-   [`@&#8203;MichaelMcDonnell](https://github.com/MichaelMcDonnell)` made their first contribution in [https://github.com/rust-lang/flate2-rs/pull/329](https://github.com/rust-lang/flate2-rs/pull/329)
-   [`@&#8203;JohnTitor](https://github.com/JohnTitor)` made their first contribution in [https://github.com/rust-lang/flate2-rs/pull/331](https://github.com/rust-lang/flate2-rs/pull/331)
-   [`@&#8203;softdevca](https://github.com/softdevca)` made their first contribution in [https://github.com/rust-lang/flate2-rs/pull/335](https://github.com/rust-lang/flate2-rs/pull/335)
-   [`@&#8203;wcampbell0x2a](https://github.com/wcampbell0x2a)` made their first contribution in [https://github.com/rust-lang/flate2-rs/pull/336](https://github.com/rust-lang/flate2-rs/pull/336)
-   [`@&#8203;yestyle](https://github.com/yestyle)` made their first contribution in [https://github.com/rust-lang/flate2-rs/pull/337](https://github.com/rust-lang/flate2-rs/pull/337)
-   [`@&#8203;AntonJMLarsson](https://github.com/AntonJMLarsson)` made their first contribution in [https://github.com/rust-lang/flate2-rs/pull/330](https://github.com/rust-lang/flate2-rs/pull/330)
-   [`@&#8203;taco-paco](https://github.com/taco-paco)` made their first contribution in [https://github.com/rust-lang/flate2-rs/pull/322](https://github.com/rust-lang/flate2-rs/pull/322)
-   [`@&#8203;jongiddy](https://github.com/jongiddy)` made their first contribution in [https://github.com/rust-lang/flate2-rs/pull/325](https://github.com/rust-lang/flate2-rs/pull/325)

**Full Changelog**: https://github.com/rust-lang/flate2-rs/compare/1.0.25...1.0.26

### [`v1.0.25`](https://github.com/rust-lang/flate2-rs/releases/tag/1.0.25)

[Compare Source](https://github.com/rust-lang/flate2-rs/compare/1.0.24...1.0.25)

#### What's Changed

-   Use SPDX license format and update links by [`@&#8203;atouchet](https://github.com/atouchet)` in [https://github.com/rust-lang/flate2-rs/pull/296](https://github.com/rust-lang/flate2-rs/pull/296)
-   Bump miniz_oxide to 0.6 by [`@&#8203;paolobarbolini](https://github.com/paolobarbolini)` in [https://github.com/rust-lang/flate2-rs/pull/317](https://github.com/rust-lang/flate2-rs/pull/317)
-   Prep release 1.0.25 by [`@&#8203;thomcc](https://github.com/thomcc)` in [https://github.com/rust-lang/flate2-rs/pull/327](https://github.com/rust-lang/flate2-rs/pull/327)

#### New Contributors

-   [`@&#8203;atouchet](https://github.com/atouchet)` made their first contribution in [https://github.com/rust-lang/flate2-rs/pull/296](https://github.com/rust-lang/flate2-rs/pull/296)
-   [`@&#8203;paolobarbolini](https://github.com/paolobarbolini)` made their first contribution in [https://github.com/rust-lang/flate2-rs/pull/317](https://github.com/rust-lang/flate2-rs/pull/317)
-   [`@&#8203;thomcc](https://github.com/thomcc)` made their first contribution in [https://github.com/rust-lang/flate2-rs/pull/327](https://github.com/rust-lang/flate2-rs/pull/327)

**Full Changelog**: https://github.com/rust-lang/flate2-rs/compare/1.0.24...1.0.25

### [`v1.0.24`](https://github.com/rust-lang/flate2-rs/compare/1.0.23...1.0.24)

[Compare Source](https://github.com/rust-lang/flate2-rs/compare/1.0.23...1.0.24)

### [`v1.0.23`](https://github.com/rust-lang/flate2-rs/compare/1.0.22...1.0.23)

[Compare Source](https://github.com/rust-lang/flate2-rs/compare/1.0.22...1.0.23)

### [`v1.0.22`](https://github.com/rust-lang/flate2-rs/compare/1.0.21...1.0.22)

[Compare Source](https://github.com/rust-lang/flate2-rs/compare/1.0.21...1.0.22)

### [`v1.0.21`](https://github.com/rust-lang/flate2-rs/compare/1.0.20...1.0.21)

[Compare Source](https://github.com/rust-lang/flate2-rs/compare/1.0.20...1.0.21)

### [`v1.0.20`](https://github.com/rust-lang/flate2-rs/compare/1.0.19...1.0.20)

[Compare Source](https://github.com/rust-lang/flate2-rs/compare/1.0.19...1.0.20)

### [`v1.0.19`](https://github.com/rust-lang/flate2-rs/compare/1.0.18...1.0.19)

[Compare Source](https://github.com/rust-lang/flate2-rs/compare/1.0.18...1.0.19)

### [`v1.0.18`](https://github.com/rust-lang/flate2-rs/compare/1.0.17...1.0.18)

[Compare Source](https://github.com/rust-lang/flate2-rs/compare/1.0.17...1.0.18)

### [`v1.0.17`](https://github.com/rust-lang/flate2-rs/compare/1.0.16...1.0.17)

[Compare Source](https://github.com/rust-lang/flate2-rs/compare/1.0.16...1.0.17)

### [`v1.0.16`](https://github.com/rust-lang/flate2-rs/compare/1.0.14...1.0.16)

[Compare Source](https://github.com/rust-lang/flate2-rs/compare/1.0.14...1.0.16)

### [`v1.0.14`](https://github.com/rust-lang/flate2-rs/compare/1.0.13...1.0.14)

[Compare Source](https://github.com/rust-lang/flate2-rs/compare/1.0.13...1.0.14)

### [`v1.0.13`](https://github.com/rust-lang/flate2-rs/compare/1.0.12...1.0.13)

[Compare Source](https://github.com/rust-lang/flate2-rs/compare/1.0.12...1.0.13)

### [`v1.0.12`](https://github.com/rust-lang/flate2-rs/compare/1.0.11...1.0.12)

[Compare Source](https://github.com/rust-lang/flate2-rs/compare/1.0.11...1.0.12)

### [`v1.0.11`](https://github.com/rust-lang/flate2-rs/compare/1.0.10...1.0.11)

[Compare Source](https://github.com/rust-lang/flate2-rs/compare/1.0.10...1.0.11)

### [`v1.0.10`](https://github.com/rust-lang/flate2-rs/compare/1.0.9...1.0.10)

[Compare Source](https://github.com/rust-lang/flate2-rs/compare/1.0.9...1.0.10)

### [`v1.0.9`](https://github.com/rust-lang/flate2-rs/compare/1.0.8...1.0.9)

[Compare Source](https://github.com/rust-lang/flate2-rs/compare/1.0.8...1.0.9)

### [`v1.0.8`](https://github.com/rust-lang/flate2-rs/compare/1.0.7...1.0.8)

[Compare Source](https://github.com/rust-lang/flate2-rs/compare/1.0.7...1.0.8)

### [`v1.0.7`](https://github.com/rust-lang/flate2-rs/compare/1.0.6...1.0.7)

[Compare Source](https://github.com/rust-lang/flate2-rs/compare/1.0.6...1.0.7)

### [`v1.0.6`](https://github.com/rust-lang/flate2-rs/compare/1.0.5...1.0.6)

[Compare Source](https://github.com/rust-lang/flate2-rs/compare/1.0.5...1.0.6)

### [`v1.0.5`](https://github.com/rust-lang/flate2-rs/compare/1.0.4...1.0.5)

[Compare Source](https://github.com/rust-lang/flate2-rs/compare/1.0.4...1.0.5)

### [`v1.0.4`](https://github.com/rust-lang/flate2-rs/compare/1.0.3...1.0.4)

[Compare Source](https://github.com/rust-lang/flate2-rs/compare/1.0.3...1.0.4)

</details>

<details>
<summary>rust-lang/git2-rs (git2)</summary>

### [`v0.17.2`](https://github.com/rust-lang/git2-rs/blob/HEAD/CHANGELOG.md#0172---2023-05-27)

[Compare Source](https://github.com/rust-lang/git2-rs/compare/0.17.1...0.17.2)

[0.17.1...0.17.2](https://github.com/rust-lang/git2-rs/compare/0.17.1...0.17.2)

##### Added

-   Added support for stashing with options (which can support partial stashing).
    [#&#8203;930](https://github.com/rust-lang/git2-rs/pull/930)

</details>

<details>
<summary>rust-lang/glob (glob)</summary>

### [`v0.3.1`](https://github.com/rust-lang/glob/releases/tag/0.3.1)

[Compare Source](https://github.com/rust-lang/glob/compare/0.3.0...0.3.1)

#### What's Changed

-   Add doc-comment to test README examples by [`@&#8203;GuillaumeGomez](https://github.com/GuillaumeGomez)` in [https://github.com/rust-lang/glob/pull/81](https://github.com/rust-lang/glob/pull/81)
-   Set up CI with Azure Pipelines by [`@&#8203;KodrAus](https://github.com/KodrAus)` in [https://github.com/rust-lang/glob/pull/86](https://github.com/rust-lang/glob/pull/86)
-   Use 'dyn' since trait objects without an explicit 'dyn' are deprecated by [`@&#8203;Atul9](https://github.com/Atul9)` in [https://github.com/rust-lang/glob/pull/87](https://github.com/rust-lang/glob/pull/87)
-   Fix tests on Windows by [`@&#8203;steveklabnik](https://github.com/steveklabnik)` in [https://github.com/rust-lang/glob/pull/88](https://github.com/rust-lang/glob/pull/88)
-   Add Debug trait to MatchOptions by [`@&#8203;brmmm3](https://github.com/brmmm3)` in [https://github.com/rust-lang/glob/pull/91](https://github.com/rust-lang/glob/pull/91)
-   Add triagebot configuration by [`@&#8203;Mark-Simulacrum](https://github.com/Mark-Simulacrum)` in [https://github.com/rust-lang/glob/pull/95](https://github.com/rust-lang/glob/pull/95)
-   Derive Debug for Paths by [`@&#8203;gibfahn](https://github.com/gibfahn)` in [https://github.com/rust-lang/glob/pull/97](https://github.com/rust-lang/glob/pull/97)
-   Derive Debug for MatchOptions by [`@&#8203;brmmm3](https://github.com/brmmm3)` in [https://github.com/rust-lang/glob/pull/99](https://github.com/rust-lang/glob/pull/99)
-   Move tokens_len into if block as it is only used there by [`@&#8203;brmmm3](https://github.com/brmmm3)` in [https://github.com/rust-lang/glob/pull/93](https://github.com/rust-lang/glob/pull/93)
-   Replace Azure Pipelines with GitHub Actions by [`@&#8203;KodrAus](https://github.com/KodrAus)` in [https://github.com/rust-lang/glob/pull/113](https://github.com/rust-lang/glob/pull/113)
-   Use SPDX license format by [`@&#8203;atouchet](https://github.com/atouchet)` in [https://github.com/rust-lang/glob/pull/115](https://github.com/rust-lang/glob/pull/115)
-   replace the Azure Pipelines status badge by [`@&#8203;KodrAus](https://github.com/KodrAus)` in [https://github.com/rust-lang/glob/pull/114](https://github.com/rust-lang/glob/pull/114)
-   Fix spacing in Readme by [`@&#8203;atouchet](https://github.com/atouchet)` in [https://github.com/rust-lang/glob/pull/119](https://github.com/rust-lang/glob/pull/119)
-   Update GHA OS versions to latest by [`@&#8203;JohnTitor](https://github.com/JohnTitor)` in [https://github.com/rust-lang/glob/pull/118](https://github.com/rust-lang/glob/pull/118)
-   Allow deprecation to `Error::description` by [`@&#8203;JohnTitor](https://github.com/JohnTitor)` in [https://github.com/rust-lang/glob/pull/120](https://github.com/rust-lang/glob/pull/120)
-   Note the difference between `new()` and `default()` by [`@&#8203;JohnTitor](https://github.com/JohnTitor)` in [https://github.com/rust-lang/glob/pull/121](https://github.com/rust-lang/glob/pull/121)
-   Prepare 0.3.1 release by [`@&#8203;JohnTitor](https://github.com/JohnTitor)` in [https://github.com/rust-lang/glob/pull/124](https://github.com/rust-lang/glob/pull/124)

#### New Contributors

-   [`@&#8203;GuillaumeGomez](https://github.com/GuillaumeGomez)` made their first contribution in [https://github.com/rust-lang/glob/pull/81](https://github.com/rust-lang/glob/pull/81)
-   [`@&#8203;Atul9](https://github.com/Atul9)` made their first contribution in [https://github.com/rust-lang/glob/pull/87](https://github.com/rust-lang/glob/pull/87)
-   [`@&#8203;brmmm3](https://github.com/brmmm3)` made their first contribution in [https://github.com/rust-lang/glob/pull/91](https://github.com/rust-lang/glob/pull/91)
-   [`@&#8203;Mark-Simulacrum](https://github.com/Mark-Simulacrum)` made their first contribution in [https://github.com/rust-lang/glob/pull/95](https://github.com/rust-lang/glob/pull/95)
-   [`@&#8203;gibfahn](https://github.com/gibfahn)` made their first contribution in [https://github.com/rust-lang/glob/pull/97](https://github.com/rust-lang/glob/pull/97)
-   [`@&#8203;atouchet](https://github.com/atouchet)` made their first contribution in [https://github.com/rust-lang/glob/pull/115](https://github.com/rust-lang/glob/pull/115)
-   [`@&#8203;JohnTitor](https://github.com/JohnTitor)` made their first contribution in [https://github.com/rust-lang/glob/pull/118](https://github.com/rust-lang/glob/pull/118)

**Full Changelog**: https://github.com/rust-lang/glob/compare/0.3.0...0.3.1

</details>

<details>
<summary>sunng87/handlebars-rust (handlebars)</summary>

### [`v3.5.5`](https://github.com/sunng87/handlebars-rust/blob/HEAD/CHANGELOG.md#355---2021-05-03)

[Compare Source](https://github.com/sunng87/handlebars-rust/compare/v3.5.4...v3.5.5)

-   \[Fixed] Panic on reporting invalid tag name \[[#&#8203;427](https://github.com/sunng87/handlebars-rust/issues/427)]

### [`v3.5.4`](https://github.com/sunng87/handlebars-rust/blob/HEAD/CHANGELOG.md#354---2021-03-27)

[Compare Source](https://github.com/sunng87/handlebars-rust/compare/v3.5.3...v3.5.4)

-   \[Fixed] Json string literal with escape char \[[#&#8203;422](https://github.com/sunng87/handlebars-rust/issues/422)]

### [`v3.5.3`](https://github.com/sunng87/handlebars-rust/blob/HEAD/CHANGELOG.md#353---2021-02-20)

[Compare Source](https://github.com/sunng87/handlebars-rust/compare/v3.5.2...v3.5.3)

-   \[Fixed] value access issue when upper block has a base value \[[#&#8203;419](https://github.com/sunng87/handlebars-rust/issues/419)]

### [`v3.5.2`](https://github.com/sunng87/handlebars-rust/blob/HEAD/CHANGELOG.md#352---2020-12-29)

[Compare Source](https://github.com/sunng87/handlebars-rust/compare/v3.5.1...v3.5.2)

-   \[Fixed] allow `/` as trailing separator on Windows, backported from master \[[#&#8203;405](https://github.com/sunng87/handlebars-rust/issues/405)]

### [`v3.5.1`](https://github.com/sunng87/handlebars-rust/blob/HEAD/CHANGELOG.md#351---2020-10-25)

[Compare Source](https://github.com/sunng87/handlebars-rust/compare/v3.5.0...v3.5.1)

-   \[Fixed] dir source path separator bug on windows \[[#&#8203;389](https://github.com/sunng87/handlebars-rust/issues/389)]

### [`v3.5.0`](https://github.com/sunng87/handlebars-rust/blob/HEAD/CHANGELOG.md#350---2020-09-23)

[Compare Source](https://github.com/sunng87/handlebars-rust/compare/v3.4.0...v3.5.0)

-   \[Changed] `#each` helper now renders else block for non-iterable data \[[#&#8203;380](https://github.com/sunng87/handlebars-rust/issues/380)]
-   \[Fixed] reference starts with `null`, `true` and `false` were parsed incorrectly \[[#&#8203;382](https://github.com/sunng87/handlebars-rust/issues/382)]

### [`v3.4.0`](https://github.com/sunng87/handlebars-rust/blob/HEAD/CHANGELOG.md#340---2020-08-14)

[Compare Source](https://github.com/sunng87/handlebars-rust/compare/v3.3.0...v3.4.0)

-   \[Added] Debug log that can be turned on by using envlog or other implementation, to trace data resolution during rendering \[[#&#8203;369](https://github.com/sunng87/handlebars-rust/issues/369)]
-   \[Fixed] Derived value as block context base value \[[#&#8203;343](https://github.com/sunng87/handlebars-rust/issues/343), [#&#8203;353](https://github.com/sunng87/handlebars-rust/issues/353)]
-   \[Fixed] Partial name aligned with handlebars.js, added support for `.`, escape `[]` and string `''` name
-   \[Changed] HTML escape aligned with handlebars.js, added `=`, `\` and \`\`\` \[[#&#8203;366](https://github.com/sunng87/handlebars-rust/issues/366)]
-   \[Changed] Update rhai to 0.18 \[[#&#8203;370](https://github.com/sunng87/handlebars-rust/issues/370)]
-   \[Fixed] Result of simple helper is now escaped \[[#&#8203;373](https://github.com/sunng87/handlebars-rust/issues/373)]

### [`v3.3.0`](https://github.com/sunng87/handlebars-rust/blob/HEAD/CHANGELOG.md#330---2020-07-18)

[Compare Source](https://github.com/sunng87/handlebars-rust/compare/v3.2.1...v3.3.0)

-   \[Added] Added two new APIs to reuse `Context` for rendering \[[#&#8203;352](https://github.com/sunng87/handlebars-rust/issues/352)]
-   \[Changed] Update rhai to 0.17 \[[#&#8203;354](https://github.com/sunng87/handlebars-rust/issues/354)]
-   \[Fixed] Fixed mustache.js html expression support, which is "&" instead of "$"

</details>

<details>
<summary>KokaKiwi/rust-hex (hex)</summary>

### [`v0.4.3`](https://github.com/KokaKiwi/rust-hex/compare/v0.4.2...v0.4.3)

[Compare Source](https://github.com/KokaKiwi/rust-hex/compare/v0.4.2...v0.4.3)

</details>

<details>
<summary>scottlamb/http-auth (http-auth)</summary>

### [`v0.1.8`](https://github.com/scottlamb/http-auth/blob/HEAD/CHANGELOG.md#v018-2023-01-30)

[Compare Source](https://github.com/scottlamb/http-auth/compare/v0.1.7...v0.1.8)

-   upgrade `base64` dependency from 0.20 to 0.21.

### [`v0.1.7`](https://github.com/scottlamb/http-auth/blob/HEAD/CHANGELOG.md#v017-2023-01-05)

[Compare Source](https://github.com/scottlamb/http-auth/compare/v0.1.6...v0.1.7)

-   bump minimum Rust version to 1.57.
-   upgrade `base64` dependency from 0.13 to 0.20.

</details>

<details>
<summary>tailhook/humantime (humantime)</summary>

### [`v2.1.0`](https://github.com/tailhook/humantime/compare/v2.0.1...v2.1.0)

[Compare Source](https://github.com/tailhook/humantime/compare/v2.0.1...v2.1.0)

### [`v2.0.1`](https://github.com/tailhook/humantime/compare/v2.0.0...v2.0.1)

[Compare Source](https://github.com/tailhook/humantime/compare/v2.0.0...v2.0.1)

</details>

<details>
<summary>BurntSushi/ripgrep (ignore)</summary>

### [`v0.4.20`](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.19...ignore-0.4.20)

[Compare Source](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.19...ignore-0.4.20)

### [`v0.4.19`](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.18...ignore-0.4.19)

[Compare Source](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.18...ignore-0.4.19)

### [`v0.4.18`](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.17...ignore-0.4.18)

[Compare Source](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.17...ignore-0.4.18)

### [`v0.4.17`](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.16...ignore-0.4.17)

[Compare Source](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.16...ignore-0.4.17)

### [`v0.4.16`](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.15...ignore-0.4.16)

[Compare Source](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.15...ignore-0.4.16)

### [`v0.4.15`](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.14...ignore-0.4.15)

[Compare Source](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.14...ignore-0.4.15)

### [`v0.4.14`](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.13...ignore-0.4.14)

[Compare Source](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.13...ignore-0.4.14)

### [`v0.4.13`](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.12...ignore-0.4.13)

[Compare Source](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.12...ignore-0.4.13)

### [`v0.4.12`](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.11...ignore-0.4.12)

[Compare Source](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.11...ignore-0.4.12)

### [`v0.4.11`](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.10...ignore-0.4.11)

[Compare Source](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.10...ignore-0.4.11)

### [`v0.4.10`](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.9...ignore-0.4.10)

[Compare Source](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.9...ignore-0.4.10)

### [`v0.4.9`](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.8...ignore-0.4.9)

[Compare Source](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.8...ignore-0.4.9)

### [`v0.4.8`](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.7...ignore-0.4.8)

[Compare Source](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.7...ignore-0.4.8)

</details>

<details>
<summary>bodil/im-rs (im-rc)</summary>

### [`v15.1.0`](https://github.com/bodil/im-rs/blob/HEAD/CHANGELOG.md#1510---2022-04-29)

[Compare Source](https://github.com/bodil/im-rs/compare/v15.0.0...v15.1.0)

##### Added

-   `HashSet` now implements `From<Vector<A>>` and `From<&Vector<A>> where A: Clone`.

##### Fixed

-   Fixed a long standing crash bug in `OrdMap`/`OrdSet`. ([#&#8203;154](https://github.com/bodil/im-rs/issues/154), [#&#8203;143](https://github.com/bodil/im-rs/issues/143), [#&#8203;152](https://github.com/bodil/im-rs/issues/152), [#&#8203;124](https://github.com/bodil/im-rs/issues/124))
-   The `union` method on maps/sets will now prefer to mutate the larger set (which leads to less
    work) rather than the first set. ([#&#8203;163](https://github.com/bodil/im-rs/issues/163))
-   Ensure `TreeFocus` only implements `Send`/`Sync` when the underlying type does. ([#&#8203;157](https://github.com/bodil/im-rs/issues/157), [#&#8203;158](https://github.com/bodil/im-rs/issues/158))
-   There was an issue where nodes in very large `OrdMap`s could overflow when removing an element
    and cause a panic, which has now been fixed. ([#&#8203;141](https://github.com/bodil/im-rs/issues/141))
-   Assorted doc cleanup. ([#&#8203;150](https://github.com/bodil/im-rs/issues/150), [#&#8203;173](https://github.com/bodil/im-rs/issues/173), [#&#8203;186](https://github.com/bodil/im-rs/issues/186), [#&#8203;194](https://github.com/bodil/im-rs/issues/194))

</details>

<details>
<summary>rust-lang-nursery/lazy-static.rs (lazy_static)</summary>

### [`v1.4.0`](https://github.com/rust-lang-nursery/lazy-static.rs/releases/tag/1.4.0)

[Compare Source](https://github.com/rust-lang-nursery/lazy-static.rs/compare/1.3.0...1.4.0)

**Bumps the minimum supported version of `rustc` to `1.27.2`**

-   [Fix typo in lib.rs](https://github.com/rust-lang-nursery/lazy-static.rs/pull/144) (thanks [`@&#8203;fbruetting](https://github.com/fbruetting))`
-   [Automatically check if README.md examples are working when running "cargo test"](https://github.com/rust-lang-nursery/lazy-static.rs/pull/145) (thanks [`@&#8203;GuillaumeGomez](https://github.com/GuillaumeGomez))`
-   [Allow deprecated to remove warnings in nightly](https://github.com/rust-lang-nursery/lazy-static.rs/pull/152) (thanks [`@&#8203;Schaeff](https://github.com/Schaeff))`
-   [bump MSRV to 1.27.2](https://github.com/rust-lang-nursery/lazy-static.rs/pull/155) (thanks [`@&#8203;matklad](https://github.com/matklad))`

</details>

<details>
<summary>indiv0/lazycell (lazycell)</summary>

### [`v1.3.0`](https://github.com/indiv0/lazycell/blob/HEAD/CHANGELOG.md#v130-2020-08-12)

##### Bug Fixes

-   Add custom `impl Default` to support non-Default-able `<T>` types ([b49f4eab](https://github.com/indiv0/lazycell/commit/b49f4eabec49c0a5146ef01017c2506a3c357180))
-   **lazycell:**  Fix unsound aliasing in `LazyCell::fill` ([e789ac1a](https://github.com/indiv0/lazycell/commit/e789ac1a99010ad79c2d09c761fec6d67053647d), closes [#&#8203;98](https://github.com/indiv0/lazycell/issues/98))

##### Features

-   Implement serde support ([e728a0b6](https://github.com/indiv0/lazycell/commit/e728a0b680e607b793a81b5af7bf7f1d2c0eb5e5))

##### Documentation

-   fix typo ([5f5ba9d5](https://github.com/indiv0/lazycell/commit/5f5ba9d5ac3364f8376c0c872c2e5094974385ba))

### [`v1.2.1`](https://github.com/indiv0/lazycell/blob/HEAD/CHANGELOG.md#v121-2018-12-03)

[Compare Source](https://github.com/indiv0/lazycell/compare/v1.2.0...v1.2.1)

##### Features

-   Implement Clone for LazyCell and AtomicLazyCell ([30fe4a8f](https://github.com/indiv0/lazycell/commit/30fe4a8f568059b3c78ed149a810962a676cb2b2))

</details>

<details>
<summary>rust-lang/libc (libc)</summary>

### [`v0.2.147`](https://github.com/rust-lang/libc/releases/tag/0.2.147)

[Compare Source](https://github.com/rust-lang/libc/compare/0.2.146...0.2.147)

#### What's Changed

-   Add socket timestamping for Android by [`@&#8203;spencercw](https://github.com/spencercw)` in [https://github.com/rust-lang/libc/pull/3267](https://github.com/rust-lang/libc/pull/3267)
-   Fix s390x-installer paths by [`@&#8203;JohnTitor](https://github.com/JohnTitor)` in [https://github.com/rust-lang/libc/pull/3281](https://github.com/rust-lang/libc/pull/3281)
-   Generate documentation for all supported targets on docs.rs by [`@&#8203;GuillaumeGomez](https://github.com/GuillaumeGomez)` in [https://github.com/rust-lang/libc/pull/3279](https://github.com/rust-lang/libc/pull/3279)
-   Define `IPPROTO_ETHERNET` on Linux-like platforms. by [`@&#8203;sunfishcode](https://github.com/sunfishcode)` in [https://github.com/rust-lang/libc/pull/3272](https://github.com/rust-lang/libc/pull/3272)
-   Add trait implementations for QNX Neutrino by [`@&#8203;flba-eb](https://github.com/flba-eb)` in [https://github.com/rust-lang/libc/pull/3273](https://github.com/rust-lang/libc/pull/3273)
-   getentropy addition to android by [`@&#8203;devnexen](https://github.com/devnexen)` in [https://github.com/rust-lang/libc/pull/3270](https://github.com/rust-lang/libc/pull/3270)
-   android adding sendfile64 variant by [`@&#8203;devnexen](https://github.com/devnexen)` in [https://github.com/rust-lang/libc/pull/3271](https://github.com/rust-lang/libc/pull/3271)
-   android: Add NLM_F_DUMP_FILTERED constant by [`@&#8203;dragan-cecavac-nordsec](https://github.com/dragan-cecavac-nordsec)` in [https://github.com/rust-lang/libc/pull/3276](https://github.com/rust-lang/libc/pull/3276)
-   Update and release version 0.2.147 by [`@&#8203;flba-eb](https://github.com/flba-eb)` in [https://github.com/rust-lang/libc/pull/3283](https://github.com/rust-lang/libc/pull/3283)

#### New Contributors

-   [`@&#8203;dragan-cecavac-nordsec](https://github.com/dragan-cecavac-nordsec)` made their first contribution in [https://github.com/rust-lang/libc/pull/3276](https://github.com/rust-lang/libc/pull/3276)

**Full Changelog**: https://github.com/rust-lang/libc/compare/0.2.146...0.2.147

### [`v0.2.146`](https://github.com/rust-lang/libc/releases/tag/0.2.146)

[Compare Source](https://github.com/rust-lang/libc/compare/0.2.145...0.2.146)

#### What's Changed

-   Use `use` to alias open/openat in lfs64.rs by [`@&#8203;bossmc](https://github.com/bossmc)` in [https://github.com/rust-lang/libc/pull/3265](https://github.com/rust-lang/libc/pull/3265)
-   Update crate version to 0.2.146 by [`@&#8203;nikarh](https://github.com/nikarh)` in [https://github.com/rust-lang/libc/pull/3266](https://github.com/rust-lang/libc/pull/3266)

**Full Changelog**: https://github.com/rust-lang/libc/compare/0.2.145...0.2.146

### [`v0.2.145`](https://github.com/rust-lang/libc/releases/tag/0.2.145)

[Compare Source](https://github.com/rust-lang/libc/compare/0.2.144...0.2.145)

**This version has been yanked on crates.io.**

#### What's Changed

-   redox add sig(timed)wait calls by [`@&#8203;devnexen](https://github.com/devnexen)` in [https://github.com/rust-lang/libc/pull/3244](https://github.com/rust-lang/libc/pull/3244)
-   Support for `PTRACE_SYSEMU` and `PTRACE_SYSEMU_SINGLESTEP` on musl by [`@&#8203;emilengler](https://github.com/emilengler)` in [https://github.com/rust-lang/libc/pull/3245](https://github.com/rust-lang/libc/pull/3245)
-   Fix loongarch64 bindings by [`@&#8203;heiher](https://github.com/heiher)` in [https://github.com/rust-lang/libc/pull/3246](https://github.com/rust-lang/libc/pull/3246)
-   Add linux canxl constants and canxl frame struct by [`@&#8203;marcelbuesing](https://github.com/marcelbuesing)` in [https://github.com/rust-lang/libc/pull/3247](https://github.com/rust-lang/libc/pull/3247)
-   Change branch references to HEAD where possible or main otherwise by [`@&#8203;joshtriplett](https://github.com/joshtriplett)` in [https://github.com/rust-lang/libc/pull/3249](https://github.com/rust-lang/libc/pull/3249)
-   linux/musl/s390x: change f_\* constants to uint from ulong by [`@&#8203;nekopsykose](https://github.com/nekopsykose)` in [https://github.com/rust-lang/libc/pull/3137](https://github.com/rust-lang/libc/pull/3137)
-   android: add memmem by [`@&#8203;tibordp](https://github.com/tibordp)` in [https://github.com/rust-lang/libc/pull/3252](https://github.com/rust-lang/libc/pull/3252)
-   redox adding lockf flags by [`@&#8203;devnexen](https://github.com/devnexen)` in [https://github.com/rust-lang/libc/pull/3251](https://github.com/rust-lang/libc/pull/3251)
-   Add ucred struct and field type aliases for redox by [`@&#8203;andrewdavidmackenzie](https://github.com/andrewdavidmackenzie)` in [https://github.com/rust-lang/libc/pull/3250](https://github.com/rust-lang/libc/pull/3250)
-   Fixed vita libc definitions by [`@&#8203;nikarh](https://github.com/nikarh)` in [https://github.com/rust-lang/libc/pull/3255](https://github.com/rust-lang/libc/pull/3255)
-   Skip round-trip tests for structs with FAMs by [`@&#8203;bossmc](https://github.com/bossmc)` in [https://github.com/rust-lang/libc/pull/3254](https://github.com/rust-lang/libc/pull/3254)
-   Fixed pthread_attr_t and pthread_rwlockattr_t for newlib by [`@&#8203;nikarh](https://github.com/nikarh)` in [https://github.com/rust-lang/libc/pull/3256](https://github.com/rust-lang/libc/pull/3256)
-   Alias all LFS64 symbols to their non-LFS64 counterparts on musl by [`@&#8203;bossmc](https://github.com/bossmc)` in [https://github.com/rust-lang/libc/pull/2935](https://github.com/rust-lang/libc/pull/2935)
-   add constants and structs for vsock on macos by [`@&#8203;tzneal](https://github.com/tzneal)` in [https://github.com/rust-lang/libc/pull/3258](https://github.com/rust-lang/libc/pull/3258)
-   dragonflybsd supports malloc_usable_size too by [`@&#8203;devnexen](https://github.com/devnexen)` in [https://github.com/rust-lang/libc/pull/3253](https://github.com/rust-lang/libc/pull/3253)
-   linux-gnu: add putpwent/putgrent by [`@&#8203;superwhiskers](https://togithub.c`

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "before 3am on the first day of the month" (UTC), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/rust-lang/cargo).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNi4yNC4yIiwidXBkYXRlZEluVmVyIjoiMzYuMjQuMiIsInRhcmdldEJyYW5jaCI6Im1hc3RlciJ9-->
bors added a commit to rust-lang-ci/rust that referenced this issue Aug 14, 2023
core/any: remove Provider trait, rename Demand to Request

This touches on two WIP features:

* `error_generic_member_access`
  * tracking issue: rust-lang#99301
  * RFC (WIP): rust-lang/rfcs#2895
* `provide_any`
  * tracking issue: rust-lang#96024
  * RFC: rust-lang/rfcs#3192

The changes in this PR are intended to address libs meeting feedback summarized by `@Amanieu` in rust-lang#96024 (comment)

The specific items this PR addresses so far are:

> We feel that the names "demand" and "request" are somewhat synonymous and would like only one of those to be used for better consistency.

I went with `Request` here since it sounds nicer, but I'm mildly concerned that at first glance it could be confused with the use of the word in networking context.

> The Provider trait should be deleted and its functionality should be merged into Error. We are happy to only provide an API that is only usable with Error. If there is demand for other uses then this can be provided through an external crate.

The net impact this PR has is that examples which previously looked like
```
    core::any::request_ref::<String>(&err).unwramp()
```

now look like
```
    (&err as &dyn core::error::Error).request_value::<String>().unwrap()
```

These are methods that based on the type hint when called return an `Option<T>` of that type. I'll admit I don't fully understand how that's done, but it involves `core::any::tags::Type` and `core::any::TaggedOption`, neither of which are exposed in the public API, to construct a `Request` which is then passed to the `Error.provide` method.

Something that I'm curious about is whether or not they are essential to the use of `Request` types (prior to this PR referred to as `Demand`) and if so does the fact that they are kept private imply that `Request`s are only meant to be constructed privately within the standard library? That's what it looks like to me.

These methods ultimately call into code that looks like:
```
/// Request a specific value by tag from the `Error`.
fn request_by_type_tag<'a, I>(err: &'a (impl Error + ?Sized)) -> Option<I::Reified>
where
    I: tags::Type<'a>,
{
    let mut tagged = core::any::TaggedOption::<'a, I>(None);
    err.provide(tagged.as_request());
    tagged.0
}
```

As far as the `Request` API is concerned, one suggestion I would like to make is that the previous example should look more like this:
```
/// Request a specific value by tag from the `Error`.
fn request_by_type_tag<'a, I>(err: &'a (impl Error + ?Sized)) -> Option<I::Reified>
where
    I: tags::Type<'a>,
{
    let tagged_request = core::any::Request<I>::new_tagged();
    err.provide(tagged_request);
    tagged.0
}
```
This makes it possible for anyone to construct a `Request` for use in their own projects without exposing an implementation detail like `TaggedOption` in the API surface.

Otherwise noteworthy is that I had to add `pub(crate)` on both `core::any::TaggedOption` and `core::any::tags` since `Request`s now need to be constructed in the `core::error` module. I considered moving `TaggedOption` into the `core::error` module but again I figured it's an implementation detail of `Request` and belongs closer to that.

At the time I am opening this PR, I have not yet looked into the following bit of feedback:

> We took a look at the generated code and found that LLVM is unable to optimize multiple .provide_* calls into a switch table because each call fetches the type id from Erased::type_id separately each time and the compiler doesn't know that these calls all return the same value. This should be fixed.

This is what I'll focus on next while waiting for feedback on the progress so far. I suspect that learning more about the type IDs will help me understand the need for `TaggedOption` a little better.
@jmjoy
Copy link

jmjoy commented Aug 18, 2023

How about add an optional key? Just like:

pub fn provide_value<T>(&mut self, key: Option<&str>, value: T) -> &mut Demand<'a>;

then we can provide multi value with the same type, such as:

struct Sth {
    foo: String,
    bar: String,
}

impl Provider for Sth {
    fn provide<'a>(&'a self, demand: &mut Demand<'a>) {
        demand
            .provide_value::<String>(Some("foo"), self.foo)
            .provide_value::<String>(Some("bar"), self.bar);
    }
}

@waynr
Copy link
Contributor

waynr commented Aug 18, 2023

FEI, the Provider API has been rejected by the libs meeting folks. For more background, please see my earlier comment in this issue: #96024 (comment)

The TL;DR is that the Provider trait has been rejected, leaving just the Request type (aka the type formerly known as Demand) and the new provide method on the Error trait. The Request type and its associated internal-only machinery has been moved from the core::any module into core::error. This is the state of affairs in latest nightly after #113464 was merged earlier this week.

The only thing that's left to do as far as this tracking issue is concerned is to close it (as far as I understand).

@TennyZhuang
Copy link
Contributor

Is there any third-party crate to maintain the Provider trait in the future? Although it may not be suitable to be merged in the std::any, it's still a useful pattern in some scenarios.

@waynr
Copy link
Contributor

waynr commented Sep 5, 2023

@TennyZhuang the closest thing I know of was mentioned in the notes for this feature's RFC, which can be found here: provide-any

I don't know how similar this is to what was unstable here in the standard library and there are no published crates.

@conradludgate
Copy link
Contributor

conradludgate commented Sep 5, 2023

There is also the supplier crate that I made in response to this feature being removed. I also consider it unstable but it's a direct lift and shift from the latest provider impl that std had in nightly

https://docs.rs/supplier/0.0.2/supplier/

I had plans to change the API but all my attempts so far have failed to be beneficial

thomcc pushed a commit to tcdi/postgrestd that referenced this issue Oct 17, 2023
core/any: remove Provider trait, rename Demand to Request

This touches on two WIP features:

* `error_generic_member_access`
  * tracking issue: rust-lang/rust#99301
  * RFC (WIP): rust-lang/rfcs#2895
* `provide_any`
  * tracking issue: rust-lang/rust#96024
  * RFC: rust-lang/rfcs#3192

The changes in this PR are intended to address libs meeting feedback summarized by `@Amanieu` in rust-lang/rust#96024 (comment)

The specific items this PR addresses so far are:

> We feel that the names "demand" and "request" are somewhat synonymous and would like only one of those to be used for better consistency.

I went with `Request` here since it sounds nicer, but I'm mildly concerned that at first glance it could be confused with the use of the word in networking context.

> The Provider trait should be deleted and its functionality should be merged into Error. We are happy to only provide an API that is only usable with Error. If there is demand for other uses then this can be provided through an external crate.

The net impact this PR has is that examples which previously looked like
```
    core::any::request_ref::<String>(&err).unwramp()
```

now look like
```
    (&err as &dyn core::error::Error).request_value::<String>().unwrap()
```

These are methods that based on the type hint when called return an `Option<T>` of that type. I'll admit I don't fully understand how that's done, but it involves `core::any::tags::Type` and `core::any::TaggedOption`, neither of which are exposed in the public API, to construct a `Request` which is then passed to the `Error.provide` method.

Something that I'm curious about is whether or not they are essential to the use of `Request` types (prior to this PR referred to as `Demand`) and if so does the fact that they are kept private imply that `Request`s are only meant to be constructed privately within the standard library? That's what it looks like to me.

These methods ultimately call into code that looks like:
```
/// Request a specific value by tag from the `Error`.
fn request_by_type_tag<'a, I>(err: &'a (impl Error + ?Sized)) -> Option<I::Reified>
where
    I: tags::Type<'a>,
{
    let mut tagged = core::any::TaggedOption::<'a, I>(None);
    err.provide(tagged.as_request());
    tagged.0
}
```

As far as the `Request` API is concerned, one suggestion I would like to make is that the previous example should look more like this:
```
/// Request a specific value by tag from the `Error`.
fn request_by_type_tag<'a, I>(err: &'a (impl Error + ?Sized)) -> Option<I::Reified>
where
    I: tags::Type<'a>,
{
    let tagged_request = core::any::Request<I>::new_tagged();
    err.provide(tagged_request);
    tagged.0
}
```
This makes it possible for anyone to construct a `Request` for use in their own projects without exposing an implementation detail like `TaggedOption` in the API surface.

Otherwise noteworthy is that I had to add `pub(crate)` on both `core::any::TaggedOption` and `core::any::tags` since `Request`s now need to be constructed in the `core::error` module. I considered moving `TaggedOption` into the `core::error` module but again I figured it's an implementation detail of `Request` and belongs closer to that.

At the time I am opening this PR, I have not yet looked into the following bit of feedback:

> We took a look at the generated code and found that LLVM is unable to optimize multiple .provide_* calls into a switch table because each call fetches the type id from Erased::type_id separately each time and the compiler doesn't know that these calls all return the same value. This should be fixed.

This is what I'll focus on next while waiting for feedback on the progress so far. I suspect that learning more about the type IDs will help me understand the need for `TaggedOption` a little better.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
B-RFC-approved Blocker: Approved by a merged RFC but not yet implemented. B-RFC-implemented Blocker: Approved by a merged RFC and implemented. B-unstable Blocker: Implemented in the nightly compiler and unstable. C-tracking-issue Category: A tracking issue for an RFC or an unstable feature. T-libs-api Relevant to the library API team, which will review and decide on the PR/issue.
Projects
None yet
Development

No branches or pull requests