mirror of
https://github.com/opentofu/opentofu.git
synced 2026-02-11 14:53:34 -05:00
Some checks are pending
build / Build for freebsd_386 (push) Waiting to run
build / Build for linux_386 (push) Waiting to run
build / Build for openbsd_386 (push) Waiting to run
build / Build for windows_386 (push) Waiting to run
build / Build for freebsd_amd64 (push) Waiting to run
build / Build for linux_amd64 (push) Waiting to run
build / Build for openbsd_amd64 (push) Waiting to run
build / Build for solaris_amd64 (push) Waiting to run
build / Build for windows_amd64 (push) Waiting to run
build / Build for freebsd_arm (push) Waiting to run
build / Build for linux_arm (push) Waiting to run
build / Build for linux_arm64 (push) Waiting to run
build / Build for darwin_amd64 (push) Waiting to run
build / Build for darwin_arm64 (push) Waiting to run
build / End-to-end Tests for linux_386 (push) Waiting to run
build / End-to-end Tests for windows_386 (push) Waiting to run
build / End-to-end Tests for darwin_amd64 (push) Waiting to run
build / End-to-end Tests for linux_amd64 (push) Waiting to run
build / End-to-end Tests for windows_amd64 (push) Waiting to run
Quick Checks / List files changed for pull request (push) Waiting to run
Quick Checks / Unit tests for linux_386 (push) Blocked by required conditions
Quick Checks / Unit tests for linux_amd64 (push) Blocked by required conditions
Quick Checks / Unit tests for windows_amd64 (push) Blocked by required conditions
Quick Checks / Unit tests for linux_arm (push) Blocked by required conditions
Quick Checks / Unit tests for darwin_arm64 (push) Blocked by required conditions
Quick Checks / Unit tests for linux_arm64 (push) Blocked by required conditions
Quick Checks / Race Tests (push) Blocked by required conditions
Quick Checks / End-to-end Tests (push) Blocked by required conditions
Quick Checks / Code Consistency Checks (push) Blocked by required conditions
Quick Checks / License Checks (push) Waiting to run
Website checks / List files changed for pull request (push) Waiting to run
Website checks / Build (push) Blocked by required conditions
Website checks / Test Installation Instructions (push) Blocked by required conditions
Signed-off-by: Diogenes Fernandes <diofeher@gmail.com> Signed-off-by: Diógenes Fernandes <diofeher@gmail.com> Co-authored-by: Martin Atkins <mart@degeneration.co.uk>
45 lines
1.6 KiB
Go
45 lines
1.6 KiB
Go
// Copyright (c) The OpenTofu Authors
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
// Copyright (c) 2023 HashiCorp, Inc.
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
//go:build windows
|
|
|
|
package replacefile
|
|
|
|
import (
|
|
"os"
|
|
"syscall"
|
|
|
|
"golang.org/x/sys/windows"
|
|
)
|
|
|
|
// AtomicRename renames from the source path to the destination path,
|
|
// atomically replacing any file that might already exist at the destination.
|
|
//
|
|
// Typically this operation can succeed only if the source and destination
|
|
// are within the same physical filesystem, so this function is best reserved
|
|
// for cases where the source and destination exist in the same directory and
|
|
// only the local filename differs between them.
|
|
func AtomicRename(source, destination string) error {
|
|
// On Windows, renaming one file over another is not atomic and certain
|
|
// error conditions can result in having only the source file and nothing
|
|
// at the destination file. Instead, we need to call into the MoveFileEx
|
|
// Windows API function, setting two flags to opt in to replacing an
|
|
// existing file.
|
|
srcPtr, err := syscall.UTF16PtrFromString(source)
|
|
if err != nil {
|
|
return &os.LinkError{Op: "replace", Old: source, New: destination, Err: err}
|
|
}
|
|
destPtr, err := syscall.UTF16PtrFromString(destination)
|
|
if err != nil {
|
|
return &os.LinkError{Op: "replace", Old: source, New: destination, Err: err}
|
|
}
|
|
|
|
flags := uint32(windows.MOVEFILE_REPLACE_EXISTING | windows.MOVEFILE_WRITE_THROUGH)
|
|
err = windows.MoveFileEx(srcPtr, destPtr, flags)
|
|
if err != nil {
|
|
return &os.LinkError{Op: "replace", Old: source, New: destination, Err: err}
|
|
}
|
|
return nil
|
|
}
|