os.exec: return ?string instead of string
							parent
							
								
									1470b3da11
								
							
						
					
					
						commit
						28147c0930
					
				|  | @ -261,7 +261,10 @@ fn build_thirdparty_obj_file(flag string) { | |||
| 		}  | ||||
| 	}  | ||||
| 	cc := if os.user_os() == 'windows' { 'gcc' } else { 'cc' } // TODO clang support on Windows  
 | ||||
| 	res := os.exec('$cc -fPIC -c -o $obj_path $cfiles')  | ||||
| 	res := os.exec('$cc -fPIC -c -o $obj_path $cfiles') or { | ||||
| 		panic(err) | ||||
| 		return // TODO remove return
 | ||||
| 	} | ||||
| 	println(res)  | ||||
| }  | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										108
									
								
								compiler/main.v
								
								
								
								
							
							
						
						
									
										108
									
								
								compiler/main.v
								
								
								
								
							|  | @ -137,11 +137,17 @@ fn main() { | |||
| 			println('Building vget...')  | ||||
| 			os.chdir(vroot + '/tools')  | ||||
| 			vexec := os.args[0]  | ||||
| 			os.exec('$vexec vget.v')  | ||||
| 			_ := os.exec('$vexec vget.v') or { | ||||
| 				panic(err) | ||||
| 				return // TODO remove return
 | ||||
| 			} | ||||
| 			println('Done.')  | ||||
| 		}  | ||||
| 		println('Installing module ${mod}...')  | ||||
| 		os.exec('$vget $mod')  | ||||
| 		_ := os.exec('$vget $mod') or { | ||||
| 			panic(err) | ||||
| 			return // TODO remove return
 | ||||
| 		} | ||||
| 		return  | ||||
| 	}  | ||||
| 	// TODO quit if the compiler is too old 
 | ||||
|  | @ -871,7 +877,19 @@ mut args := '' | |||
| 	} | ||||
| 	// Run
 | ||||
| 	ticks := time.ticks()  | ||||
| 	res := os.exec(cmd) | ||||
| 	_ := os.exec(cmd) or { | ||||
| 		if v.pref.is_debug { | ||||
| 			println(err) | ||||
| 		} else { | ||||
| 			print(err.limit(200)) | ||||
| 			if err.len > 200 { | ||||
| 				println('...\n(Use `v -debug` to print the entire error message)\n') | ||||
| 			} | ||||
| 		} | ||||
| 		panic('C error. This should never happen. ' + | ||||
| 			'Please create a GitHub issue: https://github.com/vlang/v/issues/new/choose')
 | ||||
| 		return // TODO remove return
 | ||||
| 	} | ||||
| 	diff := time.ticks() - ticks  | ||||
| 	// Print the C command
 | ||||
| 	if v.pref.show_c_cmd || v.pref.is_verbose { | ||||
|  | @ -880,18 +898,6 @@ mut args := '' | |||
| 		println('cc took $diff ms')  | ||||
| 		println('=========\n') | ||||
| 	} | ||||
| 	if res.contains('error: ') { | ||||
| 		if v.pref.is_debug {  | ||||
| 			println(res) | ||||
| 		} else { | ||||
| 			print(res.limit(200))  | ||||
| 			if res.len > 200 {  | ||||
| 				println('...\n(Use `v -debug` to print the entire error message)\n')    | ||||
| 			}  | ||||
| 		}  | ||||
| 		panic('C error. This should never happen. ' + | ||||
| 			'Please create a GitHub issue: https://github.com/vlang/v/issues/new/choose')
 | ||||
| 	} | ||||
| 	// Link it if we are cross compiling and need an executable
 | ||||
