Mercurial > hg
changeset 34051:d2fc88426d21
context: add arbitraryfilectx, which can represent files outside the workdir
Move it from contrib/simplemerge so it can be re-used in the future.
Differential Revision: https://phab.mercurial-scm.org/D604
author | Phil Cohen <phillco@fb.com> |
---|---|
date | Fri, 01 Sep 2017 11:52:20 -0700 |
parents | b4226ad98366 |
children | ca6a3852daf0 |
files | contrib/simplemerge mercurial/context.py |
diffstat | 2 files changed, 35 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- a/contrib/simplemerge Fri Sep 01 10:35:43 2017 -0700 +++ b/contrib/simplemerge Fri Sep 01 11:52:20 2017 -0700 @@ -9,6 +9,7 @@ from mercurial.i18n import _ from mercurial import ( + context, error, fancyopts, simplemerge, @@ -49,26 +50,6 @@ for first, second in out_opts: sys.stdout.write(' %-*s %s\n' % (opts_len, first, second)) -class filebackedctx(object): - """simplemerge requires context-like objects""" - def __init__(self, path): - self._path = path - - def decodeddata(self): - with open(self._path, "rb") as f: - return f.read() - - def flags(self): - return '' - - def path(self): - return self._path - - def write(self, data, flags): - assert not flags - with open(self._path, "w") as f: - f.write(data) - try: for fp in (sys.stdin, sys.stdout, sys.stderr): util.setbinary(fp) @@ -85,9 +66,9 @@ raise ParseError(_('wrong number of arguments')) local, base, other = args sys.exit(simplemerge.simplemerge(uimod.ui.load(), - filebackedctx(local), - filebackedctx(base), - filebackedctx(other), + context.arbitraryfilectx(local), + context.arbitraryfilectx(base), + context.arbitraryfilectx(other), **opts)) except ParseError as e: sys.stdout.write("%s: %s\n" % (sys.argv[0], e))
--- a/mercurial/context.py Fri Sep 01 10:35:43 2017 -0700 +++ b/mercurial/context.py Fri Sep 01 11:52:20 2017 -0700 @@ -2385,3 +2385,34 @@ removed.append(f) return scmutil.status(modified, added, removed, [], [], [], []) + +class arbitraryfilectx(object): + """Allows you to use filectx-like functions on a file in an arbitrary + location on disk, possibly not in the working directory. + """ + def __init__(self, path): + self._path = path + + def cmp(self, otherfilectx): + return self.data() != otherfilectx.data() + + def path(self): + return self._path + + def flags(self): + return '' + + def data(self): + return util.readfile(self._path) + + def decodeddata(self): + with open(self._path, "rb") as f: + return f.read() + + def remove(self): + util.unlink(self._path) + + def write(self, data, flags): + assert not flags + with open(self._path, "w") as f: + f.write(data)