mirror of
				https://gitea.com/Lydanne/buildx.git
				synced 2025-11-04 18:13:42 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			36 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			36 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
//go:build windows
 | 
						|
// +build windows
 | 
						|
 | 
						|
package system
 | 
						|
 | 
						|
import (
 | 
						|
	"path/filepath"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"github.com/pkg/errors"
 | 
						|
)
 | 
						|
 | 
						|
// CheckSystemDriveAndRemoveDriveLetter verifies and manipulates a Windows path.
 | 
						|
// This is used, for example, when validating a user provided path in docker cp.
 | 
						|
// If a drive letter is supplied, it must be the system drive. The drive letter
 | 
						|
// is always removed. Also, it translates it to OS semantics (IOW / to \). We
 | 
						|
// need the path in this syntax so that it can ultimately be contatenated with
 | 
						|
// a Windows long-path which doesn't support drive-letters. Examples:
 | 
						|
// C:			--> Fail
 | 
						|
// C:\			--> \
 | 
						|
// a			--> a
 | 
						|
// /a			--> \a
 | 
						|
// d:\			--> Fail
 | 
						|
func CheckSystemDriveAndRemoveDriveLetter(path string) (string, error) {
 | 
						|
	if len(path) == 2 && string(path[1]) == ":" {
 | 
						|
		return "", errors.Errorf("No relative path specified in %q", path)
 | 
						|
	}
 | 
						|
	if !filepath.IsAbs(path) || len(path) < 2 {
 | 
						|
		return filepath.FromSlash(path), nil
 | 
						|
	}
 | 
						|
	if string(path[1]) == ":" && !strings.EqualFold(string(path[0]), "c") {
 | 
						|
		return "", errors.New("The specified path is not on the system drive (C:)")
 | 
						|
	}
 | 
						|
	return filepath.FromSlash(path[2:]), nil
 | 
						|
}
 |