mirror of https://github.com/restic/restic.git
fs: move getVolumePathName function
This commit is contained in:
parent
b3b173a47c
commit
4052a5927c
|
@ -8,7 +8,6 @@ import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
|
||||||
"syscall"
|
"syscall"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
|
@ -299,20 +298,3 @@ func pathSupportsExtendedAttributes(path string) (supported bool, err error) {
|
||||||
supported = (fileSystemFlags & windows.FILE_SUPPORTS_EXTENDED_ATTRIBUTES) != 0
|
supported = (fileSystemFlags & windows.FILE_SUPPORTS_EXTENDED_ATTRIBUTES) != 0
|
||||||
return supported, nil
|
return supported, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// getVolumePathName returns the volume path name for the given path.
|
|
||||||
func getVolumePathName(path string) (volumeName string, err error) {
|
|
||||||
utf16Path, err := windows.UTF16PtrFromString(path)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
// Get the volume path (e.g., "D:")
|
|
||||||
var volumePath [windows.MAX_PATH + 1]uint16
|
|
||||||
err = windows.GetVolumePathName(utf16Path, &volumePath[0], windows.MAX_PATH+1)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
// Trim any trailing backslashes
|
|
||||||
volumeName = strings.TrimRight(windows.UTF16ToString(volumePath[:]), "\\")
|
|
||||||
return volumeName, nil
|
|
||||||
}
|
|
||||||
|
|
|
@ -10,7 +10,6 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
|
||||||
"syscall"
|
"syscall"
|
||||||
"testing"
|
"testing"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
@ -278,46 +277,3 @@ func TestPathSupportsExtendedAttributes(t *testing.T) {
|
||||||
t.Error("Expected an error for non-existent path, but got nil")
|
t.Error("Expected an error for non-existent path, but got nil")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGetVolumePathName(t *testing.T) {
|
|
||||||
tempDirVolume := filepath.VolumeName(os.TempDir())
|
|
||||||
testCases := []struct {
|
|
||||||
name string
|
|
||||||
path string
|
|
||||||
expectedPrefix string
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "Root directory",
|
|
||||||
path: os.Getenv("SystemDrive") + `\`,
|
|
||||||
expectedPrefix: os.Getenv("SystemDrive"),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Nested directory",
|
|
||||||
path: os.Getenv("SystemDrive") + `\Windows\System32`,
|
|
||||||
expectedPrefix: os.Getenv("SystemDrive"),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Temp directory",
|
|
||||||
path: os.TempDir() + `\`,
|
|
||||||
expectedPrefix: tempDirVolume,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tc := range testCases {
|
|
||||||
t.Run(tc.name, func(t *testing.T) {
|
|
||||||
volumeName, err := getVolumePathName(tc.path)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("Unexpected error: %v", err)
|
|
||||||
}
|
|
||||||
if !strings.HasPrefix(volumeName, tc.expectedPrefix) {
|
|
||||||
t.Errorf("Expected volume name to start with %s, but got %s", tc.expectedPrefix, volumeName)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test with an invalid path
|
|
||||||
_, err := getVolumePathName("Z:\\NonExistentPath")
|
|
||||||
if err == nil {
|
|
||||||
t.Error("Expected an error for non-existent path, but got nil")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -423,6 +423,23 @@ func checkAndStoreEASupport(path string) (isEASupportedVolume bool, err error) {
|
||||||
return isEASupportedVolume, err
|
return isEASupportedVolume, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// getVolumePathName returns the volume path name for the given path.
|
||||||
|
func getVolumePathName(path string) (volumeName string, err error) {
|
||||||
|
utf16Path, err := windows.UTF16PtrFromString(path)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
// Get the volume path (e.g., "D:")
|
||||||
|
var volumePath [windows.MAX_PATH + 1]uint16
|
||||||
|
err = windows.GetVolumePathName(utf16Path, &volumePath[0], windows.MAX_PATH+1)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
// Trim any trailing backslashes
|
||||||
|
volumeName = strings.TrimRight(windows.UTF16ToString(volumePath[:]), "\\")
|
||||||
|
return volumeName, nil
|
||||||
|
}
|
||||||
|
|
||||||
// isVolumePath returns whether a path refers to a volume
|
// isVolumePath returns whether a path refers to a volume
|
||||||
func isVolumePath(path string) (bool, error) {
|
func isVolumePath(path string) (bool, error) {
|
||||||
volName, err := prepareVolumeName(path)
|
volName, err := prepareVolumeName(path)
|
||||||
|
|
|
@ -533,3 +533,46 @@ func getOSVolumeGUIDPath(t *testing.T) string {
|
||||||
|
|
||||||
return windows.UTF16ToString(volumeGUID[:])
|
return windows.UTF16ToString(volumeGUID[:])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetVolumePathName(t *testing.T) {
|
||||||
|
tempDirVolume := filepath.VolumeName(os.TempDir())
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
path string
|
||||||
|
expectedPrefix string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "Root directory",
|
||||||
|
path: os.Getenv("SystemDrive") + `\`,
|
||||||
|
expectedPrefix: os.Getenv("SystemDrive"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Nested directory",
|
||||||
|
path: os.Getenv("SystemDrive") + `\Windows\System32`,
|
||||||
|
expectedPrefix: os.Getenv("SystemDrive"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Temp directory",
|
||||||
|
path: os.TempDir() + `\`,
|
||||||
|
expectedPrefix: tempDirVolume,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
volumeName, err := getVolumePathName(tc.path)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Unexpected error: %v", err)
|
||||||
|
}
|
||||||
|
if !strings.HasPrefix(volumeName, tc.expectedPrefix) {
|
||||||
|
t.Errorf("Expected volume name to start with %s, but got %s", tc.expectedPrefix, volumeName)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test with an invalid path
|
||||||
|
_, err := getVolumePathName("Z:\\NonExistentPath")
|
||||||
|
if err == nil {
|
||||||
|
t.Error("Expected an error for non-existent path, but got nil")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue