From: Daira Hopwood Date: Sat, 24 Oct 2015 00:14:56 +0000 (+0100) Subject: replace_file should allow the replaced file not to exist on Windows. X-Git-Url: https://git.rkrishnan.org/simplejson/components/(%5B%5E?a=commitdiff_plain;h=b04f3d699422f8e8dd4dddd6c3d29d06cdbb2f8c;p=tahoe-lafs%2Ftahoe-lafs.git replace_file should allow the replaced file not to exist on Windows. Signed-off-by: Daira Hopwood --- diff --git a/src/allmydata/util/fileutil.py b/src/allmydata/util/fileutil.py index f923e1a0..a2be63c0 100644 --- a/src/allmydata/util/fileutil.py +++ b/src/allmydata/util/fileutil.py @@ -588,6 +588,9 @@ if sys.platform == "win32": REPLACEFILE_IGNORE_MERGE_ERRORS = 0x00000002 + # + ERROR_FILE_NOT_FOUND = 2 + def rename_no_overwrite(source_path, dest_path): os.rename(source_path, dest_path) @@ -602,7 +605,13 @@ if sys.platform == "win32": # The UnableToUnlinkReplacementError case does not happen on Windows; # all errors should be treated as signalling a conflict. err = get_last_error() - raise ConflictError("WinError: %s" % (WinError(err))) + if err != ERROR_FILE_NOT_FOUND: + raise ConflictError("WinError: %s" % (WinError(err),)) + + try: + rename_no_overwrite(replacement_path, replaced_path) + except EnvironmentError: + reraise(ConflictError) else: def rename_no_overwrite(source_path, dest_path): # link will fail with EEXIST if there is already something at dest_path.