Show More
@@ -1975,3 +1975,101 b' class memfilectx(committablefilectx):' | |||
|
1975 | 1975 | def write(self, data, flags): |
|
1976 | 1976 | """wraps repo.wwrite""" |
|
1977 | 1977 | self._data = data |
|
1978 | ||
|
1979 | class metadataonlyctx(committablectx): | |
|
1980 | """Like memctx but it's reusing the manifest of different commit. | |
|
1981 | Intended to be used by lightweight operations that are creating | |
|
1982 | metadata-only changes. | |
|
1983 | ||
|
1984 | Revision information is supplied at initialization time. 'repo' is the | |
|
1985 | current localrepo, 'ctx' is original revision which manifest we're reuisng | |
|
1986 | 'parents' is a sequence of two parent revisions identifiers (pass None for | |
|
1987 | every missing parent), 'text' is the commit. | |
|
1988 | ||
|
1989 | user receives the committer name and defaults to current repository | |
|
1990 | username, date is the commit date in any format supported by | |
|
1991 | util.parsedate() and defaults to current date, extra is a dictionary of | |
|
1992 | metadata or is left empty. | |
|
1993 | """ | |
|
1994 | def __new__(cls, repo, path, *args, **kwargs): | |
|
1995 | return super(metadataonlyctx, cls).__new__(cls, repo) | |
|
1996 | ||
|
1997 | def __init__(self, repo, originalctx, parents, text, user=None, date=None, | |
|
1998 | extra=None, editor=False): | |
|
1999 | super(metadataonlyctx, self).__init__(repo, text, user, date, extra) | |
|
2000 | self._rev = None | |
|
2001 | self._node = None | |
|
2002 | self._originalctx = originalctx | |
|
2003 | self._manifestnode = originalctx.manifestnode() | |
|
2004 | parents = [(p or nullid) for p in parents] | |
|
2005 | p1, p2 = self._parents = [changectx(self._repo, p) for p in parents] | |
|
2006 | ||
|
2007 | # sanity check to ensure that the reused manifest parents are | |
|
2008 | # manifests of our commit parents | |
|
2009 | mp1, mp2 = self.manifestctx().parents | |
|
2010 | if p1 != nullid and p1.manifestctx().node() != mp1: | |
|
2011 | raise RuntimeError('can\'t reuse the manifest: ' | |
|
2012 | 'its p1 doesn\'t match the new ctx p1') | |
|
2013 | if p2 != nullid and p2.manifestctx().node() != mp2: | |
|
2014 | raise RuntimeError('can\'t reuse the manifest: ' | |
|
2015 | 'its p2 doesn\'t match the new ctx p2') | |
|
2016 | ||
|
2017 | self._files = originalctx.files() | |
|
2018 | self.substate = {} | |
|
2019 | ||
|
2020 | if extra: | |
|
2021 | self._extra = extra.copy() | |
|
2022 | else: | |
|
2023 | self._extra = {} | |
|
2024 | ||
|
2025 | if self._extra.get('branch', '') == '': | |
|
2026 | self._extra['branch'] = 'default' | |
|
2027 | ||
|
2028 | if editor: | |
|
2029 | self._text = editor(self._repo, self, []) | |
|
2030 | self._repo.savecommitmessage(self._text) | |
|
2031 | ||
|
2032 | def manifestnode(self): | |
|
2033 | return self._manifestnode | |
|
2034 | ||
|
2035 | @propertycache | |
|
2036 | def _manifestctx(self): | |
|
2037 | return self._repo.manifestlog[self._manifestnode] | |
|
2038 | ||
|
2039 | def filectx(self, path, filelog=None): | |
|
2040 | return self._originalctx.filectx(path, filelog=filelog) | |
|
2041 | ||
|
2042 | def commit(self): | |
|
2043 | """commit context to the repo""" | |
|
2044 | return self._repo.commitctx(self) | |
|
2045 | ||
|
2046 | @property | |
|
2047 | def _manifest(self): | |
|
2048 | return self._originalctx.manifest() | |
|
2049 | ||
|
2050 | @propertycache | |
|
2051 | def _status(self): | |
|
2052 | """Calculate exact status from ``files`` specified in the ``origctx`` | |
|
2053 | and parents manifests. | |
|
2054 | """ | |
|
2055 | man1 = self.p1().manifest() | |
|
2056 | p2 = self._parents[1] | |
|
2057 | # "1 < len(self._parents)" can't be used for checking | |
|
2058 | # existence of the 2nd parent, because "metadataonlyctx._parents" is | |
|
2059 | # explicitly initialized by the list, of which length is 2. | |
|
2060 | if p2.node() != nullid: | |
|
2061 | man2 = p2.manifest() | |
|
2062 | managing = lambda f: f in man1 or f in man2 | |
|
2063 | else: | |
|
2064 | managing = lambda f: f in man1 | |
|
2065 | ||
|
2066 | modified, added, removed = [], [], [] | |
|
2067 | for f in self._files: | |
|
2068 | if not managing(f): | |
|
2069 | added.append(f) | |
|
2070 | elif self[f]: | |
|
2071 | modified.append(f) | |
|
2072 | else: | |
|
2073 | removed.append(f) | |
|
2074 | ||
|
2075 | return scmutil.status(modified, added, removed, [], [], [], []) |
General Comments 0
You need to be logged in to leave comments.
Login now