Skip to content

Commit d766c03

Browse files
jhericorpavlik
authored andcommitted
Write output atomically at the end
1 parent 307cae5 commit d766c03

1 file changed

Lines changed: 9 additions & 8 deletions

File tree

specification/scripts/generator.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
import os
2222
import pdb
2323
import re
24+
import shutil
2425
import sys
26+
import tempfile
2527
try:
2628
from pathlib import Path
2729
except ImportError:
@@ -559,14 +561,7 @@ def beginFile(self, genOpts):
559561
# Open specified output file. Not done in constructor since a
560562
# Generator can be used without writing to a file.
561563
if self.genOpts.filename is not None:
562-
if sys.platform == 'win32':
563-
directory = Path(self.genOpts.directory)
564-
if not Path.exists(directory):
565-
os.makedirs(directory)
566-
self.outFile = (directory / self.genOpts.filename).open('w', encoding='utf-8')
567-
else:
568-
filename = self.genOpts.directory + '/' + self.genOpts.filename
569-
self.outFile = io.open(filename, 'w', encoding='utf-8')
564+
self.outFile = tempfile.NamedTemporaryFile(mode='w', encoding='utf-8', delete=False)
570565
else:
571566
self.outFile = sys.stdout
572567

@@ -580,6 +575,12 @@ def endFile(self):
580575
self.outFile.flush()
581576
if self.outFile != sys.stdout and self.outFile != sys.stderr:
582577
self.outFile.close()
578+
if self.genOpts.filename is not None:
579+
if sys.platform == 'win32':
580+
directory = Path(self.genOpts.directory)
581+
if not Path.exists(directory):
582+
os.makedirs(directory)
583+
shutil.copy(self.outFile.name, self.genOpts.directory + '/' + self.genOpts.filename)
583584
self.genOpts = None
584585

585586
def beginFeature(self, interface, emit):

0 commit comments

Comments
 (0)