Mercurial > hgsubversion
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]