mercurial/context.py
changeset 6715 a3c41abfa828
parent 6709 f84f507c53d3
child 6718 4386a7706828
equal deleted inserted replaced
6714:5f339b6a7eff 6715:a3c41abfa828
   671         except OSError, err:
   671         except OSError, err:
   672             if err.errno != errno.ENOENT: raise
   672             if err.errno != errno.ENOENT: raise
   673             return (t, tz)
   673             return (t, tz)
   674 
   674 
   675     def cmp(self, text): return self._repo.wread(self._path) == text
   675     def cmp(self, text): return self._repo.wread(self._path) == text
       
   676 
       
   677 class memctx(object):
       
   678     """A memctx is a subset of changectx supposed to be built on memory
       
   679     and passed to commit functions.
       
   680 
       
   681     NOTE: this interface and the related memfilectx are experimental and
       
   682     may change without notice.
       
   683 
       
   684     parents - a pair of parent nodeids.
       
   685     filectxfn - a callable taking (repo, memctx, path) arguments and
       
   686     returning a memctx object.
       
   687     date - any valid date string or (unixtime, offset), or None.
       
   688     user - username string, or None.
       
   689     extra - a dictionary of extra values, or None.
       
   690     """
       
   691     def __init__(self, repo, parents, text, files, filectxfn, user=None, 
       
   692                  date=None, extra=None):
       
   693         self._repo = repo
       
   694         self._rev = None
       
   695         self._node = None
       
   696         self._text = text
       
   697         self._date = date and util.parsedate(date) or util.makedate()
       
   698         self._user = user or self._repo.ui.username()
       
   699         parents = [(p or nullid) for p in parents]
       
   700         p1, p2 = parents
       
   701         self._parents = [self._repo.changectx(p) for p in (p1, p2)]
       
   702         files = list(files)
       
   703         files.sort()
       
   704         self._status = [files, [], [], [], []]
       
   705         self._filectxfn = filectxfn
       
   706 
       
   707         self._extra = extra and extra.copy() or {}
       
   708         if 'branch' not in self._extra:
       
   709             self._extra['branch'] = 'default'
       
   710         elif self._extra.get('branch') == '':
       
   711             self._extra['branch'] = 'default'
       
   712 
       
   713     def __str__(self):
       
   714         return str(self._parents[0]) + "+"
       
   715 
       
   716     def __nonzero__(self):
       
   717         return True
       
   718 
       
   719     def user(self): return self._user
       
   720     def date(self): return self._date
       
   721     def description(self): return self._text
       
   722     def files(self): return self.modified()
       
   723     def modified(self): return self._status[0]
       
   724     def added(self): return self._status[1]
       
   725     def removed(self): return self._status[2]
       
   726     def deleted(self): return self._status[3]
       
   727     def unknown(self): return self._status[4]
       
   728     def clean(self): return self._status[5]
       
   729     def branch(self): return self._extra['branch']
       
   730     def extra(self): return self._extra
       
   731 
       
   732     def parents(self):
       
   733         """return contexts for each parent changeset"""
       
   734         return self._parents
       
   735 
       
   736     def filectx(self, path, filelog=None):
       
   737         """get a file context from the working directory"""
       
   738         return self._filectxfn(self._repo, self, path)
       
   739 
       
   740 class memfilectx(object):
       
   741     """A memfilectx is a subset of filectx supposed to be built by client
       
   742     code and passed to commit functions.
       
   743     """
       
   744     def __init__(self, path, data, islink, isexec, copied):
       
   745         """copied is the source file path, or None."""
       
   746         self._path = path
       
   747         self._data = data
       
   748         self._flags = (islink and 'l' or '') + (isexec and 'x' or '')
       
   749         self._copied = None
       
   750         if copied:
       
   751             self._copied = (copied, nullid)
       
   752 
       
   753     def __nonzero__(self): return True
       
   754     def __str__(self): return "%s@%s" % (self.path(), self._changectx)
       
   755     def path(self): return self._path
       
   756     def data(self): return self._data
       
   757     def fileflags(self): return self._flags
       
   758     def isexec(self): return 'x' in self._flags
       
   759     def islink(self): return 'l' in self._flags
       
   760     def renamed(self): return self._copied
       
   761