# HG changeset patch # User mpm@selenic.com # Date 1119411395 28800 # Node ID 43b8da7420a90e4ddc5184f7c2b5aaa7776f6fe5 # Parent dbe86d465e090e7cf0e48c3b36a445b30ba516cc [PATCH] rename under the other OS -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 [PATCH] rename under the other OS From: K Thananchayan Rename fails under windows if dest file exists. This patch add a rename method to util module that removes the dest file and retries if initial attempt fails. manifest hash: 2744d9fd1717e15133b411a269df909fa8ec0faf -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCuNzDywK+sNU5EO8RAsPBAJ9NQN3bTuJvTem5x+utGnoMkhYc0QCbBFSJ PoMP69H1UnVE6drFlnlFE0s= =pePw -----END PGP SIGNATURE----- diff --git a/mercurial/hg.py b/mercurial/hg.py --- a/mercurial/hg.py +++ b/mercurial/hg.py @@ -338,7 +338,7 @@ def opener(base): else: if s.st_nlink > 1: file(f + ".tmp", "wb").write(file(f, "rb").read()) - os.rename(f+".tmp", f) + util.rename(f+".tmp", f) return file(f, mode) @@ -482,7 +482,7 @@ class localrepository: self.ui.status("attempting to rollback last transaction\n") transaction.rollback(self.opener, self.join("undo")) self.dirstate = None - os.rename(self.join("undo.dirstate"), self.join("dirstate")) + util.rename(self.join("undo.dirstate"), self.join("dirstate")) self.dirstate = dirstate(self.opener, self.ui, self.root) else: self.ui.warn("no undo information available\n") diff --git a/mercurial/transaction.py b/mercurial/transaction.py --- a/mercurial/transaction.py +++ b/mercurial/transaction.py @@ -12,6 +12,7 @@ # of the GNU General Public License, incorporated herein by reference. import os +import util class transaction: def __init__(self, opener, journal, after = None): @@ -46,7 +47,7 @@ class transaction: self.file.close() self.entries = [] if self.after: - os.rename(self.journal, self.after) + util.rename(self.journal, self.after) else: os.unlink(self.journal) diff --git a/mercurial/util.py b/mercurial/util.py --- a/mercurial/util.py +++ b/mercurial/util.py @@ -7,6 +7,14 @@ import os +def rename(src, dst): + try: + os.rename(src, dst) + except: + os.unlink(dst) + os.rename(src, dst) + +# Platfor specific varients if os.name == 'nt': def pconvert(path): return path.replace("\\", "/")