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

Implement viper.BindStruct for automatic unmarshalling from environment variables #1429

Merged
merged 2 commits into from Dec 6, 2023

Conversation

krakowski
Copy link
Contributor

@krakowski krakowski commented Sep 6, 2022

Description

The current viper implementation does not allow to viper.Unmarshal environment variables into structs without binding them first (using viper.BindEnv). This behavior results in an "empty" struct (i.e no values filled) if no configuration file is provided with matching keys.

This pull request adds a new viper.BindStruct function which takes a struct pointer and binds each (nested) struct field to an environment variable using the struct field's name or the user-specified mapstructure tag. The implementation is quite simple, since I could reuse some functions:

func (v *Viper) BindStruct(input interface{}) error {
	envKeysMap := map[string]interface{}{}
	if err := mapstructure.Decode(input, &envKeysMap); err != nil {
		return err
	}

	structKeys := v.flattenAndMergeMap(map[string]bool{}, envKeysMap, "")
	for key, _ := range structKeys {
		if err := v.BindEnv(key); err != nil {
			return err
		}
	}

	return nil
}

A simple example could look like this:

type Configuration struct {
    Value int
}

os.Setenv("VALUE", 42)

var config Configuration
viper.BindStruct(&config)
viper.Unmarshal(&config)

Please see the TestBindStruct unit test for a more complete example.

Related Issues

@CLAassistant
Copy link

CLAassistant commented Sep 6, 2022

CLA assistant check
All committers have signed the CLA.

@github-actions
Copy link

github-actions bot commented Sep 6, 2022

👋 Thanks for contributing to Viper! You are awesome! 🎉

A maintainer will take a look at your pull request shortly. 👀

In the meantime: We are working on Viper v2 and we would love to hear your thoughts about what you like or don't like about Viper, so we can improve or fix those issues.

⏰ If you have a couple minutes, please take some time and share your thoughts: https://forms.gle/R6faU74qPRPAzchZ9

📣 If you've already given us your feedback, you can still help by spreading the news,
either by sharing the above link or telling people about this on Twitter:

https://twitter.com/sagikazarmark/status/1306904078967074816

Thank you! ❤️

@sagikazarmark
Copy link
Collaborator

Thanks for sending this PR!

I'll try to prioritize reviewing it, especially since it resolves a long standing problem.

@sagikazarmark sagikazarmark added this to the 2022 Q4 milestone Nov 6, 2022
@sagikazarmark sagikazarmark removed this from the 2022 Q4 milestone Jan 19, 2023
@swengineer404
Copy link

Can we get an update on this?

@bkubiak
Copy link

bkubiak commented Mar 31, 2023

@sagikazarmark It would be great to get this PR merged. Can you check it, please?

@na-ji
Copy link

na-ji commented Apr 2, 2023

Hello,

I tried this PR quickly on my personal configuration, and can tell that it does not work with slices/arrays. It might be a problem with mapstructure though.

@krakowski
Copy link
Contributor Author

Hi @na-ji,

There are test cases with slices included in this PR which work fine. See here for example. What exactly does not work in your case?

@na-ji
Copy link

na-ji commented May 5, 2023

Hi @na-ji,

There are test cases with slices included in this PR which work fine. See here for example. What exactly does not work in your case?

Hi, sorry for not adding an example. I will try to add one later. I was talking about slices of structs. This kind of structure is fully supported on other formats, like JSON, Yaml, Toml etc. But I don't know if it will be with environment variables.

@heraju
Copy link

heraju commented Sep 6, 2023

