The v2_censor function is huge, now that its content has settled a bit it is a
good time to split individual part inside dedicated function.
The last part is the file copying and opening logic. It now have its own
function.
| Alphare |
| hg-reviewers |
The v2_censor function is huge, now that its content has settled a bit it is a
good time to split individual part inside dedicated function.
The last part is the file copying and opening logic. It now have its own
function.
| Automatic diff as part of commit; lint not applicable. |
| Automatic diff as part of commit; unit tests not applicable. |
| # rev → (new_base, data_start, data_end, compression_mode) | # rev → (new_base, data_start, data_end, compression_mode) | ||||
| rewritten_entries = _precompute_rewritten_delta( | rewritten_entries = _precompute_rewritten_delta( | ||||
| rl, | rl, | ||||
| old_index, | old_index, | ||||
| {censor_rev}, | {censor_rev}, | ||||
| tmp_storage, | tmp_storage, | ||||
| ) | ) | ||||
| old_index_filepath = rl.opener.join(docket.index_filepath()) | all_files = _setup_new_files( | ||||
| old_data_filepath = rl.opener.join(docket.data_filepath()) | rl, | ||||
| old_sidedata_filepath = rl.opener.join(docket.sidedata_filepath()) | index_cutoff, | ||||
| data_cutoff, | |||||
| new_index_filepath = rl.opener.join(docket.new_index_file()) | sidedata_cutoff, | ||||
| new_data_filepath = rl.opener.join(docket.new_data_file()) | |||||
| new_sidedata_filepath = rl.opener.join(docket.new_sidedata_file()) | |||||
| util.copyfile( | |||||
| old_index_filepath, new_index_filepath, nb_bytes=index_cutoff | |||||
| ) | |||||
| util.copyfile( | |||||
| old_data_filepath, new_data_filepath, nb_bytes=data_cutoff | |||||
| ) | |||||
| util.copyfile( | |||||
| old_sidedata_filepath, | |||||
| new_sidedata_filepath, | |||||
| nb_bytes=sidedata_cutoff, | |||||
| ) | |||||
| rl.opener.register_file(docket.index_filepath()) | |||||
| rl.opener.register_file(docket.data_filepath()) | |||||
| rl.opener.register_file(docket.sidedata_filepath()) | |||||
| docket.index_end = index_cutoff | |||||
| docket.data_end = data_cutoff | |||||
| docket.sidedata_end = sidedata_cutoff | |||||
| # reload the revlog internal information | |||||
| rl.clearcaches() | |||||
| rl._loadindex(docket=docket) | |||||
| @contextlib.contextmanager | |||||
| def all_files(): | |||||
| # hide opening in an helper function to please check-code, black | |||||
| # and various python ersion at the same time | |||||
| with open(old_data_filepath, 'rb') as old_data_file: | |||||
| with open(old_sidedata_filepath, 'rb') as old_sidedata_file: | |||||
| with open(new_index_filepath, 'r+b') as new_index_file: | |||||
| with open(new_data_filepath, 'r+b') as new_data_file: | |||||
| with open( | |||||
| new_sidedata_filepath, 'r+b' | |||||
| ) as new_sidedata_file: | |||||
| yield ( | |||||
| old_data_file, | |||||
| old_sidedata_file, | |||||
| new_index_file, | |||||
| new_data_file, | |||||
| new_sidedata_file, | |||||
| ) | ) | ||||
| # we dont need to open the old index file since its content already | # we dont need to open the old index file since its content already | ||||
| # exist in a usable form in `old_index`. | # exist in a usable form in `old_index`. | ||||
| with all_files() as open_files: | with all_files() as open_files: | ||||
| ( | ( | ||||
| old_data_file, | old_data_file, | ||||
| old_sidedata_file, | old_sidedata_file, | ||||
| new_index_file, | new_index_file, | ||||
| new_data_file, | new_data_file, | ||||
| new_sidedata_file, | new_sidedata_file, | ||||
| ) = open_files | ) = open_files | ||||
| new_index_file.seek(0, os.SEEK_END) | |||||
| assert new_index_file.tell() == index_cutoff | |||||
| new_data_file.seek(0, os.SEEK_END) | |||||
| assert new_data_file.tell() == data_cutoff | |||||
| new_sidedata_file.seek(0, os.SEEK_END) | |||||
| assert new_sidedata_file.tell() == sidedata_cutoff | |||||
| # writing the censored revision | # writing the censored revision | ||||
| _rewrite_censor( | _rewrite_censor( | ||||
| rl, | rl, | ||||
| old_index, | old_index, | ||||
| open_files, | open_files, | ||||
| censor_rev, | censor_rev, | ||||
| tombstone, | tombstone, | ||||
| # using `tell` is a bit lazy, but we are not here for speed | # using `tell` is a bit lazy, but we are not here for speed | ||||
| start = tmp_storage.tell() | start = tmp_storage.tell() | ||||
| tmp_storage.write(d.data[1]) | tmp_storage.write(d.data[1]) | ||||
| end = tmp_storage.tell() | end = tmp_storage.tell() | ||||
| rewritten_entries[rev] = (d.base, start, end, comp_mode) | rewritten_entries[rev] = (d.base, start, end, comp_mode) | ||||
| return rewritten_entries | return rewritten_entries | ||||
| def _setup_new_files( | |||||
| revlog, | |||||
| index_cutoff, | |||||
| data_cutoff, | |||||
| sidedata_cutoff, | |||||
| ): | |||||
| """ | |||||
| return a context manager to open all the relevant files: | |||||
| - old_data_file, | |||||
| - old_sidedata_file, | |||||
| - new_index_file, | |||||
| - new_data_file, | |||||
| - new_sidedata_file, | |||||
| The old_index_file is not here because it is accessed through the | |||||
| `old_index` object if the caller function. | |||||
| """ | |||||
| docket = revlog._docket | |||||
| old_index_filepath = revlog.opener.join(docket.index_filepath()) | |||||
| old_data_filepath = revlog.opener.join(docket.data_filepath()) | |||||
| old_sidedata_filepath = revlog.opener.join(docket.sidedata_filepath()) | |||||
| new_index_filepath = revlog.opener.join(docket.new_index_file()) | |||||
| new_data_filepath = revlog.opener.join(docket.new_data_file()) | |||||
| new_sidedata_filepath = revlog.opener.join(docket.new_sidedata_file()) | |||||
| util.copyfile(old_index_filepath, new_index_filepath, nb_bytes=index_cutoff) | |||||
| util.copyfile(old_data_filepath, new_data_filepath, nb_bytes=data_cutoff) | |||||
| util.copyfile( | |||||
| old_sidedata_filepath, | |||||
| new_sidedata_filepath, | |||||
| nb_bytes=sidedata_cutoff, | |||||
| ) | |||||
| revlog.opener.register_file(docket.index_filepath()) | |||||
| revlog.opener.register_file(docket.data_filepath()) | |||||
| revlog.opener.register_file(docket.sidedata_filepath()) | |||||
| docket.index_end = index_cutoff | |||||
| docket.data_end = data_cutoff | |||||
| docket.sidedata_end = sidedata_cutoff | |||||
| # reload the revlog internal information | |||||
| revlog.clearcaches() | |||||
| revlog._loadindex(docket=docket) | |||||
| @contextlib.contextmanager | |||||
| def all_files_opener(): | |||||
| # hide opening in an helper function to please check-code, black | |||||
| # and various python version at the same time | |||||
| with open(old_data_filepath, 'rb') as old_data_file: | |||||
| with open(old_sidedata_filepath, 'rb') as old_sidedata_file: | |||||
| with open(new_index_filepath, 'r+b') as new_index_file: | |||||
| with open(new_data_filepath, 'r+b') as new_data_file: | |||||
| with open( | |||||
| new_sidedata_filepath, 'r+b' | |||||
| ) as new_sidedata_file: | |||||
| new_index_file.seek(0, os.SEEK_END) | |||||
| assert new_index_file.tell() == index_cutoff | |||||
| new_data_file.seek(0, os.SEEK_END) | |||||
| assert new_data_file.tell() == data_cutoff | |||||
| new_sidedata_file.seek(0, os.SEEK_END) | |||||
| assert new_sidedata_file.tell() == sidedata_cutoff | |||||
| yield ( | |||||
| old_data_file, | |||||
| old_sidedata_file, | |||||
| new_index_file, | |||||
| new_data_file, | |||||
| new_sidedata_file, | |||||
| ) | |||||
| return all_files_opener | |||||
| def _rewrite_simple( | def _rewrite_simple( | ||||
| revlog, | revlog, | ||||
| old_index, | old_index, | ||||
| all_files, | all_files, | ||||
| rev, | rev, | ||||
| rewritten_entries, | rewritten_entries, | ||||
| tmp_storage, | tmp_storage, | ||||
| ): | ): | ||||