Siddharth Agarwal <sid0@fb.com> [Mon, 16 Nov 2015 11:45:35 -0800] rev 26979
filemerge: introduce class whose objects represent files not in a context
Most code is going to barf at the return values here (particularly from data
and size), so we restrict it to the filemerge code.
This is already somewhat supported via:
ctx.filectx(f, fileid=nullid)
Indeed, for add/add conflicts (ancestor doesn't have the file) we use precisely
that. However, that is broken in subtle ways:
- The cmp() function in filectx returns False (identical) for such a filectx
when compared to a zero-length file.
- size() returns 0 rather than some sort of value indicating that the file isn't
present.
- data() returns '' rather than some sort of value indicating that the file isn't
present.
Given the relatively niche use of such filectxes, this seems to be the simplest
way to fix all these issues.
Siddharth Agarwal <sid0@fb.com> [Mon, 16 Nov 2015 11:27:27 -0800] rev 26978
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.
Siddharth Agarwal <sid0@fb.com> [Fri, 13 Nov 2015 22:37:51 -0800] rev 26977
filectx: allow custom comparators
We're going to introduce other sorts of filectxes very soon, and we'd like the
cmp method to function properly (i.e. commutatively) for them. The only way to
make that happen is for this cmp method to call into that specialized one if
that defines a custom comparator.
Siddharth Agarwal <sid0@fb.com> [Fri, 13 Nov 2015 23:01:36 -0800] rev 26976
debugmergestate: print out record type for files
We're going to add a separate record type for change/delete conflicts soon. We
need to make sure they get stored with the correct record type so that older
versions of Mercurial correctly abort when they see change/delete records.
Siddharth Agarwal <sid0@fb.com> [Sun, 15 Nov 2015 22:45:20 -0800] rev 26975
merge.applyupdates: don't return early if merge driver's conclude failed
Somewhat silly oversight -- this prevented the progress bar from being reset.
Laurent Charignon <lcharignon@fb.com> [Mon, 16 Nov 2015 17:15:36 -0800] rev 26974
convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Before this patch, convert was using repo._bookmarks.write, a deprecated API
for saving bookmarks.
This patch changes the use of repo._bookmarks.write to
repo._bookmarks.recordchange.