Prevously OpenTofu's provider installer would try to install a package even
if there was already a directory there which doesn't match the package
contents. That's effective in making us more likely to end up with a
working provider cache directory, but risks clobbering a package directory
that the operator intentionally modified for some reason.
We'll now require that if an existing directory (or symlink to one) is
present at the place where we'd need to put our cache entry then its
contents must already match what we're trying to install, thereby making
this a no-op. If the existing contents don't match then we'll fail with an
error to let the operator decide whether they need to keep something from
their modified directory before deleting it.
In earlier versions of OpenTofu, silently replacing an existing directory
was actually sometimes done intentionally to ensure that the cache would
definitely match the dependency lock file, but we no longer need to do that
because as of OpenTofu v1.12 the provider installer now exits early
(without downloading anything at all) if a matching package is already
present, so we never end up trying to replace a package that was already
present on disk unless it's the case we're now trying to catch as an error
here.
The handling of this is in PackageLocalArchive because the two
network-based location types (HTTP archive and OCI blob archive) work by
first fetching the archive to a temporary local location and then asking
the local archive location to finish the installation.
This is covered by e2etests rather than a unit test because successfully
hitting this error requires both the "providercache" and "getproviders"
packages to cooperate to let execution reach this late step without any
earlier code doing an early exit due to the directory already being
present. The e2etest runs through that entire codepath to make sure we
reach the error message we're expecting to reach.
Signed-off-by: Martin Atkins <mart@degeneration.co.uk>