comparison mercurial/revlog.py @ 47078:223b47235d1c

sidedata: enable sidedata computers to optionally rewrite flags Sidedata computers may want to influence the flags of the revision they touch. For example, the computer for changelog-based copytracing can add a flag to signify that this revision might affect copytracing, inversely removing said flag if the information is no longer applicable. See inline documentation in `storageutil` for more details. Differential Revision: https://phab.mercurial-scm.org/D10344
author Rapha?l Gom?s <rgomes@octobus.net>
date Thu, 08 Apr 2021 16:55:17 +0200
parents 119790e1c67c
children 27f1191b1305
comparison
equal deleted inserted replaced
47077:119790e1c67c 47078:223b47235d1c
3103 # Maybe this bug still exists, see revlog._writeentry 3103 # Maybe this bug still exists, see revlog._writeentry
3104 fp.seek(0, os.SEEK_END) 3104 fp.seek(0, os.SEEK_END)
3105 current_offset = fp.tell() 3105 current_offset = fp.tell()
3106 for rev in range(startrev, endrev + 1): 3106 for rev in range(startrev, endrev + 1):
3107 entry = self.index[rev] 3107 entry = self.index[rev]
3108 new_sidedata = storageutil.run_sidedata_helpers( 3108 new_sidedata, flags = storageutil.run_sidedata_helpers(
3109 store=self, 3109 store=self,
3110 sidedata_helpers=helpers, 3110 sidedata_helpers=helpers,
3111 sidedata={}, 3111 sidedata={},
3112 rev=rev, 3112 rev=rev,
3113 ) 3113 )
3119 # rewriting entries that already have sidedata is not 3119 # rewriting entries that already have sidedata is not
3120 # supported yet, because it introduces garbage data in the 3120 # supported yet, because it introduces garbage data in the
3121 # revlog. 3121 # revlog.
3122 msg = b"Rewriting existing sidedata is not supported yet" 3122 msg = b"Rewriting existing sidedata is not supported yet"
3123 raise error.Abort(msg) 3123 raise error.Abort(msg)
3124 entry = entry[:8] 3124
3125 # Apply (potential) flags to add and to remove after running
3126 # the sidedata helpers
3127 new_offset_flags = entry[0] | flags[0] & ~flags[1]
3128 entry = (new_offset_flags,) + entry[1:8]
3125 entry += (current_offset, len(serialized_sidedata)) 3129 entry += (current_offset, len(serialized_sidedata))
3126 3130
3127 fp.write(serialized_sidedata) 3131 fp.write(serialized_sidedata)
3128 new_entries.append(entry) 3132 new_entries.append(entry)
3129 current_offset += len(serialized_sidedata) 3133 current_offset += len(serialized_sidedata)
3130 3134
3131 # rewrite the new index entries 3135 # rewrite the new index entries
3132 with self._indexfp(b'w+') as fp: 3136 with self._indexfp(b'w+') as fp:
3133 fp.seek(startrev * self.index.entry_size) 3137 fp.seek(startrev * self.index.entry_size)
3134 for i, entry in enumerate(new_entries): 3138 for i, e in enumerate(new_entries):
3135 rev = startrev + i 3139 rev = startrev + i
3136 self.index.replace_sidedata_info(rev, entry[8], entry[9]) 3140 self.index.replace_sidedata_info(rev, e[8], e[9], e[0])
3137 packed = self.index.entry_binary(rev) 3141 packed = self.index.entry_binary(rev)
3138 if rev == 0: 3142 if rev == 0:
3139 header = self.index.pack_header(self.version) 3143 header = self.index.pack_header(self.version)
3140 packed = header + packed 3144 packed = header + packed
3141 fp.write(packed) 3145 fp.write(packed)