[PATCH 3 of 6 phases exchange V2] phases: add basic pushkey support

timeless timeless at gmail.com
Thu Dec 15 07:55:44 CST 2011


* serialiZation
* the line with "an extra data" is problematic, I'd drop "an" or
append "element" to "data"
* still needS
* push THE phase boundary
* as THE phase root
* won't be pushED
* on ITS own -- it's = it is = wrong

Note that mpm complained about the first one earlier

On 12/15/11, pierre-yves.david at logilab.fr <pierre-yves.david at logilab.fr> wrote:
> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david at logilab.fr>
> # Date 1323944666 -3600
> # Node ID f1a13423d9c1e10a28104aeed157e8b5d0b025a2
> # Parent  9de2e49957ddfb3b0f41fd4c726e63d779b6129e
> phases: add basic pushkey support
>
> diff --git a/mercurial/phases.py b/mercurial/phases.py
> --- a/mercurial/phases.py
> +++ b/mercurial/phases.py
> @@ -98,5 +98,49 @@ def retractboundary(repo, targetphase, n
>          currentroots.intersection_update(ctx.node() for ctx in ctxs)
>          if '_phaserev' in vars(repo):
>              del repo._phaserev
>          repo._dirtyphases = True
>
> +
> +def listphases(repo):
> +    """List phases root for serialisation over pushkey"""
> +    keys = {}
> +    for phase in trackedphases:
> +        for root in repo._phaseroots[phase]:
> +            keys[hex(root)] = '%i' % phase
> +    if repo.ui.configbool('phases', 'publish', True):
> +        # Add an extra data to let remote know we are a publishing repo.
> +        # Publishing repo can't just pretend they are old repo. When
> pushing to
> +        # a publishing repo, the client still need to push phase boundary
> +        #
> +        # We are using nullid for this as nullid is never be used as phase
> +        # root.  having a nullid entry in phase roots mean you are a
> publishing
> +        # repo.
> +        #
> +        # Push do not only push changeset. It also push phase data. New
> +        # phase data may apply to common changeset which won't be push (as
> they
> +        # are common).  Here is a very simple example:
> +        #
> +        # 1) repo A push changeset X as draft to repo B
> +        # 2) repo B make changeset X public
> +        # 3) repo B push to repo A. X is not pushed but the data that X as
> now
> +        #    public should
> +        #
> +        # The server can't handle it on it's own as it has no idea of
> client
> +        # phase data.
> +        keys['publishing'] = 'True'
> +    return keys
> +
> +def pushphase(repo, nhex, oldphasestr, newphasestr):
> +    """List phases root for serialisation over pushkey"""
> +    lock = repo.lock()
> +    try:
> +        currentphase = repo[nhex].phase()
> +        newphase = abs(int(newphasestr)) # let's avoid negative index
> surprise
> +        oldphase = abs(int(oldphasestr)) # let's avoid negative index
> surprise
> +        if currentphase == oldphase and newphase < oldphase:
> +            advanceboundary(repo, newphase, [bin(nhex)])
> +            return 1
> +        else:
> +            return 0
> +    finally:
> +        lock.release()
> diff --git a/mercurial/pushkey.py b/mercurial/pushkey.py
> --- a/mercurial/pushkey.py
> +++ b/mercurial/pushkey.py
> @@ -3,20 +3,22 @@
>  # Copyright 2010 Matt Mackall <mpm at selenic.com>
>  #
>  # 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
> +import bookmarks, phases
>
>  def _nslist(repo):
>      n = {}
>      for k in _namespaces:
>          n[k] = ""
>      return n
>
>  _namespaces = {"namespaces": (lambda *x: False, _nslist),
> -               "bookmarks": (bookmarks.pushbookmark,
> bookmarks.listbookmarks)}
> +               "bookmarks": (bookmarks.pushbookmark,
> bookmarks.listbookmarks),
> +               "phases": (phases.pushphase, phases.listphases),
> +              }
>
>  def register(namespace, pushkey, listkeys):
>      _namespaces[namespace] = (pushkey, listkeys)
>
>  def _get(namespace):
> diff --git a/tests/test-bookmarks-pushpull.t
> b/tests/test-bookmarks-pushpull.t
> --- a/tests/test-bookmarks-pushpull.t
> +++ b/tests/test-bookmarks-pushpull.t
> @@ -32,10 +32,11 @@ import bookmark by name
>    (run 'hg update' to get a working copy)
>    $ hg bookmarks
>       Y                         0:4e3505fd9583
>    $ hg debugpushkey ../a namespaces
>    bookmarks	
> +  phases	
>    namespaces	
>    $ hg debugpushkey ../a bookmarks
>    Y	4e3505fd95835d721066b76e75dbb8cc554d7f77
>    X	4e3505fd95835d721066b76e75dbb8cc554d7f77
>    Z	4e3505fd95835d721066b76e75dbb8cc554d7f77
> @@ -149,10 +150,11 @@ hgweb
>    $ cat ../hg.pid >> $DAEMON_PIDS
>    $ cd ../a
>
>    $ hg debugpushkey http://localhost:$HGPORT/ namespaces
>    bookmarks	
> +  phases	
>    namespaces	
>    $ hg debugpushkey http://localhost:$HGPORT/ bookmarks
>    Y	4e3505fd95835d721066b76e75dbb8cc554d7f77
>    X	9b140be1080824d768c5a4691a564088eede71f9
>    foo	0000000000000000000000000000000000000000
> diff --git a/tests/test-ssh.t b/tests/test-ssh.t
> --- a/tests/test-ssh.t
> +++ b/tests/test-ssh.t
> @@ -163,10 +163,11 @@ check remote tip
>  test pushkeys and bookmarks
>
>    $ cd ../local
>    $ hg debugpushkey --config ui.ssh="python $TESTDIR/dummyssh"
> ssh://user@dummy/remote namespaces
>    bookmarks	
> +  phases	
>    namespaces	
>    $ hg book foo -r 0
>    $ hg out -B
>    comparing with ssh://user@dummy/remote
>    searching for changed bookmarks
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
>

-- 
Sent from my mobile device


More information about the Mercurial-devel mailing list