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:
parent
d95fa7aca7
commit
5616ab6025
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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 ""
|
|
||||||
}
|
|
||||||
|
@ -69,7 +69,3 @@ func splitPath(path string) (string, string) {
|
|||||||
|
|
||||||
return dirname, basename
|
return dirname, basename
|
||||||
}
|
}
|
||||||
|
|
||||||
func volumeName(p string) string {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
@ -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--
|
||||||
|
Loading…
Reference in New Issue
Block a user