Skip to content

Commit

Permalink
tools: ynl-gen: use temporary file for rendering
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jiri Pirko authored and David S. Miller committed Aug 19, 2023
1 parent 58f2ffd commit f65f305
Showing 1 changed file with 8 additions and 2 deletions.
10 changes: 8 additions & 2 deletions tools/net/ynl/ynl-gen-c.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import collections
import os
import re
import shutil
import tempfile
import yaml

from lib import SpecFamily, SpecAttrSet, SpecAttr, SpecOperation, SpecEnumSet, SpecEnumEntry
Expand Down Expand Up @@ -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")
Expand All @@ -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:
Expand Down Expand Up @@ -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()

0 comments on commit f65f305

Please sign in to comment.