
Add `crosspath.ToNative(path)`, which returns the path with platform- native path separators. This is meant for use in the Worker, to convert paths before attempting to use them.
96 lines
2.9 KiB
Go
96 lines
2.9 KiB
Go
// Package crosspath deals with file/directory paths in a cross-platform way.
|
|
//
|
|
// This package tries to understand Windows paths on UNIX and vice versa.
|
|
// Returned paths may be using forward slashes as separators.
|
|
package crosspath
|
|
|
|
/* ***** BEGIN GPL LICENSE BLOCK *****
|
|
*
|
|
* Original Code Copyright (C) 2022 Blender Foundation.
|
|
*
|
|
* This file is part of Flamenco.
|
|
*
|
|
* Flamenco is free software: you can redistribute it and/or modify it under
|
|
* the terms of the GNU General Public License as published by the Free Software
|
|
* Foundation, either version 3 of the License, or (at your option) any later
|
|
* version.
|
|
*
|
|
* Flamenco is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
* A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with
|
|
* Flamenco. If not, see <https://www.gnu.org/licenses/>.
|
|
*
|
|
* ***** END GPL LICENSE BLOCK ***** */
|
|
|
|
import (
|
|
"fmt"
|
|
path_module "path" // import under other name so that parameters can be called 'path'
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
// Base returns the last element of path. Trailing slashes are removed before
|
|
// extracting the last element. If the path is empty, Base returns ".". If the
|
|
// path consists entirely of slashes, Base returns "/".
|
|
func Base(path string) string {
|
|
slashed := ToSlash(path)
|
|
return path_module.Base(slashed)
|
|
}
|
|
|
|
// Dir returns all but the last element of path, typically the path's directory.
|
|
// If the path is empty, Dir returns ".".
|
|
func Dir(path string) string {
|
|
if path == "" {
|
|
return "."
|
|
}
|
|
|
|
slashed := ToSlash(path)
|
|
|
|
// Don't use path.Dir(), as that cleans up the path and removes double
|
|
// slashes. However, Windows UNC paths start with double blackslashes, which
|
|
// will translate to double slashes and should not be removed.
|
|
dir, _ := path_module.Split(slashed)
|
|
switch {
|
|
case dir == "":
|
|
return "."
|
|
case len(dir) > 1:
|
|
// Remove trailing slash.
|
|
return dir[:len(dir)-1]
|
|
default:
|
|
return dir
|
|
}
|
|
}
|
|
|
|
func Join(elem ...string) string {
|
|
return ToSlash(path_module.Join(elem...))
|
|
}
|
|
|
|
// Stem returns the filename without extension.
|
|
func Stem(path string) string {
|
|
base := Base(path)
|
|
ext := path_module.Ext(base)
|
|
return base[:len(base)-len(ext)]
|
|
}
|
|
|
|
// ToSlash replaces all backslashes with forward slashes.
|
|
// Contrary to filepath.ToSlash(), this also happens on Linux; it does not
|
|
// expect `path` to be in platform-native notation.
|
|
func ToSlash(path string) string {
|
|
return strings.ReplaceAll(path, "\\", "/")
|
|
}
|
|
|
|
// ToNative replaces all path separators (forward and backward slashes) with the
|
|
// platform-native separator.
|
|
func ToNative(path string) string {
|
|
switch filepath.Separator {
|
|
case '/':
|
|
return ToSlash(path)
|
|
case '\\':
|
|
return strings.ReplaceAll(path, "/", "\\")
|
|
default:
|
|
panic(fmt.Sprintf("this platform has an unknown path separator: %q", filepath.Separator))
|
|
}
|
|
}
|