comparison mercurial/localrepo.py @ 13364:ddddb76f2da3

bookmarks: merge low-level push/pull support into core
author Matt Mackall <mpm@selenic.com>
date Thu, 10 Feb 2011 13:46:28 -0600
parents 999f616b09dc
children f1c5294e9119
comparison
equal deleted inserted replaced
13363:999f616b09dc 13364:ddddb76f2da3
1299 tmp = discovery.findcommonincoming(self, remote, heads=heads, 1299 tmp = discovery.findcommonincoming(self, remote, heads=heads,
1300 force=force) 1300 force=force)
1301 common, fetch, rheads = tmp 1301 common, fetch, rheads = tmp
1302 if not fetch: 1302 if not fetch:
1303 self.ui.status(_("no changes found\n")) 1303 self.ui.status(_("no changes found\n"))
1304 return 0 1304 result = 0
1305
1306 if heads is None and fetch == [nullid]:
1307 self.ui.status(_("requesting all changes\n"))
1308 elif heads is None and remote.capable('changegroupsubset'):
1309 # issue1320, avoid a race if remote changed after discovery
1310 heads = rheads
1311
1312 if heads is None:
1313 cg = remote.changegroup(fetch, 'pull')
1314 else: 1305 else:
1315 if not remote.capable('changegroupsubset'): 1306 if heads is None and fetch == [nullid]:
1307 self.ui.status(_("requesting all changes\n"))
1308 elif heads is None and remote.capable('changegroupsubset'):
1309 # issue1320, avoid a race if remote changed after discovery
1310 heads = rheads
1311
1312 if heads is None:
1313 cg = remote.changegroup(fetch, 'pull')
1314 elif not remote.capable('changegroupsubset'):
1316 raise util.Abort(_("partial pull cannot be done because " 1315 raise util.Abort(_("partial pull cannot be done because "
1317 "other repository doesn't support " 1316 "other repository doesn't support "
1318 "changegroupsubset.")) 1317 "changegroupsubset."))
1319 cg = remote.changegroupsubset(fetch, heads, 'pull') 1318 else:
1320 return self.addchangegroup(cg, 'pull', remote.url(), lock=lock) 1319 cg = remote.changegroupsubset(fetch, heads, 'pull')
1320 result = self.addchangegroup(cg, 'pull', remote.url(),
1321 lock=lock)
1321 finally: 1322 finally:
1322 lock.release() 1323 lock.release()
1324
1325 self.ui.debug("checking for updated bookmarks\n")
1326 rb = remote.listkeys('bookmarks')
1327 changed = False
1328 for k in rb.keys():
1329 if k in self._bookmarks:
1330 nr, nl = rb[k], self._bookmarks[k]
1331 if nr in self:
1332 cr = self[nr]
1333 cl = self[nl]
1334 if cl.rev() >= cr.rev():
1335 continue
1336 if cr in cl.descendants():
1337 self._bookmarks[k] = cr.node()
1338 changed = True
1339 self.ui.status(_("updating bookmark %s\n") % k)
1340 else:
1341 self.ui.warn(_("not updating divergent"
1342 " bookmark %s\n") % k)
1343 if changed:
1344 bookmarks.write(self)
1345
1346 return result
1323 1347
1324 def checkpush(self, force, revs): 1348 def checkpush(self, force, revs):
1325 """Extensions can override this function if additional checks have 1349 """Extensions can override this function if additional checks have
1326 to be performed before pushing, or call it if they override push 1350 to be performed before pushing, or call it if they override push
1327 command. 1351 command.
1348 lock = None 1372 lock = None
1349 unbundle = remote.capable('unbundle') 1373 unbundle = remote.capable('unbundle')
1350 if not unbundle: 1374 if not unbundle:
1351 lock = remote.lock() 1375 lock = remote.lock()
1352 try: 1376 try:
1353 ret = discovery.prepush(self, remote, force, revs, newbranch) 1377 cg, remote_heads = discovery.prepush(self, remote, force, revs,
1354 if ret[0] is None: 1378 newbranch)
1355 # and here we return 0 for "nothing to push" or 1 for 1379 ret = remote_heads
1356 # "something to push but I refuse" 1380 if cg is not None:
1357 return ret[1] 1381 if unbundle:
1358 1382 # local repo finds heads on server, finds out what
1359 cg, remote_heads = ret 1383 # revs it must push. once revs transferred, if server
1360 if unbundle: 1384 # finds it has different heads (someone else won
1361 # local repo finds heads on server, finds out what revs it must 1385 # commit/push race), server aborts.
1362 # push. once revs transferred, if server finds it has 1386 if force:
1363 # different heads (someone else won commit/push race), server 1387 remote_heads = ['force']
1364 # aborts. 1388 # ssh: return remote's addchangegroup()
1365 if force: 1389 # http: return remote's addchangegroup() or 0 for error
1366 remote_heads = ['force'] 1390 ret = remote.unbundle(cg, remote_heads, 'push')
1367 # ssh: return remote's addchangegroup() 1391 else:
1368 # http: return remote's addchangegroup() or 0 for error 1392 # we return an integer indicating remote head count change
1369 return remote.unbundle(cg, remote_heads, 'push') 1393 ret = remote.addchangegroup(cg, 'push', self.url(),
1370 else: 1394 lock=lock)
1371 # we return an integer indicating remote head count change
1372 return remote.addchangegroup(cg, 'push', self.url(), lock=lock)
1373 finally: 1395 finally:
1374 if lock is not None: 1396 if lock is not None:
1375 lock.release() 1397 lock.release()
1398
1399 self.ui.debug("checking for updated bookmarks\n")
1400 rb = remote.listkeys('bookmarks')
1401 for k in rb.keys():
1402 if k in self._bookmarks:
1403 nr, nl = rb[k], hex(self._bookmarks[k])
1404 if nr in self:
1405 cr = self[nr]
1406 cl = self[nl]
1407 if cl in cr.descendants():
1408 r = remote.pushkey('bookmarks', k, nr, nl)
1409 if r:
1410 self.ui.status(_("updating bookmark %s\n") % k)
1411 else:
1412 self.ui.warn(_('updating bookmark %s'
1413 ' failed!\n') % k)
1414
1415 return ret
1376 1416
1377 def changegroupinfo(self, nodes, source): 1417 def changegroupinfo(self, nodes, source):
1378 if self.ui.verbose or source == 'bundle': 1418 if self.ui.verbose or source == 'bundle':
1379 self.ui.status(_("%d changesets found\n") % len(nodes)) 1419 self.ui.status(_("%d changesets found\n") % len(nodes))
1380 if self.ui.debugflag: 1420 if self.ui.debugflag: