1303 # slow path |
1303 # slow path |
1304 self.hook('preoutgoing', throw=True, source=source) |
1304 self.hook('preoutgoing', throw=True, source=source) |
1305 |
1305 |
1306 self.changegroupinfo(msng_cl_lst, source) |
1306 self.changegroupinfo(msng_cl_lst, source) |
1307 |
1307 |
1308 # Known heads are the list of heads that it is assumed the recipient |
1308 # We assume that all ancestors of bases are known |
1309 # of this changegroup will know about. |
1309 commonrevs = set(cl.ancestors(*[cl.rev(n) for n in bases])) |
1310 knownheads = set() |
|
1311 # We assume that all parents of bases are known heads. |
|
1312 for n in bases: |
|
1313 knownheads.update(cl.parents(n)) |
|
1314 knownheads.discard(nullid) |
|
1315 if knownheads: |
|
1316 # Now that we know what heads are known, we can compute which |
|
1317 # changesets are known. The recipient must know about all |
|
1318 # changesets required to reach the known heads from the null |
|
1319 # changeset. |
|
1320 has_cl_set, junk, junk = cl.nodesbetween(None, knownheads) |
|
1321 junk = None |
|
1322 # Transform the list into a set. |
|
1323 has_cl_set = set(has_cl_set) |
|
1324 else: |
|
1325 # If there were no known heads, the recipient cannot be assumed to |
|
1326 # know about any changesets. |
|
1327 has_cl_set = set() |
|
1328 |
1310 |
1329 # Make it easy to refer to self.manifest |
1311 # Make it easy to refer to self.manifest |
1330 mnfst = self.manifest |
1312 mnfst = self.manifest |
1331 # We don't know which manifests are missing yet |
1313 # We don't know which manifests are missing yet |
1332 msng_mnfst_set = {} |
1314 msng_mnfst_set = {} |
1393 hasset = set() |
1375 hasset = set() |
1394 # If a 'missing' filenode thinks it belongs to a changenode we |
1376 # If a 'missing' filenode thinks it belongs to a changenode we |
1395 # assume the recipient must have, then the recipient must have |
1377 # assume the recipient must have, then the recipient must have |
1396 # that filenode. |
1378 # that filenode. |
1397 for n in missingnodes: |
1379 for n in missingnodes: |
1398 clnode = cl.node(revlog.linkrev(revlog.rev(n))) |
1380 clrev = revlog.linkrev(revlog.rev(n)) |
1399 if clnode in has_cl_set: |
1381 if clrev in commonrevs: |
1400 hasset.add(n) |
1382 hasset.add(n) |
1401 for n in hasset: |
1383 for n in hasset: |
1402 missingnodes.pop(n, None) |
1384 missingnodes.pop(n, None) |
1403 for r in revlog.ancestors(*[revlog.rev(n) for n in hasset]): |
1385 for r in revlog.ancestors(*[revlog.rev(n) for n in hasset]): |
1404 missingnodes.pop(revlog.node(r), None) |
1386 missingnodes.pop(revlog.node(r), None) |