tools/check-md: allow directories as args and deprecate -all flag (#8582)
							parent
							
								
									12e8e31bb2
								
							
						
					
					
						commit
						76ea3e7b41
					
				|  | @ -13,6 +13,6 @@ jobs: | |||
|     - name: Build V | ||||
|       run: make | ||||
|     - name: Check markdown line length & code examples | ||||
|       run: ./v run cmd/tools/check-md.v -hide-warnings -all | ||||
|       run: ./v check-md -hide-warnings . | ||||
|     ## NB: -hide-warnings is used here, so that the output is less noisy, | ||||
|     ## thus real errors are easier to spot. | ||||
|  |  | |||
							
								
								
									
										14
									
								
								TESTS.md
								
								
								
								
							
							
						
						
									
										14
									
								
								TESTS.md
								
								
								
								
							|  | @ -1,15 +1,15 @@ | |||
| # Automated tests | ||||
| 
 | ||||
| TLDR: run `v test-all` locally, after making your changes,  | ||||
| TLDR: run `v test-all` locally, after making your changes, | ||||
| and before submitting PRs. | ||||
| 
 | ||||
| ## Notes | ||||
| In the `v` repo there are several different tests. The main types are: | ||||
| 
 | ||||
| * `_test.v` tests - check that `test_` functions succeed. These can be  | ||||
| * `_test.v` tests - check that `test_` functions succeed. These can be | ||||
| run per directory or individually. | ||||
| * `.out` tests - run a `.vv` file and check the output matches the  | ||||
| contents of the `.out` file with the same base name. This is  | ||||
| * `.out` tests - run a `.vv` file and check the output matches the | ||||
| contents of the `.out` file with the same base name. This is | ||||
| particularly useful for checking that errors are printed. | ||||
| 
 | ||||
| Tip: use `v -cc tcc` when compiling tests for speed. | ||||
|  | @ -46,7 +46,7 @@ This is not required. | |||
| 
 | ||||
| Test all files in the current directory are formatted. | ||||
| 
 | ||||
| * `v run cmd/tools/check-md.v -hide-warnings -all` | ||||
| * `v check-md -hide-warnings .` | ||||
| 
 | ||||
| Ensure that all .md files in the project are formatted properly, | ||||
| and that the V code block examples in them can be compiled/formatted too. | ||||
|  | @ -75,7 +75,7 @@ This runs tests for: | |||
| ## `v test-all` | ||||
| 
 | ||||
| Test and build *everything*. Usefull to verify *locally*, that the CI will | ||||
| most likely pass. Slowest, but most comprehensive.  | ||||
| most likely pass. Slowest, but most comprehensive. | ||||
| 
 | ||||
| It works, by running these in succession: | ||||
| * `v test-cleancode` | ||||
|  | @ -83,5 +83,5 @@ It works, by running these in succession: | |||
| * `v test-fmt` | ||||
| * `v build-tools` | ||||
| * `v build-examples` | ||||
| * `v run cmd/tools/check-md.v -hide-warnings -all` | ||||
| * `v check-md -hide-warnings .` | ||||
| * `v install nedpals.args` | ||||
|  |  | |||
|  | @ -1,9 +1,13 @@ | |||
| // Copyright (c) 2019-2021 Alexander Medvednikov. All rights reserved.
 | ||||
| // Use of this source code is governed by an MIT license
 | ||||
| // that can be found in the LICENSE file.
 | ||||
| module main | ||||
| 
 | ||||
| import os | ||||
| import os.cmdline | ||||
| import rand | ||||
| import term | ||||
| import vhelp | ||||
| import v.pref | ||||
| 
 | ||||
| const ( | ||||
|  | @ -11,35 +15,19 @@ const ( | |||
| 	term_colors          = term.can_show_color_on_stderr() | ||||
| 	is_all               = '-all' in os.args | ||||
| 	hide_warnings        = '-hide-warnings' in os.args | ||||
| 	non_option_args      = cmdline.only_non_options(os.args[1..]) | ||||
| 	non_option_args      = cmdline.only_non_options(os.args[2..]) | ||||
| ) | ||||
| 
 | ||||
| fn wprintln(s string) { | ||||
| 	if !hide_warnings { | ||||
| 		println(s) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn main() { | ||||
| 	if os.args.len == 1 { | ||||
| 		println('Usage: checks the passed markdown files for correct ```v ``` code blocks, | ||||
| and for other style violations. like too long lines/links etc... | ||||
| a) `v run cmd/tools/check-md.v -all` - will check *all* .md files in the folders. | ||||
| b) `v run cmd/tools/check-md.v doc/docs.md` - will only check a single file. | ||||
| c) `v run cmd/tools/check-md.v -hide-warnings file.md` - same, but will not print warnings, only errors. | ||||
| 
 | ||||
| NB: There are several special keywords, which you can put after the code fences for v. | ||||
| These are: | ||||
| 	compile      - default, you do not need to specify it. cmd/tools/check-md.v compile the example. | ||||
| 	ignore       - ignore the example, useful for examples that just use the syntax highlighting | ||||
| 	failcompile  - known failing compilation. Useful for examples demonstrating compiler errors. | ||||
| 	oksyntax     - it should parse, it may not compile. Useful for partial examples. | ||||
| 	badsyntax    - known bad syntax, it should not even parse | ||||
| 	wip          - like ignore; a planned feature; easy to search. | ||||
| ') | ||||
| 	if non_option_args.len == 0 || '-help' in os.args { | ||||
| 		vhelp.show_topic('check-md') | ||||
| 		exit(0) | ||||
| 	} | ||||
| 	files_paths := if is_all { md_file_paths() } else { non_option_args } | ||||
| 	if is_all { | ||||
| 		println('´-all´ flag is deprecated. Please use ´v check-md .´ instead.') | ||||
| 		exit(1) | ||||
| 	} | ||||
| 	mut files_paths := non_option_args.clone() | ||||
| 	mut warnings := 0 | ||||
| 	mut errors := 0 | ||||
| 	mut oks := 0 | ||||
|  | @ -47,7 +35,12 @@ These are: | |||
| 	if term_colors { | ||||
| 		os.setenv('VCOLORS', 'always', true) | ||||
| 	} | ||||
| 	for file_path in files_paths { | ||||
| 	for i := 0; i < files_paths.len; i++ { | ||||
| 		file_path := files_paths[i] | ||||
| 		if os.is_dir(file_path) { | ||||
| 			files_paths << md_file_paths(file_path) | ||||
| 			continue | ||||
| 		} | ||||
| 		real_path := os.real_path(file_path) | ||||
| 		lines := os.read_lines(real_path) or { | ||||
| 			println('"$file_path" does not exist') | ||||
|  | @ -57,31 +50,31 @@ These are: | |||
| 		mut mdfile := MDFile{ | ||||
| 			path: file_path | ||||
| 		} | ||||
| 		for i, line in lines { | ||||
| 		for j, line in lines { | ||||
| 			if line.len > too_long_line_length { | ||||
| 				if mdfile.state == .vexample { | ||||
| 					wprintln(wline(file_path, i, line.len, 'long V example line')) | ||||
| 					wprintln(wline(file_path, j, line.len, 'long V example line')) | ||||
| 					wprintln(line) | ||||
| 					warnings++ | ||||
| 				} else if mdfile.state == .codeblock { | ||||
| 					wprintln(wline(file_path, i, line.len, 'long code block line')) | ||||
| 					wprintln(wline(file_path, j, line.len, 'long code block line')) | ||||
| 					wprintln(line) | ||||
| 					warnings++ | ||||
| 				} else if line.starts_with('|') { | ||||
| 					wprintln(wline(file_path, i, line.len, 'long table')) | ||||
| 					wprintln(wline(file_path, j, line.len, 'long table')) | ||||
| 					wprintln(line) | ||||
| 					warnings++ | ||||
| 				} else if line.contains('https') { | ||||
| 					wprintln(wline(file_path, i, line.len, 'long link')) | ||||
| 					wprintln(wline(file_path, j, line.len, 'long link')) | ||||
| 					wprintln(line) | ||||
| 					warnings++ | ||||
| 				} else { | ||||
| 					eprintln(eline(file_path, i, line.len, 'line too long')) | ||||
| 					eprintln(eline(file_path, j, line.len, 'line too long')) | ||||
| 					eprintln(line) | ||||
| 					errors++ | ||||
| 				} | ||||
| 			} | ||||
| 			mdfile.parse_line(i, line) | ||||
| 			mdfile.parse_line(j, line) | ||||
| 		} | ||||
| 		all_md_files << mdfile | ||||
| 	} | ||||
|  | @ -90,7 +83,6 @@ These are: | |||
| 		errors += new_errors | ||||
| 		oks += new_oks | ||||
| 	} | ||||
| 	// println('all_md_files: $all_md_files')
 | ||||
| 	if warnings > 0 || errors > 0 || oks > 0 { | ||||
| 		println('\nWarnings: $warnings | Errors: $errors | OKs: $oks') | ||||
| 	} | ||||
|  | @ -99,14 +91,11 @@ These are: | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn md_file_paths() []string { | ||||
| fn md_file_paths(dir string) []string { | ||||
| 	mut files_to_check := []string{} | ||||
| 	md_files := os.walk_ext('.', '.md') | ||||
| 	md_files := os.walk_ext(dir, '.md') | ||||
| 	for file in md_files { | ||||
| 		if file.starts_with('./thirdparty') { | ||||
| 			continue | ||||
| 		} | ||||
| 		if file.contains('CHANGELOG') { | ||||
| 		if file.contains_any_substr(['/thirdparty/', 'CHANGELOG']) { | ||||
| 			continue | ||||
| 		} | ||||
| 		files_to_check << file | ||||
|  | @ -114,6 +103,12 @@ fn md_file_paths() []string { | |||
| 	return files_to_check | ||||
| } | ||||
| 
 | ||||
| fn wprintln(s string) { | ||||
| 	if !hide_warnings { | ||||
| 		println(s) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn ftext(s string, cb fn (string) string) string { | ||||
| 	if term_colors { | ||||
| 		return cb(s) | ||||
|  | @ -78,7 +78,7 @@ fn get_all_commands() []Command { | |||
| 		okmsg: 'All examples can be compiled.' | ||||
| 	} | ||||
| 	res << Command{ | ||||
| 		line: '$vexe run cmd/tools/check-md.v -hide-warnings -all' | ||||
| 		line: '$vexe check-md -hide-warnings .' | ||||
| 		label: 'Check ```v ``` code examples and formatting of .MD files...' | ||||
| 		okmsg: 'All .md files look good.' | ||||
| 	} | ||||
|  |  | |||
|  | @ -0,0 +1,21 @@ | |||
| check-md is a tool to check the passed markdown files for correct ```v ``` code blocks | ||||
| and other style violations like too long lines/links etc... | ||||
| 
 | ||||
| Usage: | ||||
| 	a) `v check-md [flags] <...files>` - Check the given .md files. | ||||
| 	b) `v check-md [flags] <...dirs>`  - Check *all* files in the given directories. | ||||
| 	Note: You can also combine files and directories. | ||||
| 
 | ||||
| Flags: | ||||
| 	-hide-warnings    Do not print warnings, only errors. | ||||
| 
 | ||||
| NB: There are several special keywords, which you can put after the code fences for v. | ||||
| These are: | ||||
| 	compile      - Default, can be omitted. The example will be compiled and formatting is verified. | ||||
| 	live         - Compile hot reload examples with the ´-live´ flag set and verify formatting. | ||||
| 	ignore       - Ignore the example, useful for examples that just use the syntax highlighting | ||||
| 	failcompile  - Known failing compilation. Useful for examples demonstrating compiler errors. | ||||
| 	oksyntax     - Should parse and be formatted but may not compile. Useful for partial examples. | ||||
| 	badsyntax    - Known bad syntax, it should not even parse. | ||||
| 	wip          - Like ignore; a planned feature; easy to search. | ||||
| 	nofmt        - Disable fmt verification for individual code blocks. | ||||
|  | @ -35,7 +35,7 @@ V supports the following commands: | |||
|    list              List all installed modules. | ||||
|    outdated          Show installed modules that need updates. | ||||
| * Others: | ||||
|    doctor            Display some usefull info about your system to help reporting bugs | ||||
|    doctor            Display some usefull info about your system to help reporting bugs. | ||||
|    translate         Translate C code to V (coming soon in 0.3). | ||||
|    tracev            Produce a tracing version of the v compiler. | ||||
|                      Use `tracev yourfile.v` when the compiler panics. | ||||
|  | @ -45,4 +45,4 @@ Use "v help <command>" for more information about a command, example: `v help bu | |||
| Use "v help other" to see less frequently used commands. | ||||
| 
 | ||||
| Note: Help is required to write more help topics. | ||||
| Only build, doc, fmt, run, test, search, install, remove, update, bin2v are properly documented currently. | ||||
| Only build, doc, fmt, run, test, search, install, remove, update, bin2v, check-md are properly documented currently. | ||||
|  |  | |||
|  | @ -8,6 +8,8 @@ but which are used less frequently by users: | |||
|    build-tools        Test if all tools can be built. | ||||
|    build-vbinaries    Test if V can be built with different configuration. | ||||
| 
 | ||||
|    check-md          Check that V examples in markdown files are formatted and can compile. | ||||
| 
 | ||||
|    test-all           Run most checks, that the CI does locally. | ||||
|                       It may take over 2 minutes, and it needs internet connectivity too, | ||||
|                       because it tries to also verify that `v install` works. | ||||
|  |  | |||
|  | @ -27,6 +27,7 @@ const ( | |||
| 		'test-compiler', /* deprecated by test-self */ | ||||
| 		'test-compiler-full', /* deprecated by test-self */ | ||||
| 		'test-cleancode', | ||||
| 		'check-md', | ||||
| 		'repl', | ||||
| 		'complete', | ||||
| 		'build-tools', | ||||
|  |  | |||
|  | @ -136,8 +136,8 @@ For more details and troubleshooting, please visit the [vab GitHub repository](h | |||
| 
 | ||||
| <!-- | ||||
| NB: there are several special keywords, which you can put after the code fences for v: | ||||
| compile, ignore, failcompile, oksyntax, badsyntax, wip | ||||
| For more details, do: `v run cmd/tools/check-md.v` | ||||
| compile, live, ignore, failcompile, oksyntax, badsyntax, wip, nofmt | ||||
| For more details, do: `v check-md` | ||||
| --> | ||||
| 
 | ||||
| ## Hello World | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue