hgext/bookmarks.py
author Matt Mackall <mpm@selenic.com>
Thu, 10 Feb 2011 13:46:28 -0600
changeset 13366 c756e9166417
parent 13365 f1c5294e9119
child 13367 cef73cd9c268
permissions -rw-r--r--
bookmarks: merge incoming/outgoing into core
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
     1
# Mercurial extension to provide the 'hg bookmark' command
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
     2
#
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
     3
# Copyright 2008 David Soria Parra <dsp@php.net>
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
     4
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8087
diff changeset
     5
# This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9643
diff changeset
     6
# GNU General Public License version 2 or any later version.
7252
104a8324798e bookmarks: Avoid long lines
Joel Rosdahl <joel@rosdahl.net>
parents: 7251
diff changeset
     7
8894
868670dbc237 extensions: improve the consistency of synopses
Cédric Duval <cedricduval@free.fr>
parents: 8892
diff changeset
     8
'''track a line of development with movable markers
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
     9
9251
6bddba3973bc bookmarks: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9202
diff changeset
    10
Bookmarks are local movable markers to changesets. Every bookmark
6bddba3973bc bookmarks: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9202
diff changeset
    11
points to a changeset identified by its hash. If you commit a
6bddba3973bc bookmarks: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9202
diff changeset
    12
changeset that is based on a changeset that has a bookmark on it, the
6bddba3973bc bookmarks: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9202
diff changeset
    13
bookmark shifts to the new changeset.
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    14
11193
687c7d395f20 Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents: 10973
diff changeset
    15
It is possible to use bookmark names in every revision lookup (e.g.
687c7d395f20 Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents: 10973
diff changeset
    16
:hg:`merge`, :hg:`update`).
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    17
9251
6bddba3973bc bookmarks: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9202
diff changeset
    18
By default, when several bookmarks point to the same changeset, they
6bddba3973bc bookmarks: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9202
diff changeset
    19
will all move forward together. It is possible to obtain a more
6bddba3973bc bookmarks: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9202
diff changeset
    20
git-like experience by adding the following configuration option to
12083
ebfc46929f3e help: refer to user configuration file more consistently
Brodie Rao <brodie@bitheap.org>
parents: 12026
diff changeset
    21
your configuration file::
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    22
8892
30b25ebaa63b bookmarks: help improvements
Cédric Duval <cedricduval@free.fr>
parents: 8862
diff changeset
    23
  [bookmarks]
30b25ebaa63b bookmarks: help improvements
Cédric Duval <cedricduval@free.fr>
parents: 8862
diff changeset
    24
  track.current = True
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    25
9251
6bddba3973bc bookmarks: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9202
diff changeset
    26
This will cause Mercurial to track the bookmark that you are currently
6bddba3973bc bookmarks: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9202
diff changeset
    27
using, and only update it. This is similar to git's approach to
6bddba3973bc bookmarks: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9202
diff changeset
    28
branching.
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    29
'''
7252
104a8324798e bookmarks: Avoid long lines
Joel Rosdahl <joel@rosdahl.net>
parents: 7251
diff changeset
    30
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    31
from mercurial.i18n import _
12714
f5178fbcd197 bookmarks: add revset for referencing bookmarks
Augie Fackler <durin42@gmail.com>
parents: 12394
diff changeset
    32
from mercurial.node import nullid, nullrev, bin, hex, short
11431
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
    33
from mercurial import util, commands, repair, extensions, pushkey, hg, url
13359
87f248e78173 bookmarks: move revset support to core
Matt Mackall <mpm@selenic.com>
parents: 13358
diff changeset
    34
from mercurial import encoding
13350
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents: 13313
diff changeset
    35
from mercurial import bookmarks
7638
f83a2b1d1a71 bookmarks; clean up imports and function wrapping
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
    36
import os
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    37
7255
69e431ea124d bookmarks: Rename --move to --rename
Joel Rosdahl <joel@rosdahl.net>
parents: 7254
diff changeset
    38
def bookmark(ui, repo, mark=None, rev=None, force=False, delete=False, rename=None):
8894
868670dbc237 extensions: improve the consistency of synopses
Cédric Duval <cedricduval@free.fr>
parents: 8892
diff changeset
    39
    '''track a line of development with movable markers
7250
352627bcafc3 bookmarks: Remove trailing space
Joel Rosdahl <joel@rosdahl.net>
parents: 7239
diff changeset
    40
9251
6bddba3973bc bookmarks: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9202
diff changeset
    41
    Bookmarks are pointers to certain commits that move when
6bddba3973bc bookmarks: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9202
diff changeset
    42
    committing. Bookmarks are local. They can be renamed, copied and
10973
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10956
diff changeset
    43
    deleted. It is possible to use bookmark names in :hg:`merge` and
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10956
diff changeset
    44
    :hg:`update` to merge and update respectively to a given bookmark.
7250
352627bcafc3 bookmarks: Remove trailing space
Joel Rosdahl <joel@rosdahl.net>
parents: 7239
diff changeset
    45
10973
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10956
diff changeset
    46
    You can use :hg:`bookmark NAME` to set a bookmark on the working
9251
6bddba3973bc bookmarks: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9202
diff changeset
    47
    directory's parent revision with the given name. If you specify
6bddba3973bc bookmarks: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9202
diff changeset
    48
    a revision using -r REV (where REV may be an existing bookmark),
6bddba3973bc bookmarks: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9202
diff changeset
    49
    the bookmark is assigned to that revision.
12772
4212fdc4db18 bookmarks: add paragraph on pushing and pulling to help
Kevin Bullock <kbullock@ringworld.org>
parents: 12747
diff changeset
    50
4212fdc4db18 bookmarks: add paragraph on pushing and pulling to help
Kevin Bullock <kbullock@ringworld.org>
parents: 12747
diff changeset
    51
    Bookmarks can be pushed and pulled between repositories (see :hg:`help
4212fdc4db18 bookmarks: add paragraph on pushing and pulling to help
Kevin Bullock <kbullock@ringworld.org>
parents: 12747
diff changeset
    52
    push` and :hg:`help pull`). This requires the bookmark extension to be
4212fdc4db18 bookmarks: add paragraph on pushing and pulling to help
Kevin Bullock <kbullock@ringworld.org>
parents: 12747
diff changeset
    53
    enabled for both the local and remote repositories.
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    54
    '''
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    55
    hexfn = ui.debugflag and hex or short
10105
dc5b5cc5ca34 bookmarks: turn repo._bookmarks into a propertycache
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9643
diff changeset
    56
    marks = repo._bookmarks
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    57
    cur   = repo.changectx('.').node()
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    58
7255
69e431ea124d bookmarks: Rename --move to --rename
Joel Rosdahl <joel@rosdahl.net>
parents: 7254
diff changeset
    59
    if rename:
69e431ea124d bookmarks: Rename --move to --rename
Joel Rosdahl <joel@rosdahl.net>
parents: 7254
diff changeset
    60
        if rename not in marks:
7251
444d88175e33 bookmarks: Fix spelling and grammar
Joel Rosdahl <joel@rosdahl.net>
parents: 7250
diff changeset
    61
            raise util.Abort(_("a bookmark of this name does not exist"))
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    62
        if mark in marks and not force:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    63
            raise util.Abort(_("a bookmark of the same name already exists"))
7254
d892211d670e bookmarks: Require new bookmark name when renaming
Joel Rosdahl <joel@rosdahl.net>
parents: 7253
diff changeset
    64
        if mark is None:
d892211d670e bookmarks: Require new bookmark name when renaming
Joel Rosdahl <joel@rosdahl.net>
parents: 7253
diff changeset
    65
            raise util.Abort(_("new bookmark name required"))
7255
69e431ea124d bookmarks: Rename --move to --rename
Joel Rosdahl <joel@rosdahl.net>
parents: 7254
diff changeset
    66
        marks[mark] = marks[rename]
69e431ea124d bookmarks: Rename --move to --rename
Joel Rosdahl <joel@rosdahl.net>
parents: 7254
diff changeset
    67
        del marks[rename]
10107
c03f467423f3 bookmarks: repo._bookmarkcurrent should be a propertycache
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10106
diff changeset
    68
        if repo._bookmarkcurrent == rename:
13350
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents: 13313
diff changeset
    69
            bookmarks.setcurrent(repo, mark)
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents: 13313
diff changeset
    70
        bookmarks.write(repo)
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    71
        return
7250
352627bcafc3 bookmarks: Remove trailing space
Joel Rosdahl <joel@rosdahl.net>
parents: 7239
diff changeset
    72
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    73
    if delete:
8527
f9a80054dd3c use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
    74
        if mark is None:
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    75
            raise util.Abort(_("bookmark name required"))
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    76
        if mark not in marks:
7251
444d88175e33 bookmarks: Fix spelling and grammar
Joel Rosdahl <joel@rosdahl.net>
parents: 7250
diff changeset
    77
            raise util.Abort(_("a bookmark of this name does not exist"))
10107
c03f467423f3 bookmarks: repo._bookmarkcurrent should be a propertycache
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10106
diff changeset
    78
        if mark == repo._bookmarkcurrent:
13350
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents: 13313
diff changeset
    79
            bookmarks.setcurrent(repo, None)
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    80
        del marks[mark]
13350
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents: 13313
diff changeset
    81
        bookmarks.write(repo)
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    82
        return
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    83
13031
3da456d0c885 code style: prefer 'is' and 'is not' tests with singletons
Martin Geisler <mg@aragost.com>
parents: 12881
diff changeset
    84
    if mark is not None:
7259
18c23375861f bookmarks: Correctly reject newlines in bookmark names
Joel Rosdahl <joel@rosdahl.net>
parents: 7258
diff changeset
    85
        if "\n" in mark:
18c23375861f bookmarks: Correctly reject newlines in bookmark names
Joel Rosdahl <joel@rosdahl.net>
parents: 7258
diff changeset
    86
            raise util.Abort(_("bookmark name cannot contain newlines"))
7260
eb91b9ce2c19 bookmarks: Strip bookmark names of whitespace, just like tag names
Joel Rosdahl <joel@rosdahl.net>
parents: 7259
diff changeset
    87
        mark = mark.strip()
11704
18c47562d331 bookmarks: don't allow name to contain whitespaces only
Idan Kamara <idankk86@gmail.com>
parents: 11641
diff changeset
    88
        if not mark:
18c47562d331 bookmarks: don't allow name to contain whitespaces only
Idan Kamara <idankk86@gmail.com>
parents: 11641
diff changeset
    89
            raise util.Abort(_("bookmark names cannot consist entirely of "
18c47562d331 bookmarks: don't allow name to contain whitespaces only
Idan Kamara <idankk86@gmail.com>
parents: 11641
diff changeset
    90
                               "whitespace"))
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    91
        if mark in marks and not force:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    92
            raise util.Abort(_("a bookmark of the same name already exists"))
7250
352627bcafc3 bookmarks: Remove trailing space
Joel Rosdahl <joel@rosdahl.net>
parents: 7239
diff changeset
    93
        if ((mark in repo.branchtags() or mark == repo.dirstate.branch())
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    94
            and not force):
7252
104a8324798e bookmarks: Avoid long lines
Joel Rosdahl <joel@rosdahl.net>
parents: 7251
diff changeset
    95
            raise util.Abort(
104a8324798e bookmarks: Avoid long lines
Joel Rosdahl <joel@rosdahl.net>
parents: 7251
diff changeset
    96
                _("a bookmark cannot have the name of an existing branch"))
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    97
        if rev:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    98
            marks[mark] = repo.lookup(rev)
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    99
        else:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   100
            marks[mark] = repo.changectx('.').node()
13350
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents: 13313
diff changeset
   101
        bookmarks.setcurrent(repo, mark)
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents: 13313
diff changeset
   102
        bookmarks.write(repo)
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   103
        return
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   104
8527
f9a80054dd3c use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
   105
    if mark is None:
7258
9bd051efbdd6 bookmarks: Require a bookmark name when a revision is specified
Joel Rosdahl <joel@rosdahl.net>
parents: 7257
diff changeset
   106
        if rev:
9bd051efbdd6 bookmarks: Require a bookmark name when a revision is specified
Joel Rosdahl <joel@rosdahl.net>
parents: 7257
diff changeset
   107
            raise util.Abort(_("bookmark name required"))
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   108
        if len(marks) == 0:
10510
f77f3383c666 i18n: mark more strings for translation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10463
diff changeset
   109
            ui.status(_("no bookmarks set\n"))
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   110
        else:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   111
            for bmark, n in marks.iteritems():
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   112
                if ui.configbool('bookmarks', 'track.current'):
10107
c03f467423f3 bookmarks: repo._bookmarkcurrent should be a propertycache
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10106
diff changeset
   113
                    current = repo._bookmarkcurrent
10820
da809085bc9f bookmark: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10597
diff changeset
   114
                    if bmark == current and n == cur:
da809085bc9f bookmark: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10597
diff changeset
   115
                        prefix, label = '*', 'bookmarks.current'
da809085bc9f bookmark: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10597
diff changeset
   116
                    else:
da809085bc9f bookmark: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10597
diff changeset
   117
                        prefix, label = ' ', ''
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   118
                else:
10820
da809085bc9f bookmark: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10597
diff changeset
   119
                    if n == cur:
da809085bc9f bookmark: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10597
diff changeset
   120
                        prefix, label = '*', 'bookmarks.current'
da809085bc9f bookmark: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10597
diff changeset
   121
                    else:
da809085bc9f bookmark: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10597
diff changeset
   122
                        prefix, label = ' ', ''
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   123
9459
3b283adcc720 bookmarks: support --quiet
Steve Losh <steve@stevelosh.com>
parents: 9282
diff changeset
   124
                if ui.quiet:
10820
da809085bc9f bookmark: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10597
diff changeset
   125
                    ui.write("%s\n" % bmark, label=label)
9459
3b283adcc720 bookmarks: support --quiet
Steve Losh <steve@stevelosh.com>
parents: 9282
diff changeset
   126
                else:
3b283adcc720 bookmarks: support --quiet
Steve Losh <steve@stevelosh.com>
parents: 9282
diff changeset
   127
                    ui.write(" %s %-25s %d:%s\n" % (
10820
da809085bc9f bookmark: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10597
diff changeset
   128
                        prefix, bmark, repo.changelog.rev(n), hexfn(n)),
da809085bc9f bookmark: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10597
diff changeset
   129
                        label=label)
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   130
        return
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   131
11378
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   132
def pull(oldpull, ui, repo, source="default", **opts):
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   133
    # translate bookmark args to rev args for actual pull
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   134
    if opts.get('bookmark'):
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   135
        # this is an unpleasant hack as pull will do this internally
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   136
        source, branches = hg.parseurl(ui.expandpath(source),
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   137
                                       opts.get('branch'))
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   138
        other = hg.repository(hg.remoteui(repo, opts), source)
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   139
        rb = other.listkeys('bookmarks')
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   140
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   141
        for b in opts['bookmark']:
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   142
            if b not in rb:
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   143
                raise util.Abort(_('remote bookmark %s not found!') % b)
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   144
            opts.setdefault('rev', []).append(b)
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   145
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   146
    result = oldpull(ui, repo, source, **opts)
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   147
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   148
    # update specified bookmarks
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   149
    if opts.get('bookmark'):
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   150
        for b in opts['bookmark']:
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   151
            # explicit pull overrides local bookmark if any
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   152
            ui.status(_("importing bookmark %s\n") % b)
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   153
            repo._bookmarks[b] = repo[rb[b]].node()
13350
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents: 13313
diff changeset
   154
        bookmarks.write(repo)
11378
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   155
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   156
    return result
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   157
11379
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   158
def push(oldpush, ui, repo, dest=None, **opts):
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   159
    dopush = True
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   160
    if opts.get('bookmark'):
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   161
        dopush = False
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   162
        for b in opts['bookmark']:
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   163
            if b in repo._bookmarks:
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   164
                dopush = True
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   165
                opts.setdefault('rev', []).append(b)
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   166
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   167
    result = 0
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   168
    if dopush:
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   169
        result = oldpush(ui, repo, dest, **opts)
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   170
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   171
    if opts.get('bookmark'):
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   172
        # this is an unpleasant hack as push will do this internally
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   173
        dest = ui.expandpath(dest or 'default-push', dest or 'default')
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   174
        dest, branches = hg.parseurl(dest, opts.get('branch'))
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   175
        other = hg.repository(hg.remoteui(repo, opts), dest)
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   176
        rb = other.listkeys('bookmarks')
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   177
        for b in opts['bookmark']:
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   178
            # explicit push overrides remote bookmark if any
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   179
            if b in repo._bookmarks:
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   180
                ui.status(_("exporting bookmark %s\n") % b)
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   181
                new = repo[b].hex()