Any update on this would be appreciated, is there any work around on this, stuck with deployment on this now :(

@maufranchini
Copy link

Any update on this issue? I'm currently stuck with deployment due to this problem. Is there a potential workaround?

One approach that has worked for me is to utilize the BindEnv function provided by Viper.

For instance, if you have a configuration key server.env and you're setting an environment variable named SERVER_ENV, you can link them using:

viper.BindEnv("server.env", "SERVER_ENV")

After this binding, you should be able to access the value of the SERVER_ENV environment variable using the corresponding configuration key in your application.

didrocks added a commit to ubuntu/authd that referenced this pull request Oct 5, 2023
Visit manually env to bind every possibly related environment variable
to be able to unmarshall those into a struct.
More context on spf13/viper#1429.
didrocks added a commit to ubuntu/authd that referenced this pull request Oct 5, 2023
Visit manually env to bind every possibly related environment variable
to be able to unmarshall those into a struct.
More context on spf13/viper#1429.
@mathnogueira
Copy link

Any update on this PR? Having to add an extra BindEnv for each new config we add to the struct is error-prone. This new function would help a lot of us.

@sagikazarmark
Copy link
Collaborator

Apologies for the late review everyone.

Using BindEnv as a workaround sounds OK, but maybe we could come up with a better solution specifically for Unmarshal.

The original reason why Unmarshal does not work with AutomaticEnv is this: internally, Unmarshall gets a list of keys already registered in Viper and builds the input for mapstructure from those keys.

Implementation: https://github.com/spf13/viper/blob/master/viper.go#L2098

Here is what I propose:

  • BindStruct should register a list of keys in an internal key list (deduplicated)
  • When Unmarshal calls AllSettings (and transitively GetKeys), it should merge the bound list with the available keys

Practically, we probably need an internal implementation of AllSettings that does that just for Unmarshal (we may be able to merge those back together later, but technically it could be a BC break since those keys don't necessarily have any values).

I'm a little weary to accept this PR as it is, because I don't think BindEnv is the right solution, it's rather a workaround.

I'm happy to give this a go in the next coming weeks, but if anyone wants to pick it up first, I'm happy to review PRs too.

@mathnogueira
Copy link

Hey @sagikazarmark ! I just opened a PR to move the implementation out of a new method to the viper.Unmarshal function. I would love your review on that.

@krakowski
Copy link
Contributor Author

Hey @sagikazarmark,

thanks for taking a look at this! Just want to make sure I fully understand what you propose.

  • BindStruct should register a list of keys in an internal key list (deduplicated)
  • When Unmarshal calls AllSettings (and transitively GetKeys), it should merge the bound list with the available keys

Do you mean BindStruct should create a list of keys here?

viper/viper.go

Lines 210 to 216 in c4dcd31

config map[string]any
override map[string]any
defaults map[string]any
kvstore map[string]any
pflags map[string]FlagValue
env map[string][]string
aliases map[string]string

If so, this would mean those keys need to be merged with existing keys according to some priority within AllKeys.

viper/viper.go

Lines 2018 to 2035 in c4dcd31

func (v *Viper) AllKeys() []string {
m := map[string]bool{}
// add all paths, by order of descending priority to ensure correct shadowing
m = v.flattenAndMergeMap(m, castMapStringToMapInterface(v.aliases), "")
m = v.flattenAndMergeMap(m, v.override, "")
m = v.mergeFlatMap(m, castMapFlagToMapInterface(v.pflags))
m = v.mergeFlatMap(m, castMapStringSliceToMapInterface(v.env))
m = v.flattenAndMergeMap(m, v.config, "")
m = v.flattenAndMergeMap(m, v.kvstore, "")
m = v.flattenAndMergeMap(m, v.defaults, "")
// convert set of paths to list
a := make([]string, 0, len(m))
for x := range m {
a = append(a, x)
}
return a
}

Since both BindStruct and BindEnv are used for binding environment variables, I'm not really sure which should be prioritized at this point. Do you have some thoughts on this?

Also, do you have any examples in mind where internally using BindEnv is disadvantageous? That might make it clearer to me why it is supposed to be a workaround.

Thanks!

@mathnogueira
Copy link

Since @krakowski is taking a look at this. I'll close my PR for now.

@sagikazarmark
Copy link
Collaborator

@krakowski

Do you mean BindStruct should create a list of keys here?

viper/viper.go

Lines 210 to 216 in c4dcd31

config map[string]any
override map[string]any
defaults map[string]any
kvstore map[string]any
pflags map[string]FlagValue
env map[string][]string
aliases map[string]string

Yes

If so, this would mean those keys need to be merged with existing keys according to some priority within AllKeys.

viper/viper.go

Lines 2018 to 2035 in c4dcd31

func (v *Viper) AllKeys() []string {
m := map[string]bool{}
// add all paths, by order of descending priority to ensure correct shadowing
m = v.flattenAndMergeMap(m, castMapStringToMapInterface(v.aliases), "")
m = v.flattenAndMergeMap(m, v.override, "")
m = v.mergeFlatMap(m, castMapFlagToMapInterface(v.pflags))
m = v.mergeFlatMap(m, castMapStringSliceToMapInterface(v.env))
m = v.flattenAndMergeMap(m, v.config, "")
m = v.flattenAndMergeMap(m, v.kvstore, "")
m = v.flattenAndMergeMap(m, v.defaults, "")
// convert set of paths to list
a := make([]string, 0, len(m))
for x := range m {
a = append(a, x)
}
return a
}

I would say, BindStruct should come with the lowest priority. Any call to SetDefault, BindEnv or any other source should have a higher priority. In my mind BindStruct basically provides a schema for Viper. Any additional modification or config should have a higher priority.

Since both BindStruct and BindEnv are used for binding environment variables, I'm not really sure which should be prioritized at this point. Do you have some thoughts on this?

In my mind, BindStruct provides a schema to Viper. The reason why AutomaticEnv doesn't work with Unmarshal today is because internally Unmarshal grabs all keys defined in Viper and maps those to the provided struct. Currently, only AutomaticEnv suffers from this, but in the future there might be other supported config sources that may not load all keys upfront.

Also, do you have any examples in mind where internally using BindEnv is disadvantageous? That might make it clearer to me why it is supposed to be a workaround.

See my answer above. Currently only AutomaticEnv is the problematic part.


Do you mean BindStruct should create a list of keys here?

On second thought, I'm thinking maybe we should merge BindStruct's functionality into Unmarshal. Instead of a separate BindStruct call, we could just do all that within Unmarshal. We wouldn't have to store the keys in Viper either.

@krakowski
Copy link
Contributor Author

On second thought, I'm thinking maybe we should merge BindStruct's functionality into Unmarshal. Instead of a separate BindStruct call, we could just do all that within Unmarshal. We wouldn't have to store the keys in Viper either.

I will refactor this PR today to reflect this change making BindStruct a private function (bindStruct) inside viper and calling it from Unmarshal 👍

That way, from the view of a user, only Unmarshal has to be called. This is what most people expect looking at the issues I referenced in this PR's description.

@krakowski
Copy link
Contributor Author

@sagikazarmark This is now implemented. Please have a look 🙂

One thing I noticed: There's also UnmarshalKey.

viper/viper.go

Lines 1103 to 1105 in c4dcd31

func (v *Viper) UnmarshalKey(key string, rawVal any, opts ...DecoderConfigOption) error {
return decode(v.Get(key), defaultDecoderConfig(rawVal, opts...))
}

Calling bindStruct there would traverse the whole struct every time UnmarshalKey is called. My proposal is to call BindEnv with the user-provided key like so:

func (v *Viper) UnmarshalKey(key string, rawVal any, opts ...DecoderConfigOption) error {
	if err := v.BindEnv(key); err != nil {
		return err
	}
	
	return decode(v.Get(key), defaultDecoderConfig(rawVal, opts...))
}

What do you think?

@sagikazarmark
Copy link
Collaborator

I don't think we need to do this for UnmarshalKey since the key in that case is already known and is passed to the Get call which will resolve the right env var. There is no need to call BindEnv.

viper.go Outdated
return err
}

structKeys := v.flattenAndMergeMap(map[string]bool{}, envKeysMap, "")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These keys should be merged with the list of AllKeys instead. No need to call BindEnv.

@sagikazarmark
Copy link
Collaborator

@krakowski Thanks for updating the PR!

I thought we agreed not to call BindEnv, but to change the way AllSettings is called and merge the list of keys with AllKeys.

Signed-off-by: Mark Sagi-Kazar <mark.sagikazar@gmail.com>
@sagikazarmark
Copy link
Collaborator

sagikazarmark commented Dec 5, 2023

I quickly made my own version: #1699

@krakowski I'd love to get your thoughts on it (if you can give it a try, even better).

renovate bot added a commit to open-feature/flagd that referenced this pull request Dec 7, 2023
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [github.com/spf13/viper](https://togithub.com/spf13/viper) | require |
minor | `v1.17.0` -> `v1.18.0` |

---

> [!WARNING]
> Some dependencies could not be looked up. Check the Dependency
Dashboard for more information.

---

### Release Notes

<details>
<summary>spf13/viper (github.com/spf13/viper)</summary>

### [`v1.18.0`](https://togithub.com/spf13/viper/releases/tag/v1.18.0)

[Compare
Source](https://togithub.com/spf13/viper/compare/v1.17.0...v1.18.0)

#### Major changes

Highlighting some of the changes for better visibility.

Please share your feedback in the Discussion forum. Thanks! ❤️

##### `AutomaticEnv` works with `Unmarshal`

Previously, environment variables that weren't bound manually or had no
defaults could not be mapped by `Unmarshal`. (The problem is explained
in details in this issue:
[#&#8203;761](https://togithub.com/spf13/viper/issues/761))

[#&#8203;1429](https://togithub.com/spf13/viper/issues/1429) introduced
a solution that solves that issue.

#### What's Changed

##### Enhancements 🚀

- chore: rename files according to enabled build tags by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1642
- test: replace ifs with asserts to simplify tests by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1656
- ci: enable test shuffle and fix tests by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1643
- fix: gocritic lint issues by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1696

##### Bug Fixes 🐛

- Implement viper.BindStruct for automatic unmarshalling from
environment variables by
[@&#8203;krakowski](https://togithub.com/krakowski) in
[spf13/viper#1429
- fix isPathShadowedInFlatMap type cast bug by
[@&#8203;linuxsong](https://togithub.com/linuxsong) in
[spf13/viper#1585

##### Dependency Updates ⬆️

- build(deps): bump github/codeql-action from 2.21.9 to 2.22.3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1661
- build(deps): bump golang.org/x/net from 0.15.0 to 0.17.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1659
- build(deps): bump actions/checkout from 4.1.0 to 4.1.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1663
- build(deps): bump actions/github-script from 6.4.1 to 7.0.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1686
- build(deps): bump github/codeql-action from 2.22.3 to 2.22.8 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1688
- build(deps): bump github.com/spf13/afero from 1.10.0 to 1.11.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1692
- build(deps): bump actions/dependency-review-action from 3.1.0 to 3.1.4
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1690
- build(deps): bump cachix/install-nix-action from 23 to 24 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1689
- build(deps): bump github.com/nats-io/nkeys from 0.4.5 to 0.4.6 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1672
- build(deps): bump github.com/spf13/cast from 1.5.1 to 1.6.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1691
- build(deps): bump github.com/fsnotify/fsnotify from 1.6.0 to 1.7.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1668
- chore: update dependencies by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1694
- chore: update crypt by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1701

##### Other Changes

- Add info about multiple hosts for remote config by
[@&#8203;KaymeKaydex](https://togithub.com/KaymeKaydex) in
[spf13/viper#1684
- refactor: drop fsonitfy wrapper by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1693
- Note Get\* behavior on parse failure by
[@&#8203;scop](https://togithub.com/scop) in
[spf13/viper#1687
- fix: godot lint issues by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1657

#### New Contributors

- [@&#8203;KaymeKaydex](https://togithub.com/KaymeKaydex) made their
first contribution in
[spf13/viper#1684
- [@&#8203;krakowski](https://togithub.com/krakowski) made their first
contribution in
[spf13/viper#1429
- [@&#8203;linuxsong](https://togithub.com/linuxsong) made their first
contribution in
[spf13/viper#1585

**Full Changelog**:
spf13/viper@v1.17.0...v1.18.0

</details>

---

### Configuration

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

🚦 **Automerge**: Enabled.

♻ **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, 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/open-feature/flagd).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy44Ny4yIiwidXBkYXRlZEluVmVyIjoiMzcuODcuMiIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==-->

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

@andig seems UnmarshalExact was missed in this PR. I opened #1704 to fix this. Your test case should work with the changes made there.

@sagikazarmark
Copy link
Collaborator

Fix released in https://github.com/spf13/viper/releases/tag/v1.18.1

ti-chi-bot bot pushed a commit to PingCAP-QE/ee-apps that referenced this pull request Dec 9, 2023
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [github.com/spf13/viper](https://togithub.com/spf13/viper) | require |
minor | `v1.8.0` -> `v1.18.1` |
| [github.com/spf13/viper](https://togithub.com/spf13/viper) | require |
minor | `v1.17.0` -> `v1.18.1` |

---

### Release Notes

<details>
<summary>spf13/viper (github.com/spf13/viper)</summary>

### [`v1.18.1`](https://togithub.com/spf13/viper/releases/tag/v1.18.1)

[Compare
Source](https://togithub.com/spf13/viper/compare/v1.18.0...v1.18.1)

<!-- Release notes generated using configuration in .github/release.yml
at v1.18.1 -->

#### What's Changed

##### Bug Fixes 🐛

- Merge missing struct keys inside UnmarshalExact by
[@&#8203;krakowski](https://togithub.com/krakowski) in
[spf13/viper#1704

**Full Changelog**:
spf13/viper@v1.18.0...v1.18.1

### [`v1.18.0`](https://togithub.com/spf13/viper/releases/tag/v1.18.0)

[Compare
Source](https://togithub.com/spf13/viper/compare/v1.17.0...v1.18.0)

#### Major changes

Highlighting some of the changes for better visibility.

Please share your feedback in the Discussion forum. Thanks! ❤️

##### `AutomaticEnv` works with `Unmarshal`

Previously, environment variables that weren't bound manually or had no
defaults could not be mapped by `Unmarshal`. (The problem is explained
in details in this issue:
[#&#8203;761](https://togithub.com/spf13/viper/issues/761))

[#&#8203;1429](https://togithub.com/spf13/viper/issues/1429) introduced
a solution that solves that issue.

#### What's Changed

##### Enhancements 🚀

- chore: rename files according to enabled build tags by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1642
- test: replace ifs with asserts to simplify tests by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1656
- ci: enable test shuffle and fix tests by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1643
- fix: gocritic lint issues by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1696

##### Bug Fixes 🐛

- Implement viper.BindStruct for automatic unmarshalling from
environment variables by
[@&#8203;krakowski](https://togithub.com/krakowski) in
[spf13/viper#1429
- fix isPathShadowedInFlatMap type cast bug by
[@&#8203;linuxsong](https://togithub.com/linuxsong) in
[spf13/viper#1585

##### Dependency Updates ⬆️

- build(deps): bump github/codeql-action from 2.21.9 to 2.22.3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1661
- build(deps): bump golang.org/x/net from 0.15.0 to 0.17.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1659
- build(deps): bump actions/checkout from 4.1.0 to 4.1.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1663
- build(deps): bump actions/github-script from 6.4.1 to 7.0.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1686
- build(deps): bump github/codeql-action from 2.22.3 to 2.22.8 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1688
- build(deps): bump github.com/spf13/afero from 1.10.0 to 1.11.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1692
- build(deps): bump actions/dependency-review-action from 3.1.0 to 3.1.4
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1690
- build(deps): bump cachix/install-nix-action from 23 to 24 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1689
- build(deps): bump github.com/nats-io/nkeys from 0.4.5 to 0.4.6 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1672
- build(deps): bump github.com/spf13/cast from 1.5.1 to 1.6.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1691
- build(deps): bump github.com/fsnotify/fsnotify from 1.6.0 to 1.7.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1668
- chore: update dependencies by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1694
- chore: update crypt by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1701

##### Other Changes

- Add info about multiple hosts for remote config by
[@&#8203;KaymeKaydex](https://togithub.com/KaymeKaydex) in
[spf13/viper#1684
- refactor: drop fsonitfy wrapper by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1693
- Note Get\* behavior on parse failure by
[@&#8203;scop](https://togithub.com/scop) in
[spf13/viper#1687
- fix: godot lint issues by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1657

#### New Contributors

- [@&#8203;KaymeKaydex](https://togithub.com/KaymeKaydex) made their
first contribution in
[spf13/viper#1684
- [@&#8203;krakowski](https://togithub.com/krakowski) made their first
contribution in
[spf13/viper#1429
- [@&#8203;linuxsong](https://togithub.com/linuxsong) made their first
contribution in
[spf13/viper#1585

**Full Changelog**:
spf13/viper@v1.17.0...v1.18.0

### [`v1.17.0`](https://togithub.com/spf13/viper/releases/tag/v1.17.0)

[Compare
Source](https://togithub.com/spf13/viper/compare/v1.16.0...v1.17.0)

#### Major changes

Highlighting some of the changes for better visibility.

Please share your feedback in the Discussion forum. Thanks! ❤️

##### Minimum Go version: 1.19

Viper now requires Go 1.19

This change ensures we can stay up to date with modern practices and
dependencies.

##### `log/slog` support **\[BREAKING]**

Viper [v1.11.0](https://togithub.com/spf13/viper/releases/tag/v1.11.0)
added an experimental `Logger` interface to allow custom implementations
(besides
[jwalterweatherman](https://togithub.com/spf13/jwalterweatherman)).

In addition, it also exposed an experimental `WithLogger` function
allowing to set a custom logger.

This release deprecates that interface in favor of
[log/slog](https://pkg.go.dev/log/slog) released in Go 1.21.

> \[!WARNING]
> `WithLogger` accepts an
[\*slog.Logger](https://pkg.go.dev/log/slog#Logger) from now on.

To preserve backwards compatibility with older Go versions, prior to Go
1.21 Viper accepts a
[\*golang.org/x/exp/slog.Logger](https://pkg.go.dev/golang.org/x/exp/slog#Logger).

The experimental flag is removed.

##### New finder implementation **\[BREAKING]**

As of this release, Viper uses a new library to look for files, called
[locafero](https://togithub.com/sagikazarmark/locafero).

The new library is better covered by tests and has been built from
scratch as a general purpose file finder library.

The implementation is experimental and is hidden behind a `finder` build
tag.

> \[!WARNING]
> The `io/fs` based implementation (that used to be hidden behind a
`finder` build tag) has been removed.

#### What's Changed

##### Exciting New Features 🎉

- Add NATS support by [@&#8203;hooksie1](https://togithub.com/hooksie1)
in
[spf13/viper#1590
- Add slog support by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1627

##### Enhancements 🚀

- chore: add local development environment using nix by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1572
- feat: add func GetEnvPrefix by
[@&#8203;baruchiro](https://togithub.com/baruchiro) in
[spf13/viper#1565
- Improve dev env by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1575
- fix: code optimization by
[@&#8203;testwill](https://togithub.com/testwill) in
[spf13/viper#1557
- test: remove not needed testutil.Setenv by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1610
- new finder library based on afero by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1625
- refactor: make use of `strings.Cut` by
[@&#8203;scop](https://togithub.com/scop) in
[spf13/viper#1650

##### Breaking Changes 🛠

- feat: drop support for Go 1.17 by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1574

##### Dependency Updates ⬆️

- build(deps): bump mheap/github-action-required-labels from 4 to 5 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1563
- build(deps): bump github.com/stretchr/testify from 1.8.3 to 1.8.4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1558
- build(deps): bump cachix/install-nix-action from 21 to 22 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1573
- build(deps): bump github.com/pelletier/go-toml/v2 from 2.0.8 to 2.0.9
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1586
- chore: upgrade crypt by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1589
- build(deps): bump actions/checkout from 3.5.3 to 4.0.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1616
- build(deps): bump github/codeql-action from 2.21.2 to 2.21.5 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1615
- build(deps): bump github.com/pelletier/go-toml/v2 from 2.0.9 to 2.1.0
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1614
- build(deps): bump actions/dependency-review-action from 3.0.6 to 3.0.8
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1605
- build(deps): bump golangci/golangci-lint-action from 3.6.0 to 3.7.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1604
- build(deps): bump actions/setup-go from 4.0.1 to 4.1.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1593
- build(deps): bump github.com/subosito/gotenv from 1.4.2 to 1.6.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1603
- build(deps): bump cachix/install-nix-action from 22 to 23 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1620
- chore(deps): update crypt by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1621
- build(deps): bump actions/dependency-review-action from 3.0.8 to 3.1.0
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1623
- Bump minimum Go version to 1.19 by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1626
- build(deps): bump github/codeql-action from 2.21.5 to 2.21.6 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1632
- build(deps): bump github/codeql-action from 2.21.6 to 2.21.7 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1634
- build(deps): bump actions/checkout from 4.0.0 to 4.1.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1641
- build(deps): bump github.com/spf13/afero from 1.9.5 to 1.10.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1640
- build(deps): bump github/codeql-action from 2.21.7 to 2.21.8 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1638
- build(deps): bump github/codeql-action from 2.21.8 to 2.21.9 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1648
- chore(deps): update crypt by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1652

##### Other Changes

- \[StepSecurity] ci: Harden GitHub Actions by
[@&#8203;step-security-bot](https://togithub.com/step-security-bot) in
[spf13/viper#1592
- Add Vitess to list of projects using Viper by
[@&#8203;systay](https://togithub.com/systay) in
[spf13/viper#1619
- docs: fix typos in comments by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1609
- ci: add Go 1.21 to the test matrix by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1622
- Remove usages of deprecated io/ioutil; simplify viper tests by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1631
- chore: remove deprecated build tags by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1630
- refactor: replace 'interface{}' with 'any' by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1646
- test: refactor asserts by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1644
- docs: add set subset KV example by
[@&#8203;yhliyr](https://togithub.com/yhliyr) in
[spf13/viper#1647
- Make deps fixes by [@&#8203;bersace](https://togithub.com/bersace) in
[spf13/viper#1628

#### New Contributors

- [@&#8203;goldeneggg](https://togithub.com/goldeneggg) made their first
contribution in
[spf13/viper#1561
- [@&#8203;baruchiro](https://togithub.com/baruchiro) made their first
contribution in
[spf13/viper#1565
- [@&#8203;testwill](https://togithub.com/testwill) made their first
contribution in
[spf13/viper#1557
- [@&#8203;step-security-bot](https://togithub.com/step-security-bot)
made their first contribution in
[spf13/viper#1592
- [@&#8203;systay](https://togithub.com/systay) made their first
contribution in
[spf13/viper#1619
- [@&#8203;alexandear](https://togithub.com/alexandear) made their first
contribution in
[spf13/viper#1609
- [@&#8203;hooksie1](https://togithub.com/hooksie1) made their first
contribution in
[spf13/viper#1590
- [@&#8203;yhliyr](https://togithub.com/yhliyr) made their first
contribution in
[spf13/viper#1647
- [@&#8203;bersace](https://togithub.com/bersace) made their first
contribution in
[spf13/viper#1628
- [@&#8203;scop](https://togithub.com/scop) made their first
contribution in
[spf13/viper#1650

**Full Changelog**:
spf13/viper@v1.16.0...v1.17.0

### [`v1.16.0`](https://togithub.com/spf13/viper/releases/tag/v1.16.0)

[Compare
Source](https://togithub.com/spf13/viper/compare/v1.15.0...v1.16.0)

<!-- Release notes generated using configuration in .github/release.yml
at v1.16.0 -->

#### What's Changed

##### Enhancements 🚀

- Sub parent inheritance by
[@&#8203;TaylorOno](https://togithub.com/TaylorOno) in
[spf13/viper#1056
- fix: fix typo by [@&#8203;yquansah](https://togithub.com/yquansah) in
[spf13/viper#1523
- ci: add Go 1.20 to build matrix by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1506
- extend v.find() to handle stringToInt value types with stringToInt
pflag [#&#8203;1435](https://togithub.com/spf13/viper/issues/1435) by
[@&#8203;vorishirne](https://togithub.com/vorishirne) in
[spf13/viper#1462
- add:viper: allow to disable internal log messages by
[@&#8203;burgesQ](https://togithub.com/burgesQ) in
[spf13/viper#1483
- Allow ConfigParseError to unwrap by
[@&#8203;andig](https://togithub.com/andig) in
[spf13/viper#1433

##### Bug Fixes 🐛

- fix: time.Duration slice type conversion by
[@&#8203;UrbanskiDawid](https://togithub.com/UrbanskiDawid) in
[spf13/viper#1498

##### Dependency Updates ⬆️

- build(deps): bump mheap/github-action-required-labels from 3 to 4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1533
- build(deps): bump actions/setup-go from 3 to 4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1526
- build(deps): bump golang.org/x/net from 0.4.0 to 0.7.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1519
- build(deps): bump github.com/pelletier/go-toml/v2 from 2.0.6 to 2.0.7
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1516
- build(deps): bump github.com/stretchr/testify from 1.8.1 to 1.8.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1515
- build(deps): bump github.com/spf13/afero from 1.9.3 to 1.9.5 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1518
- build(deps): bump github.com/sagikazarmark/crypt from 0.9.0 to 0.10.0
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1550
- build(deps): bump github.com/spf13/cast from 1.5.0 to 1.5.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1551
- build(deps): bump github.com/stretchr/testify from 1.8.2 to 1.8.3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1553
- build(deps): bump github.com/pelletier/go-toml/v2 from 2.0.7 to 2.0.8
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1555

##### Other Changes

- Update main image to better handle dark background by
[@&#8203;Deleplace](https://togithub.com/Deleplace) in
[spf13/viper#1532

#### New Contributors

- [@&#8203;UrbanskiDawid](https://togithub.com/UrbanskiDawid) made their
first contribution in
[spf13/viper#1498
- [@&#8203;TaylorOno](https://togithub.com/TaylorOno) made their first
contribution in
[spf13/viper#1056
- [@&#8203;yquansah](https://togithub.com/yquansah) made their first
contribution in
[spf13/viper#1523
- [@&#8203;Azanul](https://togithub.com/Azanul) made their first
contribution in
[spf13/viper#1544
- [@&#8203;Deleplace](https://togithub.com/Deleplace) made their first
contribution in
[spf13/viper#1532
- [@&#8203;cfabianski](https://togithub.com/cfabianski) made their first
contribution in
[spf13/viper#1552
- [@&#8203;vorishirne](https://togithub.com/vorishirne) made their first
contribution in
[spf13/viper#1462
- [@&#8203;burgesQ](https://togithub.com/burgesQ) made their first
contribution in
[spf13/viper#1483
- [@&#8203;andig](https://togithub.com/andig) made their first
contribution in
[spf13/viper#1433

**Full Changelog**:
spf13/viper@v1.15.0...v1.16.0

### [`v1.15.0`](https://togithub.com/spf13/viper/releases/tag/v1.15.0)

[Compare
Source](https://togithub.com/spf13/viper/compare/v1.14.0...v1.15.0)

<!-- Release notes generated using configuration in .github/release.yml
at v1.15.0 -->

#### What's Changed

##### Exciting New Features 🎉

- feat: add multiple endpoints support for remote by
[@&#8203;mozartz](https://togithub.com/mozartz) in
[spf13/viper#1464

##### Enhancements 🚀

- Add DocBlock to WatchConfig by
[@&#8203;glebik000](https://togithub.com/glebik000) in
[spf13/viper#1467

##### Breaking Changes 🛠

- Drop YAML v2 and TOML v1 by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1493
- Drop support for Go 1.16 by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1494

##### Dependency Updates ⬆️

- build(deps): bump github.com/spf13/afero from 1.9.2 to 1.9.3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1465
- build(deps): bump github.com/magiconair/properties from 1.8.6 to 1.8.7
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1475
- build(deps): bump github.com/pelletier/go-toml/v2 from 2.0.5 to 2.0.6
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1466
- build(deps): bump mheap/github-action-required-labels from 2 to 3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1482
- build(deps): bump github.com/subosito/gotenv from 1.4.1 to 1.4.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1488
- build(deps): bump github.com/sagikazarmark/crypt from 0.8.0 to 0.9.0
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1490

#### New Contributors

- [@&#8203;choar816](https://togithub.com/choar816) made their first
contribution in
[spf13/viper#1481
- [@&#8203;lol768](https://togithub.com/lol768) made their first
contribution in
[spf13/viper#1485
- [@&#8203;mozartz](https://togithub.com/mozartz) made their first
contribution in
[spf13/viper#1464
- [@&#8203;glebik000](https://togithub.com/glebik000) made their first
contribution in
[spf13/viper#1467

**Full Changelog**:
spf13/viper@v1.14.0...v1.15.0

### [`v1.14.0`](https://togithub.com/spf13/viper/releases/tag/v1.14.0)

[Compare
Source](https://togithub.com/spf13/viper/compare/v1.13.0...v1.14.0)

<!-- Release notes generated using configuration in .github/release.yml
at v1.14.0 -->

#### What's Changed

##### Enhancements 🚀

- feat: make Viper compile on platforms unsupported by fsnotify by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1457
- Fsnotify improvements by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1458
- Disable watch on appengine by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1460

##### Breaking Changes 🛠

- Drop support for Go 1.15 by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1428

##### Dependency Updates ⬆️

- build(deps): bump github.com/spf13/afero from 1.8.2 to 1.9.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1406
- build(deps): bump github.com/sagikazarmark/crypt from 0.6.0 to 0.7.0
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1437
- build(deps): bump github.com/stretchr/testify from 1.8.0 to 1.8.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1453
- build(deps): bump github.com/fsnotify/fsnotify from 1.5.4 to 1.6.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1449
- chore: update crypt by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1461

**Full Changelog**:
spf13/viper@v1.13.0...v1.14.0

### [`v1.13.0`](https://togithub.com/spf13/viper/releases/tag/v1.13.0)

[Compare
Source](https://togithub.com/spf13/viper/compare/v1.12.0...v1.13.0)

**Important:** This is the last release supporting Go 1.15.

#### What's Changed

##### Exciting New Features 🎉

- Add etcd3 to supported remote providers by
[@&#8203;franklinkim](https://togithub.com/franklinkim) in
[spf13/viper#1371

##### Enhancements 🚀

- Fix go-staticcheck failures (ST1005) by
[@&#8203;mjmaisey](https://togithub.com/mjmaisey) in
[spf13/viper#1373
- Use jsonc in markdown codeblocks for better readability by
[@&#8203;HurSungYun](https://togithub.com/HurSungYun) in
[spf13/viper#1393
- Add Go 1.19 support by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1424
- Adds support for uint16 with `GetUint16` by
[@&#8203;oxisto](https://togithub.com/oxisto) in
[spf13/viper#1405
- Add a DebugTo convenience funtion by
[@&#8203;bcrochet](https://togithub.com/bcrochet) in
[spf13/viper#1414

##### Bug Fixes 🐛

- Recurse into arrays when converting keys to lowercase by
[@&#8203;awrichar](https://togithub.com/awrichar) in
[spf13/viper#1387

##### Dependency Updates ⬆️

- build(deps): bump github.com/stretchr/testify from 1.7.1 to 1.7.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1374
- build(deps): bump github.com/subosito/gotenv from 1.3.0 to 1.4.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1375
- build(deps): bump github.com/pelletier/go-toml/v2 from 2.0.1 to 2.0.2
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1378
- build(deps): bump gopkg.in/yaml.v3 from 3.0.0 to 3.0.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1360
- build(deps): bump github.com/stretchr/testify from 1.7.2 to 1.7.3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1381
- build(deps): bump github.com/stretchr/testify from 1.7.3 to 1.7.4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1384
- build(deps): bump mheap/github-action-required-labels from 1 to 2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1383
- build(deps): bump github.com/stretchr/testify from 1.7.4 to 1.8.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1395
- build(deps): bump github.com/subosito/gotenv from 1.4.0 to 1.4.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1420
- build(deps): bump github.com/pelletier/go-toml/v2 from 2.0.2 to 2.0.5
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1422
- build(deps): bump gopkg.in/ini.v1 from 1.66.4 to 1.67.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1412

#### New Contributors

- [@&#8203;mjmaisey](https://togithub.com/mjmaisey) made their first
contribution in
[spf13/viper#1373
- [@&#8203;HurSungYun](https://togithub.com/HurSungYun) made their first
contribution in
[spf13/viper#1393
- [@&#8203;franklinkim](https://togithub.com/franklinkim) made their
first contribution in
[spf13/viper#1371
- [@&#8203;awrichar](https://togithub.com/awrichar) made their first
contribution in
[spf13/viper#1387
- [@&#8203;oxisto](https://togithub.com/oxisto) made their first
contribution in
[spf13/viper#1405
- [@&#8203;bcrochet](https://togithub.com/bcrochet) made their first
contribution in
[spf13/viper#1414

**Full Changelog**:
spf13/viper@v1.12.0...v1.13.0

### [`v1.12.0`](https://togithub.com/spf13/viper/releases/tag/v1.12.0)

[Compare
Source](https://togithub.com/spf13/viper/compare/v1.11.0...v1.12.0)

This release makes YAML v3 and TOML v2 the default versions used for
encoding.

You can switch back to the old versions by adding `viper_yaml2` and
`viper_toml1` to the build tags.

Please note that YAML v2 and TOML v1 are considered deprecated from this
release and may be removed in a future release.

Please provide feedback in discussions and report bugs on the issue
tracker. Thanks!

<!-- Release notes generated using configuration in .github/release.yml
at v1.12.0 -->

#### What's Changed

##### Exciting New Features 🎉

- Add etcd3 support to remote by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1356
- Make YAML 3 the default by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1357
- Make TOML 2 the default by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1358

##### Enhancements 🚀

- chore: fix Error log calls in mergeMaps by
[@&#8203;wwade](https://togithub.com/wwade) in
[spf13/viper#1341
- Add MustBindEnv by
[@&#8203;meowfaceman](https://togithub.com/meowfaceman) in
[spf13/viper#1301

##### Dependency Updates ⬆️

- build(deps): bump github/codeql-action from 1 to 2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1336
- build(deps): bump github.com/pelletier/go-toml/v2 from 2.0.0-beta.8 to
2.0.0 by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1339
- build(deps): bump github.com/mitchellh/mapstructure from 1.4.3 to
1.5.0 by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1332
- build(deps): bump github.com/pelletier/go-toml from 1.9.4 to 1.9.5 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1335
- build(deps): bump github.com/fsnotify/fsnotify from 1.5.1 to 1.5.4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1338
- build(deps): bump github.com/spf13/cast from 1.4.1 to 1.5.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1344
- build(deps): bump github.com/pelletier/go-toml/v2 from 2.0.0 to 2.0.1
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1343
- build(deps): bump github.com/subosito/gotenv from 1.2.0 to 1.3.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1349

#### New Contributors

- [@&#8203;meowfaceman](https://togithub.com/meowfaceman) made their
first contribution in
[spf13/viper#1301
- [@&#8203;wwade](https://togithub.com/wwade) made their first
contribution in
[spf13/viper#1341

**Full Changelog**:
spf13/viper@v1.11.0...v1.12.0

### [`v1.11.0`](https://togithub.com/spf13/viper/releases/tag/v1.11.0)

[Compare
Source](https://togithub.com/spf13/viper/compare/v1.10.1...v1.11.0)

<!-- Release notes generated using configuration in .github/release.yml
at v1.11.0 -->

#### What's Changed

##### Exciting New Features 🎉

- Experimental yaml v3 library support by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1273
- Experimental toml v2 support by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1274
- Experimental logger by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1275

##### Enhancements 🚀

- Remove unnecessary operand by
[@&#8203;steviebps](https://togithub.com/steviebps) in
[spf13/viper#1213
- Improve encoding layer by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1167
- Allow merging configs with different types of leaf values by
[@&#8203;illarion](https://togithub.com/illarion) in
[spf13/viper#1181

##### Bug Fixes 🐛

- Disable race detector on windows by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1269

##### Breaking Changes 🛠

- Drop Go 1.14 support by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1327

##### Dependency Updates ⬆️

- build(deps): bump github.com/spf13/afero from 1.6.0 to 1.7.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1265
- build(deps): bump github.com/spf13/afero from 1.7.0 to 1.7.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1271
- build(deps): bump github.com/spf13/afero from 1.7.1 to 1.8.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1281
- build(deps): bump gopkg.in/ini.v1 from 1.66.2 to 1.66.3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1287
- build(deps): bump github.com/spf13/afero from 1.8.0 to 1.8.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1291
- build(deps): bump actions/github-script from 5 to 6 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1295
- build(deps): bump actions/checkout from 2 to 3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1304
- build(deps): bump github.com/magiconair/properties from 1.8.5 to 1.8.6
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1299
- build(deps): bump gopkg.in/ini.v1 from 1.66.3 to 1.66.4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1293
- build(deps): bump github.com/spf13/afero from 1.8.1 to 1.8.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1311
- build(deps): bump actions/setup-go from 2 to 3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1319
- build(deps): bump github.com/pelletier/go-toml/v2 from 2.0.0-beta.6 to
2.0.0-beta.7 by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1320
- build(deps): bump github.com/pelletier/go-toml/v2 from 2.0.0-beta.7 to
2.0.0-beta.8 by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1322
- Update crypt by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1325

#### New Contributors

- [@&#8203;steviebps](https://togithub.com/steviebps) made their first
contribution in
[spf13/viper#1213
- [@&#8203;illarion](https://togithub.com/illarion) made their first
contribution in
[spf13/viper#1181

**Full Changelog**:
spf13/viper@v1.10.1...v1.11.0

### [`v1.10.1`](https://togithub.com/spf13/viper/releases/tag/v1.10.1)

[Compare
Source](https://togithub.com/spf13/viper/compare/v1.10.0...v1.10.1)

This is a maintenance release upgrading the Consul dependency fixing
CVEs.

### [`v1.10.0`](https://togithub.com/spf13/viper/releases/tag/v1.10.0)

[Compare
Source](https://togithub.com/spf13/viper/compare/v1.9.0...v1.10.0)

This is a maintenance release primarily containing minor fixes and
improvements.

#### Changes

##### Added

-   Experimental finder based on io/fs
-   Tests are executed on Windows
-   Tests are executed on Go 1.17
-   Logger interface to decouple Viper from JWW

***

In addition to the above changes, this release comes with minor
improvements, documentation changes an dependency updates.

**Many thanks to everyone who contributed to this release!**

### [`v1.9.0`](https://togithub.com/spf13/viper/releases/tag/v1.9.0)

[Compare
Source](https://togithub.com/spf13/viper/compare/v1.8.1...v1.9.0)

This is a maintenance release primarily containing minor fixes and
improvements.

#### Changes

##### Added

-   Experimental new encoding layer
-   Add support for `tfvars` files

##### Fixed

-   Writing hidden files with no extension
-   `InConfig` processing paths

***

In addition to the above changes, this release comes with tons of minor
improvements, documentation changes an dependency updates.

**Many thanks to everyone who contributed to this release!**

### [`v1.8.1`](https://togithub.com/spf13/viper/releases/tag/v1.8.1)

[Compare
Source](https://togithub.com/spf13/viper/compare/v1.8.0...v1.8.1)

This patch releases fixes two minor issues:

-   Replace `%s` with `%w` when wrapping errors
-   Fix `pflag.StringArray` processing

</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 these
updates again.

---

- [ ] <!-- 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/PingCAP-QE/ee-apps).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy44Ny4yIiwidXBkYXRlZEluVmVyIjoiMzcuODcuMiIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
nono added a commit to cozy/cozy-stack that referenced this pull request Dec 11, 2023
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [github.com/spf13/viper](https://togithub.com/spf13/viper) | require |
minor | `v1.16.0` -> `v1.18.1` |

---

### Release Notes

<details>
<summary>spf13/viper (github.com/spf13/viper)</summary>

### [`v1.18.1`](https://togithub.com/spf13/viper/releases/tag/v1.18.1)

[Compare
Source](https://togithub.com/spf13/viper/compare/v1.18.0...v1.18.1)

<!-- Release notes generated using configuration in .github/release.yml
at v1.18.1 -->

#### What's Changed

##### Bug Fixes 🐛

- Merge missing struct keys inside UnmarshalExact by
[@&#8203;krakowski](https://togithub.com/krakowski) in
[spf13/viper#1704

**Full Changelog**:
spf13/viper@v1.18.0...v1.18.1

### [`v1.18.0`](https://togithub.com/spf13/viper/releases/tag/v1.18.0)

[Compare
Source](https://togithub.com/spf13/viper/compare/v1.17.0...v1.18.0)

#### Major changes

Highlighting some of the changes for better visibility.

Please share your feedback in the Discussion forum. Thanks! ❤️

##### `AutomaticEnv` works with `Unmarshal`

Previously, environment variables that weren't bound manually or had no
defaults could not be mapped by `Unmarshal`. (The problem is explained
in details in this issue:
[#&#8203;761](https://togithub.com/spf13/viper/issues/761))

[#&#8203;1429](https://togithub.com/spf13/viper/issues/1429) introduced
a solution that solves that issue.

#### What's Changed

##### Enhancements 🚀

- chore: rename files according to enabled build tags by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1642
- test: replace ifs with asserts to simplify tests by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1656
- ci: enable test shuffle and fix tests by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1643
- fix: gocritic lint issues by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1696

##### Bug Fixes 🐛

- Implement viper.BindStruct for automatic unmarshalling from
environment variables by
[@&#8203;krakowski](https://togithub.com/krakowski) in
[spf13/viper#1429
- fix isPathShadowedInFlatMap type cast bug by
[@&#8203;linuxsong](https://togithub.com/linuxsong) in
[spf13/viper#1585

##### Dependency Updates ⬆️

- build(deps): bump github/codeql-action from 2.21.9 to 2.22.3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1661
- build(deps): bump golang.org/x/net from 0.15.0 to 0.17.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1659
- build(deps): bump actions/checkout from 4.1.0 to 4.1.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1663
- build(deps): bump actions/github-script from 6.4.1 to 7.0.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1686
- build(deps): bump github/codeql-action from 2.22.3 to 2.22.8 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1688
- build(deps): bump github.com/spf13/afero from 1.10.0 to 1.11.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1692
- build(deps): bump actions/dependency-review-action from 3.1.0 to 3.1.4
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1690
- build(deps): bump cachix/install-nix-action from 23 to 24 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1689
- build(deps): bump github.com/nats-io/nkeys from 0.4.5 to 0.4.6 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1672
- build(deps): bump github.com/spf13/cast from 1.5.1 to 1.6.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1691
- build(deps): bump github.com/fsnotify/fsnotify from 1.6.0 to 1.7.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1668
- chore: update dependencies by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1694
- chore: update crypt by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1701

##### Other Changes

- Add info about multiple hosts for remote config by
[@&#8203;KaymeKaydex](https://togithub.com/KaymeKaydex) in
[spf13/viper#1684
- refactor: drop fsonitfy wrapper by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1693
- Note Get\* behavior on parse failure by
[@&#8203;scop](https://togithub.com/scop) in
[spf13/viper#1687
- fix: godot lint issues by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1657

#### New Contributors

- [@&#8203;KaymeKaydex](https://togithub.com/KaymeKaydex) made their
first contribution in
[spf13/viper#1684
- [@&#8203;krakowski](https://togithub.com/krakowski) made their first
contribution in
[spf13/viper#1429
- [@&#8203;linuxsong](https://togithub.com/linuxsong) made their first
contribution in
[spf13/viper#1585

**Full Changelog**:
spf13/viper@v1.17.0...v1.18.0

### [`v1.17.0`](https://togithub.com/spf13/viper/releases/tag/v1.17.0)

[Compare
Source](https://togithub.com/spf13/viper/compare/v1.16.0...v1.17.0)

#### Major changes

Highlighting some of the changes for better visibility.

Please share your feedback in the Discussion forum. Thanks! ❤️

##### Minimum Go version: 1.19

Viper now requires Go 1.19

This change ensures we can stay up to date with modern practices and
dependencies.

##### `log/slog` support **\[BREAKING]**

Viper [v1.11.0](https://togithub.com/spf13/viper/releases/tag/v1.11.0)
added an experimental `Logger` interface to allow custom implementations
(besides
[jwalterweatherman](https://togithub.com/spf13/jwalterweatherman)).

In addition, it also exposed an experimental `WithLogger` function
allowing to set a custom logger.

This release deprecates that interface in favor of
[log/slog](https://pkg.go.dev/log/slog) released in Go 1.21.

> \[!WARNING]
> `WithLogger` accepts an
[\*slog.Logger](https://pkg.go.dev/log/slog#Logger) from now on.

To preserve backwards compatibility with older Go versions, prior to Go
1.21 Viper accepts a
[\*golang.org/x/exp/slog.Logger](https://pkg.go.dev/golang.org/x/exp/slog#Logger).

The experimental flag is removed.

##### New finder implementation **\[BREAKING]**

As of this release, Viper uses a new library to look for files, called
[locafero](https://togithub.com/sagikazarmark/locafero).

The new library is better covered by tests and has been built from
scratch as a general purpose file finder library.

The implementation is experimental and is hidden behind a `finder` build
tag.

> \[!WARNING]
> The `io/fs` based implementation (that used to be hidden behind a
`finder` build tag) has been removed.

#### What's Changed

##### Exciting New Features 🎉

- Add NATS support by [@&#8203;hooksie1](https://togithub.com/hooksie1)
in
[spf13/viper#1590
- Add slog support by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1627

##### Enhancements 🚀

- chore: add local development environment using nix by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1572
- feat: add func GetEnvPrefix by
[@&#8203;baruchiro](https://togithub.com/baruchiro) in
[spf13/viper#1565
- Improve dev env by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1575
- fix: code optimization by
[@&#8203;testwill](https://togithub.com/testwill) in
[spf13/viper#1557
- test: remove not needed testutil.Setenv by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1610
- new finder library based on afero by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1625
- refactor: make use of `strings.Cut` by
[@&#8203;scop](https://togithub.com/scop) in
[spf13/viper#1650

##### Breaking Changes 🛠

- feat: drop support for Go 1.17 by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1574

##### Dependency Updates ⬆️

- build(deps): bump mheap/github-action-required-labels from 4 to 5 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1563
- build(deps): bump github.com/stretchr/testify from 1.8.3 to 1.8.4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1558
- build(deps): bump cachix/install-nix-action from 21 to 22 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1573
- build(deps): bump github.com/pelletier/go-toml/v2 from 2.0.8 to 2.0.9
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1586
- chore: upgrade crypt by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1589
- build(deps): bump actions/checkout from 3.5.3 to 4.0.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1616
- build(deps): bump github/codeql-action from 2.21.2 to 2.21.5 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1615
- build(deps): bump github.com/pelletier/go-toml/v2 from 2.0.9 to 2.1.0
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1614
- build(deps): bump actions/dependency-review-action from 3.0.6 to 3.0.8
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1605
- build(deps): bump golangci/golangci-lint-action from 3.6.0 to 3.7.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1604
- build(deps): bump actions/setup-go from 4.0.1 to 4.1.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1593
- build(deps): bump github.com/subosito/gotenv from 1.4.2 to 1.6.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1603
- build(deps): bump cachix/install-nix-action from 22 to 23 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1620
- chore(deps): update crypt by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1621
- build(deps): bump actions/dependency-review-action from 3.0.8 to 3.1.0
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1623
- Bump minimum Go version to 1.19 by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1626
- build(deps): bump github/codeql-action from 2.21.5 to 2.21.6 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1632
- build(deps): bump github/codeql-action from 2.21.6 to 2.21.7 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1634
- build(deps): bump actions/checkout from 4.0.0 to 4.1.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1641
- build(deps): bump github.com/spf13/afero from 1.9.5 to 1.10.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1640
- build(deps): bump github/codeql-action from 2.21.7 to 2.21.8 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1638
- build(deps): bump github/codeql-action from 2.21.8 to 2.21.9 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1648
- chore(deps): update crypt by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1652

##### Other Changes

- \[StepSecurity] ci: Harden GitHub Actions by
[@&#8203;step-security-bot](https://togithub.com/step-security-bot) in
[spf13/viper#1592
- Add Vitess to list of projects using Viper by
[@&#8203;systay](https://togithub.com/systay) in
[spf13/viper#1619
- docs: fix typos in comments by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1609
- ci: add Go 1.21 to the test matrix by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1622
- Remove usages of deprecated io/ioutil; simplify viper tests by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1631
- chore: remove deprecated build tags by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1630
- refactor: replace 'interface{}' with 'any' by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1646
- test: refactor asserts by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1644
- docs: add set subset KV example by
[@&#8203;yhliyr](https://togithub.com/yhliyr) in
[spf13/viper#1647
- Make deps fixes by [@&#8203;bersace](https://togithub.com/bersace) in
[spf13/viper#1628

#### New Contributors

- [@&#8203;goldeneggg](https://togithub.com/goldeneggg) made their first
contribution in
[spf13/viper#1561
- [@&#8203;baruchiro](https://togithub.com/baruchiro) made their first
contribution in
[spf13/viper#1565
- [@&#8203;testwill](https://togithub.com/testwill) made their first
contribution in
[spf13/viper#1557
- [@&#8203;step-security-bot](https://togithub.com/step-security-bot)
made their first contribution in
[spf13/viper#1592
- [@&#8203;systay](https://togithub.com/systay) made their first
contribution in
[spf13/viper#1619
- [@&#8203;alexandear](https://togithub.com/alexandear) made their first
contribution in
[spf13/viper#1609
- [@&#8203;hooksie1](https://togithub.com/hooksie1) made their first
contribution in
[spf13/viper#1590
- [@&#8203;yhliyr](https://togithub.com/yhliyr) made their first
contribution in
[spf13/viper#1647
- [@&#8203;bersace](https://togithub.com/bersace) made their first
contribution in
[spf13/viper#1628
- [@&#8203;scop](https://togithub.com/scop) made their first
contribution in
[spf13/viper#1650

**Full Changelog**:
spf13/viper@v1.16.0...v1.17.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "before 6am on Monday" in timezone
Europe/Paris, 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, 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/cozy/cozy-stack).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy44Ny4yIiwidXBkYXRlZEluVmVyIjoiMzcuODcuMiIsInRhcmdldEJyYW5jaCI6Im1hc3RlciJ9-->
@maxisam
Copy link

maxisam commented Dec 13, 2023

Hi, this doesn't work in this case.

https://github.com/maxisam/mgob/actions/runs/7198427412/job/19607841688?pr=97#step:10:701

The config is like

https://github.com/maxisam/mgob/blob/144a21f8275314f74b9ff3a279fbfea22cda06d3/pkg/config/plan.go#L14-L29

for property under target, it works, but not for property under Azure.

Here is the test
https://github.com/maxisam/mgob/blob/144a21f8275314f74b9ff3a279fbfea22cda06d3/pkg/config/plan_test.go#L40-L69

in this test,
plan.Azure.ConnectionString will get the original value from the yaml config
plan.Target.Password will get the environment variable value just fine, whether password is in the config or not.

in short, with pointer type, it will get config value only. But pointer type is very handy, I can check if it is nil, and know if I need to run certain feature.

simple version of test

func TestEnv(t *testing.T) {
	v := viper.New()

	v.SetEnvPrefix("evcc")
	v.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
	v.AutomaticEnv()

	os.Setenv("EVCC_DATABASE_TYPE", "sqlite")
	os.Setenv("EVCC_DATABASE_DSN", "dsn")
	os.Setenv("EVCC_TEST_ENV", "test-env")

	type Test struct {
		Env string
	}

	var conf struct {
		Database struct {
			Type string
			Dsn  string
		}
		Test *Test
	}
	assert.NoError(t, v.Unmarshal(&conf))

	assert.Equal(t, "sqlite", conf.Database.Type)
	assert.Equal(t, "dsn", conf.Database.Dsn)
	assert.Nil(t, conf.Test) // this will still remain nil
	// assert.Equal(t, "test-env", conf.Test.Env)
}

Thanks!

@xsteadfastx
Copy link

You mean the map stored at index 0 should then contain a TITLE key with the value assigned to the EVCC_LOADPOINTS_0_TITLE environment variable?

Exactly.

Does BindEnv support this kind of unmarshal operation?

@krakowski seems it cannot, that would actually be #935.

so this doesnt work? any ideas for workarounds?

@xsteadfastx
Copy link

@sagikazarmark @krakowski this still does not unmarshal something like EVCC_LOADPOINTS_0_TITLE into []map[string]interface{}, right?

You mean the map stored at index 0 should then contain a TITLE key with the value assigned to the EVCC_LOADPOINTS_0_TITLE environment variable? I can try it out. Does BindEnv support this kind of unmarshal operation?

tried it with the latest version with no luck.

@sagikazarmark
Copy link
Collaborator

@xsteadfastx you should use mapstructure struct tag instead of yaml. Not sure if that's the only problem, but that is one.

@xsteadfastx
Copy link

xsteadfastx commented Dec 14, 2023 via email

@andig

This comment was marked as outdated.

@krakowski
Copy link
Contributor Author

@maxisam It seems mapstructure does not follow pointer types when decoding fields.

type StorageConfig struct {
  Size int `mapstructure:"size"`
}

type Configuration struct {
  Storage StorageConfig `mapstructure:"filesystem"`
}

Decoding the Configuration struct using mapstructure will yield a filesystem.size key. If you change the Storage field's type to *StorageConfig (pointer type) it yields a filesystem key. The code you posted does not work, because in your case test is used as a key instead of test.env.

A simple workaround you can use is to bind this key manually using BindEnv.

...
v.AutomaticEnv()

os.Setenv("EVCC_DATABASE_TYPE", "sqlite")
os.Setenv("EVCC_DATABASE_DSN", "dsn")
os.Setenv("EVCC_TEST_ENV", "test-env")

v.BindEnv("test.env")
...

Another option is to not use pointer fields inside the configuration structs.

@maxisam
Copy link

maxisam commented Dec 14, 2023

@krakowski Thanks for explaining, I knew it must be pointer type. I think using pointer type should be pretty common, but maybe I am wrong. (I only use Golang in this project)

I also wanna point it out this is actually a breaking change. After this, we can't no longer use pointer type with environment variable. But it was fine before.

I like the idea of this change but I think the pointer type is a big gotcha and limit the usage a lot

@xsteadfastx
Copy link

im using mapstructure.

You're using yaml tags, not mapstrucure. It shouldn't matter though as long as the member name is a straightforward version of the actual config. That seems to be the case afaikt.

That said, #1429 (comment) is actually OT as was my post since it referred to slices which were/are not supported via ENV.

why do you think im using yaml? i mean i didnt event posted any code.

@sagikazarmark
Copy link
Collaborator

@maxisam to be precise: mapstructure doesn't support multiple indirections. In fact, it requires you to pass a pointer to your desired output, but in case of the input it only dereferences a pointer once which results in the error seen before.

I submitted a PR to mapstructure to fix that. No idea when or if it' going to be accepted.

I have another PR in Viper as a workaround: #1707

@xsteadfastx this is what makes me believe you use yaml as struct tags: https://github.com/maxisam/mgob/blob/144a21f8275314f74b9ff3a279fbfea22cda06d3/pkg/config/plan.go#L14-L29

It works, as long as you tell mapstructure to use that instead of mapstructure.

But as @andig pointed out, slices may be another issue.

@krakowski
Copy link
Contributor Author

@krakowski Thanks for explaining, I knew it must be pointer type. I think using pointer type should be pretty common, but maybe I am wrong. (I only use Golang in this project)

I also wanna point it out this is actually a breaking change. After this, we can't no longer use pointer type with environment variable. But it was fine before.

I like the idea of this change but I think the pointer type is a big gotcha and limit the usage a lot

@maxisam The code you posted did not work before this change (or ever) either. Please see the following replit based on viper v1.17.0: https://replit.com/@krakowski1/Viper-Automatic-Env#main.go

Before this change you needed to call BindEnv for every key. Now it is required for pointer type fields only because of the way mapstructure decoding works (which is what I mentioned as a workaround).

@maxisam
Copy link

maxisam commented Dec 15, 2023

@krakowski it did work before. I had an unit test for that. I load config first and load env variable. I meant not the test code I post here but the real code in my repo.

@maxisam
Copy link

maxisam commented Dec 15, 2023

@sagikazarmark Thanks for explaining. I hope your PR will work. In the meantime I will just use <1.8.0 with a workaround.
Also you points to my repo not @xsteadfastx

@preslavrachev
Copy link

Released v1.18.0 with this change.

Has this been made publicly available? In the code, I am seeing a check, which in my case defaults to false:

const BindStruct = false

How do I turn this on within my project?

@preslavrachev
Copy link

preslavrachev commented Dec 28, 2023

Whoever arrives here looking for how to enable this feature, you need to add the tags=viper_bind_struct option when running go build, go run, or go test. This is rather unfortunate, as it now needs me to create makefile to ensure that my app is started correctly (unfortunately, Go does not have default build options, as to my knowledge).

You can still make your life easier by enabling those build flags in your VS Code configuration too:

{
  "gopls": {
    "build.buildFlags": ["-tags=viper_bind_struct"]
  },
  "go.buildFlags": ["-tags=viper_bind_struct"],
  "go.testFlags": ["-tags=viper_bind_struct"]
}

@sagikazarmark any idea on whether this feature will be enabled by default in future releases?

@poundifdef
Copy link

@preslavrachev There is much more context for why this was put behind a build flag here: #1706

Basically, that code caused regressions in specific cases and so it was put behind a flag until it is fully backwards-compatible.

github-merge-queue bot pushed a commit to infratographer/x that referenced this pull request Apr 2, 2024
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [github.com/spf13/viper](https://togithub.com/spf13/viper) | `v1.16.0`
-> `v1.18.2` |
[![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fspf13%2fviper/v1.18.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/go/github.com%2fspf13%2fviper/v1.18.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/go/github.com%2fspf13%2fviper/v1.16.0/v1.18.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fspf13%2fviper/v1.16.0/v1.18.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>spf13/viper (github.com/spf13/viper)</summary>

### [`v1.18.2`](https://togithub.com/spf13/viper/releases/tag/v1.18.2)

[Compare
Source](https://togithub.com/spf13/viper/compare/v1.18.1...v1.18.2)

**tl;dr Skip 1.18.0 and 1.18.1 and upgrade to this version instead.**

This release fixes a regression that appears in rare circumstances when
using `Unmarshal` or `UnmarshalExact` to decode values onto pointers
with multiple indirection (eg. pointer to a pointer, etc). The change
was introduced in 1.18.0 as a means to resolve a long-standing bug when
decoding environment variables to structs.

The feature is now disabled by default and can be enabled using the
`viper_bind_struct` build tag. It's also considered experimental at this
point, so breaking changes may be introduced in the future.

#### What's Changed

##### Bug Fixes 🐛

- feat!: hide struct binding behind a feature flag by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1715

**Full Changelog**:
spf13/viper@v1.18.1...v1.18.2

### [`v1.18.1`](https://togithub.com/spf13/viper/releases/tag/v1.18.1)

[Compare
Source](https://togithub.com/spf13/viper/compare/v1.18.0...v1.18.1)

<!-- Release notes generated using configuration in .github/release.yml
at v1.18.1 -->

#### What's Changed

##### Bug Fixes 🐛

- Merge missing struct keys inside UnmarshalExact by
[@&#8203;krakowski](https://togithub.com/krakowski) in
[spf13/viper#1704

**Full Changelog**:
spf13/viper@v1.18.0...v1.18.1

### [`v1.18.0`](https://togithub.com/spf13/viper/releases/tag/v1.18.0)

[Compare
Source](https://togithub.com/spf13/viper/compare/v1.17.0...v1.18.0)

#### Major changes

Highlighting some of the changes for better visibility.

Please share your feedback in the Discussion forum. Thanks! ❤️

##### `AutomaticEnv` works with `Unmarshal`

Previously, environment variables that weren't bound manually or had no
defaults could not be mapped by `Unmarshal`. (The problem is explained
in details in this issue:
[#&#8203;761](https://togithub.com/spf13/viper/issues/761))

[#&#8203;1429](https://togithub.com/spf13/viper/issues/1429) introduced
a solution that solves that issue.

#### What's Changed

##### Enhancements 🚀

- chore: rename files according to enabled build tags by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1642
- test: replace ifs with asserts to simplify tests by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1656
- ci: enable test shuffle and fix tests by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1643
- fix: gocritic lint issues by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1696

##### Bug Fixes 🐛

- Implement viper.BindStruct for automatic unmarshalling from
environment variables by
[@&#8203;krakowski](https://togithub.com/krakowski) in
[spf13/viper#1429
- fix isPathShadowedInFlatMap type cast bug by
[@&#8203;linuxsong](https://togithub.com/linuxsong) in
[spf13/viper#1585

##### Dependency Updates ⬆️

- build(deps): bump github/codeql-action from 2.21.9 to 2.22.3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1661
- build(deps): bump golang.org/x/net from 0.15.0 to 0.17.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1659
- build(deps): bump actions/checkout from 4.1.0 to 4.1.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1663
- build(deps): bump actions/github-script from 6.4.1 to 7.0.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1686
- build(deps): bump github/codeql-action from 2.22.3 to 2.22.8 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1688
- build(deps): bump github.com/spf13/afero from 1.10.0 to 1.11.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1692
- build(deps): bump actions/dependency-review-action from 3.1.0 to 3.1.4
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1690
- build(deps): bump cachix/install-nix-action from 23 to 24 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1689
- build(deps): bump github.com/nats-io/nkeys from 0.4.5 to 0.4.6 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1672
- build(deps): bump github.com/spf13/cast from 1.5.1 to 1.6.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1691
- build(deps): bump github.com/fsnotify/fsnotify from 1.6.0 to 1.7.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1668
- chore: update dependencies by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1694
- chore: update crypt by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1701

##### Other Changes

- Add info about multiple hosts for remote config by
[@&#8203;KaymeKaydex](https://togithub.com/KaymeKaydex) in
[spf13/viper#1684
- refactor: drop fsonitfy wrapper by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1693
- Note Get\* behavior on parse failure by
[@&#8203;scop](https://togithub.com/scop) in
[spf13/viper#1687
- fix: godot lint issues by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1657

#### New Contributors

- [@&#8203;KaymeKaydex](https://togithub.com/KaymeKaydex) made their
first contribution in
[spf13/viper#1684
- [@&#8203;krakowski](https://togithub.com/krakowski) made their first
contribution in
[spf13/viper#1429
- [@&#8203;linuxsong](https://togithub.com/linuxsong) made their first
contribution in
[spf13/viper#1585

**Full Changelog**:
spf13/viper@v1.17.0...v1.18.0

### [`v1.17.0`](https://togithub.com/spf13/viper/releases/tag/v1.17.0)

[Compare
Source](https://togithub.com/spf13/viper/compare/v1.16.0...v1.17.0)

#### Major changes

Highlighting some of the changes for better visibility.

Please share your feedback in the Discussion forum. Thanks! ❤️

##### Minimum Go version: 1.19

Viper now requires Go 1.19

This change ensures we can stay up to date with modern practices and
dependencies.

##### `log/slog` support **\[BREAKING]**

Viper [v1.11.0](https://togithub.com/spf13/viper/releases/tag/v1.11.0)
added an experimental `Logger` interface to allow custom implementations
(besides
[jwalterweatherman](https://togithub.com/spf13/jwalterweatherman)).

In addition, it also exposed an experimental `WithLogger` function
allowing to set a custom logger.

This release deprecates that interface in favor of
[log/slog](https://pkg.go.dev/log/slog) released in Go 1.21.

> \[!WARNING]
> `WithLogger` accepts an
[\*slog.Logger](https://pkg.go.dev/log/slog#Logger) from now on.

To preserve backwards compatibility with older Go versions, prior to Go
1.21 Viper accepts a
[\*golang.org/x/exp/slog.Logger](https://pkg.go.dev/golang.org/x/exp/slog#Logger).

The experimental flag is removed.

##### New finder implementation **\[BREAKING]**

As of this release, Viper uses a new library to look for files, called
[locafero](https://togithub.com/sagikazarmark/locafero).

The new library is better covered by tests and has been built from
scratch as a general purpose file finder library.

The implementation is experimental and is hidden behind a `finder` build
tag.

> \[!WARNING]
> The `io/fs` based implementation (that used to be hidden behind a
`finder` build tag) has been removed.

#### What's Changed

##### Exciting New Features 🎉

- Add NATS support by [@&#8203;hooksie1](https://togithub.com/hooksie1)
in
[spf13/viper#1590
- Add slog support by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1627

##### Enhancements 🚀

- chore: add local development environment using nix by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1572
- feat: add func GetEnvPrefix by
[@&#8203;baruchiro](https://togithub.com/baruchiro) in
[spf13/viper#1565
- Improve dev env by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1575
- fix: code optimization by
[@&#8203;testwill](https://togithub.com/testwill) in
[spf13/viper#1557
- test: remove not needed testutil.Setenv by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1610
- new finder library based on afero by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1625
- refactor: make use of `strings.Cut` by
[@&#8203;scop](https://togithub.com/scop) in
[spf13/viper#1650

##### Breaking Changes 🛠

- feat: drop support for Go 1.17 by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1574

##### Dependency Updates ⬆️

- build(deps): bump mheap/github-action-required-labels from 4 to 5 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1563
- build(deps): bump github.com/stretchr/testify from 1.8.3 to 1.8.4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1558
- build(deps): bump cachix/install-nix-action from 21 to 22 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1573
- build(deps): bump github.com/pelletier/go-toml/v2 from 2.0.8 to 2.0.9
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1586
- chore: upgrade crypt by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1589
- build(deps): bump actions/checkout from 3.5.3 to 4.0.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1616
- build(deps): bump github/codeql-action from 2.21.2 to 2.21.5 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1615
- build(deps): bump github.com/pelletier/go-toml/v2 from 2.0.9 to 2.1.0
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1614
- build(deps): bump actions/dependency-review-action from 3.0.6 to 3.0.8
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1605
- build(deps): bump golangci/golangci-lint-action from 3.6.0 to 3.7.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1604
- build(deps): bump actions/setup-go from 4.0.1 to 4.1.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1593
- build(deps): bump github.com/subosito/gotenv from 1.4.2 to 1.6.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1603
- build(deps): bump cachix/install-nix-action from 22 to 23 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1620
- chore(deps): update crypt by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1621
- build(deps): bump actions/dependency-review-action from 3.0.8 to 3.1.0
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1623
- Bump minimum Go version to 1.19 by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1626
- build(deps): bump github/codeql-action from 2.21.5 to 2.21.6 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1632
- build(deps): bump github/codeql-action from 2.21.6 to 2.21.7 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1634
- build(deps): bump actions/checkout from 4.0.0 to 4.1.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1641
- build(deps): bump github.com/spf13/afero from 1.9.5 to 1.10.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1640
- build(deps): bump github/codeql-action from 2.21.7 to 2.21.8 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1638
- build(deps): bump github/codeql-action from 2.21.8 to 2.21.9 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/viper#1648
- chore(deps): update crypt by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1652

##### Other Changes

- \[StepSecurity] ci: Harden GitHub Actions by
[@&#8203;step-security-bot](https://togithub.com/step-security-bot) in
[spf13/viper#1592
- Add Vitess to list of projects using Viper by
[@&#8203;systay](https://togithub.com/systay) in
[spf13/viper#1619
- docs: fix typos in comments by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1609
- ci: add Go 1.21 to the test matrix by
[@&#8203;sagikazarmark](https://togithub.com/sagikazarmark) in
[spf13/viper#1622
- Remove usages of deprecated io/ioutil; simplify viper tests by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1631
- chore: remove deprecated build tags by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1630
- refactor: replace 'interface{}' with 'any' by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1646
- test: refactor asserts by
[@&#8203;alexandear](https://togithub.com/alexandear) in
[spf13/viper#1644
- docs: add set subset KV example by
[@&#8203;yhliyr](https://togithub.com/yhliyr) in
[spf13/viper#1647
- Make deps fixes by [@&#8203;bersace](https://togithub.com/bersace) in
[spf13/viper#1628

#### New Contributors

- [@&#8203;goldeneggg](https://togithub.com/goldeneggg) made their first
contribution in
[spf13/viper#1561
- [@&#8203;baruchiro](https://togithub.com/baruchiro) made their first
contribution in
[spf13/viper#1565
- [@&#8203;testwill](https://togithub.com/testwill) made their first
contribution in
[spf13/viper#1557
- [@&#8203;step-security-bot](https://togithub.com/step-security-bot)
made their first contribution in
[spf13/viper#1592
- [@&#8203;systay](https://togithub.com/systay) made their first
contribution in
[spf13/viper#1619
- [@&#8203;alexandear](https://togithub.com/alexandear) made their first
contribution in
[spf13/viper#1609
- [@&#8203;hooksie1](https://togithub.com/hooksie1) made their first
contribution in
[spf13/viper#1590
- [@&#8203;yhliyr](https://togithub.com/yhliyr) made their first
contribution in
[spf13/viper#1647
- [@&#8203;bersace](https://togithub.com/bersace) made their first
contribution in
[spf13/viper#1628
- [@&#8203;scop](https://togithub.com/scop) made their first
contribution in
[spf13/viper#1650

**Full Changelog**:
spf13/viper@v1.16.0...v1.17.0

</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, 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/infratographer/x).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4wLjMiLCJ1cGRhdGVkSW5WZXIiOiIzNy4yNjkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment