# HG changeset patch # User Siddharth Agarwal # Date 1447702047 28800 # Node ID 9b9d4bcc915ea641aeba7cd173af4503fb55baf1 # Parent bd19561b98d9cf610afc92a34edc4e1579c12d72 filectx: add isabsent method This will indicate whether this filectx represents a file that is *not* in a changectx. This will be used by merge and filemerge code to know about when a conflict is a change/delete conflict. While this is kind of hacky, it is the least bad of all the alternatives. Other options considered but rejected include: - isinstance(fctx, ...) -- not very Pythonic, doesn't support duck typing - fctx.size() is None -- the 'size()' call on workingfilectxes causes a disk stat - fctx.filenode() == nullid -- the semantics around filenode are incredibly confusing. In particular, for workingfilectxes, filenode() is always None no matter whether the file is present on disk or in either parent. Having different behavior for None versus nullid in the merge code is just asking for pain. Thanks to Pierre-Yves David for early review feedback here. diff -r bd19561b98d9 -r 9b9d4bcc915e mercurial/context.py --- a/mercurial/context.py Fri Nov 13 22:37:51 2015 -0800 +++ b/mercurial/context.py Mon Nov 16 11:27:27 2015 -0800 @@ -747,6 +747,13 @@ def islink(self): return 'l' in self.flags() + def isabsent(self): + """whether this filectx represents a file not in self._changectx + + This is mainly for merge code to detect change/delete conflicts. This is + expected to be True for all subclasses of basectx.""" + return False + _customcmp = False def cmp(self, fctx): """compare with other file context