11994
31dde4c3bb83 bookmarks: Check if the bookmark to delete exists on the remote
David Soria Parra <dsp@php.net>
parents: 11704
diff changeset
   182
            elif b in rb:
11379
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   183
                ui.status(_("deleting remote bookmark %s\n") % b)
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   184
                new = '' # delete
11994
31dde4c3bb83 bookmarks: Check if the bookmark to delete exists on the remote
David Soria Parra <dsp@php.net>
parents: 11704
diff changeset
   185
            else:
12146
4d12c42fe932 bookmarks: break long line found by check-code
Martin Geisler <mg@lazybytes.net>
parents: 12083
diff changeset
   186
                ui.warn(_('bookmark %s does not exist on the local '
4d12c42fe932 bookmarks: break long line found by check-code
Martin Geisler <mg@lazybytes.net>
parents: 12083
diff changeset
   187
                          'or remote repository!\n') % b)
11994
31dde4c3bb83 bookmarks: Check if the bookmark to delete exists on the remote
David Soria Parra <dsp@php.net>
parents: 11704
diff changeset
   188
                return 2
11379
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   189
            old = rb.get(b, '')
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   190
            r = other.pushkey('bookmarks', b, old, new)
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   191
            if not r:
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   192
                ui.warn(_('updating bookmark %s failed!\n') % b)
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   193
                if not result:
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   194
                    result = 2
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   195
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   196
    return result
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   197
7638
f83a2b1d1a71 bookmarks; clean up imports and function wrapping
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   198
def uisetup(ui):
f83a2b1d1a71 bookmarks; clean up imports and function wrapping
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   199
    if ui.configbool('bookmarks', 'track.current'):
f83a2b1d1a71 bookmarks; clean up imports and function wrapping
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   200
        extensions.wrapcommand(commands.table, 'update', updatecurbookmark)
11378
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   201
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   202
    entry = extensions.wrapcommand(commands.table, 'pull', pull)
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   203
    entry[1].append(('B', 'bookmark', [],
12302
6ad36bca3a8a bookmarks: set VALUE in push/pull
Will Maier <willmaier@ml1.net>
parents: 12152
diff changeset
   204
                     _("bookmark to import"),
6ad36bca3a8a bookmarks: set VALUE in push/pull
Will Maier <willmaier@ml1.net>
parents: 12152
diff changeset
   205
                     _('BOOKMARK')))
11379
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   206
    entry = extensions.wrapcommand(commands.table, 'push', push)
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   207
    entry[1].append(('B', 'bookmark', [],
12302
6ad36bca3a8a bookmarks: set VALUE in push/pull
Will Maier <willmaier@ml1.net>
parents: 12152
diff changeset
   208
                     _("bookmark to export"),
6ad36bca3a8a bookmarks: set VALUE in push/pull
Will Maier <willmaier@ml1.net>
parents: 12152
diff changeset
   209
                     _('BOOKMARK')))
11378
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   210
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   211
def updatecurbookmark(orig, ui, repo, *args, **opts):
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   212
    '''Set the current bookmark
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   213
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   214
    If the user updates to a bookmark we update the .hg/bookmarks.current
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   215
    file.
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   216
    '''
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   217
    res = orig(ui, repo, *args, **opts)
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   218
    rev = opts['rev']
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   219
    if not rev and len(args) > 0:
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   220
        rev = args[0]
13350
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents: 13313
diff changeset
   221
    bookmarks.setcurrent(repo, rev)
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   222
    return res
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   223
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   224
cmdtable = {
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   225
    "bookmarks":
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   226
        (bookmark,
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   227
         [('f', 'force', False, _('force')),
11321
40c06bbf58be help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 11193
diff changeset
   228
          ('r', 'rev', '', _('revision'), _('REV')),
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   229
          ('d', 'delete', False, _('delete a given bookmark')),
11321
40c06bbf58be help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 11193
diff changeset
   230
          ('m', 'rename', '', _('rename a given bookmark'), _('NAME'))],
7818
b6b9065c20b3 bookmarks: change NAME to REV
Benoit Allard <benoit@aeteurope.nl>
parents: 7817
diff changeset
   231
         _('hg bookmarks [-f] [-d] [-m NAME] [-r REV] [NAME]')),
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   232
}