[PATCH] pull/push: allow to pull and push all shared bookmarks , (issue2800

Matt Mackall mpm at selenic.com
Sat May 7 08:59:49 CDT 2011


On Sat, 2011-05-07 at 14:06 +0200, Guido Jansen wrote:
> # HG changeset patch
> # User guido.jansen at lmsintl.com
> # Date 1304769172 -7200
> # Node ID 2b46d7cf58aa78a5ccd500850363fd39c22753a6
> # Parent  13d44e4235f87cba6b7df2e545d2fca099505c39

First rule of patching: do not send two patches as one.

> The description of bookmarks says under the heading
>    "Working With Remote Repositories":
> "By default bookmarks that are already present on both the client and server
> are updated on the client on pull and updated on the server on push."
> 
> This was not implemented. Also, this does not make sense. You do not know in
> which direction the sync should go, it depends on how you organized.
> 
> Still, the functionality is useful, hence this patch which adds a new option
> to the hg push and pull command:
> 
> hg -h pull:
>  -a --allcbm                 pull all common bookmarks from the server
> 
> hg -h push:
>  -a --allcbm                 push all common bookmarks to the server
> 
> 
>  These options will take the intersection of the bookmarks in the source and
>  the destination and will include them in the push or pull operation.
> 
> diff -r 13d44e4235f8 -r 2b46d7cf58aa mercurial/commands.py
> --- a/mercurial/commands.py	Mon May 02 12:10:50 2011 -0500
> +++ b/mercurial/commands.py	Sat May 07 13:52:52 2011 +0200
> @@ -3115,12 +3115,25 @@
>      other = hg.repository(hg.remoteui(repo, opts), source)
>      ui.status(_('pulling from %s\n') % util.hidepassword(source))
>      revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
> -
> +    
> +    # find bookmarks that are available on both sides and include them in the PULL list
> +    rb = other.listkeys('bookmarks')
> +    bookmarkstopull = [] 
> +    if opts.get('allcbm'):
> +        lb = repo.listkeys('bookmarks')
> +        for b in rb:
> +            if b in lb:
> +                bookmarkstopull.append(b)
> +    
>      if opts.get('bookmark'):
> +        for b in opts['bookmark']:
> +            if b not in bookmarkstopull:
> +                bookmarkstopull.append(b)     
> +                   
> +    if bookmarkstopull <> []:
>          if not revs:
>              revs = []
> -        rb = other.listkeys('bookmarks')
> -        for b in opts['bookmark']:
> +        for b in bookmarkstopull:
>              if b not in rb:
>                  raise util.Abort(_('remote bookmark %s not found!') % b)
>              revs.append(rb[b])
> @@ -3145,8 +3158,8 @@
>          del repo._subtoppath
>  
>      # update specified bookmarks
> -    if opts.get('bookmark'):
> -        for b in opts['bookmark']:
> +    if bookmarkstopull <> []:
> +        for b in bookmarkstopull:
>              # explicit pull overrides local bookmark if any
>              ui.status(_("importing bookmark %s\n") % b)
>              repo._bookmarks[b] = repo[rb[b]].node()
> @@ -3184,8 +3197,25 @@
>      Returns 0 if push was successful, 1 if nothing to push.
>      """
>  
> +    # find bookmarks that are available on both sides and include them in the PUSH list
> +    dest = ui.expandpath(dest or 'default-push', dest or 'default')
> +    dest, branches = hg.parseurl(dest, opts.get('branch'))
> +    other = hg.repository(hg.remoteui(repo, opts), dest)
> +    rb = other.listkeys('bookmarks')
> +    bookmarkstopush = [] 
> +    if opts.get('allcbm'):
> +        lb = repo.listkeys('bookmarks')
> +        for b in rb:
> +            if b in lb:
> +                bookmarkstopush.append(b)
> +            
>      if opts.get('bookmark'):
>          for b in opts['bookmark']:
> +            if b not in bookmarkstopush:
> +                bookmarkstopush.append(b)
> +            
> +    if bookmarkstopush <> []:
> +        for b in bookmarkstopush:
>              # translate -B options to -r so changesets get pushed
>              if b in repo._bookmarks:
>                  opts.setdefault('rev', []).append(b)
> @@ -3194,8 +3224,6 @@
>                  # this lets simultaneous -r, -b options continue working
>                  opts.setdefault('rev', []).append("null")
>  
> -    dest = ui.expandpath(dest or 'default-push', dest or 'default')
> -    dest, branches = hg.parseurl(dest, opts.get('branch'))
>      ui.status(_('pushing to %s\n') % util.hidepassword(dest))
>      revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
>      other = hg.repository(hg.remoteui(repo, opts), dest)
> @@ -3217,9 +3245,8 @@
>  
>      result = (result == 0)
>  
> -    if opts.get('bookmark'):
> -        rb = other.listkeys('bookmarks')
> -        for b in opts['bookmark']:
> +    if bookmarkstopush <> []:
> +        for b in bookmarkstopush:
>              # explicit push overrides remote bookmark if any
>              if b in repo._bookmarks:
>                  ui.status(_("exporting bookmark %s\n") % b)
> @@ -4819,6 +4846,7 @@
>            ('r', 'rev', [],
>             _('a remote changeset intended to be added'), _('REV')),
>            ('B', 'bookmark', [], _("bookmark to pull"), _('BOOKMARK')),
> +          ('a', 'allcbm', None, _('pull all common bookmarks from the server')),
>            ('b', 'branch', [],
>             _('a specific branch you would like to pull'), _('BRANCH')),
>           ] + remoteopts,
> @@ -4830,6 +4858,7 @@
>             _('a changeset intended to be included in the destination'),
>             _('REV')),
>            ('B', 'bookmark', [], _("bookmark to push"), _('BOOKMARK')),
> +          ('a', 'allcbm', None, _('push all common bookmarks to the server')),
>            ('b', 'branch', [],
>             _('a specific branch you would like to push'), _('BRANCH')),
>            ('', 'new-branch', False, _('allow pushing a new branch')),
> 
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel


-- 
Mathematics is the supreme nostalgia of our time.




More information about the Mercurial-devel mailing list