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 |
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>
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 --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()