1
0
mirror of https://github.com/golang/go synced 2024-11-15 02:30:31 -07:00

os: use filepathlite.VolumeName

It is better to have a single implementation of VolumeName, which is
quite tricky to get right on Windows.

Change-Id: Ibba82dd71fe10b594cb6f782582430aa422e7078
Reviewed-on: https://go-review.googlesource.com/c/go/+/582499
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Damien Neil <dneil@google.com>
Run-TryBot: Quim Muntal <quimmuntal@gmail.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
This commit is contained in:
qmuntal 2024-04-30 14:41:49 +02:00 committed by Damien Neil
parent d95fa7aca7
commit 5616ab6025
5 changed files with 5 additions and 50 deletions

View File

@ -292,10 +292,10 @@ func Symlink(oldname, newname string) error {
// need the exact location of the oldname when it's relative to determine if it's a directory // need the exact location of the oldname when it's relative to determine if it's a directory
destpath := oldname destpath := oldname
if v := volumeName(oldname); v == "" { if v := filepathlite.VolumeName(oldname); v == "" {
if len(oldname) > 0 && IsPathSeparator(oldname[0]) { if len(oldname) > 0 && IsPathSeparator(oldname[0]) {
// oldname is relative to the volume containing newname. // oldname is relative to the volume containing newname.
if v = volumeName(newname); v != "" { if v = filepathlite.VolumeName(newname); v != "" {
// Prepend the volume explicitly, because it may be different from the // Prepend the volume explicitly, because it may be different from the
// volume of the current working directory. // volume of the current working directory.
destpath = v + oldname destpath = v + oldname

View File

@ -5,6 +5,7 @@
package os package os
import ( import (
"internal/filepathlite"
"syscall" "syscall"
) )
@ -43,7 +44,7 @@ func MkdirAll(path string, perm FileMode) error {
// If there is a parent directory, and it is not the volume name, // If there is a parent directory, and it is not the volume name,
// recurse to ensure parent directory exists. // recurse to ensure parent directory exists.
if parent := path[:i]; len(parent) > len(volumeName(path)) { if parent := path[:i]; len(parent) > len(filepathlite.VolumeName(path)) {
err = MkdirAll(parent, perm) err = MkdirAll(parent, perm)
if err != nil { if err != nil {
return err return err

View File

@ -13,7 +13,3 @@ const (
func IsPathSeparator(c uint8) bool { func IsPathSeparator(c uint8) bool {
return PathSeparator == c return PathSeparator == c
} }
func volumeName(p string) string {
return ""
}

View File

@ -69,7 +69,3 @@ func splitPath(path string) (string, string) {
return dirname, basename return dirname, basename
} }
func volumeName(p string) string {
return ""
}

View File

@ -45,44 +45,6 @@ func basename(name string) string {
return name return name
} }
func volumeName(path string) (v string) {
if len(path) < 2 {
return ""
}
// with drive letter
c := path[0]
if path[1] == ':' &&
('0' <= c && c <= '9' || 'a' <= c && c <= 'z' ||
'A' <= c && c <= 'Z') {
return path[:2]
}
// is it UNC
if l := len(path); l >= 5 && IsPathSeparator(path[0]) && IsPathSeparator(path[1]) &&
!IsPathSeparator(path[2]) && path[2] != '.' {
// first, leading `\\` and next shouldn't be `\`. its server name.
for n := 3; n < l-1; n++ {
// second, next '\' shouldn't be repeated.
if IsPathSeparator(path[n]) {
n++
// third, following something characters. its share name.
if !IsPathSeparator(path[n]) {
if path[n] == '.' {
break
}
for ; n < l; n++ {
if IsPathSeparator(path[n]) {
break
}
}
return path[:n]
}
break
}
}
}
return ""
}
func fromSlash(path string) string { func fromSlash(path string) string {
// Replace each '/' with '\\' if present // Replace each '/' with '\\' if present
var pathbuf []byte var pathbuf []byte
@ -106,7 +68,7 @@ func fromSlash(path string) string {
} }
func dirname(path string) string { func dirname(path string) string {
vol := volumeName(path) vol := filepathlite.VolumeName(path)
i := len(path) - 1 i := len(path) - 1
for i >= len(vol) && !IsPathSeparator(path[i]) { for i >= len(vol) && !IsPathSeparator(path[i]) {
i-- i--