# HG changeset patch # User Pierre-Yves.David@ens-lyon.org # Date 1339089719 -7200 # Node ID 28ed1c4511ce03768f70b10b6389ec5f8a453426 # Parent 178a2e85d426d314894c989adfffc640e36279fa obsolete: exchange obsolete marker over pushkey For a version of the exchange, all markers are exchange. This won't scale and we will need a better protocol later. diff -r 178a2e85d426 -r 28ed1c4511ce mercurial/localrepo.py --- a/mercurial/localrepo.py Thu Jun 07 19:20:44 2012 +0200 +++ b/mercurial/localrepo.py Thu Jun 07 19:21:59 2012 +0200 @@ -4,12 +4,11 @@ # # This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. - from node import bin, hex, nullid, nullrev, short from i18n import _ import repo, changegroup, subrepo, discovery, pushkey, obsolete import changelog, dirstate, filelog, manifest, context, bookmarks, phases -import lock, transaction, store, encoding +import lock, transaction, store, encoding, base85 import scmutil, util, extensions, hook, error, revset import match as matchmod import merge as mergemod @@ -1674,6 +1673,11 @@ # Remote is old or publishing all common changesets # should be seen as public phases.advanceboundary(self, phases.public, subset) + + remoteobs = remote.listkeys('obsolete') + if 'dump' in remoteobs: + data = base85.b85decode(remoteobs['dump']) + self.obsstore.mergemarkers(data) finally: lock.release() @@ -1814,6 +1818,12 @@ if not r: self.ui.warn(_('updating %s to public failed!\n') % newremotehead) + if 'obsolete' in self.listkeys('namespaces') and self.obsstore: + data = self.obsstore._writemarkers() + r = remote.pushkey('obsolete', 'dump', '', + base85.b85encode(data)) + if not r: + self.ui.warn(_('failed to push obsolete markers!\n')) finally: if lock is not None: lock.release() diff -r 178a2e85d426 -r 28ed1c4511ce mercurial/obsolete.py --- a/mercurial/obsolete.py Thu Jun 07 19:20:44 2012 +0200 +++ b/mercurial/obsolete.py Thu Jun 07 19:21:59 2012 +0200 @@ -52,7 +52,7 @@ cannot contain '\0'. """ import struct -from mercurial import util +from mercurial import util, base85 from i18n import _ _pack = struct.pack @@ -166,6 +166,9 @@ def __iter__(self): return iter(self._all) + def __nonzero__(self): + return bool(self._all) + def create(self, prec, succs=(), flag=0, metadata=None): """obsolete: add a new obsolete marker @@ -195,6 +198,13 @@ for marker in _readmarkers(data): self._load(marker) + def mergemarkers(self, data): + other = set(_readmarkers(data)) + local = set(self._all) + new = other - local + for marker in new: + self.add(marker) + def flushmarkers(self, stream): """Write all markers to a stream @@ -209,20 +219,48 @@ for suc in sucs: self.successors.setdefault(suc, set()).add(marker) - def _writemarkers(self, stream): + def _writemarkers(self, stream=None): # Kept separate from flushmarkers(), it will be reused for # markers exchange. - stream.write(_pack('>B', _fmversion)) + if stream is None: + final = [] + w = final.append + else: + w = stream.write + w(_pack('>B', _fmversion)) for marker in self._all: pre, sucs, flags, metadata = marker nbsuc = len(sucs) format = _fmfixed + (_fmnode * nbsuc) data = [nbsuc, len(metadata), flags, pre] data.extend(sucs) - stream.write(_pack(format, *data)) - stream.write(metadata) + w(_pack(format, *data)) + w(metadata) + if stream is None: + return ''.join(final) + +def listmarkers(repo): + """List markers over pushkey""" + if not repo.obsstore: + return {} + data = repo.obsstore._writemarkers() + return {'dump': base85.b85encode(data)} - +def pushmarker(repo, key, old, new): + """Push markers over pushkey""" + if key != 'dump': + repo.ui.warn(_('unknown key: %r') % key) + return 0 + if old: + repo.ui.warn(_('unexpected old value') % key) + return 0 + data = base85.b85decode(new) + lock = repo.lock() + try: + repo.obsstore.mergemarkers(data) + return 1 + finally: + lock.release() def allmarkers(repo): """all obsolete markers known in a repository""" diff -r 178a2e85d426 -r 28ed1c4511ce mercurial/pushkey.py --- a/mercurial/pushkey.py Thu Jun 07 19:20:44 2012 +0200 +++ b/mercurial/pushkey.py Thu Jun 07 19:21:59 2012 +0200 @@ -5,7 +5,7 @@ # This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. -import bookmarks, phases +import bookmarks, phases, obsolete def _nslist(repo): n = {} @@ -16,6 +16,7 @@ _namespaces = {"namespaces": (lambda *x: False, _nslist), "bookmarks": (bookmarks.pushbookmark, bookmarks.listbookmarks), "phases": (phases.pushphase, phases.listphases), + "obsolete": (obsolete.pushmarker, obsolete.listmarkers), } def register(namespace, pushkey, listkeys): diff -r 178a2e85d426 -r 28ed1c4511ce tests/test-bookmarks-pushpull.t --- a/tests/test-bookmarks-pushpull.t Thu Jun 07 19:20:44 2012 +0200 +++ b/tests/test-bookmarks-pushpull.t Thu Jun 07 19:21:59 2012 +0200 @@ -40,6 +40,7 @@ bookmarks phases namespaces + obsolete $ hg debugpushkey ../a bookmarks Y 4e3505fd95835d721066b76e75dbb8cc554d7f77 X 4e3505fd95835d721066b76e75dbb8cc554d7f77 @@ -214,6 +215,7 @@ bookmarks phases namespaces + obsolete $ hg debugpushkey http://localhost:$HGPORT/ bookmarks Y 4efff6d98829d9c824c621afd6e3f01865f5439f foobar 9b140be1080824d768c5a4691a564088eede71f9 diff -r 178a2e85d426 -r 28ed1c4511ce tests/test-hook.t --- a/tests/test-hook.t Thu Jun 07 19:20:44 2012 +0200 +++ b/tests/test-hook.t Thu Jun 07 19:21:59 2012 +0200 @@ -198,6 +198,7 @@ listkeys hook: HG_NAMESPACE=bookmarks HG_VALUES={'bar': '0000000000000000000000000000000000000000', 'foo': '0000000000000000000000000000000000000000'} no changes found listkeys hook: HG_NAMESPACE=phases HG_VALUES={'cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b': '1', 'publishing': 'True'} + listkeys hook: HG_NAMESPACE=obsolete HG_VALUES={} listkeys hook: HG_NAMESPACE=bookmarks HG_VALUES={'bar': '0000000000000000000000000000000000000000', 'foo': '0000000000000000000000000000000000000000'} adding remote bookmark bar importing bookmark bar diff -r 178a2e85d426 -r 28ed1c4511ce tests/test-http-proxy.t --- a/tests/test-http-proxy.t Thu Jun 07 19:20:44 2012 +0200 +++ b/tests/test-http-proxy.t Thu Jun 07 19:21:59 2012 +0200 @@ -105,20 +105,24 @@ * - - [*] "GET http://localhost:$HGPORT/?cmd=batch HTTP/1.1" - - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D (glob) * - - [*] "GET http://localhost:$HGPORT/?cmd=getbundle HTTP/1.1" - - x-hgarg-1:common=0000000000000000000000000000000000000000&heads=83180e7845de420a1bb46896fd5fe05294f8d629 (glob) * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys HTTP/1.1" - - x-hgarg-1:namespace=phases (glob) + * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys HTTP/1.1" - - x-hgarg-1:namespace=obsolete (glob) * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys HTTP/1.1" - - x-hgarg-1:namespace=bookmarks (glob) * - - [*] "GET http://localhost:$HGPORT/?cmd=capabilities HTTP/1.1" - - (glob) * - - [*] "GET http://localhost:$HGPORT/?cmd=batch HTTP/1.1" - - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D (glob) * - - [*] "GET http://localhost:$HGPORT/?cmd=getbundle HTTP/1.1" - - x-hgarg-1:common=0000000000000000000000000000000000000000&heads=83180e7845de420a1bb46896fd5fe05294f8d629 (glob) * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys HTTP/1.1" - - x-hgarg-1:namespace=phases (glob) + * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys HTTP/1.1" - - x-hgarg-1:namespace=obsolete (glob) * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys HTTP/1.1" - - x-hgarg-1:namespace=bookmarks (glob) * - - [*] "GET http://localhost:$HGPORT/?cmd=capabilities HTTP/1.1" - - (glob) * - - [*] "GET http://localhost:$HGPORT/?cmd=batch HTTP/1.1" - - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D (glob) * - - [*] "GET http://localhost:$HGPORT/?cmd=getbundle HTTP/1.1" - - x-hgarg-1:common=0000000000000000000000000000000000000000&heads=83180e7845de420a1bb46896fd5fe05294f8d629 (glob) * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys HTTP/1.1" - - x-hgarg-1:namespace=phases (glob) + * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys HTTP/1.1" - - x-hgarg-1:namespace=obsolete (glob) * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys HTTP/1.1" - - x-hgarg-1:namespace=bookmarks (glob) * - - [*] "GET http://localhost:$HGPORT/?cmd=capabilities HTTP/1.1" - - (glob) * - - [*] "GET http://localhost:$HGPORT/?cmd=batch HTTP/1.1" - - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D (glob) * - - [*] "GET http://localhost:$HGPORT/?cmd=getbundle HTTP/1.1" - - x-hgarg-1:common=0000000000000000000000000000000000000000&heads=83180e7845de420a1bb46896fd5fe05294f8d629 (glob) * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys HTTP/1.1" - - x-hgarg-1:namespace=phases (glob) + * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys HTTP/1.1" - - x-hgarg-1:namespace=obsolete (glob) * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys HTTP/1.1" - - x-hgarg-1:namespace=bookmarks (glob) diff -r 178a2e85d426 -r 28ed1c4511ce tests/test-https.t --- a/tests/test-https.t Thu Jun 07 19:20:44 2012 +0200 +++ b/tests/test-https.t Thu Jun 07 19:21:59 2012 +0200 @@ -125,6 +125,7 @@ adding file changes added 1 changesets with 4 changes to 4 files warning: localhost certificate with fingerprint 91:4f:1a:ff:87:24:9c:09:b6:85:9b:88:b1:90:6d:30:75:64:91:ca not verified (check hostfingerprints or web.cacerts config setting) + warning: localhost certificate with fingerprint 91:4f:1a:ff:87:24:9c:09:b6:85:9b:88:b1:90:6d:30:75:64:91:ca not verified (check hostfingerprints or web.cacerts config setting) updating to branch default 4 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg verify -R copy-pull @@ -154,6 +155,7 @@ added 1 changesets with 1 changes to 1 files warning: localhost certificate with fingerprint 91:4f:1a:ff:87:24:9c:09:b6:85:9b:88:b1:90:6d:30:75:64:91:ca not verified (check hostfingerprints or web.cacerts config setting) changegroup hook: HG_NODE=5fed3813f7f5e1824344fdc9cf8f63bb662c292d HG_SOURCE=pull HG_URL=https://localhost:$HGPORT/ + warning: localhost certificate with fingerprint 91:4f:1a:ff:87:24:9c:09:b6:85:9b:88:b1:90:6d:30:75:64:91:ca not verified (check hostfingerprints or web.cacerts config setting) (run 'hg update' to get a working copy) $ cd .. @@ -182,6 +184,7 @@ pulling from https://localhost:$HGPORT/ searching for changes no changes found + warning: localhost certificate with fingerprint 91:4f:1a:ff:87:24:9c:09:b6:85:9b:88:b1:90:6d:30:75:64:91:ca not verified (check hostfingerprints or web.cacerts config setting) cacert mismatch @@ -194,6 +197,7 @@ pulling from https://127.0.0.1:$HGPORT/ searching for changes no changes found + warning: 127.0.0.1 certificate with fingerprint 91:4f:1a:ff:87:24:9c:09:b6:85:9b:88:b1:90:6d:30:75:64:91:ca not verified (check hostfingerprints or web.cacerts config setting) $ hg -R copy-pull pull --config web.cacerts=pub-other.pem abort: error: *:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed (glob) [255] @@ -202,6 +206,7 @@ pulling from https://localhost:$HGPORT/ searching for changes no changes found + warning: localhost certificate with fingerprint 91:4f:1a:ff:87:24:9c:09:b6:85:9b:88:b1:90:6d:30:75:64:91:ca not verified (check hostfingerprints or web.cacerts config setting) Test server cert which isn't valid yet @@ -259,6 +264,7 @@ pulling from https://localhost:$HGPORT/ searching for changes no changes found + warning: localhost certificate with fingerprint 91:4f:1a:ff:87:24:9c:09:b6:85:9b:88:b1:90:6d:30:75:64:91:ca not verified (check hostfingerprints or web.cacerts config setting) Test https with cacert and fingerprint through proxy diff -r 178a2e85d426 -r 28ed1c4511ce tests/test-obsolete.t --- a/tests/test-obsolete.t Thu Jun 07 19:20:44 2012 +0200 +++ b/tests/test-obsolete.t Thu Jun 07 19:21:59 2012 +0200 @@ -59,3 +59,85 @@ cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 {'date': '1337 0', 'user': 'test'} ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 {'date': '1338 0', 'user': 'test'} 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 {'date': '1339 0', 'user': 'test'} + + $ cd .. + +Exchange Test +============================ + +Destination repo does not have any data +--------------------------------------- + +Try to pull markers + + $ hg init tmpc + $ cd tmpc + $ hg pull ../tmpb + pulling from ../tmpb + requesting all changes + adding changesets + adding manifests + adding file changes + added 6 changesets with 6 changes to 6 files (+3 heads) + (run 'hg heads' to see heads, 'hg merge' to merge) + $ hg debugobsolete + ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 {'date': '1338 0', 'user': 'test'} + cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 {'date': '1337 0', 'user': 'test'} + 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f 0 {'date': '56 12', 'user': 'test'} + 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 {'date': '1339 0', 'user': 'test'} + + $ cd .. + +Try to pull markers + + $ hg init tmpd + $ hg -R tmpb push tmpd + pushing to tmpd + searching for changes + adding changesets + adding manifests + adding file changes + added 6 changesets with 6 changes to 6 files (+3 heads) + $ hg -R tmpd debugobsolete + ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 {'date': '1338 0', 'user': 'test'} + cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 {'date': '1337 0', 'user': 'test'} + 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f 0 {'date': '56 12', 'user': 'test'} + 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 {'date': '1339 0', 'user': 'test'} + + +Destination repo have existing data +--------------------------------------- + +On pull + + $ hg init tmpe + $ cd tmpe + $ hg debugobsolete -d '1339 0' 2448244824482448244824482448244824482448 1339133913391339133913391339133913391339 + $ hg pull ../tmpb + pulling from ../tmpb + requesting all changes + adding changesets + adding manifests + adding file changes + added 6 changesets with 6 changes to 6 files (+3 heads) + (run 'hg heads' to see heads, 'hg merge' to merge) + $ hg debugobsolete + 2448244824482448244824482448244824482448 1339133913391339133913391339133913391339 0 {'date': '1339 0', 'user': 'test'} + ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 {'date': '1338 0', 'user': 'test'} + cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 {'date': '1337 0', 'user': 'test'} + 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f 0 {'date': '56 12', 'user': 'test'} + 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 {'date': '1339 0', 'user': 'test'} + +On push + + $ hg push ../tmpc + pushing to ../tmpc + searching for changes + no changes found + [1] + $ hg -R ../tmpc debugobsolete + ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 {'date': '1338 0', 'user': 'test'} + cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 {'date': '1337 0', 'user': 'test'} + 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f 0 {'date': '56 12', 'user': 'test'} + 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 {'date': '1339 0', 'user': 'test'} + 2448244824482448244824482448244824482448 1339133913391339133913391339133913391339 0 {'date': '1339 0', 'user': 'test'} diff -r 178a2e85d426 -r 28ed1c4511ce tests/test-ssh.t --- a/tests/test-ssh.t Thu Jun 07 19:20:44 2012 +0200 +++ b/tests/test-ssh.t Thu Jun 07 19:21:59 2012 +0200 @@ -167,6 +167,7 @@ bookmarks phases namespaces + obsolete $ hg book foo -r 0 $ hg out -B comparing with ssh://user@dummy/remote