terraform/internal/replacefile
Martin Atkins 2332a7ab47 replacefile: don't create the temporary file in TMPDIR
ioutil.TempFile has a special case where an empty string for its dir
argument is interpreted as a request to automatically look up the system
temporary directory, which is commonly /tmp .

We don't want that behavior here because we're specifically trying to
create the temporary file in the same directory as the file we're hoping
to replace. If the file gets created in /tmp then it might be on a
different device and thus the later atomic rename won't work.

Instead, we'll add our own special case to explicitly use "." when the
given filename is in the current working directory. That overrides the
special automatic behavior of ioutil.TempFile and thus forces the
behavior we need.

This hadn't previously mattered for earlier callers of this code because
they were creating files in subdirectories, but this codepath was failing
for the dependency lock file due to it always being created directly
in the current working directory.

Unfortunately since this is a picky implementation detail I couldn't find
a good way to write a unit test for it without considerable refactoring.
Instead, I verified manually that the temporary filename wasn't in /tmp on
my Linux system, and hope that the comment inline will explain this
situation well enough to avoid an accidental regression in future
maintenence.
2020-10-20 16:29:59 -07:00
..
doc.go internal/depsfile: Factor out our atomic file replacement logic 2020-10-14 08:01:19 -07:00
replacefile_unix.go internal/depsfile: Factor out our atomic file replacement logic 2020-10-14 08:01:19 -07:00
replacefile_windows.go internal/depsfile: Factor out our atomic file replacement logic 2020-10-14 08:01:19 -07:00
writefile.go replacefile: don't create the temporary file in TMPDIR 2020-10-20 16:29:59 -07:00