From 514184cc9df36d6aaa5ebbd45b081a4f689aac05 Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Wed, 11 Mar 2020 17:53:19 -0700 Subject: [PATCH] internal/getproviders: Functions to determine installation directories The existing functionality in this package deals with finding packages that are either available for installation or already installed. In order to support installation we also need to determine the location where a package should be installed. This lives in the getproviders package because that way all of the logic related to the filesystem layout for local provider directories lives together here where they can be maintained together more easily in future. --- internal/getproviders/filesystem_search.go | 14 ++++++++++++++ internal/getproviders/types.go | 11 +++++++++++ 2 files changed, 25 insertions(+) diff --git a/internal/getproviders/filesystem_search.go b/internal/getproviders/filesystem_search.go index ff10acf461..55857f4c13 100644 --- a/internal/getproviders/filesystem_search.go +++ b/internal/getproviders/filesystem_search.go @@ -204,3 +204,17 @@ func SearchLocalDirectory(baseDir string) (map[addrs.Provider]PackageMetaList, e } return ret, nil } + +// UnpackedDirectoryPathForPackage is similar to +// PackageMeta.UnpackedDirectoryPath but makes its decision based on +// individually-passed provider address, version, and target platform so that +// it can be used by callers outside this package that may have other +// types that represent package identifiers. +func UnpackedDirectoryPathForPackage(baseDir string, provider addrs.Provider, version Version, platform Platform) string { + return filepath.ToSlash(filepath.Join( + baseDir, + provider.Hostname.ForDisplay(), provider.Namespace, provider.Type, + version.String(), + platform.String(), + )) +} diff --git a/internal/getproviders/types.go b/internal/getproviders/types.go index ac41b20e1d..c675cd0073 100644 --- a/internal/getproviders/types.go +++ b/internal/getproviders/types.go @@ -133,6 +133,17 @@ func (m PackageMeta) LessThan(other PackageMeta) bool { } } +// UnpackedDirectoryPath determines the path under the given base +// directory where SearchLocalDirectory or the FilesystemMirrorSource would +// expect to find an unpacked copy of the receiving PackageMeta. +// +// The result always uses forward slashes as path separator, even on Windows, +// to produce a consistent result on all platforms. Windows accepts both +// direction of slash as long as each individual path string is self-consistent. +func (m PackageMeta) UnpackedDirectoryPath(baseDir string) string { + return UnpackedDirectoryPathForPackage(baseDir, m.Provider, m.Version, m.TargetPlatform) +} + // PackageLocation represents a location where a provider distribution package // can be obtained. A value of this type contains one of the following // concrete types: PackageLocalArchive, PackageLocalDir, or PackageHTTPURL.