diff mbox series

[net-next] tools: ynl-gen: use temporary file for rendering

Message ID 20230818111927.2237134-1-jiri@resnulli.us (mailing list archive)
State Accepted
Commit f65f305ae0089fd74174d24dd32241ffe53a8d46
Delegated to: Netdev Maintainers
Headers show
Series [net-next] tools: ynl-gen: use temporary file for rendering | expand

Checks

Context Check Description
netdev/series_format success Single patches do not need cover letters
netdev/tree_selection success Clearly marked for net-next
netdev/fixes_present success Fixes tag not required for -next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 9 this patch: 9
netdev/cc_maintainers success CCed 5 of 5 maintainers
netdev/build_clang success Errors and warnings before: 9 this patch: 9
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 9 this patch: 9
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 34 lines checked
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Jiri Pirko Aug. 18, 2023, 11:19 a.m. UTC
From: Jiri Pirko <jiri@nvidia.com>

Currently any error during render leads to output an empty file.
That is quite annoying when using tools/net/ynl/ynl-regen.sh
which git greps files with content of "YNL-GEN.." and therefore ignores
empty files. So once you fail to regen, you have to checkout the file.

Avoid that by rendering to a temporary file first, only at the end
copy the content to the actual destination.

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
 tools/net/ynl/ynl-gen-c.py | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

Comments

Jakub Kicinski Aug. 18, 2023, 9:38 p.m. UTC | #1
On Fri, 18 Aug 2023 13:19:27 +0200 Jiri Pirko wrote:
> From: Jiri Pirko <jiri@nvidia.com>
> 
> Currently any error during render leads to output an empty file.
> That is quite annoying when using tools/net/ynl/ynl-regen.sh
> which git greps files with content of "YNL-GEN.." and therefore ignores
> empty files. So once you fail to regen, you have to checkout the file.
> 
> Avoid that by rendering to a temporary file first, only at the end
> copy the content to the actual destination.
> 
> Signed-off-by: Jiri Pirko <jiri@nvidia.com>

Neat! I thought this would be harder to implement.

Reviewed-by: Jakub Kicinski <kuba@kernel.org>
patchwork-bot+netdevbpf@kernel.org Aug. 19, 2023, 6:34 p.m. UTC | #2
Hello:

This patch was applied to netdev/net-next.git (main)
by David S. Miller <davem@davemloft.net>:

On Fri, 18 Aug 2023 13:19:27 +0200 you wrote:
> From: Jiri Pirko <jiri@nvidia.com>
> 
> Currently any error during render leads to output an empty file.
> That is quite annoying when using tools/net/ynl/ynl-regen.sh
> which git greps files with content of "YNL-GEN.." and therefore ignores
> empty files. So once you fail to regen, you have to checkout the file.
> 
> [...]

Here is the summary with links:
  - [net-next] tools: ynl-gen: use temporary file for rendering
    https://git.kernel.org/netdev/net-next/c/f65f305ae008

You are awesome, thank you!
diff mbox series

Patch

diff --git a/tools/net/ynl/ynl-gen-c.py b/tools/net/ynl/ynl-gen-c.py
index 5f39d2490655..bdff8dfc29c9 100755
--- a/tools/net/ynl/ynl-gen-c.py
+++ b/tools/net/ynl/ynl-gen-c.py
@@ -5,6 +5,8 @@  import argparse
 import collections
 import os
 import re
+import shutil
+import tempfile
 import yaml
 
 from lib import SpecFamily, SpecAttrSet, SpecAttr, SpecOperation, SpecEnumSet, SpecEnumEntry
@@ -2304,7 +2306,7 @@  def main():
     parser.add_argument('-o', dest='out_file', type=str)
     args = parser.parse_args()
 
-    out_file = open(args.out_file, 'w+') if args.out_file else os.sys.stdout
+    tmp_file = tempfile.TemporaryFile('w+') if args.out_file else os.sys.stdout
 
     if args.header is None:
         parser.error("--header or --source is required")
@@ -2329,7 +2331,7 @@  def main():
         print(f'Message enum-model {parsed.msg_id_model} not supported for {args.mode} generation')
         os.sys.exit(1)
 
-    cw = CodeWriter(BaseNlLib(), out_file)
+    cw = CodeWriter(BaseNlLib(), tmp_file)
 
     _, spec_kernel = find_kernel_root(args.spec)
     if args.mode == 'uapi' or args.header:
@@ -2578,6 +2580,10 @@  def main():
     if args.header:
         cw.p(f'#endif /* {hdr_prot} */')
 
+    if args.out_file:
+        out_file = open(args.out_file, 'w+')
+        tmp_file.seek(0)
+        shutil.copyfileobj(tmp_file, out_file)
 
 if __name__ == "__main__":
     main()