# HG changeset patch # User Siddharth Agarwal # Date 1410910977 25200 # Node ID 4ed0855d211fb589198564c796bd5d10aaa9d710 # Parent f367a446219118983319055ceba06daac4566252 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. diff --git a/hgsubversion/compathacks.py b/hgsubversion/compathacks.py --- 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]