summaryrefslogtreecommitdiffstats
path: root/BaseTools/Source/Python/Common
diff options
context:
space:
mode:
authorYunhua Feng <yunhuax.feng@intel.com>2019-04-11 12:57:15 +0800
committerLiming Gao <liming.gao@intel.com>2019-04-22 10:05:52 +0800
commit0b836855fb4df66f7ca035a7b67a064c0088ed69 (patch)
tree2f43aa6520c130b2b959e73e1f1ed30f60b4c10b /BaseTools/Source/Python/Common
parente72920ec617ba1fceb114b3bb2a587a8e836734b (diff)
downloadedk2-0b836855fb4df66f7ca035a7b67a064c0088ed69.tar.gz
edk2-0b836855fb4df66f7ca035a7b67a064c0088ed69.tar.bz2
edk2-0b836855fb4df66f7ca035a7b67a064c0088ed69.zip
BaseTools: Sometime write file not immediate to disk
BZ: https://bugzilla.tianocore.org/process_bug.cgi On Windows OS, sometime the generated file is not immediate saved to disk. When run nmake, prompt AutoGen.h not found, and stop build. Below blog shows Write-Replace to fix it. This patch uses this way to write temp file, then rename the temp file to the real file. https://blog.gocept.com/2013/07/15/reliable-file-updates-with-python/ Cc: Bob Feng <bob.c.feng@intel.com> Cc: Liming Gao <liming.gao@intel.com> Cc: Yonghong Zhu <yonghong.zhu@intel.com> Signed-off-by: Yunhua Feng <yunhuax.feng@intel.com> Reviewed-by: Yonghong Zhu <yonghong.zhu@intel.com>
Diffstat (limited to 'BaseTools/Source/Python/Common')
-rw-r--r--BaseTools/Source/Python/Common/Misc.py17
1 files changed, 13 insertions, 4 deletions
diff --git a/BaseTools/Source/Python/Common/Misc.py b/BaseTools/Source/Python/Common/Misc.py
index 5db9405ddc..3b3ab2d6df 100644
--- a/BaseTools/Source/Python/Common/Misc.py
+++ b/BaseTools/Source/Python/Common/Misc.py
@@ -22,6 +22,7 @@ from random import sample
from struct import pack
import uuid
import subprocess
+import tempfile
from collections import OrderedDict
import Common.LongFilePathOs as os
@@ -476,15 +477,23 @@ def SaveFileOnChange(File, Content, IsBinaryFile=True):
if not os.access(DirName, os.W_OK):
EdkLogger.error(None, PERMISSION_FAILURE, "Do not have write permission on directory %s" % DirName)
+ OpenMode = "w"
if IsBinaryFile:
+ OpenMode = "wb"
+
+ if GlobalData.gIsWindows and not os.path.exists(File):
+ # write temp file, then rename the temp file to the real file
+ # to make sure the file be immediate saved to disk
+ with tempfile.NamedTemporaryFile(OpenMode, dir=os.path.dirname(File), delete=False) as tf:
+ tf.write(Content)
+ tempname = tf.name
try:
- with open(File, "wb") as Fd:
- Fd.write(Content)
- except IOError as X:
+ os.rename(tempname, File)
+ except:
EdkLogger.error(None, FILE_CREATE_FAILURE, ExtraData='IOError %s' % X)
else:
try:
- with open(File, 'w') as Fd:
+ with open(File, OpenMode) as Fd:
Fd.write(Content)
except IOError as X:
EdkLogger.error(None, FILE_CREATE_FAILURE, ExtraData='IOError %s' % X)