comparison mercurial/testing/storage.py @ 45788:a5206e71c536

revlog: extend addgroup() with callback for duplicates The addgroup() interface currently doesn't allow the caller to keep track of duplicated nodes except by looking at the returned node list. Add an optional second callback for this purpose and change the return type to a boolean. This allows follow-up changes to use more efficient storage for the node list in places that are memory-sensitive. Differential Revision: https://phab.mercurial-scm.org/D9231
author Joerg Sonnenberger <joerg@bec.de>
date Sun, 18 Oct 2020 22:18:02 +0200
parents a1ee825fc6c5
children 89a2afe31e82
comparison
equal deleted inserted replaced
45787:225e513c444e 45788:a5206e71c536
1115 1115
1116 def linkmapper(node): 1116 def linkmapper(node):
1117 return 0 1117 return 0
1118 1118
1119 with self._maketransactionfn() as tr: 1119 with self._maketransactionfn() as tr:
1120 nodes = f.addgroup([], None, tr, addrevisioncb=cb) 1120 nodes = []
1121
1122 def onchangeset(cl, node):
1123 nodes.append(node)
1124 cb(cl, node)
1125
1126 def ondupchangeset(cl, node):
1127 nodes.append(node)
1128
1129 f.addgroup(
1130 [],
1131 None,
1132 tr,
1133 addrevisioncb=onchangeset,
1134 duplicaterevisioncb=ondupchangeset,
1135 )
1121 1136
1122 self.assertEqual(nodes, []) 1137 self.assertEqual(nodes, [])
1123 self.assertEqual(callbackargs, []) 1138 self.assertEqual(callbackargs, [])
1124 self.assertEqual(len(f), 0) 1139 self.assertEqual(len(f), 0)
1125 1140
1134 deltas = [ 1149 deltas = [
1135 (node0, nullid, nullid, nullid, nullid, delta0, 0), 1150 (node0, nullid, nullid, nullid, nullid, delta0, 0),
1136 ] 1151 ]
1137 1152
1138 with self._maketransactionfn() as tr: 1153 with self._maketransactionfn() as tr:
1139 nodes = f.addgroup(deltas, linkmapper, tr, addrevisioncb=cb) 1154 nodes = []
1155
1156 def onchangeset(cl, node):
1157 nodes.append(node)
1158 cb(cl, node)
1159
1160 def ondupchangeset(cl, node):
1161 nodes.append(node)
1162
1163 f.addgroup(
1164 deltas,
1165 linkmapper,
1166 tr,
1167 addrevisioncb=onchangeset,
1168 duplicaterevisioncb=ondupchangeset,
1169 )
1140 1170
1141 self.assertEqual( 1171 self.assertEqual(
1142 nodes, 1172 nodes,
1143 [ 1173 [
1144 b'\x49\xd8\xcb\xb1\x5c\xe2\x57\x92\x04\x47' 1174 b'\x49\xd8\xcb\xb1\x5c\xe2\x57\x92\x04\x47'
1173 delta = mdiff.trivialdiffheader(len(fulltext)) + fulltext 1203 delta = mdiff.trivialdiffheader(len(fulltext)) + fulltext
1174 1204
1175 deltas.append((nodes[i], nullid, nullid, nullid, nullid, delta, 0)) 1205 deltas.append((nodes[i], nullid, nullid, nullid, nullid, delta, 0))
1176 1206
1177 with self._maketransactionfn() as tr: 1207 with self._maketransactionfn() as tr:
1178 self.assertEqual(f.addgroup(deltas, lambda x: 0, tr), nodes) 1208 newnodes = []
1209
1210 def onchangeset(cl, node):
1211 newnodes.append(node)
1212
1213 f.addgroup(
1214 deltas,
1215 lambda x: 0,
1216 tr,
1217 addrevisioncb=onchangeset,
1218 duplicaterevisioncb=onchangeset,
1219 )
1220 self.assertEqual(newnodes, nodes)
1179 1221
1180 self.assertEqual(len(f), len(deltas)) 1222 self.assertEqual(len(f), len(deltas))
1181 self.assertEqual(list(f.revs()), [0, 1, 2]) 1223 self.assertEqual(list(f.revs()), [0, 1, 2])
1182 self.assertEqual(f.rev(nodes[0]), 0) 1224 self.assertEqual(f.rev(nodes[0]), 0)
1183 self.assertEqual(f.rev(nodes[1]), 1) 1225 self.assertEqual(f.rev(nodes[1]), 1)