##// END OF EJS Templates
revlog: implement changelogv2 packing and unpacking in C...
pacien -
r49617:7dd5a2c0 default
parent child Browse files
Show More
@@ -133,8 +133,9 b' static const long v1_entry_size = 64;'
133 133 /* A Revlogv2 index entry is 96 bytes long. */
134 134 static const long v2_entry_size = 96;
135 135
136 static const long format_v1 = 1; /* Internal only, could be any number */
137 static const long format_v2 = 2; /* Internal only, could be any number */
136 static const long format_v1 = 1; /* Internal only, could be any number */
137 static const long format_v2 = 2; /* Internal only, could be any number */
138 static const long format_cl2 = 3; /* Internal only, could be any number */
138 139
139 140 static const long entry_v1_offset_high = 0;
140 141 static const long entry_v1_offset_offset_flags = 4;
@@ -160,6 +161,19 b' static const long entry_v2_offset_sideda'
160 161 static const long entry_v2_offset_all_comp_mode = 76;
161 162 /* next free offset: 77 */
162 163
164 static const long entry_cl2_offset_high = 0;
165 static const long entry_cl2_offset_offset_flags = 4;
166 static const long entry_cl2_offset_comp_len = 8;
167 static const long entry_cl2_offset_uncomp_len = 12;
168 static const long entry_cl2_offset_parent_1 = 16;
169 static const long entry_cl2_offset_parent_2 = 20;
170 static const long entry_cl2_offset_node_id = 24;
171 static const long entry_cl2_offset_sidedata_offset = 56;
172 static const long entry_cl2_offset_sidedata_comp_len = 64;
173 static const long entry_cl2_offset_all_comp_mode = 68;
174 static const long entry_cl2_offset_rank = 69;
175 /* next free offset: 73 */
176
163 177 static const char comp_mode_inline = 2;
164 178 static const char rank_unknown = -1;
165 179
@@ -236,6 +250,9 b' static inline int index_get_parents(inde'
236 250 } else if (self->format_version == format_v2) {
237 251 ps[0] = getbe32(data + entry_v2_offset_parent_1);
238 252 ps[1] = getbe32(data + entry_v2_offset_parent_2);
253 } else if (self->format_version == format_cl2) {
254 ps[0] = getbe32(data + entry_cl2_offset_parent_1);
255 ps[1] = getbe32(data + entry_cl2_offset_parent_2);
239 256 } else {
240 257 raise_revlog_error();
241 258 return -1;
@@ -307,6 +324,10 b' static inline int64_t index_get_start(in'
307 324 getbe32(data + entry_v2_offset_high);
308 325 offset |= ((uint64_t)offset_high) << 32;
309 326 }
327 } else if (self->format_version == format_cl2) {
328 uint32_t offset_high = getbe32(data + entry_cl2_offset_high);
329 offset = getbe32(data + entry_cl2_offset_offset_flags);
330 offset |= ((uint64_t)offset_high) << 32;
310 331 } else {
311 332 raise_revlog_error();
312 333 return -1;
@@ -329,6 +350,8 b' static inline int index_get_length(index'
329 350 tmp = (int)getbe32(data + entry_v1_offset_comp_len);
330 351 } else if (self->format_version == format_v2) {
331 352 tmp = (int)getbe32(data + entry_v2_offset_comp_len);
353 } else if (self->format_version == format_cl2) {
354 tmp = (int)getbe32(data + entry_cl2_offset_comp_len);
332 355 } else {
333 356 raise_revlog_error();
334 357 return -1;
@@ -357,7 +380,7 b' static PyObject *index_get(indexObject *'
357 380 {
358 381 uint64_t offset_flags, sidedata_offset;
359 382 int comp_len, uncomp_len, base_rev, link_rev, parent_1, parent_2,
360 sidedata_comp_len;
383 sidedata_comp_len, rank = rank_unknown;
361 384 char data_comp_mode, sidedata_comp_mode;
362 385 const char *c_node_id;
363 386 const char *data;
@@ -434,6 +457,30 b' static PyObject *index_get(indexObject *'
434 457 data_comp_mode = data[entry_v2_offset_all_comp_mode] & 3;
435 458 sidedata_comp_mode =
436 459 ((data[entry_v2_offset_all_comp_mode] >> 2) & 3);
460 } else if (self->format_version == format_cl2) {
461 uint32_t offset_high = getbe32(data + entry_cl2_offset_high);
462 offset_flags = getbe32(data + entry_cl2_offset_offset_flags);
463 offset_flags |= ((uint64_t)offset_high) << 32;
464 comp_len = getbe32(data + entry_cl2_offset_comp_len);
465 uncomp_len = getbe32(data + entry_cl2_offset_uncomp_len);
466 /* base_rev and link_rev are not stored in changelogv2, but are
467 still used by some functions shared with the other revlogs.
468 They are supposed to contain links to other revisions,
469 but they always point to themselves in the case of a changelog.
470 */
471 base_rev = pos;
472 link_rev = pos;
473 parent_1 = getbe32(data + entry_cl2_offset_parent_1);
474 parent_2 = getbe32(data + entry_cl2_offset_parent_2);
475 c_node_id = data + entry_cl2_offset_node_id;
476 sidedata_offset =
477 getbe64(data + entry_cl2_offset_sidedata_offset);
478 sidedata_comp_len =
479 getbe32(data + entry_cl2_offset_sidedata_comp_len);
480 data_comp_mode = data[entry_cl2_offset_all_comp_mode] & 3;
481 sidedata_comp_mode =
482 ((data[entry_cl2_offset_all_comp_mode] >> 2) & 3);
483 rank = getbe32(data + entry_cl2_offset_rank);
437 484 } else {
438 485 raise_revlog_error();
439 486 return NULL;
@@ -442,7 +489,7 b' static PyObject *index_get(indexObject *'
442 489 return Py_BuildValue(tuple_format, offset_flags, comp_len, uncomp_len,
443 490 base_rev, link_rev, parent_1, parent_2, c_node_id,
444 491 self->nodelen, sidedata_offset, sidedata_comp_len,
445 data_comp_mode, sidedata_comp_mode, rank_unknown);
492 data_comp_mode, sidedata_comp_mode, rank);
446 493 }
447 494 /*
448 495 * Pack header information in binary
@@ -514,6 +561,8 b' static const char *index_node(indexObjec'
514 561 node_id = data + entry_v1_offset_node_id;
515 562 } else if (self->format_version == format_v2) {
516 563 node_id = data + entry_v2_offset_node_id;
564 } else if (self->format_version == format_cl2) {
565 node_id = data + entry_cl2_offset_node_id;
517 566 } else {
518 567 raise_revlog_error();
519 568 return NULL;
@@ -636,6 +685,24 b' static PyObject *index_append(indexObjec'
636 685 comp_field = data_comp_mode & 3;
637 686 comp_field = comp_field | (sidedata_comp_mode & 3) << 2;
638 687 data[entry_v2_offset_all_comp_mode] = comp_field;
688 } else if (self->format_version == format_cl2) {
689 putbe32(offset_flags >> 32, data + entry_cl2_offset_high);
690 putbe32(offset_flags & 0xffffffffU,
691 data + entry_cl2_offset_offset_flags);
692 putbe32(comp_len, data + entry_cl2_offset_comp_len);
693 putbe32(uncomp_len, data + entry_cl2_offset_uncomp_len);
694 putbe32(parent_1, data + entry_cl2_offset_parent_1);
695 putbe32(parent_2, data + entry_cl2_offset_parent_2);
696 memcpy(data + entry_cl2_offset_node_id, c_node_id,
697 c_node_id_len);
698 putbe64(sidedata_offset,
699 data + entry_cl2_offset_sidedata_offset);
700 putbe32(sidedata_comp_len,
701 data + entry_cl2_offset_sidedata_comp_len);
702 comp_field = data_comp_mode & 3;
703 comp_field = comp_field | (sidedata_comp_mode & 3) << 2;
704 data[entry_cl2_offset_all_comp_mode] = comp_field;
705 putbe32(rank, data + entry_cl2_offset_rank);
639 706 } else {
640 707 raise_revlog_error();
641 708 return NULL;
@@ -693,12 +760,28 b' static PyObject *index_replace_sidedata_'
693 760 /* Find the newly added node, offset from the "already on-disk" length
694 761 */
695 762 data = self->added + self->entry_size * (rev - self->length);
696 putbe64(offset_flags, data + entry_v2_offset_high);
697 putbe64(sidedata_offset, data + entry_v2_offset_sidedata_offset);
698 putbe32(sidedata_comp_len, data + entry_v2_offset_sidedata_comp_len);
699 data[entry_v2_offset_all_comp_mode] =
700 (data[entry_v2_offset_all_comp_mode] & ~(3 << 2)) |
701 ((comp_mode & 3) << 2);
763 if (self->format_version == format_v2) {
764 putbe64(offset_flags, data + entry_v2_offset_high);
765 putbe64(sidedata_offset,
766 data + entry_v2_offset_sidedata_offset);
767 putbe32(sidedata_comp_len,
768 data + entry_v2_offset_sidedata_comp_len);
769 data[entry_v2_offset_all_comp_mode] =
770 (data[entry_v2_offset_all_comp_mode] & ~(3 << 2)) |
771 ((comp_mode & 3) << 2);
772 } else if (self->format_version == format_cl2) {
773 putbe64(offset_flags, data + entry_cl2_offset_high);
774 putbe64(sidedata_offset,
775 data + entry_cl2_offset_sidedata_offset);
776 putbe32(sidedata_comp_len,
777 data + entry_cl2_offset_sidedata_comp_len);
778 data[entry_cl2_offset_all_comp_mode] =
779 (data[entry_cl2_offset_all_comp_mode] & ~(3 << 2)) |
780 ((comp_mode & 3) << 2);
781 } else {
782 raise_revlog_error();
783 return NULL;
784 }
702 785
703 786 Py_RETURN_NONE;
704 787 }
@@ -1246,6 +1329,8 b' static inline int index_baserev(indexObj'
1246 1329 result = getbe32(data + entry_v1_offset_base_rev);
1247 1330 } else if (self->format_version == format_v2) {
1248 1331 result = getbe32(data + entry_v2_offset_base_rev);
1332 } else if (self->format_version == format_cl2) {
1333 return rev;
1249 1334 } else {
1250 1335 raise_revlog_error();
1251 1336 return -1;
General Comments 0
You need to be logged in to leave comments. Login now