| package configload |
| |
| import ( |
| "os" |
| "path/filepath" |
| |
| "github.com/hashicorp/terraform-svchost/disco" |
| "github.com/hashicorp/terraform/internal/modsdir" |
| "github.com/hashicorp/terraform/internal/registry" |
| "github.com/spf13/afero" |
| ) |
| |
| type moduleMgr struct { |
| FS afero.Afero |
| |
| // CanInstall is true for a module manager that can support installation. |
| // |
| // This must be set only if FS is an afero.OsFs, because the installer |
| // (which uses go-getter) is not aware of the virtual filesystem |
| // abstraction and will always write into the "real" filesystem. |
| CanInstall bool |
| |
| // Dir is the path where descendent modules are (or will be) installed. |
| Dir string |
| |
| // Services is a service discovery client that will be used to find |
| // remote module registry endpoints. This object may be pre-loaded with |
| // cached discovery information. |
| Services *disco.Disco |
| |
| // Registry is a client for the module registry protocol, which is used |
| // when a module is requested from a registry source. |
| Registry *registry.Client |
| |
| // manifest tracks the currently-installed modules for this manager. |
| // |
| // The loader may read this. Only the installer may write to it, and |
| // after a set of updates are completed the installer must call |
| // writeModuleManifestSnapshot to persist a snapshot of the manifest |
| // to disk for use on subsequent runs. |
| manifest modsdir.Manifest |
| } |
| |
| func (m *moduleMgr) manifestSnapshotPath() string { |
| return filepath.Join(m.Dir, modsdir.ManifestSnapshotFilename) |
| } |
| |
| // readModuleManifestSnapshot loads a manifest snapshot from the filesystem. |
| func (m *moduleMgr) readModuleManifestSnapshot() error { |
| r, err := m.FS.Open(m.manifestSnapshotPath()) |
| if err != nil { |
| if os.IsNotExist(err) { |
| // We'll treat a missing file as an empty manifest |
| m.manifest = make(modsdir.Manifest) |
| return nil |
| } |
| return err |
| } |
| |
| m.manifest, err = modsdir.ReadManifestSnapshot(r) |
| return err |
| } |