From 9ae14105c32453e5601b635bc83e6e6de9b985da Mon Sep 17 00:00:00 2001 From: Fredrik Ekre Date: Thu, 12 Dec 2024 01:35:42 +0100 Subject: [PATCH 1/2] Add --verbose command line argument This patch implements a new command line argument `--verbose` which enables verbose ouutput. Runic is now silent by default so `--verbose` re-enables the verbose file printing from previous releases. --- CHANGELOG.md | 7 +++++ README.md | 6 ++++ src/main.jl | 7 +++-- test/maintests.jl | 73 ++++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 90 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e2e762..3f90643 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased +### Added + - New command line argument `--verbose` which enables verbose output ([#121]). +### Changed + - Runic is now silent by default. Use `--verbose` to enable the verbose file progress + printing from previous releases ([#121]). + ## [v1.2.0] - 2024-12-09 ### Added - New command line option `--lines=a:b` for limiting formatting to lines `a` to `b`. diff --git a/README.md b/README.md index df8c1df..1ae8246 100644 --- a/README.md +++ b/README.md @@ -111,6 +111,12 @@ OPTIONS -o , --output= File to write formatted output to. If no output is given, or if the file is `-`, output is written to stdout. + + -v, --verbose + Enable verbose output. + + --version + Print Runic and julia version information. ``` In addition to the CLI there is also the two function `Runic.format_file` and diff --git a/src/main.jl b/src/main.jl index 131f68d..7551499 100644 --- a/src/main.jl +++ b/src/main.jl @@ -143,6 +143,9 @@ function print_help() File to write formatted output to. If no output is given, or if the file is `-`, output is written to stdout. + -v, --verbose + Enable verbose output. + --version Print Runic and julia version information. """ @@ -355,8 +358,8 @@ function main(argv) end end - # Print file info unless quiet and unless stdin and/or stdout is involved - print_progress = !(quiet || input_is_stdin || !(output.output_is_file || check)) + # Print file info if `verbose` unless piping from/to stdin/stdout + print_progress = verbose && !(input_is_stdin || !(output.output_is_file || check)) # Print file info unless quiet and unless input/output is stdin/stdout if print_progress diff --git a/test/maintests.jl b/test/maintests.jl index 571c11b..71cdae9 100644 --- a/test/maintests.jl +++ b/test/maintests.jl @@ -91,6 +91,15 @@ function maintests(f::R) where {R} write(f_in, bad) f_out = "out.jl" for argv in [["--output=$f_out", f_in], ["-o", f_out, f_in]] + rm(f_out, force = true) + rc, fd1, fd2 = runic(argv) + @test rc == 0 + @test isempty(fd1) && isempty(fd2) + @test read(f_out, String) == good + @test read(f_in, String) == bad + end + # --verbose + let argv = ["--verbose", "--output=$f_out", f_in] rm(f_out, force = true) rc, fd1, fd2 = runic(argv) @test rc == 0 @@ -107,6 +116,14 @@ function maintests(f::R) where {R} cdtmp() do f_in = "in.jl" for argv in [["--inplace", f_in], ["-i", f_in]] + write(f_in, bad) + rc, fd1, fd2 = runic(argv) + @test rc == 0 + @test isempty(fd1) && isempty(fd2) + @test read(f_in, String) == good + end + # --verbose + let argv = ["-v", "--inplace", f_in] write(f_in, bad) rc, fd1, fd2 = runic(argv) @test rc == 0 @@ -125,7 +142,14 @@ function maintests(f::R) where {R} write(f_in, good) rc, fd1, fd2 = runic(argv) @test rc == 0 - @test isempty(fd1) + @test isempty(fd1) && isempty(fd2) + @test read(f_in, String) == good + end + # --verbose + let argv = ["--verbose", "--inplace", f_in] + write(f_in, good) + rc, fd1, fd2 = runic(argv) + @test rc == 0 @test occursin("Formatting `in.jl` ...", fd2) @test occursin("✔", fd2) @test !occursin("✖", fd2) @@ -144,6 +168,15 @@ function maintests(f::R) where {R} markdownfile = "markdown.md" write(markdownfile, "this is not a Julia file") for argv in [["--inplace", "."], ["-i", "."], ["-i", ".", "src"]] + write(fgood, good) + write(fbad, bad) + rc, fd1, fd2 = runic(argv) + @test rc == 0 + @test isempty(fd1) && isempty(fd2) + @test read(fgood, String) == read(fbad, String) == good + end + # --verbose + let argv = ["-v", "--inplace", "."] write(fgood, good) write(fbad, bad) rc, fd1, fd2 = runic(argv) @@ -163,6 +196,14 @@ function maintests(f::R) where {R} cdtmp() do f_in = "in.jl" for argv in [["--check", f_in], ["-c", f_in]] + write(f_in, bad) + rc, fd1, fd2 = runic(argv) + @test rc == 1 + @test isempty(fd1) && isempty(fd2) + @test read(f_in, String) == bad + end + # --verbose + let argv = ["--verbose", "--check", f_in] write(f_in, bad) rc, fd1, fd2 = runic(argv) @test rc == 1 @@ -178,6 +219,13 @@ function maintests(f::R) where {R} cdtmp() do f_in = "in.jl" for argv in [["--check", f_in], ["-c", f_in]] + write(f_in, good) + rc, fd1, fd2 = runic(argv) + @test rc == 0 + @test isempty(fd1) && isempty(fd2) + @test read(f_in, String) == good + end + let argv = ["-v", "--check", f_in] write(f_in, good) rc, fd1, fd2 = runic(argv) @test rc == 0 @@ -200,6 +248,16 @@ function maintests(f::R) where {R} markdownfile = "markdown.md" write(markdownfile, "this is not a Julia file") for argv in [["--check", "."], ["-c", "."]] + write(fgood, good) + write(fbad, bad) + rc, fd1, fd2 = runic(argv) + @test rc == 1 + @test isempty(fd1) && isempty(fd2) + @test read(fgood, String) == good + @test read(fbad, String) == bad + end + # --verbose + let argv = ["--verbose", "--check", "."] write(fgood, good) write(fbad, bad) rc, fd1, fd2 = runic(argv) @@ -221,6 +279,19 @@ function maintests(f::R) where {R} cdtmp() do f_in = "in.jl" for argv in [["--check", "--diff", f_in], ["-c", "-d", f_in]] + write(f_in, bad) + rc, fd1, fd2 = runic(argv) + @test rc == 1 + @test isempty(fd1) + @test !occursin("Checking `in.jl` ...", fd2) + @test !occursin("✔", fd2) + @test !occursin("✖", fd2) + @test occursin("diff --git", fd2) + @test occursin("-1+1", fd2) + @test occursin("+1 + 1", fd2) + @test read(f_in, String) == bad + end + let argv = ["-v", "--check", "--diff", f_in] write(f_in, bad) rc, fd1, fd2 = runic(argv) @test rc == 1 From e3f5d040fbe2527d17a9953528e0551c4e991d59 Mon Sep 17 00:00:00 2001 From: Fredrik Ekre Date: Thu, 12 Dec 2024 11:20:24 +0100 Subject: [PATCH 2/2] Add a progress prefix in verbose mode This patch adds a progress prefix to each file of the form `[file/nfiles]` to verbose output. --- src/main.jl | 37 +++++++++++++++++++++++-------------- test/maintests.jl | 29 +++++++++++++++++++++++------ 2 files changed, 46 insertions(+), 20 deletions(-) diff --git a/src/main.jl b/src/main.jl index 7551499..37ea494 100644 --- a/src/main.jl +++ b/src/main.jl @@ -85,12 +85,15 @@ function panic( return errno end -function okln() +blue(str) = printstyled(stderr, str; color = :blue) +function okln(str) + blue(str) printstyled(stderr, "✔"; color = :green, bold = true) println(stderr) return end -function errln() +function errln(str) + blue(str) printstyled(stderr, "✖"; color = :red, bold = true) println(stderr) return @@ -316,7 +319,8 @@ function main(argv) end # Loop over the input files - for inputfile in inputfiles + nfiles_str = string(length(inputfiles)) + for (file_counter, inputfile) in enumerate(inputfiles) # Read the input if input_is_stdin @assert length(inputfiles) == 1 @@ -365,14 +369,18 @@ function main(argv) if print_progress @assert inputfile != "-" input_pretty = relpath(inputfile) + prefix = string( + "[", lpad(string(file_counter), textwidth(nfiles_str), " "), "/", + nfiles_str, "] " + ) if Sys.iswindows() input_pretty = replace(input_pretty, "\\" => "/") end if check - str = "Checking `$(input_pretty)` " + str = string(prefix, "Checking `", input_pretty, "` ") ndots = 80 - textwidth(str) - 1 - 1 dots = ndots > 0 ? "."^ndots : "" - printstyled(stderr, str * dots * " "; color = :blue) + str = string(str, dots, " ") else if output.output_is_samefile output_pretty = " " @@ -383,10 +391,10 @@ function main(argv) end output_pretty = " -> `$(output_pretty)` " end - str = "Formatting `$(input_pretty)`$(output_pretty)" + str = string(prefix, "Formatting `", input_pretty, "`", output_pretty) ndots = 80 - textwidth(str) - 1 - 1 dots = ndots > 0 ? "."^ndots : "" - printstyled(stderr, str * dots * " "; color = :blue) + str = string(str, dots, " ") end end @@ -396,7 +404,7 @@ function main(argv) format_tree!(ctx′) ctx′ catch err - print_progress && errln() + print_progress && errln(str) if err isa JuliaSyntax.ParseError panic("failed to parse input: ", err) continue @@ -424,24 +432,25 @@ function main(argv) changed = !nodes_equal(ctx.fmt_tree, ctx.src_tree) if check if changed - print_progress && errln() + print_progress && errln(str) global errno = 1 else - print_progress && okln() + print_progress && okln(str) end elseif changed || !inplace @assert output.which !== :devnull try writeo(output, seekstart(ctx.fmt_io)) catch err - print_progress && errln() + print_progress && errln(str) panic("could not write to output file `$(output.file)`: ", err) + continue end - print_progress && okln() + print_progress && okln(str) else - print_progress && okln() + print_progress && okln(str) end - if diff + if changed && diff mktempdir() do dir a = mkdir(joinpath(dir, "a")) b = mkdir(joinpath(dir, "b")) diff --git a/test/maintests.jl b/test/maintests.jl index 71cdae9..df0ab56 100644 --- a/test/maintests.jl +++ b/test/maintests.jl @@ -104,7 +104,7 @@ function maintests(f::R) where {R} rc, fd1, fd2 = runic(argv) @test rc == 0 @test isempty(fd1) - @test occursin("Formatting `in.jl` -> `out.jl` ...", fd2) + @test occursin("[1/1] Formatting `in.jl` -> `out.jl` ...", fd2) @test occursin("✔", fd2) @test !occursin("✖", fd2) @test read(f_out, String) == good @@ -128,7 +128,7 @@ function maintests(f::R) where {R} rc, fd1, fd2 = runic(argv) @test rc == 0 @test isempty(fd1) - @test occursin("Formatting `in.jl` ...", fd2) + @test occursin("[1/1] Formatting `in.jl` ...", fd2) @test occursin("✔", fd2) @test !occursin("✖", fd2) @test read(f_in, String) == good @@ -150,7 +150,7 @@ function maintests(f::R) where {R} write(f_in, good) rc, fd1, fd2 = runic(argv) @test rc == 0 - @test occursin("Formatting `in.jl` ...", fd2) + @test occursin("[1/1] Formatting `in.jl` ...", fd2) @test occursin("✔", fd2) @test !occursin("✖", fd2) @test read(f_in, String) == good @@ -184,6 +184,7 @@ function maintests(f::R) where {R} @test isempty(fd1) @test occursin("Formatting `good.jl` ...", fd2) @test occursin("Formatting `src/bad.jl` ...", fd2) + @test occursin("[1/2]", fd2) && occursin("[2/2]", fd2) @test occursin("✔", fd2) @test !occursin("✖", fd2) @test !occursin("git.jl", fd2) @@ -208,7 +209,7 @@ function maintests(f::R) where {R} rc, fd1, fd2 = runic(argv) @test rc == 1 @test isempty(fd1) - @test occursin("Checking `in.jl` ...", fd2) + @test occursin("[1/1] Checking `in.jl` ...", fd2) @test !occursin("✔", fd2) @test occursin("✖", fd2) @test read(f_in, String) == bad @@ -230,7 +231,7 @@ function maintests(f::R) where {R} rc, fd1, fd2 = runic(argv) @test rc == 0 @test isempty(fd1) - @test occursin("Checking `in.jl` ...", fd2) + @test occursin("[1/1] Checking `in.jl` ...", fd2) @test occursin("✔", fd2) @test !occursin("✖", fd2) @test read(f_in, String) == good @@ -265,6 +266,7 @@ function maintests(f::R) where {R} @test isempty(fd1) @test occursin("Checking `good.jl` ...", fd2) @test occursin("Checking `src/bad.jl` ...", fd2) + @test occursin("[1/2]", fd2) && occursin("[2/2]", fd2) @test occursin("✔", fd2) @test occursin("✖", fd2) @test !occursin("git.jl", fd2) @@ -296,7 +298,7 @@ function maintests(f::R) where {R} rc, fd1, fd2 = runic(argv) @test rc == 1 @test isempty(fd1) - @test occursin("Checking `in.jl` ...", fd2) + @test occursin("[1/1] Checking `in.jl` ...", fd2) @test !occursin("✔", fd2) @test occursin("✖", fd2) @test occursin("diff --git", fd2) @@ -307,6 +309,21 @@ function maintests(f::R) where {R} end end + # runic --verbose + cdtmp() do + f_in = "in.jl" + write(f_in, good) + let argv = ["--verbose"; "--check"; fill(f_in, 10)] + rc, fd1, fd2 = runic(argv) + @test rc == 0 + @test isempty(fd1) + for i in 1:9 + @test occursin("[ $(i)/10] Checking `in.jl` ...", fd2) + end + @test occursin("[10/10] Checking `in.jl` ...", fd2) + end + end + # Error paths # runic -o let (rc, fd1, fd2) = runic(["-o"])