changeset 1237:4ed0855d211f

compathacks: add hacks for filectxfn deletion contract changing Mercurial rev 650b5b6e75ed changed the contract for filectxfn, and rev d226fe36e362 added a way for us to detect the change.
author Siddharth Agarwal <sid0@fb.com>
date Tue, 16 Sep 2014 16:42:57 -0700
parents f367a4462191
children 339b5703000c
files hgsubversion/compathacks.py
diffstat 1 files changed, 41 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/hgsubversion/compathacks.py
+++ b/hgsubversion/compathacks.py
@@ -1,5 +1,7 @@
 """Functions to work around API changes."""
 
+import errno
+import sys
 
 def branchset(repo):
     """Return the set of branches present in a repo.
@@ -26,3 +28,42 @@ def makememfilectx(repo, path, data, isl
         return context.memfilectx(repo, path, data, islink, isexec, copied)
     except TypeError:
         return context.memfilectx(path, data, islink, isexec, copied)
+
+def filectxfn_deleted(memctx, path):
+    """
+    Return None or raise an IOError as necessary if path is deleted.
+
+    Call as:
+
+    if path_missing:
+        return compathacks.filectxfn_deleted(memctx, path)
+
+    Works around filectxfn's contract changing between 3.1 and 3.2: 3.2 onwards,
+    for deleted files, filectxfn should return None rather than returning
+    IOError.
+    """
+    if getattr(memctx, '_returnnoneformissingfiles', False):
+        return None
+    raise IOError(errno.ENOENT, '%s is deleted' % path)
+
+def filectxfn_deleted_reraise(memctx):
+    """
+    Return None or reraise exc as necessary.
+
+    Call as:
+
+    try:
+        # code that raises IOError if the path is missing
+    except IOError:
+        return compathacks.filectxfn_deleted_reraise(memctx)
+
+    Works around filectxfn's contract changing between 3.1 and 3.2: 3.2 onwards,
+    for deleted files, filectxfn should return None rather than returning
+    IOError.
+    """
+    exc_info = sys.exc_info()
+    if (exc_info[1].errno == errno.ENOENT and
+        getattr(memctx, '_returnnoneformissingfiles', False)):
+        return None
+    # preserve traceback info
+    raise exc_info[0], exc_info[1], exc_info[2]