summaryrefslogtreecommitdiff
path: root/tools/net
diff options
context:
space:
mode:
authorJiri Pirko <jiri@nvidia.com>2023-08-18 13:19:27 +0200
committerDavid S. Miller <davem@davemloft.net>2023-08-19 19:24:38 +0100
commitf65f305ae0089fd74174d24dd32241ffe53a8d46 (patch)
tree9ddb70926eda91482667ca62fc7148c53210dd24 /tools/net
parent58f2ffdedf7b05b318f2cdafaca69e4435c8478e (diff)
tools: ynl-gen: use temporary file for rendering
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> Reviewed-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'tools/net')
-rwxr-xr-xtools/net/ynl/ynl-gen-c.py10
1 files changed, 8 insertions, 2 deletions
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()