revlog: add 'raw' argument to revision and _addrevision
authorRemi Chaintron <remi@fb.com>
Thu, 05 Jan 2017 17:16:07 +0000
changeset 30743 2df983125d37
parent 30742 d3e2d39b97ea
child 30744 e12c0fa1f65b
revlog: add 'raw' argument to revision and _addrevision This patch introduces a new 'raw' argument (defaults to False) to revlog's revision() and _addrevision() methods. When the 'raw' argument is set to True, it indicates the revision data should be handled as raw data by the flagprocessor. Note: Given revlog.addgroup() calls are restricted to changegroup generation, we can always set raw to True when calling revlog._addrevision() from revlog.addgroup().
mercurial/bundlerepo.py
mercurial/changegroup.py
mercurial/context.py
mercurial/debugcommands.py
mercurial/revlog.py
mercurial/unionrepo.py
--- a/mercurial/bundlerepo.py	Tue Jan 10 06:59:49 2017 +0800
+++ b/mercurial/bundlerepo.py	Thu Jan 05 17:16:07 2017 +0000
@@ -117,7 +117,7 @@
         return mdiff.textdiff(self.revision(self.node(rev1)),
                               self.revision(self.node(rev2)))
 
-    def revision(self, nodeorrev):
+    def revision(self, nodeorrev, raw=False):
         """return an uncompressed revision of a given node or revision
         number.
         """
--- a/mercurial/changegroup.py	Tue Jan 10 06:59:49 2017 +0800
+++ b/mercurial/changegroup.py	Thu Jan 05 17:16:07 2017 +0000
@@ -783,7 +783,7 @@
         prefix = ''
         if revlog.iscensored(base) or revlog.iscensored(rev):
             try:
-                delta = revlog.revision(node)
+                delta = revlog.revision(node, raw=True)
             except error.CensoredNodeError as e:
                 delta = e.tombstone
             if base == nullrev:
@@ -792,7 +792,7 @@
                 baselen = revlog.rawsize(base)
                 prefix = mdiff.replacediffheader(baselen, len(delta))
         elif base == nullrev:
-            delta = revlog.revision(node)
+            delta = revlog.revision(node, raw=True)
             prefix = mdiff.trivialdiffheader(len(delta))
         else:
             delta = revlog.revdiff(base, rev)
--- a/mercurial/context.py	Tue Jan 10 06:59:49 2017 +0800
+++ b/mercurial/context.py	Thu Jan 05 17:16:07 2017 +0000
@@ -1110,6 +1110,9 @@
         return filectx(self._repo, self._path, fileid=fileid,
                        filelog=self._filelog, changeid=changeid)
 
+    def rawdata(self):
+        return self._filelog.revision(self._filenode, raw=True)
+
     def data(self):
         try:
             return self._filelog.read(self._filenode)
--- a/mercurial/debugcommands.py	Tue Jan 10 06:59:49 2017 +0800
+++ b/mercurial/debugcommands.py	Thu Jan 05 17:16:07 2017 +0000
@@ -445,7 +445,7 @@
         raise error.CommandError('debugdata', _('invalid arguments'))
     r = cmdutil.openrevlog(repo, 'debugdata', file_, opts)
     try:
-        ui.write(r.revision(r.lookup(rev)))
+        ui.write(r.revision(r.lookup(rev), raw=True))
     except KeyError:
         raise error.Abort(_('invalid revision identifier %s') % rev)
 
--- a/mercurial/revlog.py	Tue Jan 10 06:59:49 2017 +0800
+++ b/mercurial/revlog.py	Thu Jan 05 17:16:07 2017 +0000
@@ -1202,12 +1202,14 @@
         return mdiff.textdiff(self.revision(rev1),
                               self.revision(rev2))
 
-    def revision(self, nodeorrev, _df=None):
+    def revision(self, nodeorrev, _df=None, raw=False):
         """return an uncompressed revision of a given node or revision
         number.
 
-        _df is an existing file handle to read from. It is meant to only be
-        used internally.
+        _df - an existing file handle to read from. (internal-only)
+        raw - an optional argument specifying if the revision data is to be
+        treated as raw data when applying flag transforms. 'raw' should be set
+        to True when generating changegroups or in debug commands.
         """
         if isinstance(nodeorrev, int):
             rev = nodeorrev
@@ -1412,13 +1414,16 @@
         return True
 
     def _addrevision(self, node, text, transaction, link, p1, p2, flags,
-                     cachedelta, ifh, dfh, alwayscache=False):
+                     cachedelta, ifh, dfh, alwayscache=False, raw=False):
         """internal function to add revisions to the log
 
         see addrevision for argument descriptions.
         invariants:
         - text is optional (can be None); if not set, cachedelta must be set.
           if both are set, they must correspond to each other.
+        - raw is optional; if set to True, it indicates the revision data is to
+          be treated by _processflags() as raw. It is usually set by changegroup
+          generation and debug commands.
         """
         btext = [text]
         def buildtext():
@@ -1438,8 +1443,9 @@
                     fh = ifh
                 else:
                     fh = dfh
-                basetext = self.revision(self.node(baserev), _df=fh)
+                basetext = self.revision(self.node(baserev), _df=fh, raw=raw)
                 btext[0] = mdiff.patch(basetext, delta)
+
             try:
                 self.checkhash(btext[0], node, p1=p1, p2=p2)
                 if flags & REVIDX_ISCENSORED:
@@ -1668,10 +1674,14 @@
                 # the added revision, which will require a call to
                 # revision(). revision() will fast path if there is a cache
                 # hit. So, we tell _addrevision() to always cache in this case.
+                # We're only using addgroup() in the context of changegroup
+                # generation so the revision data can always be handled as raw
+                # by the flagprocessor.
                 chain = self._addrevision(node, None, transaction, link,
                                           p1, p2, flags, (baserev, delta),
                                           ifh, dfh,
-                                          alwayscache=bool(addrevisioncb))
+                                          alwayscache=bool(addrevisioncb),
+                                          raw=True)
 
                 if addrevisioncb:
                     addrevisioncb(self, chain)
--- a/mercurial/unionrepo.py	Tue Jan 10 06:59:49 2017 +0800
+++ b/mercurial/unionrepo.py	Thu Jan 05 17:16:07 2017 +0000
@@ -93,7 +93,7 @@
         return mdiff.textdiff(self.revision(self.node(rev1)),
                               self.revision(self.node(rev2)))
 
-    def revision(self, nodeorrev):
+    def revision(self, nodeorrev, raw=False):
         """return an uncompressed revision of a given node or revision
         number.
         """