Show More
@@ -426,8 +426,10 b' When ``haveparents`` is false, the comma' | |||||
426 | has no file revisions data. This means that all referenced file revisions |
|
426 | has no file revisions data. This means that all referenced file revisions | |
427 | in the queried set of changeset revisions will be sent. |
|
427 | in the queried set of changeset revisions will be sent. | |
428 |
|
428 | |||
429 |
TODO we |
|
429 | TODO we want a more complicated mechanism for the client to specify which | |
430 | specify which ancestor revisions are known. |
|
430 | ancestor revisions are known. This is needed so intelligent deltas can be | |
|
431 | emitted and so updated linknodes can be sent if the client needs to adjust | |||
|
432 | its linknodes for existing file nodes to older changeset revisions. | |||
431 | TODO we may want to make linknodes an array so multiple changesets can be |
|
433 | TODO we may want to make linknodes an array so multiple changesets can be | |
432 | marked as introducing a file revision, since this can occur with e.g. hidden |
|
434 | marked as introducing a file revision, since this can occur with e.g. hidden | |
433 | changesets. |
|
435 | changesets. |
@@ -1156,48 +1156,38 b' def filesdata(repo, proto, haveparents, ' | |||||
1156 | # changeset, it should probably be allowed to access files data for that |
|
1156 | # changeset, it should probably be allowed to access files data for that | |
1157 | # changeset. |
|
1157 | # changeset. | |
1158 |
|
1158 | |||
1159 | cl = repo.changelog |
|
|||
1160 | clnode = cl.node |
|
|||
1161 | outgoing = resolvenodes(repo, revisions) |
|
1159 | outgoing = resolvenodes(repo, revisions) | |
1162 | filematcher = makefilematcher(repo, pathfilter) |
|
1160 | filematcher = makefilematcher(repo, pathfilter) | |
1163 |
|
1161 | |||
1164 | # Figure out what needs to be emitted. |
|
|||
1165 | changedpaths = set() |
|
|||
1166 | # path -> {fnode: linknode} |
|
1162 | # path -> {fnode: linknode} | |
1167 | fnodes = collections.defaultdict(dict) |
|
1163 | fnodes = collections.defaultdict(dict) | |
1168 |
|
1164 | |||
|
1165 | # We collect the set of relevant file revisions by iterating the changeset | |||
|
1166 | # revisions and either walking the set of files recorded in the changeset | |||
|
1167 | # or by walking the manifest at that revision. There is probably room for a | |||
|
1168 | # storage-level API to request this data, as it can be expensive to compute | |||
|
1169 | # and would benefit from caching or alternate storage from what revlogs | |||
|
1170 | # provide. | |||
1169 | for node in outgoing: |
|
1171 | for node in outgoing: | |
1170 | ctx = repo[node] |
|
1172 | ctx = repo[node] | |
1171 | changedpaths.update(ctx.files()) |
|
1173 | mctx = ctx.manifestctx() | |
1172 |
|
1174 | md = mctx.read() | ||
1173 | changedpaths = sorted(p for p in changedpaths if filematcher(p)) |
|
|||
1174 |
|
1175 | |||
1175 | # If ancestors are known, we send file revisions having a linkrev in the |
|
1176 | if haveparents: | |
1176 | # outgoing set of changeset revisions. |
|
1177 | checkpaths = ctx.files() | |
1177 | if haveparents: |
|
1178 | else: | |
1178 | outgoingclrevs = set(cl.rev(n) for n in outgoing) |
|
1179 | checkpaths = md.keys() | |
1179 |
|
||||
1180 | for path in changedpaths: |
|
|||
1181 | try: |
|
|||
1182 | store = getfilestore(repo, proto, path) |
|
|||
1183 | except FileAccessError as e: |
|
|||
1184 | raise error.WireprotoCommandError(e.msg, e.args) |
|
|||
1185 |
|
1180 | |||
1186 |
|
|
1181 | for path in checkpaths: | |
1187 | linkrev = store.linkrev(rev) |
|
1182 | fnode = md[path] | |
1188 |
|
||||
1189 | if linkrev in outgoingclrevs: |
|
|||
1190 | fnodes[path].setdefault(store.node(rev), clnode(linkrev)) |
|
|||
1191 |
|
1183 | |||
1192 | # If ancestors aren't known, we walk the manifests and send all |
|
1184 | if path in fnodes and fnode in fnodes[path]: | |
1193 | # encountered file revisions. |
|
1185 | continue | |
1194 | else: |
|
|||
1195 | for node in outgoing: |
|
|||
1196 | mctx = repo[node].manifestctx() |
|
|||
1197 |
|
1186 | |||
1198 | for path, fnode in mctx.read().items(): |
|
1187 | if not filematcher(path): | |
1199 | if filematcher(path): |
|
1188 | continue | |
1200 | fnodes[path].setdefault(fnode, node) |
|
1189 | ||
|
1190 | fnodes[path].setdefault(fnode, node) | |||
1201 |
|
1191 | |||
1202 | yield { |
|
1192 | yield { | |
1203 | b'totalpaths': len(fnodes), |
|
1193 | b'totalpaths': len(fnodes), |
@@ -1267,8 +1267,6 b' rewritten accordingly' | |||||
1267 | } |
|
1267 | } | |
1268 | ] |
|
1268 | ] | |
1269 |
|
1269 | |||
1270 | TODO this is buggy |
|
|||
1271 |
|
||||
1272 | $ sendhttpv2peer << EOF |
|
1270 | $ sendhttpv2peer << EOF | |
1273 | > command filesdata |
|
1271 | > command filesdata | |
1274 | > revisions eval:[{ |
|
1272 | > revisions eval:[{ | |
@@ -1284,8 +1282,16 b' TODO this is buggy' | |||||
1284 | sending filesdata command |
|
1282 | sending filesdata command | |
1285 | response: gen[ |
|
1283 | response: gen[ | |
1286 | { |
|
1284 | { | |
1287 |
b'totalitems': |
|
1285 | b'totalitems': 1, | |
1288 |
b'totalpaths': |
|
1286 | b'totalpaths': 1 | |
|
1287 | }, | |||
|
1288 | { | |||
|
1289 | b'path': b'dupe-file', | |||
|
1290 | b'totalitems': 1 | |||
|
1291 | }, | |||
|
1292 | { | |||
|
1293 | b'linknode': b'G\xfc0X\t\x11#,\xb2dg[@(\x19\xde\xdd\xf6\xc6\xf0', | |||
|
1294 | b'node': b'.\xd2\xa3\x91*\x0b$P C\xea\xe8N\xe4\xb2y\xc1\x8b\x90\xdd' | |||
1289 | } |
|
1295 | } | |
1290 | ] |
|
1296 | ] | |
1291 |
|
1297 |
@@ -1300,21 +1300,6 b' Perform an incremental pull of both head' | |||||
1300 |
|
1300 | |||
1301 | #if reporevlogstore |
|
1301 | #if reporevlogstore | |
1302 | $ hg -R client-linknode-2 debugrevlogindex dupe-file |
|
1302 | $ hg -R client-linknode-2 debugrevlogindex dupe-file | |
1303 | abort: revlog 'dupe-file' not found |
|
1303 | rev linkrev nodeid p1 p2 | |
1304 | [255] |
|
1304 | 0 2 2ed2a3912a0b 000000000000 000000000000 | |
1305 | #endif |
|
1305 | #endif | |
1306 |
|
||||
1307 | $ hg -R client-linknode-2 verify |
|
|||
1308 | checking changesets |
|
|||
1309 | checking manifests |
|
|||
1310 | crosschecking files in changesets and manifests |
|
|||
1311 | checking files |
|
|||
1312 | warning: revlog 'data/dupe-file.i' not in fncache! |
|
|||
1313 | 2: empty or missing dupe-file |
|
|||
1314 | dupe-file@2: manifest refers to unknown revision 2ed2a3912a0b |
|
|||
1315 | checked 3 changesets with 2 changes to 3 files |
|
|||
1316 | 1 warnings encountered! |
|
|||
1317 | hint: run "hg debugrebuildfncache" to recover from corrupt fncache |
|
|||
1318 | 2 integrity errors encountered! |
|
|||
1319 | (first damaged changeset appears to be 2) |
|
|||
1320 | [1] |
|
General Comments 0
You need to be logged in to leave comments.
Login now