os: fix os.real_path on Windows (#8822)
							parent
							
								
									745b40c0a3
								
							
						
					
					
						commit
						6a752512b2
					
				| 
						 | 
					@ -275,6 +275,8 @@ fn C._wgetcwd() int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn C._fullpath() int
 | 
					fn C._fullpath() int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn C.GetFullPathName(voidptr, u32, voidptr, voidptr) u32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn C.GetCommandLine() voidptr
 | 
					fn C.GetCommandLine() voidptr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn C.LocalFree()
 | 
					fn C.LocalFree()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -744,23 +744,32 @@ pub fn getwd() string {
 | 
				
			||||||
// NB: this particular rabbit hole is *deep* ...
 | 
					// NB: this particular rabbit hole is *deep* ...
 | 
				
			||||||
[manualfree]
 | 
					[manualfree]
 | 
				
			||||||
pub fn real_path(fpath string) string {
 | 
					pub fn real_path(fpath string) string {
 | 
				
			||||||
	mut fullpath := vcalloc(max_path_len)
 | 
						mut fullpath := byteptr(0)
 | 
				
			||||||
	defer {
 | 
						defer {
 | 
				
			||||||
		unsafe { free(fullpath) }
 | 
							unsafe { free(fullpath) }
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	mut ret := charptr(0)
 | 
					
 | 
				
			||||||
	$if windows {
 | 
						$if windows {
 | 
				
			||||||
		ret = charptr(C._fullpath(charptr(fullpath), charptr(fpath.str), max_path_len))
 | 
							fullpath = unsafe { &u16(vcalloc(max_path_len * 2)) }
 | 
				
			||||||
 | 
							// TODO: check errors if path len is not enough
 | 
				
			||||||
 | 
							ret := C.GetFullPathName(fpath.to_wide(), max_path_len, fullpath, 0)
 | 
				
			||||||
		if ret == 0 {
 | 
							if ret == 0 {
 | 
				
			||||||
			return fpath
 | 
								return fpath
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} $else {
 | 
						} $else {
 | 
				
			||||||
		ret = charptr(C.realpath(charptr(fpath.str), charptr(fullpath)))
 | 
							fullpath = vcalloc(max_path_len)
 | 
				
			||||||
 | 
							ret := charptr(C.realpath(charptr(fpath.str), charptr(fullpath)))
 | 
				
			||||||
		if ret == 0 {
 | 
							if ret == 0 {
 | 
				
			||||||
			return fpath
 | 
								return fpath
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	res := unsafe { fullpath.vstring() }
 | 
					
 | 
				
			||||||
 | 
						mut res := ''
 | 
				
			||||||
 | 
						$if windows {
 | 
				
			||||||
 | 
							res = unsafe { string_from_wide(fullpath) }
 | 
				
			||||||
 | 
						} $else {
 | 
				
			||||||
 | 
							res = unsafe { fullpath.vstring() }
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	nres := normalize_drive_letter(res)
 | 
						nres := normalize_drive_letter(res)
 | 
				
			||||||
	cres := nres.clone()
 | 
						cres := nres.clone()
 | 
				
			||||||
	return cres
 | 
						return cres
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -271,6 +271,10 @@ fn test_cp_all() {
 | 
				
			||||||
	os.cp_all('ex', './', true) or { panic(err) }
 | 
						os.cp_all('ex', './', true) or { panic(err) }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn test_realpath() {
 | 
				
			||||||
 | 
						assert os.real_path('') == ''
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn test_tmpdir() {
 | 
					fn test_tmpdir() {
 | 
				
			||||||
	t := os.temp_dir()
 | 
						t := os.temp_dir()
 | 
				
			||||||
	assert t.len > 0
 | 
						assert t.len > 0
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue