comparison mercurial/revlog.py @ 36743:d031609b3cb7 stable

changegroup: do not delta lfs revisions There is no way to distinguish whether a delta base is LFS or non-LFS. If the delta is against LFS rawtext, and the client trying to apply it has the base revision stored as fulltext, the delta (aka. bundle) will fail to apply. This patch forbids using delta for LFS revisions in changegroup so bad deltas won't be transmitted. Note: this does not solve the problem entirely. It solves LFS delta applying to non-LFS base. But the other direction: non-LFS delta applying to LFS base is not solved yet. Differential Revision: https://phab.mercurial-scm.org/D2067
author Jun Wu <quark@fb.com>
date Tue, 06 Feb 2018 19:08:25 -0800
parents f90f6fd130c1
children 33275ab5e837
comparison
equal deleted inserted replaced
36742:4e41b59633fa 36743:d031609b3cb7
75 REVIDX_ISCENSORED, 75 REVIDX_ISCENSORED,
76 REVIDX_ELLIPSIS, 76 REVIDX_ELLIPSIS,
77 REVIDX_EXTSTORED, 77 REVIDX_EXTSTORED,
78 ] 78 ]
79 REVIDX_KNOWN_FLAGS = util.bitsfrom(REVIDX_FLAGS_ORDER) 79 REVIDX_KNOWN_FLAGS = util.bitsfrom(REVIDX_FLAGS_ORDER)
80 # bitmark for flags that could cause rawdata content change
81 REVIDX_RAWTEXT_CHANGING_FLAGS = REVIDX_ISCENSORED | REVIDX_EXTSTORED
80 82
81 # max size of revlog with inline data 83 # max size of revlog with inline data
82 _maxinline = 131072 84 _maxinline = 131072
83 _chunksize = 1048576 85 _chunksize = 1048576
84 86
94 96
95 def addflagprocessor(flag, processor): 97 def addflagprocessor(flag, processor):
96 """Register a flag processor on a revision data flag. 98 """Register a flag processor on a revision data flag.
97 99
98 Invariant: 100 Invariant:
99 - Flags need to be defined in REVIDX_KNOWN_FLAGS and REVIDX_FLAGS_ORDER. 101 - Flags need to be defined in REVIDX_KNOWN_FLAGS and REVIDX_FLAGS_ORDER,
102 and REVIDX_RAWTEXT_CHANGING_FLAGS if they can alter rawtext.
100 - Only one flag processor can be registered on a specific flag. 103 - Only one flag processor can be registered on a specific flag.
101 - flagprocessors must be 3-tuples of functions (read, write, raw) with the 104 - flagprocessors must be 3-tuples of functions (read, write, raw) with the
102 following signatures: 105 following signatures:
103 - (read) f(self, rawtext) -> text, bool 106 - (read) f(self, rawtext) -> text, bool
104 - (write) f(self, text) -> rawtext, bool 107 - (write) f(self, text) -> rawtext, bool
710 try: 713 try:
711 self.rev(node) 714 self.rev(node)
712 return True 715 return True
713 except KeyError: 716 except KeyError:
714 return False 717 return False
718
719 def candelta(self, baserev, rev):
720 """whether two revisions (baserev, rev) can be delta-ed or not"""
721 # Disable delta if either rev requires a content-changing flag
722 # processor (ex. LFS). This is because such flag processor can alter
723 # the rawtext content that the delta will be based on, and two clients
724 # could have a same revlog node with different flags (i.e. different
725 # rawtext contents) and the delta could be incompatible.
726 if ((self.flags(baserev) & REVIDX_RAWTEXT_CHANGING_FLAGS)
727 or (self.flags(rev) & REVIDX_RAWTEXT_CHANGING_FLAGS)):
728 return False
729 return True
715 730
716 def clearcaches(self): 731 def clearcaches(self):
717 self._cache = None 732 self._cache = None
718 self._chainbasecache.clear() 733 self._chainbasecache.clear()
719 self._chunkcache = (0, '') 734 self._chunkcache = (0, '')