| 	if v.os == .linux && !linux_host && v.pref.build_mode != .build { | ||||
| 		v.out_name = v.out_name.replace('.o', '') | ||||
|  | @ -905,11 +911,11 @@ mut args := '' | |||
| 		'/usr/lib/x86_64-linux-gnu/crti.o ' + | ||||
| 		obj_file + | ||||
| 		' /usr/lib/x86_64-linux-gnu/libc.so ' + | ||||
| 		'/usr/lib/x86_64-linux-gnu/crtn.o') | ||||
| 		println(ress) | ||||
| 		if ress.contains('error:') { | ||||
| 			exit(1) | ||||
| 		'/usr/lib/x86_64-linux-gnu/crtn.o') or { | ||||
| 			panic(err) | ||||
| 			return // TODO remove return
 | ||||
| 		} | ||||
| 		println(ress) | ||||
| 		println('linux cross compilation done. resulting binary: "$v.out_name"') | ||||
| 	} | ||||
| 	if !v.pref.is_debug && v.out_name_c != 'v.c' && v.out_name_c != 'v_macos.c' { | ||||
|  | @ -1315,22 +1321,13 @@ fn run_repl() []string { | |||
| 		if line.starts_with('print') { | ||||
| 			source_code := lines.join('\n') + '\n' + line  | ||||
| 			os.write_file(file, source_code) | ||||
| 			s := os.exec('$vexe run $file -repl') | ||||
| 			mut vals := s.split('\n') | ||||
| 			if s.contains('panic: ') { | ||||
| 				if !s.contains('declared and not used') 	{ | ||||
| 					for i:=1; i<vals.len; i++ { | ||||
| 						println(vals[i]) | ||||
| 					}  | ||||
| 				} | ||||
| 				else { | ||||
| 					println(s) | ||||
| 				} | ||||
| 			s := os.exec('$vexe run $file -repl') or { | ||||
| 				panic(err) | ||||
| 				break // TODO remove break
 | ||||
| 			} | ||||
| 			else { | ||||
| 				for i:=0; i < vals.len; i++ { | ||||
| 					println(vals[i]) | ||||
| 				} | ||||
| 			vals := s.split('\n') | ||||
| 			for i:=0; i < vals.len; i++ { | ||||
| 				println(vals[i]) | ||||
| 			} | ||||
| 		} | ||||
| 		else { | ||||
|  | @ -1342,24 +1339,14 @@ fn run_repl() []string { | |||
| 			} | ||||
| 			temp_source_code := lines.join('\n') + '\n' + temp_line | ||||
| 			os.write_file(temp_file, temp_source_code) | ||||
| 			s := os.exec('$vexe run $temp_file -repl') | ||||
| 			if s.contains('panic: ') { | ||||
| 				if !s.contains('declared and not used') 	{ | ||||
| 					mut vals := s.split('\n') | ||||
| 					for i:=0; i < vals.len; i++ { | ||||
| 						println(vals[i]) | ||||
| 					}  | ||||
| 				} | ||||
| 				else { | ||||
| 					lines << line | ||||
| 				} | ||||
| 			s := os.exec('$vexe run $temp_file -repl') or { | ||||
| 				panic(err) | ||||
| 				break // TODO remove break
 | ||||
| 			} | ||||
| 			else { | ||||
| 				lines << line | ||||
| 				vals := s.split('\n') | ||||
| 				for i:=0; i<vals.len-1; i++ { | ||||
| 					println(vals[i]) | ||||
| 				}  | ||||
| 			lines << line | ||||
| 			vals := s.split('\n') | ||||
| 			for i:=0; i<vals.len-1; i++ { | ||||
| 				println(vals[i]) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | @ -1418,15 +1405,24 @@ fn env_vflags_and_os_args() []string { | |||
| fn update_v() { | ||||
| 	println('Updating V...')  | ||||
| 	vroot := os.dir(os.executable())  | ||||
| 	mut s := os.exec('git -C "$vroot" pull --rebase origin master')  | ||||
| 	s := os.exec('git -C "$vroot" pull --rebase origin master') or { | ||||
| 		panic(err) | ||||
| 		return // TODO remove return
 | ||||
| 	} | ||||
| 	println(s)  | ||||
| 	$if windows {  | ||||
| 		os.mv('$vroot/v.exe', '$vroot/v_old.exe')  | ||||
| 		s = os.exec('$vroot/make.bat')  | ||||
| 		println(s)  | ||||
| 		s2 := os.exec('$vroot/make.bat') or { | ||||
| 			panic(err) | ||||
| 			return // TODO remove return
 | ||||
| 		} | ||||
| 		println(s2)  | ||||
| 	} $else {  | ||||
| 		s = os.exec('make -C "$vroot"')  | ||||
| 		println(s)  | ||||
| 		s2 := os.exec('make -C "$vroot"') or { | ||||
| 			panic(err) | ||||
| 			return // TODO remove return
 | ||||
| 		} | ||||
| 		println(s2)  | ||||
| 	}  | ||||
| }  | ||||
| 
 | ||||
|  |  | |||
|  | @ -134,7 +134,10 @@ fn find_vs() ?VsInstallation { | |||
| 	// VSWhere is guaranteed to be installed at this location now
 | ||||
| 	// If its not there then end user needs to update their visual studio 
 | ||||
| 	// installation!
 | ||||
| 	res := os.exec('""%ProgramFiles(x86)%\\Microsoft Visual Studio\\Installer\\vswhere.exe" -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath"') | ||||
| 	res := os.exec('""%ProgramFiles(x86)%\\Microsoft Visual Studio\\Installer\\vswhere.exe" -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath"') or { | ||||
| 		panic(err) | ||||
| 		return error(err)// TODO remove return
 | ||||
| 	} | ||||
| 	// println('res: "$res"')
 | ||||
| 
 | ||||
| 	version := os.read_file('$res\\VC\\Auxiliary\\Build\\Microsoft.VCToolsVersion.default.txt') or { | ||||
|  | @ -341,13 +344,13 @@ pub fn (v mut V) cc_msvc() { | |||
| 
 | ||||
| 	// println('$cmd')
 | ||||
| 
 | ||||
| 	res := os.exec(cmd) | ||||
| 	_ := os.exec(cmd) or { | ||||
| 		println(err) | ||||
| 		panic('msvc error') | ||||
| 		return // TODO remove return
 | ||||
| 	} | ||||
| 	// println(res)
 | ||||
| 	// println('C OUTPUT:')
 | ||||
| 	if res.contains('error') { | ||||
| 		println(res) | ||||
| 		panic('msvc error') | ||||
| 	} | ||||
| 
 | ||||
| 	if !v.pref.is_debug && v.out_name_c != 'v.c' && v.out_name_c != 'v_macos.c' { | ||||
| 		os.rm('.$v.out_name_c')  | ||||
|  | @ -386,7 +389,10 @@ fn build_thirdparty_obj_file_with_msvc(flag string) { | |||
| 
 | ||||
| 	println('$cfiles') | ||||
| 
 | ||||
| 	res := os.exec('""$msvc.exe_path\\cl.exe" /volatile:ms /Z7 $include_string /c $cfiles /Fo"$obj_path" /D_UNICODE /DUNICODE"') | ||||
| 	res := os.exec('""$msvc.exe_path\\cl.exe" /volatile:ms /Z7 $include_string /c $cfiles /Fo"$obj_path" /D_UNICODE /DUNICODE"') or { | ||||
| 		panic(err) | ||||
| 		return // TODO remove return
 | ||||
| 	} | ||||
| 	println(res) | ||||
| }  | ||||
| 
 | ||||
|  |  | |||
|  | @ -31,6 +31,7 @@ for /r . %%x in (*_test.v) do ( | |||
| goto :done | ||||
| 
 | ||||
| :fail | ||||
| echo fail | ||||
| exit /b 1 | ||||
| 
 | ||||
| :done | ||||
|  |  | |||
|  | @ -36,6 +36,9 @@ fn main() { | |||
| 	os.mkdir('.vmodules')  | ||||
| 	println('Done.')  | ||||
| 	}  | ||||
| 	os.exec('git -C "$home/.vmodules" clone --depth=1 $mod.url ' + mod.name.replace('.', '/')) | ||||
| 	_ := os.exec('git -C "$home/.vmodules" clone --depth=1 $mod.url ' + mod.name.replace('.', '/')) or { | ||||
| 		panic(err) | ||||
| 		return // TODO remove return
 | ||||
| 	} | ||||
| 	println(s)  | ||||
| }  | ||||
|  |  | |||
							
								
								
									
										22
									
								
								vlib/os/os.v
								
								
								
								
							
							
						
						
									
										22
									
								
								vlib/os/os.v
								
								
								
								
							|  | @ -336,21 +336,33 @@ fn popen(path string) *FILE { | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn pclose(f *FILE) int { | ||||
| 	$if windows { | ||||
| 		return C._pclose(f) | ||||
| 	} | ||||
| 	$else { | ||||
| 		return C.pclose(f) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // exec starts the specified command, waits for it to complete, and returns its output.
 | ||||
| pub fn exec(_cmd string) string { | ||||
| pub fn exec(_cmd string) ?string { | ||||
| 	cmd := '$_cmd 2>&1' | ||||
| 	f := popen(cmd) | ||||
| 	if isnil(f) { | ||||
| 		// TODO optional or error code 
 | ||||
| 		println('popen $cmd failed') | ||||
| 		return ''  | ||||
| 		return error('popen $cmd failed') | ||||
| 	} | ||||
| 	buf := [1000]byte  | ||||
| 	mut res := '' | ||||
| 	for C.fgets(buf, 1000, f) != 0 {  | ||||
| 		res += tos(buf, strlen(buf))  | ||||
| 	} | ||||
| 	return res.trim_space() | ||||
| 	res = res.trim_space() | ||||
| 	status_code := pclose(f)/256 | ||||
| 	if status_code != 0 { | ||||
| 		return error(res) | ||||
| 	} | ||||
| 	return res | ||||
| } | ||||
| 
 | ||||
| // `getenv` returns the value of the environment variable named by the key.
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue