context: add memctx for memory commits
authorPatrick Mezard <pmezard@gmail.com>
Thu, 19 Jun 2008 00:14:23 +0200
changeset 6715 a3c41abfa828
parent 6714 5f339b6a7eff
child 6716 c9b8d2565b92
context: add memctx for memory commits
mercurial/context.py
mercurial/localrepo.py
--- a/mercurial/context.py	Wed Jun 18 23:45:49 2008 +0200
+++ b/mercurial/context.py	Thu Jun 19 00:14:23 2008 +0200
@@ -673,3 +673,89 @@
             return (t, tz)
 
     def cmp(self, text): return self._repo.wread(self._path) == text
+
+class memctx(object):
+    """A memctx is a subset of changectx supposed to be built on memory
+    and passed to commit functions.
+
+    NOTE: this interface and the related memfilectx are experimental and
+    may change without notice.
+
+    parents - a pair of parent nodeids.
+    filectxfn - a callable taking (repo, memctx, path) arguments and
+    returning a memctx object.
+    date - any valid date string or (unixtime, offset), or None.
+    user - username string, or None.
+    extra - a dictionary of extra values, or None.
+    """
+    def __init__(self, repo, parents, text, files, filectxfn, user=None, 
+                 date=None, extra=None):
+        self._repo = repo
+        self._rev = None
+        self._node = None
+        self._text = text
+        self._date = date and util.parsedate(date) or util.makedate()
+        self._user = user or self._repo.ui.username()
+        parents = [(p or nullid) for p in parents]
+        p1, p2 = parents
+        self._parents = [self._repo.changectx(p) for p in (p1, p2)]
+        files = list(files)
+        files.sort()
+        self._status = [files, [], [], [], []]
+        self._filectxfn = filectxfn
+
+        self._extra = extra and extra.copy() or {}
+        if 'branch' not in self._extra:
+            self._extra['branch'] = 'default'
+        elif self._extra.get('branch') == '':
+            self._extra['branch'] = 'default'
+
+    def __str__(self):
+        return str(self._parents[0]) + "+"
+
+    def __nonzero__(self):
+        return True
+
+    def user(self): return self._user
+    def date(self): return self._date
+    def description(self): return self._text
+    def files(self): return self.modified()
+    def modified(self): return self._status[0]
+    def added(self): return self._status[1]
+    def removed(self): return self._status[2]
+    def deleted(self): return self._status[3]
+    def unknown(self): return self._status[4]
+    def clean(self): return self._status[5]
+    def branch(self): return self._extra['branch']
+    def extra(self): return self._extra
+
+    def parents(self):
+        """return contexts for each parent changeset"""
+        return self._parents
+
+    def filectx(self, path, filelog=None):
+        """get a file context from the working directory"""
+        return self._filectxfn(self._repo, self, path)
+
+class memfilectx(object):
+    """A memfilectx is a subset of filectx supposed to be built by client
+    code and passed to commit functions.
+    """
+    def __init__(self, path, data, islink, isexec, copied):
+        """copied is the source file path, or None."""
+        self._path = path
+        self._data = data
+        self._flags = (islink and 'l' or '') + (isexec and 'x' or '')
+        self._copied = None
+        if copied:
+            self._copied = (copied, nullid)
+
+    def __nonzero__(self): return True
+    def __str__(self): return "%s@%s" % (self.path(), self._changectx)
+    def path(self): return self._path
+    def data(self): return self._data
+    def fileflags(self): return self._flags
+    def isexec(self): return 'x' in self._flags
+    def islink(self): return 'l' in self._flags
+    def renamed(self): return self._copied
+
--- a/mercurial/localrepo.py	Wed Jun 18 23:45:49 2008 +0200
+++ b/mercurial/localrepo.py	Thu Jun 19 00:14:23 2008 +0200
@@ -798,6 +798,17 @@
         finally:
             del lock, wlock
 
+    def commitctx(self, ctx):
+        wlock = lock = None
+        try:
+            wlock = self.wlock()
+            lock = self.lock()
+            return self._commitctx(ctx, force=True, force_editor=False, 
+                                   empty_ok=True, use_dirstate=False, 
+                                   update_dirstate=False)
+        finally:
+            del lock, wlock
+
     def _commitctx(self, wctx, force=False, force_editor=False, empty_ok=False,
                   use_dirstate=True, update_dirstate=True):
         tr = None