command: Fix terraform init -from-module with relative paths
Since our new approach here works by installing with a synthetic module configuration block, we need to treat relative paths as a special case for two reasons: - Relative paths in module addresses are relative to the file containing the call rather than the working directory, but -from-module uses the working directory (and the call is in a synthetic "file" anyway) - We need to force Terraform to pass the path through to go-getter rather than just treating it as a relative reference, since we really do want a copy of the directory in this case, even if it is local. To address both of these things, we'll detect a relative path and turn it into an absolute path before beginning installation. This is a bit hacky, but this is consistent with the general philosophy of the -from-module implementation where it does hacky things so that the rest of the installer code can be spared of dealing with its special cases. This is covered by a couple of existing tests that run init -from-module, including TestInit_fromModule_dstInSrc which now passes.
This commit is contained in:
parent
8b603e4877
commit
f001cb8654
|
@ -127,6 +127,23 @@ func (l *Loader) InitDirFromModule(rootDir, sourceAddr string, hooks InstallHook
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -from-module allows relative paths but it's different than a normal
|
||||||
|
// module address where it'd be resolved relative to the module call
|
||||||
|
// (which is synthetic, here.) To address this, we'll just patch up any
|
||||||
|
// relative paths to be absolute paths before we run, ensuring we'll
|
||||||
|
// get the right result. This also, as an important side-effect, ensures
|
||||||
|
// that the result will be "downloaded" with go-getter (copied from the
|
||||||
|
// source location), rather than just recorded as a relative path.
|
||||||
|
{
|
||||||
|
maybePath := filepath.ToSlash(sourceAddr)
|
||||||
|
if maybePath == "." || strings.HasPrefix(maybePath, "./") || strings.HasPrefix(maybePath, "../") {
|
||||||
|
if wd, err := os.Getwd(); err == nil {
|
||||||
|
sourceAddr = filepath.Join(wd, sourceAddr)
|
||||||
|
log.Printf("[TRACE] -from-module relative path rewritten to absolute path %s", sourceAddr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Now we need to create an artificial root module that will seed our
|
// Now we need to create an artificial root module that will seed our
|
||||||
// installation process.
|
// installation process.
|
||||||
fakeRootModule := &configs.Module{
|
fakeRootModule := &configs.Module{
|
||||||
|
|
Loading…
Reference in New Issue