From 242d7d0fc073e1124dad05b629fe9375ae4ddb6f Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Wed, 27 Jan 2021 23:58:13 +0200 Subject: [PATCH] tools: improve error diagnostic for `v up` and `v self`. Make `v self` more robust. --- cmd/tools/vself.v | 13 +++++++++---- cmd/tools/vup.v | 34 ++++++++++++++-------------------- vlib/v/util/util.v | 8 ++++++++ 3 files changed, 31 insertions(+), 24 deletions(-) diff --git a/cmd/tools/vself.v b/cmd/tools/vself.v index 6f7552e750..16a3218fb0 100644 --- a/cmd/tools/vself.v +++ b/cmd/tools/vself.v @@ -40,13 +40,18 @@ fn compile(vroot string, cmd string) { } } -fn backup_old_version_and_rename_newer() ? { +fn backup_old_version_and_rename_newer() ?bool { + mut errors := []string{} v_file := if os.user_os() == 'windows' { 'v.exe' } else { 'v' } v2_file := if os.user_os() == 'windows' { 'v2.exe' } else { 'v2' } bak_file := if os.user_os() == 'windows' { 'v_old.exe' } else { 'v_old' } if os.exists(bak_file) { - os.rm(bak_file) ? + os.rm(bak_file) or { errors << 'failed removing $bak_file: $err' } } - os.mv(v_file, bak_file) ? - os.mv(v2_file, v_file) ? + os.mv(v_file, bak_file) or { errors << err } + os.mv(v2_file, v_file) or { errors << err } + if errors.len > 0 { + return error('backup errors:\n >> ' + errors.join('\n >> ')) + } + return true } diff --git a/cmd/tools/vup.v b/cmd/tools/vup.v index 225e48f782..3130049444 100644 --- a/cmd/tools/vup.v +++ b/cmd/tools/vup.v @@ -43,10 +43,14 @@ fn main() { app.show_current_v_version() } -fn (app App) update_from_master() { +fn (app App) vprintln(s string) { if app.is_verbose { - println('> updating from master ...') + println(s) } +} + +fn (app App) update_from_master() { + app.vprintln('> updating from master ...') if !os.exists('.git') { // initialize as if it had been cloned app.git_command('init') @@ -63,16 +67,14 @@ fn (app App) update_from_master() { fn (app App) recompile_v() { // NB: app.vexe is more reliable than just v (which may be a symlink) vself := '"$app.vexe" self' - if app.is_verbose { - println('> recompiling v itself with `$vself` ...') - } + app.vprintln('> recompiling v itself with `$vself` ...') if self_result := os.exec(vself) { if self_result.exit_code == 0 { println(self_result.output.trim_space()) return - } else if app.is_verbose { - println('`$vself` failed, running `make`...') - println(self_result.output.trim_space()) + } else { + app.vprintln('`$vself` failed, running `make`...') + app.vprintln(self_result.output.trim_space()) } } app.make(vself) @@ -84,9 +86,7 @@ fn (app App) make(vself string) { make = 'make.bat' } make_result := os.exec(make) or { panic(err) } - if app.is_verbose { - println(make_result.output) - } + app.vprintln(make_result.output) } fn (app App) show_current_v_version() { @@ -114,17 +114,11 @@ fn (app App) backup(file string) { } fn (app App) git_command(command string) { + app.vprintln('git_command: git $command') git_result := os.exec('git $command') or { panic(err) } if git_result.exit_code != 0 { - if git_result.output.contains('Permission denied') { - eprintln('No access to `$app.vroot`: Permission denied') - } else { - eprintln(git_result.output) - } + eprintln(git_result.output) exit(1) - } else { - if app.is_verbose { - println(git_result.output) - } } + app.vprintln(git_result.output) } diff --git a/vlib/v/util/util.v b/vlib/v/util/util.v index 4c3f2fcd19..12003a2992 100644 --- a/vlib/v/util/util.v +++ b/vlib/v/util/util.v @@ -168,6 +168,14 @@ pub fn launch_tool(is_verbose bool, tool_name string, args []string) { check_module_is_installed(emodule, is_verbose) or { panic(err) } } mut compilation_command := '"$vexe" ' + if tool_name in ['vself', 'vup', 'vdoctor', 'vsymlink'] { + // These tools will be called by users in cases where there + // is high chance of there being a problem somewhere. Thus + // it is better to always compile them with -g, so that in + // case these tools do crash/panic, their backtraces will have + // .v line numbers, to ease diagnostic in #bugs and issues. + compilation_command += ' -g ' + } compilation_command += '"$tool_source"' if is_verbose { println('Compiling $tool_name with: "$compilation_command"')