Mercurial > public > mercurial-scm > hg
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) |