Eric Blake
2023-Aug-04 14:29 UTC
[Libguestfs] [libnbd PATCH] golang: Optionally use gofmt on generated .go files
Combine my recent work on improving the generated Go output with
Tage's work on using a canonical formatter for Rust. If gofmt is
available during the build, then the generated .go files will now use
TAB indents and have proper columnar alignment; if it is not
available, the project still compiles.
Signed-off-by: Eric Blake <eblake at redhat.com>
---
Followup to this earlier series:
https://listman.redhat.com/archives/libguestfs/2023-July/032133.html
I still need to fold in the 'make check' verification of non-generated
.go files, plus Dan's idea of enabling CI coverage...
configure.ac | 1 +
generator/config.mli | 1 +
generator/utils.mli | 1 +
generator/config.ml.in | 3 ++-
generator/generator.ml | 15 ++++++++++-----
generator/utils.ml | 12 +++++++++++-
6 files changed, 26 insertions(+), 7 deletions(-)
diff --git a/configure.ac b/configure.ac
index 3e8b9142..b475dccf 100644
--- a/configure.ac
+++ b/configure.ac
@@ -596,6 +596,7 @@ AC_ARG_ENABLE([golang],
[enable_golang=yes])
AS_IF([test "x$enable_golang" != "xno"],[
AC_CHECK_PROG([GOLANG],[go],[go],[no])
+ AC_CHECK_PROG([GOFMT],[gofmt],[gofmt],[no])
AS_IF([test "x$GOLANG" != "xno"],[
AC_MSG_CHECKING([if $GOLANG is usable])
AS_IF([ (
diff --git a/generator/config.mli b/generator/config.mli
index 5f1a46a6..22c61dad 100644
--- a/generator/config.mli
+++ b/generator/config.mli
@@ -17,4 +17,5 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*)
+val gofmt : string
val rustfmt : string
diff --git a/generator/utils.mli b/generator/utils.mli
index d97d43ac..9f7824b2 100644
--- a/generator/utils.mli
+++ b/generator/utils.mli
@@ -54,6 +54,7 @@ val
(** Type of code formatter. *)
type formatter + | Gofmt
| Rustfmt
(** Redirect stdout to a file. Possibly formatting the code. *)
diff --git a/generator/config.ml.in b/generator/config.ml.in
index 7ac5237c..48d0d4a4 100644
--- a/generator/config.ml.in
+++ b/generator/config.ml.in
@@ -18,4 +18,5 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*)
-let rustfmt = "@RUSTFMT@"
+let gofmt = "@GOFMT@"
+let rustfmt = "@RUSTFMT@"
diff --git a/generator/generator.ml b/generator/generator.ml
index c62b0c4f..8c9a585b 100644
--- a/generator/generator.ml
+++ b/generator/generator.ml
@@ -57,10 +57,15 @@ let
output_to "ocaml/NBD.ml" OCaml.generate_ocaml_nbd_ml;
output_to "ocaml/nbd-c.c" OCaml.generate_ocaml_nbd_c;
- output_to "golang/bindings.go" GoLang.generate_golang_bindings_go;
- output_to "golang/closures.go" GoLang.generate_golang_closures_go;
- output_to "golang/wrappers.go" GoLang.generate_golang_wrappers_go;
+ output_to ~formatter:(Some Gofmt) "golang/bindings.go"
+ GoLang.generate_golang_bindings_go;
+ output_to ~formatter:(Some Gofmt) "golang/closures.go"
+ GoLang.generate_golang_closures_go;
+ output_to ~formatter:(Some Gofmt) "golang/wrappers.go"
+ GoLang.generate_golang_wrappers_go;
output_to "golang/wrappers.h" GoLang.generate_golang_wrappers_h;
- output_to ~formatter:(Some Rustfmt)
"rust/libnbd-sys/src/generated.rs" RustSys.generate_rust_sys_bindings;
- output_to ~formatter:(Some Rustfmt) "rust/src/bindings.rs"
Rust.generate_rust_bindings;
+ output_to ~formatter:(Some Rustfmt)
"rust/libnbd-sys/src/generated.rs"
+ RustSys.generate_rust_sys_bindings;
+ output_to ~formatter:(Some Rustfmt) "rust/src/bindings.rs"
+ Rust.generate_rust_bindings;
diff --git a/generator/utils.ml b/generator/utils.ml
index 3302b309..443ac6df 100644
--- a/generator/utils.ml
+++ b/generator/utils.ml
@@ -420,6 +420,7 @@ let
| i -> failwithf "%s: failed with error code %d" cmd i
type formatter + | Gofmt
| Rustfmt
let output_to ?(formatter = None) filename k @@ -431,6 +432,15 @@ let
close_out c;
chan := NoOutput;
(match formatter with
+ | Some Gofmt ->
+ if Config.gofmt <> "no" then (
+ let cmd = sprintf "%s -w %s" Config.gofmt filename_new in
+ match system cmd with
+ | WEXITED 0 -> ()
+ | WEXITED i -> failwithf "gofmt failed with exit code %d" i
+ | WSIGNALED i | WSTOPPED i ->
+ failwithf "gofmt was killed or stopped by signal %d" i
+ )
| Some Rustfmt ->
if Config.rustfmt <> "no" then (
let cmd = sprintf "%s %s" Config.rustfmt filename_new in
@@ -439,7 +449,7 @@ let
| WEXITED i -> failwithf "rustfmt failed with exit code %d"
i
| WSIGNALED i | WSTOPPED i ->
failwithf "rustfmt was killed or stopped by signal %d" i
- );
+ )
| None -> ());
(* Is the new file different from the current file? *)
if Sys.file_exists filename && files_equal filename filename_new then
--
2.41.0
Eric Blake
2023-Aug-07 21:11 UTC
[Libguestfs] [libnbd PATCH] golang: Optionally use gofmt on generated .go files
On Fri, Aug 04, 2023 at 09:29:48AM -0500, Eric Blake wrote:> Combine my recent work on improving the generated Go output with > Tage's work on using a canonical formatter for Rust. If gofmt is > available during the build, then the generated .go files will now use > TAB indents and have proper columnar alignment; if it is not > available, the project still compiles. > > Signed-off-by: Eric Blake <eblake at redhat.com> > --- > > Followup to this earlier series: > https://listman.redhat.com/archives/libguestfs/2023-July/032133.htmlNow in as 9cb10b39, after rebasing to yet more rustfmt changes in the meantime.> > I still need to fold in the 'make check' verification of non-generated > .go files, plus Dan's idea of enabling CI coverage...This still remains on my todo list. -- Eric Blake, Principal Software Engineer Red Hat, Inc. Virtualization: qemu.org | libguestfs.org
Seemingly Similar Threads
- [libnbd PATCH] golang: Optionally use gofmt on generated .go files
- libnbd | Failed pipeline for master | 9cb10b39
- libnbd | Failed pipeline for master | 9cb10b39
- Re: [PATCH 1/2] Rust bindings: Add long description
- Re: [PATCH 1/2] Rust bindings: Add long description