1362 else: |
1362 else: |
1363 if n[1] not in seen and n[1] not in fetch: |
1363 if n[1] not in seen and n[1] not in fetch: |
1364 if n[2] in m and n[3] in m: |
1364 if n[2] in m and n[3] in m: |
1365 self.ui.debug("found new changeset %s\n" % |
1365 self.ui.debug("found new changeset %s\n" % |
1366 short(n[1])) |
1366 short(n[1])) |
1367 fetch.append(n[1]) # earliest unknown |
1367 fetch[n[1]] = 1 # earliest unknown |
1368 base[n[2]] = 1 # latest known |
1368 base[n[2]] = 1 # latest known |
1369 continue |
1369 continue |
1370 |
1370 |
1371 for a in n[2:4]: |
1371 for a in n[2:4]: |
1372 if a not in rep: |
1372 if a not in rep: |
1381 (reqcnt, " ".join(map(short, r)))) |
1381 (reqcnt, " ".join(map(short, r)))) |
1382 for p in range(0, len(r), 10): |
1382 for p in range(0, len(r), 10): |
1383 for b in remote.branches(r[p:p+10]): |
1383 for b in remote.branches(r[p:p+10]): |
1384 self.ui.debug("received %s:%s\n" % |
1384 self.ui.debug("received %s:%s\n" % |
1385 (short(b[0]), short(b[1]))) |
1385 (short(b[0]), short(b[1]))) |
1386 if b[0] not in m and b[0] not in seen: |
1386 if b[0] in m: |
|
1387 self.ui.debug("found base node %s\n" % short(b[0])) |
|
1388 base[b[0]] = 1 |
|
1389 elif b[0] not in seen: |
1387 unknown.append(b) |
1390 unknown.append(b) |
1388 |
1391 |
1389 # do binary search on the branches we found |
1392 # do binary search on the branches we found |
1390 while search: |
1393 while search: |
1391 n = search.pop(0) |
1394 n = search.pop(0) |
1398 self.ui.debug("narrowing %d:%d %s\n" % (f, len(l), short(i))) |
1401 self.ui.debug("narrowing %d:%d %s\n" % (f, len(l), short(i))) |
1399 if i in m: |
1402 if i in m: |
1400 if f <= 2: |
1403 if f <= 2: |
1401 self.ui.debug("found new branch changeset %s\n" % |
1404 self.ui.debug("found new branch changeset %s\n" % |
1402 short(p)) |
1405 short(p)) |
1403 fetch.append(p) |
1406 fetch[p] = 1 |
1404 base[i] = 1 |
1407 base[i] = 1 |
1405 else: |
1408 else: |
1406 self.ui.debug("narrowed branch search to %s:%s\n" |
1409 self.ui.debug("narrowed branch search to %s:%s\n" |
1407 % (short(p), short(i))) |
1410 % (short(p), short(i))) |
1408 search.append((p, i)) |
1411 search.append((p, i)) |
1409 break |
1412 break |
1410 p, f = i, f * 2 |
1413 p, f = i, f * 2 |
1411 |
1414 |
1412 # sanity check our fetch list |
1415 # sanity check our fetch list |
1413 for f in fetch: |
1416 for f in fetch.keys(): |
1414 if f in m: |
1417 if f in m: |
1415 raise RepoError("already have changeset " + short(f[:4])) |
1418 raise RepoError("already have changeset " + short(f[:4])) |
1416 |
1419 |
1417 if base.keys() == [nullid]: |
1420 if base.keys() == [nullid]: |
1418 self.ui.warn("warning: pulling from an unrelated repository!\n") |
1421 self.ui.warn("warning: pulling from an unrelated repository!\n") |
1419 |
1422 |
1420 self.ui.note("adding new changesets starting at " + |
1423 self.ui.note("found new changesets starting at " + |
1421 " ".join([short(f) for f in fetch]) + "\n") |
1424 " ".join([short(f) for f in fetch]) + "\n") |
1422 |
1425 |
1423 self.ui.debug("%d total queries\n" % reqcnt) |
1426 self.ui.debug("%d total queries\n" % reqcnt) |
1424 |
1427 |
1425 return fetch |
1428 return fetch.keys() |
1426 |
1429 |
1427 def findoutgoing(self, remote, base=None, heads=None): |
1430 def findoutgoing(self, remote, base=None, heads=None): |
1428 if base == None: |
1431 if base == None: |
1429 base = {} |
1432 base = {} |
1430 self.findincoming(remote, base, heads) |
1433 self.findincoming(remote, base, heads) |
|
1434 |
|
1435 self.ui.debug("common changesets up to " |
|
1436 + " ".join(map(short, base.keys())) + "\n") |
1431 |
1437 |
1432 remain = dict.fromkeys(self.changelog.nodemap) |
1438 remain = dict.fromkeys(self.changelog.nodemap) |
1433 |
1439 |
1434 # prune everything remote has from the tree |
1440 # prune everything remote has from the tree |
1435 del remain[nullid] |
1441 del remain[nullid] |