diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b9cf028bcd..869e76d462 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,6 +2,23 @@ name: CI on: [push, pull_request] jobs: + v-fmt: + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@v2 + - name: getting all branch metainfo from github + run: | + git fetch --no-tags --prune --depth=1 origin +refs/heads/*:refs/remotes/origin/* + echo "Changed files compared to origin/master are:" && git diff --name-status origin/master HEAD -- '*.v' + - name: Build v (there is no need for dependencies for fmt) + run: make -j4 + - name: Build a production tools/vfmt + run: ./v -prod -d vfmt tools/vfmt.v + - name: fmt only the changed files (from master) + run: git diff --name-status origin/master HEAD -- '*.v' |grep -v '^D'|cut -f2- | xargs ./v fmt -diff + - name: Run v test-fmt + run: ./v test-fmt + ubuntu-tcc: runs-on: ubuntu-18.04 env: diff --git a/.gitignore b/.gitignore index 08c7c39ea8..bcb4d2551f 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ fns.txt /tools/vrepl /tools/vtest /tools/vtest-compiler +/tools/vtest-fmt /tools/vfmt /tools/vup /tools/vpm @@ -26,6 +27,7 @@ fns.txt /v_prod_g *.exe *.o +*.so .*.c *.tmp.c vjs diff --git a/tools/vtest-compiler.v b/tools/vtest-compiler.v index ed37558e86..af5579645d 100644 --- a/tools/vtest-compiler.v +++ b/tools/vtest-compiler.v @@ -17,21 +17,13 @@ fn main() { v_test_compiler(args_string.all_before('test-compiler')) } -fn v_test_compiler(vargs string){ - v_test_compiler2(vargs) - //make_sure_vfmt_was_run() -} - -fn v_test_compiler2(vargs string){ - +fn v_test_compiler(vargs string) { vexe := testing.vexe_path() parent_dir := filepath.dir(vexe) - testing.vlib_should_be_present( parent_dir ) - + testing.vlib_should_be_present(parent_dir) // Changing the current directory is needed for some of the compiler tests, // compiler/tests/local_test.v and compiler/tests/repl/repl_test.v - os.chdir( parent_dir ) - + os.chdir(parent_dir) /* if !os.exists(parent_dir + '/v.v') { eprintln('v.v is missing, it must be next to the V executable') @@ -50,22 +42,16 @@ fn v_test_compiler2(vargs string){ eprintln('v.c can be compiled without warnings. This is good :)') } } - building_tools_failed := testing.v_build_failing(vargs, 'tools') - eprintln('\nTesting all _test.v files...') - mut compiler_test_session := testing.new_test_session( vargs ) + mut compiler_test_session := testing.new_test_session(vargs) compiler_test_session.files << os.walk_ext(parent_dir, '_test.v') compiler_test_session.test() - eprintln( compiler_test_session.benchmark.total_message('running V tests') ) - + eprintln(compiler_test_session.benchmark.total_message('running V tests')) eprintln('') building_examples_failed := testing.v_build_failing(vargs, 'examples') - eprintln('') - building_live_failed := testing.v_build_failing(vargs + '-live', - filepath.join( 'examples', 'hot_reload')) - + building_live_failed := testing.v_build_failing(vargs + '-live', filepath.join('examples','hot_reload')) eprintln('') v_module_install_cmd := '$vexe install nedpals.args' eprintln('\nInstalling a v module with: $v_module_install_cmd ') @@ -78,25 +64,8 @@ fn v_test_compiler2(vargs string){ eprintln('v failed to install a test module') } vmark.stop() - eprintln( 'Installing a v module took: ' + vmark.total_duration().str() + 'ms') - - make_sure_vfmt_was_run() - - if building_tools_failed || - compiler_test_session.failed || - building_examples_failed || - building_live_failed { + eprintln('Installing a v module took: ' + vmark.total_duration().str() + 'ms') + if building_tools_failed || compiler_test_session.failed || building_examples_failed || building_live_failed { exit(1) } - -} - -fn make_sure_vfmt_was_run() { - files := os.walk_ext('.', '_test.v') - for file in files { - println(file) - os.exec('./vfmt $file') or { - println('$file failed') - } - } } diff --git a/tools/vtest-fmt.v b/tools/vtest-fmt.v new file mode 100644 index 0000000000..7b9e7e394c --- /dev/null +++ b/tools/vtest-fmt.v @@ -0,0 +1,66 @@ +module main + +import ( + os + testing + benchmark +) + +fn main() { + args := os.args + args_string := args[1..].join(' ') + v_test_formatting(args_string.all_before('test-fmt')) +} + +fn v_test_formatting(vargs string) { + // NB: vfmt have to be build with '-d vfmt' . V itself knows about this, + // and v will rebuild tools/vfmt, if it is missing. + // Removing the binaries below is needed, since the building tools step + // rebuilds all the tools without the special option needed by vfmt + // by simply compiling each of them with `v tools/{toolname}.v` + // os.rm('tools/vfmt') + // os.rm('tools/vfmt.exe') + mut files_able_to_be_formatted := []string + all_test_files := os.walk_ext('.', '.v') + known_failing_exceptions := ['./examples/vweb/vweb_example.v', + './tools/gen_vc.v', + './tutorials/code/blog/article.v', + './tutorials/code/blog/blog.v', + './vlib/arrays/arrays.v', + './vlib/arrays/arrays_test.v', + './vlib/builtin/js/hashmap.v', + './vlib/compiler/tests/fn_variadic_test.v', + './vlib/compiler/tests/generic_test.v', + './vlib/compiler/preludes/live_main.v', + './vlib/compiler/preludes/live_shared.v', + './vlib/compiler/preludes/tests_assertions.v', + './vlib/compiler/preludes/tests_with_stats.v', + './vlib/crypto/aes/aes.v', + './vlib/crypto/aes/aes_cbc.v', + './vlib/crypto/aes/block_generic.v', + './vlib/crypto/aes/const.v', + './vlib/crypto/aes/cypher_generic.v', + './vlib/crypto/rc4/rc4.v', + './vlib/eventbus/eventbus_test.v', + './vlib/flag/flag.v', + './vlib/os/bare/bare_example_linux.v', + './vlib/szip/szip.v', + './vlib/ui/examples/users_gui/users.v', + './vlib/vweb/assets/assets.v', + './vlib/vweb/vweb.v', + ] + for tfile in all_test_files { + if tfile in known_failing_exceptions { + continue + } + files_able_to_be_formatted << tfile + } + eprintln('Run "v fmt" over all .v files') + mut vfmt_test_session := testing.new_test_session('$vargs fmt') + vfmt_test_session.files << files_able_to_be_formatted + vfmt_test_session.test() + eprintln(vfmt_test_session.benchmark.total_message('running vfmt over V test files')) + if vfmt_test_session.benchmark.nfail > 0 { + panic('\nWARNING: v fmt failed ${vfmt_test_session.benchmark.nfail} times.\n') + } +} diff --git a/v.v b/v.v index 8e2ba5f823..384472dcc4 100644 --- a/v.v +++ b/v.v @@ -13,7 +13,7 @@ import ( const ( known_commands = ['run', 'build', 'version', 'doc'] - simple_tools = ['fmt', 'up', 'create', 'test', 'test-compiler', 'build-tools', 'build-examples', 'build-vbinaries'] + simple_tools = ['fmt', 'up', 'create', 'test', 'test-fmt', 'test-compiler', 'build-tools', 'build-examples', 'build-vbinaries'] ) fn main() { diff --git a/vlib/builtin/hashmap/hashmap.v b/vlib/builtin/hashmap/hashmap.v index 5475d753d8..d3e779b2a8 100644 --- a/vlib/builtin/hashmap/hashmap.v +++ b/vlib/builtin/hashmap/hashmap.v @@ -36,7 +36,7 @@ const ( const( fnv64_prime = 1099511628211 - fnv64_offset_basis = u64(14695981039346656037) + fnv64_offset_basis = 14695981039346656037 ) const( diff --git a/vlib/os2/keep_vfmt_happy.v b/vlib/os2/keep_vfmt_happy.v new file mode 100644 index 0000000000..b0955216c7 --- /dev/null +++ b/vlib/os2/keep_vfmt_happy.v @@ -0,0 +1,2 @@ +//this keeps vfmt happy +module os2 diff --git a/vlib/sdl/examples/tvintris/tvintris.v b/vlib/sdl/examples/tvintris/tvintris.v index 02b33d4bff..cca201a6c4 100644 --- a/vlib/sdl/examples/tvintris/tvintris.v +++ b/vlib/sdl/examples/tvintris/tvintris.v @@ -7,6 +7,7 @@ module main +import filepath import rand import time import os diff --git a/vlib/sdl/ttf/ttf.v b/vlib/sdl/ttf/ttf.v index 8559d49b1c..8a1d4df742 100644 --- a/vlib/sdl/ttf/ttf.v +++ b/vlib/sdl/ttf/ttf.v @@ -1,5 +1,7 @@ module ttf +import sdl + #include [typedef] @@ -132,4 +134,5 @@ fn C.TTF_CloseFont(font &TTF_Font) pub const ( version = '0.0.1' + sdl_version = sdl.version // TODO: remove this hack to mark sdl as used; avoids warning )