aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/cmd/tools/vself.v
diff options
context:
space:
mode:
Diffstat (limited to 'v_windows/v/cmd/tools/vself.v')
-rw-r--r--v_windows/v/cmd/tools/vself.v88
1 files changed, 88 insertions, 0 deletions
diff --git a/v_windows/v/cmd/tools/vself.v b/v_windows/v/cmd/tools/vself.v
new file mode 100644
index 0000000..5c8d1d2
--- /dev/null
+++ b/v_windows/v/cmd/tools/vself.v
@@ -0,0 +1,88 @@
+module main
+
+import os
+import os.cmdline
+import v.pref
+import v.util.recompilation
+
+const is_debug = os.args.contains('-debug')
+
+fn main() {
+ vexe := pref.vexe_path()
+ vroot := os.dir(vexe)
+ recompilation.must_be_enabled(vroot, 'Please install V from source, to use `v self` .')
+ os.chdir(vroot) ?
+ os.setenv('VCOLORS', 'always', true)
+ args := os.args[1..].filter(it != 'self')
+ jargs := args.join(' ')
+ obinary := cmdline.option(args, '-o', '')
+ sargs := if obinary != '' { jargs } else { '$jargs -o v2' }
+ cmd := '$vexe $sargs cmd/v'
+ options := if args.len > 0 { '($sargs)' } else { '' }
+ println('V self compiling ${options}...')
+ compile(vroot, cmd)
+ if obinary != '' {
+ // When -o was given, there is no need to backup/rename the original.
+ // The user just wants an independent copy of v, and so we are done.
+ return
+ }
+ backup_old_version_and_rename_newer() or { panic(err.msg) }
+ println('V built successfully!')
+}
+
+fn compile(vroot string, cmd string) {
+ result := os.execute_or_exit(cmd)
+ if result.exit_code != 0 {
+ eprintln('cannot compile to `$vroot`: \n$result.output')
+ exit(1)
+ }
+ if result.output.len > 0 {
+ println(result.output.trim_space())
+ }
+}
+
+fn list_folder(bmessage string, message string) {
+ if !is_debug {
+ return
+ }
+ if bmessage != '' {
+ println(bmessage)
+ }
+ if os.user_os() == 'windows' {
+ os.system('dir v*.exe')
+ } else {
+ os.system('ls -lartd v*')
+ }
+ println(message)
+}
+
+fn backup_old_version_and_rename_newer() ?bool {
+ mut errors := []string{}
+ short_v_file := if os.user_os() == 'windows' { 'v.exe' } else { 'v' }
+ short_v2_file := if os.user_os() == 'windows' { 'v2.exe' } else { 'v2' }
+ short_bak_file := if os.user_os() == 'windows' { 'v_old.exe' } else { 'v_old' }
+ v_file := os.real_path(short_v_file)
+ v2_file := os.real_path(short_v2_file)
+ bak_file := os.real_path(short_bak_file)
+
+ list_folder('before:', 'removing $bak_file ...')
+ if os.exists(bak_file) {
+ os.rm(bak_file) or { errors << 'failed removing $bak_file: $err.msg' }
+ }
+
+ list_folder('', 'moving $v_file to $bak_file ...')
+ os.mv(v_file, bak_file) or { errors << err.msg }
+
+ list_folder('', 'removing $v_file ...')
+ os.rm(v_file) or {}
+
+ list_folder('', 'moving $v2_file to $v_file ...')
+ os.mv_by_cp(v2_file, v_file) or { panic(err.msg) }
+
+ list_folder('after:', '')
+
+ if errors.len > 0 {
+ eprintln('backup errors:\n >> ' + errors.join('\n >> '))
+ }
+ return true
+}