hgext/bookmarks.py
author Matt Mackall <mpm@selenic.com>
Thu, 27 Jan 2011 17:22:37 -0600
changeset 13313 0c493e5ce8e9
parent 13104 5dac0d04b838
parent 13307 7f2b8aac7bdc
child 13350 a7376b92caaa
permissions -rw-r--r--
merge with stable
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
13048
e298cca2d53a bookmarks: use UTF-8 storage
Matt Mackall <mpm@selenic.com>
parents: 13032
diff changeset
    34
from mercurial import revset, encoding
7638
f83a2b1d1a71 bookmarks; clean up imports and function wrapping
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
    35
import os
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    36
10106
cb3f6da91646 bookmarks: write() can simply access repo._bookmarks
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10105
diff changeset
    37
def write(repo):
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    38
    '''Write bookmarks
7250
352627bcafc3 bookmarks: Remove trailing space
Joel Rosdahl <joel@rosdahl.net>
parents: 7239
diff changeset
    39
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    40
    Write the given bookmark => hash dictionary to the .hg/bookmarks file
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    41
    in a format equal to those of localtags.
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    42
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    43
    We also store a backup of the previous state in undo.bookmarks that
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    44
    can be copied back on rollback.
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    45
    '''
10106
cb3f6da91646 bookmarks: write() can simply access repo._bookmarks
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10105
diff changeset
    46
    refs = repo._bookmarks
13103
6e79a3bb8c79 bookmarks: create undo.bookmarks using repo.opener instead of util.copyfile
Brodie Rao <brodie@bitheap.org>
parents: 12881
diff changeset
    47
6e79a3bb8c79 bookmarks: create undo.bookmarks using repo.opener instead of util.copyfile
Brodie Rao <brodie@bitheap.org>
parents: 12881
diff changeset
    48
    try:
6e79a3bb8c79 bookmarks: create undo.bookmarks using repo.opener instead of util.copyfile
Brodie Rao <brodie@bitheap.org>
parents: 12881
diff changeset
    49
        bms = repo.opener('bookmarks').read()
6e79a3bb8c79 bookmarks: create undo.bookmarks using repo.opener instead of util.copyfile
Brodie Rao <brodie@bitheap.org>
parents: 12881
diff changeset
    50
    except IOError:
13306
146bad852ede bookmarks: always write undo file
David Soria Parra <dsp@php.net>
parents: 13103
diff changeset
    51
        bms = ''
146bad852ede bookmarks: always write undo file
David Soria Parra <dsp@php.net>
parents: 13103
diff changeset
    52
    repo.opener('undo.bookmarks', 'w').write(bms)
13103
6e79a3bb8c79 bookmarks: create undo.bookmarks using repo.opener instead of util.copyfile
Brodie Rao <brodie@bitheap.org>
parents: 12881
diff changeset
    53
10107
c03f467423f3 bookmarks: repo._bookmarkcurrent should be a propertycache
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10106
diff changeset
    54
    if repo._bookmarkcurrent not in refs:
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    55
        setcurrent(repo, None)
8862
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
    56
    wlock = repo.wlock()
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
    57
    try:
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
    58
        file = repo.opener('bookmarks', 'w', atomictemp=True)
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
    59
        for refspec, node in refs.iteritems():
13048
e298cca2d53a bookmarks: use UTF-8 storage
Matt Mackall <mpm@selenic.com>
parents: 13032
diff changeset
    60
            file.write("%s %s\n" % (hex(node), encoding.fromlocal(refspec)))
8862
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
    61
        file.rename()
11440
5fe4302cfd72 bookmarks: touch changelog on write to force hgweb reload
Matt Mackall <mpm@selenic.com>
parents: 11434
diff changeset
    62
5fe4302cfd72 bookmarks: touch changelog on write to force hgweb reload
Matt Mackall <mpm@selenic.com>
parents: 11434
diff changeset
    63
        # touch 00changelog.i so hgweb reloads bookmarks (no lock needed)
5fe4302cfd72 bookmarks: touch changelog on write to force hgweb reload
Matt Mackall <mpm@selenic.com>
parents: 11434
diff changeset
    64
        try:
5fe4302cfd72 bookmarks: touch changelog on write to force hgweb reload
Matt Mackall <mpm@selenic.com>
parents: 11434
diff changeset
    65
            os.utime(repo.sjoin('00changelog.i'), None)
5fe4302cfd72 bookmarks: touch changelog on write to force hgweb reload
Matt Mackall <mpm@selenic.com>
parents: 11434
diff changeset
    66
        except OSError:
5fe4302cfd72 bookmarks: touch changelog on write to force hgweb reload
Matt Mackall <mpm@selenic.com>
parents: 11434
diff changeset
    67
            pass
5fe4302cfd72 bookmarks: touch changelog on write to force hgweb reload
Matt Mackall <mpm@selenic.com>
parents: 11434
diff changeset
    68
8862
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
    69
    finally:
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
    70
        wlock.release()
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    71
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    72
def setcurrent(repo, mark):
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    73
    '''Set the name of the bookmark that we are currently on
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    74
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    75
    Set the name of the bookmark that we are on (hg update <bookmark>).
8087
6dcf425cc2a6 bookmarks: fix typo
Wagner Bruna <wbruna@yahoo.com>
parents: 7984
diff changeset
    76
    The name is recorded in .hg/bookmarks.current
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    77
    '''
10107
c03f467423f3 bookmarks: repo._bookmarkcurrent should be a propertycache
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10106
diff changeset
    78
    current = repo._bookmarkcurrent
c03f467423f3 bookmarks: repo._bookmarkcurrent should be a propertycache
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10106
diff changeset
    79
    if current == mark:
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    80
        return
7484
167853c7e54a bookmarks: do not overwrite bookmarks.current if not necessary
David Soria Parra <dsp@php.net>
parents: 7483
diff changeset
    81
10105
dc5b5cc5ca34 bookmarks: turn repo._bookmarks into a propertycache
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9643
diff changeset
    82
    refs = repo._bookmarks
7484
167853c7e54a bookmarks: do not overwrite bookmarks.current if not necessary
David Soria Parra <dsp@php.net>
parents: 7483
diff changeset
    83
7491
b95ff487870e bookmarks: this is a comment, not a string
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7489
diff changeset
    84
    # do not update if we do update to a rev equal to the current bookmark
7817
cb516e788238 bookmarks: fixes bug where a deleted bookmark may still be treated as current when track.current option is set
Alex Unden <alu@zpuppet.org>
parents: 7816
diff changeset
    85
    if (mark and mark not in refs and
10107
c03f467423f3 bookmarks: repo._bookmarkcurrent should be a propertycache
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10106
diff changeset
    86
        current and refs[current] == repo.changectx('.').node()):
7484
167853c7e54a bookmarks: do not overwrite bookmarks.current if not necessary
David Soria Parra <dsp@php.net>
parents: 7483
diff changeset
    87
        return
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    88
    if mark not in refs:
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    89
        mark = ''
8862
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
    90
    wlock = repo.wlock()
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
    91
    try:
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
    92
        file = repo.opener('bookmarks.current', 'w', atomictemp=True)
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
    93
        file.write(mark)
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
    94
        file.rename()
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
    95
    finally:
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
    96
        wlock.release()
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    97
    repo._bookmarkcurrent = mark
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    98
7255
69e431ea124d bookmarks: Rename --move to --rename
Joel Rosdahl <joel@rosdahl.net>
parents: 7254
diff changeset
    99
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
   100
    '''track a line of development with movable markers
7250
352627bcafc3 bookmarks: Remove trailing space
Joel Rosdahl <joel@rosdahl.net>
parents: 7239
diff changeset
   101
9251
6bddba3973bc bookmarks: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9202
diff changeset
   102
    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
   103
    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
   104
    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
   105
    :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
   106
10973
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10956
diff changeset
   107
    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
   108
    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
   109
    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
   110
    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
   111
4212fdc4db18 bookmarks: add paragraph on pushing and pulling to help
Kevin Bullock <kbullock@ringworld.org>
parents: 12747
diff changeset
   112
    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
   113
    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
   114
    enabled for both the local and remote repositories.
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   115
    '''
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   116
    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
   117
    marks = repo._bookmarks
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   118
    cur   = repo.changectx('.').node()
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   119
7255
69e431ea124d bookmarks: Rename --move to --rename
Joel Rosdahl <joel@rosdahl.net>
parents: 7254
diff changeset
   120
    if rename:
69e431ea124d bookmarks: Rename --move to --rename
Joel Rosdahl <joel@rosdahl.net>
parents: 7254
diff changeset
   121
        if rename not in marks:
7251
444d88175e33 bookmarks: Fix spelling and grammar
Joel Rosdahl <joel@rosdahl.net>
parents: 7250
diff changeset
   122
            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
   123
        if mark in marks and not force:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   124
            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
   125
        if mark is None:
d892211d670e bookmarks: Require new bookmark name when renaming
Joel Rosdahl <joel@rosdahl.net>
parents: 7253
diff changeset
   126
            raise util.Abort(_("new bookmark name required"))
7255
69e431ea124d bookmarks: Rename --move to --rename
Joel Rosdahl <joel@rosdahl.net>
parents: 7254
diff changeset
   127
        marks[mark] = marks[rename]
69e431ea124d bookmarks: Rename --move to --rename
Joel Rosdahl <joel@rosdahl.net>
parents: 7254
diff changeset
   128
        del marks[rename]
10107
c03f467423f3 bookmarks: repo._bookmarkcurrent should be a propertycache
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10106
diff changeset
   129
        if repo._bookmarkcurrent == rename:
7550
fead6cf99a09 bookmarks: set the current bookmark to the new name if we rename the current bookmark
David Soria Parra <dsp@php.net>
parents: 7489
diff changeset
   130
            setcurrent(repo, mark)
10106
cb3f6da91646 bookmarks: write() can simply access repo._bookmarks
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10105
diff changeset
   131
        write(repo)
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   132
        return
7250
352627bcafc3 bookmarks: Remove trailing space
Joel Rosdahl <joel@rosdahl.net>
parents: 7239
diff changeset
   133
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   134
    if delete:
8527
f9a80054dd3c use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
   135
        if mark is None:
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   136
            raise util.Abort(_("bookmark name required"))
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   137
        if mark not in marks:
7251
444d88175e33 bookmarks: Fix spelling and grammar
Joel Rosdahl <joel@rosdahl.net>
parents: 7250
diff changeset
   138
            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
   139
        if mark == repo._bookmarkcurrent:
7817
cb516e788238 bookmarks: fixes bug where a deleted bookmark may still be treated as current when track.current option is set
Alex Unden <alu@zpuppet.org>
parents: 7816
diff changeset
   140
            setcurrent(repo, None)
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   141
        del marks[mark]
10106
cb3f6da91646 bookmarks: write() can simply access repo._bookmarks
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10105
diff changeset
   142
        write(repo)
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   143
        return
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   144
13031
3da456d0c885 code style: prefer 'is' and 'is not' tests with singletons
Martin Geisler <mg@aragost.com>
parents: 12881
diff changeset
   145
    if mark is not None:
7259
18c23375861f bookmarks: Correctly reject newlines in bookmark names
Joel Rosdahl <joel@rosdahl.net>
parents: 7258
diff changeset
   146
        if "\n" in mark:
18c23375861f bookmarks: Correctly reject newlines in bookmark names
Joel Rosdahl <joel@rosdahl.net>
parents: 7258
diff changeset
   147
            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
   148
        mark = mark.strip()
11704
18c47562d331 bookmarks: don't allow name to contain whitespaces only
Idan Kamara <idankk86@gmail.com>
parents: 11641
diff changeset
   149
        if not mark:
18c47562d331 bookmarks: don't allow name to contain whitespaces only
Idan Kamara <idankk86@gmail.com>
parents: 11641
diff changeset
   150
            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
   151
                               "whitespace"))
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   152
        if mark in marks and not force:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   153
            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
   154
        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
   155
            and not force):
7252
104a8324798e bookmarks: Avoid long lines
Joel Rosdahl <joel@rosdahl.net>
parents: 7251
diff changeset
   156
            raise util.Abort(
104a8324798e bookmarks: Avoid long lines
Joel Rosdahl <joel@rosdahl.net>
parents: 7251
diff changeset
   157
                _("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
   158
        if rev:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   159
            marks[mark] = repo.lookup(rev)
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   160
        else:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   161
            marks[mark] = repo.changectx('.').node()
11561
e5aaaef91a27 bookmarks: ensure current bookmark is updated when specified with -r .
Brodie Rao <brodie@bitheap.org>
parents: 11444
diff changeset
   162
        setcurrent(repo, mark)
10106
cb3f6da91646 bookmarks: write() can simply access repo._bookmarks
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10105
diff changeset
   163
        write(repo)
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   164
        return
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   165
8527
f9a80054dd3c use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
   166
    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
   167
        if rev:
9bd051efbdd6 bookmarks: Require a bookmark name when a revision is specified
Joel Rosdahl <joel@rosdahl.net>
parents: 7257
diff changeset
   168
            raise util.Abort(_("bookmark name required"))
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   169
        if len(marks) == 0:
10510
f77f3383c666 i18n: mark more strings for translation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10463
diff changeset
   170
            ui.status(_("no bookmarks set\n"))
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   171
        else:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   172
            for bmark, n in marks.iteritems():
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   173
                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
   174
                    current = repo._bookmarkcurrent
10820
da809085bc9f bookmark: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10597
diff changeset
   175
                    if bmark == current and n == cur:
da809085bc9f bookmark: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10597
diff changeset
   176
                        prefix, label = '*', 'bookmarks.current'
da809085bc9f bookmark: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10597
diff changeset
   177
                    else:
da809085bc9f bookmark: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10597
diff changeset
   178
                        prefix, label = ' ', ''
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   179
                else:
10820
da809085bc9f bookmark: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10597
diff changeset
   180
                    if n == cur:
da809085bc9f bookmark: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10597
diff changeset
   181
                        prefix, label = '*', 'bookmarks.current'
da809085bc9f bookmark: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10597
diff changeset
   182
                    else:
da809085bc9f bookmark: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10597
diff changeset
   183
                        prefix, label = ' ', ''
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   184
9459
3b283adcc720 bookmarks: support --quiet
Steve Losh <steve@stevelosh.com>
parents: 9282
diff changeset
   185
                if ui.quiet:
10820
da809085bc9f bookmark: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10597
diff changeset
   186
                    ui.write("%s\n" % bmark, label=label)
9459
3b283adcc720 bookmarks: support --quiet
Steve Losh <steve@stevelosh.com>
parents: 9282
diff changeset
   187
                else:
3b283adcc720 bookmarks: support --quiet
Steve Losh <steve@stevelosh.com>
parents: 9282
diff changeset
   188
                    ui.write(" %s %-25s %d:%s\n" % (
10820
da809085bc9f bookmark: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10597
diff changeset
   189
                        prefix, bmark, repo.changelog.rev(n), hexfn(n)),
da809085bc9f bookmark: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10597
diff changeset
   190
                        label=label)
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   191
        return
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   192
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   193
def _revstostrip(changelog, node):
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   194
    srev = changelog.rev(node)
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   195
    tostrip = [srev]
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   196
    saveheads = []
7283
b19c0200c90b bookmarks: fix strip handling
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7280
diff changeset
   197
    for r in xrange(srev, len(changelog)):
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   198
        parents = changelog.parentrevs(r)
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   199
        if parents[0] in tostrip or parents[1] in tostrip:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   200
            tostrip.append(r)
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   201
            if parents[1] != nullrev:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   202
                for p in parents:
7283
b19c0200c90b bookmarks: fix strip handling
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7280
diff changeset
   203
                    if p not in tostrip and p > srev:
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   204
                        saveheads.append(p)
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   205
    return [r for r in tostrip if r not in saveheads]
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   206
7638
f83a2b1d1a71 bookmarks; clean up imports and function wrapping
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   207
def strip(oldstrip, ui, repo, node, backup="all"):
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   208
    """Strip bookmarks if revisions are stripped using
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   209
    the mercurial.strip method. This usually happens during
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   210
    qpush and qpop"""
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   211
    revisions = _revstostrip(repo.changelog, node)
10105
dc5b5cc5ca34 bookmarks: turn repo._bookmarks into a propertycache
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9643
diff changeset
   212
    marks = repo._bookmarks
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   213
    update = []
7622
4dd7b28003d2 use dict.iteritems() rather than dict.items()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7552
diff changeset
   214
    for mark, n in marks.iteritems():
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   215
        if repo.changelog.rev(n) in revisions:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   216
            update.append(mark)
7280
810ca383da9c remove unused variables
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7262
diff changeset
   217
    oldstrip(ui, repo, node, backup)
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   218
    if len(update) > 0:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   219
        for m in update:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   220
            marks[m] = repo.changectx('.').node()
10106
cb3f6da91646 bookmarks: write() can simply access repo._bookmarks
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10105
diff changeset
   221
        write(repo)
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   222
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   223
def reposetup(ui, repo):
9643
013cc052a926 bookmarks: use API to determine if repo is local
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9459
diff changeset
   224
    if not repo.local():
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   225
        return
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   226
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   227
    class bookmark_repo(repo.__class__):
10105
dc5b5cc5ca34 bookmarks: turn repo._bookmarks into a propertycache
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9643
diff changeset
   228
dc5b5cc5ca34 bookmarks: turn repo._bookmarks into a propertycache
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9643
diff changeset
   229
        @util.propertycache
dc5b5cc5ca34 bookmarks: turn repo._bookmarks into a propertycache
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9643
diff changeset
   230
        def _bookmarks(self):
10109
be041d6714ed bookmarks: move parse() and current() into property definitions
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10108
diff changeset
   231
            '''Parse .hg/bookmarks file and return a dictionary
be041d6714ed bookmarks: move parse() and current() into property definitions
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10108
diff changeset
   232
be041d6714ed bookmarks: move parse() and current() into property definitions
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10108
diff changeset
   233
            Bookmarks are stored as {HASH}\\s{NAME}\\n (localtags format) values
11641
ead7550f1aab bookmarks: rewrite _bookmarks method documentation
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11561
diff changeset
   234
            in the .hg/bookmarks file.
ead7550f1aab bookmarks: rewrite _bookmarks method documentation
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11561
diff changeset
   235
            Read the file and return a (name=>nodeid) dictionary
10109
be041d6714ed bookmarks: move parse() and current() into property definitions
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10108
diff changeset
   236
            '''
be041d6714ed bookmarks: move parse() and current() into property definitions
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10108
diff changeset
   237
            try:
be041d6714ed bookmarks: move parse() and current() into property definitions
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10108
diff changeset
   238
                bookmarks = {}
be041d6714ed bookmarks: move parse() and current() into property definitions
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10108
diff changeset
   239
                for line in self.opener('bookmarks'):
be041d6714ed bookmarks: move parse() and current() into property definitions
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10108
diff changeset
   240
                    sha, refspec = line.strip().split(' ', 1)
13048
e298cca2d53a bookmarks: use UTF-8 storage
Matt Mackall <mpm@selenic.com>
parents: 13032
diff changeset
   241
                    refspec = encoding.tolocal(refspec)
12747
175fb1b193f4 bookmarks: better fix for issue2016 (lookup infinite recursion)
Paul Molodowitch <pm@stanfordalumni.org>
parents: 12714
diff changeset
   242
                    bookmarks[refspec] = self.changelog.lookup(sha)
10109
be041d6714ed bookmarks: move parse() and current() into property definitions
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10108
diff changeset
   243
            except:
be041d6714ed bookmarks: move parse() and current() into property definitions
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10108
diff changeset
   244
                pass
be041d6714ed bookmarks: move parse() and current() into property definitions
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10108
diff changeset
   245
            return bookmarks
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   246
10107
c03f467423f3 bookmarks: repo._bookmarkcurrent should be a propertycache
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10106
diff changeset
   247
        @util.propertycache
c03f467423f3 bookmarks: repo._bookmarkcurrent should be a propertycache
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10106
diff changeset
   248
        def _bookmarkcurrent(self):
10109
be041d6714ed bookmarks: move parse() and current() into property definitions
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10108
diff changeset
   249
            '''Get the current bookmark
be041d6714ed bookmarks: move parse() and current() into property definitions
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10108
diff changeset
   250
be041d6714ed bookmarks: move parse() and current() into property definitions
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10108
diff changeset
   251
            If we use gittishsh branches we have a current bookmark that
be041d6714ed bookmarks: move parse() and current() into property definitions
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10108
diff changeset
   252
            we are on. This function returns the name of the bookmark. It
be041d6714ed bookmarks: move parse() and current() into property definitions
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10108
diff changeset
   253
            is stored in .hg/bookmarks.current
be041d6714ed bookmarks: move parse() and current() into property definitions
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10108
diff changeset
   254
            '''
be041d6714ed bookmarks: move parse() and current() into property definitions
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10108
diff changeset
   255
            mark = None
be041d6714ed bookmarks: move parse() and current() into property definitions
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10108
diff changeset
   256
            if os.path.exists(self.join('bookmarks.current')):
be041d6714ed bookmarks: move parse() and current() into property definitions
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10108
diff changeset
   257
                file = self.opener('bookmarks.current')
be041d6714ed bookmarks: move parse() and current() into property definitions
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10108
diff changeset
   258
                # No readline() in posixfile_nt, reading everything is cheap
be041d6714ed bookmarks: move parse() and current() into property definitions
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10108
diff changeset
   259
                mark = (file.readlines() or [''])[0]
be041d6714ed bookmarks: move parse() and current() into property definitions
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10108
diff changeset
   260
                if mark == '':
be041d6714ed bookmarks: move parse() and current() into property definitions
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10108
diff changeset
   261
                    mark = None
be041d6714ed bookmarks: move parse() and current() into property definitions
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10108
diff changeset
   262
                file.close()
be041d6714ed bookmarks: move parse() and current() into property definitions
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10108
diff changeset
   263
            return mark
10107
c03f467423f3 bookmarks: repo._bookmarkcurrent should be a propertycache
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10106
diff changeset
   264
13307
7f2b8aac7bdc bookmarks: respect rollbacks dryrun parameter
David Soria Parra <dsp@php.net>
parents: 13306
diff changeset
   265
        def rollback(self, dryrun=False):
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   266
            if os.path.exists(self.join('undo.bookmarks')):
13307
7f2b8aac7bdc bookmarks: respect rollbacks dryrun parameter
David Soria Parra <dsp@php.net>
parents: 13306
diff changeset
   267
                if not dryrun:
7f2b8aac7bdc bookmarks: respect rollbacks dryrun parameter
David Soria Parra <dsp@php.net>
parents: 13306
diff changeset
   268
                    util.rename(self.join('undo.bookmarks'), self.join('bookmarks'))
7f2b8aac7bdc bookmarks: respect rollbacks dryrun parameter
David Soria Parra <dsp@php.net>
parents: 13306
diff changeset
   269
                elif not os.path.exists(self.sjoin("undo")):
7f2b8aac7bdc bookmarks: respect rollbacks dryrun parameter
David Soria Parra <dsp@php.net>
parents: 13306
diff changeset
   270
                    # avoid "no rollback information available" message
7f2b8aac7bdc bookmarks: respect rollbacks dryrun parameter
David Soria Parra <dsp@php.net>
parents: 13306
diff changeset
   271
                    return 0
7f2b8aac7bdc bookmarks: respect rollbacks dryrun parameter
David Soria Parra <dsp@php.net>
parents: 13306
diff changeset
   272
            return super(bookmark_repo, self).rollback(dryrun)
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   273
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   274
        def lookup(self, key):
12747
175fb1b193f4 bookmarks: better fix for issue2016 (lookup infinite recursion)
Paul Molodowitch <pm@stanfordalumni.org>
parents: 12714
diff changeset
   275
            if key in self._bookmarks:
175fb1b193f4 bookmarks: better fix for issue2016 (lookup infinite recursion)
Paul Molodowitch <pm@stanfordalumni.org>
parents: 12714
diff changeset
   276
                key = self._bookmarks[key]
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   277
            return super(bookmark_repo, self).lookup(key)
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   278
10108
b6fcb5c55884 bookmarks: refactor code responsible for updates of bookmarks
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10107
diff changeset
   279
        def _bookmarksupdate(self, parents, node):
10105
dc5b5cc5ca34 bookmarks: turn repo._bookmarks into a propertycache
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9643
diff changeset
   280
            marks = self._bookmarks
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   281
            update = False
9236
a15b0412de06 bookmarks: Teach addchangset to respect track.current
David Soria Parra <dsp@php.net>
parents: 9235
diff changeset
   282
            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
   283
                mark = self._bookmarkcurrent
9236
a15b0412de06 bookmarks: Teach addchangset to respect track.current
David Soria Parra <dsp@php.net>
parents: 9235
diff changeset
   284
                if mark and marks[mark] in parents:
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   285
                    marks[mark] = node
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   286
                    update = True
9236
a15b0412de06 bookmarks: Teach addchangset to respect track.current
David Soria Parra <dsp@php.net>
parents: 9235
diff changeset
   287
            else:
a15b0412de06 bookmarks: Teach addchangset to respect track.current
David Soria Parra <dsp@php.net>
parents: 9235
diff changeset
   288
                for mark, n in marks.items():
a15b0412de06 bookmarks: Teach addchangset to respect track.current
David Soria Parra <dsp@php.net>
parents: 9235
diff changeset
   289
                    if n in parents:
a15b0412de06 bookmarks: Teach addchangset to respect track.current
David Soria Parra <dsp@php.net>
parents: 9235
diff changeset
   290
                        marks[mark] = node
a15b0412de06 bookmarks: Teach addchangset to respect track.current
David Soria Parra <dsp@php.net>
parents: 9235
diff changeset
   291
                        update = True
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   292
            if update:
10106
cb3f6da91646 bookmarks: write() can simply access repo._bookmarks
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10105
diff changeset
   293
                write(self)
10108
b6fcb5c55884 bookmarks: refactor code responsible for updates of bookmarks
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10107
diff changeset
   294
9235
dde454349864 bookmarks: Wrap commictx instead of commit (issue 1515)
David Soria Parra <dsp@php.net>
parents: 9202
diff changeset
   295
        def commitctx(self, ctx, error=False):
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   296
            """Add a revision to the repository and
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   297
            move the bookmark"""
8862
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   298
            wlock = self.wlock() # do both commit and bookmark with lock held
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   299
            try:
9235
dde454349864 bookmarks: Wrap commictx instead of commit (issue 1515)
David Soria Parra <dsp@php.net>
parents: 9202
diff changeset
   300
                node  = super(bookmark_repo, self).commitctx(ctx, error)
8862
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   301
                if node is None:
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   302
                    return None
8944
dda4ad7c9ea9 bookmarks: Change references to "repo" by references to "self" (issue1611)
Isaac Jurado <diptongo@gmail.com>
parents: 8894
diff changeset
   303
                parents = self.changelog.parents(node)
8862
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   304
                if parents[1] == nullid:
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   305
                    parents = (parents[0],)
10108
b6fcb5c55884 bookmarks: refactor code responsible for updates of bookmarks
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10107
diff changeset
   306
b6fcb5c55884 bookmarks: refactor code responsible for updates of bookmarks
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10107
diff changeset
   307
                self._bookmarksupdate(parents, node)
8862
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   308
                return node
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   309
            finally:
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   310
                wlock.release()
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   311
11373
306fef8440af bookmarks: pull known bookmarks from server that are newer
Matt Mackall <mpm@selenic.com>
parents: 11372
diff changeset
   312
        def pull(self, remote, heads=None, force=False):
306fef8440af bookmarks: pull known bookmarks from server that are newer
Matt Mackall <mpm@selenic.com>
parents: 11372
diff changeset
   313
            result = super(bookmark_repo, self).pull(remote, heads, force)
306fef8440af bookmarks: pull known bookmarks from server that are newer
Matt Mackall <mpm@selenic.com>
parents: 11372
diff changeset
   314
306fef8440af bookmarks: pull known bookmarks from server that are newer
Matt Mackall <mpm@selenic.com>
parents: 11372
diff changeset
   315
            self.ui.debug("checking for updated bookmarks\n")
306fef8440af bookmarks: pull known bookmarks from server that are newer
Matt Mackall <mpm@selenic.com>
parents: 11372
diff changeset
   316
            rb = remote.listkeys('bookmarks')
11774
91c4e6d2c9e5 bookmarks: replace var used as a Boolean with a Boolean
Martin Geisler <mg@aragost.com>
parents: 11705
diff changeset
   317
            changed = False
11373
306fef8440af bookmarks: pull known bookmarks from server that are newer
Matt Mackall <mpm@selenic.com>
parents: 11372
diff changeset
   318
            for k in rb.keys():
306fef8440af bookmarks: pull known bookmarks from server that are newer
Matt Mackall <mpm@selenic.com>
parents: 11372
diff changeset
   319
                if k in self._bookmarks:
306fef8440af bookmarks: pull known bookmarks from server that are newer
Matt Mackall <mpm@selenic.com>
parents: 11372
diff changeset
   320
                    nr, nl = rb[k], self._bookmarks[k]
306fef8440af bookmarks: pull known bookmarks from server that are newer
Matt Mackall <mpm@selenic.com>
parents: 11372
diff changeset
   321
                    if nr in self:
306fef8440af bookmarks: pull known bookmarks from server that are newer
Matt Mackall <mpm@selenic.com>
parents: 11372
diff changeset
   322
                        cr = self[nr]
306fef8440af bookmarks: pull known bookmarks from server that are newer
Matt Mackall <mpm@selenic.com>
parents: 11372
diff changeset
   323
                        cl = self[nl]
306fef8440af bookmarks: pull known bookmarks from server that are newer
Matt Mackall <mpm@selenic.com>
parents: 11372
diff changeset
   324
                        if cl.rev() >= cr.rev():
306fef8440af bookmarks: pull known bookmarks from server that are newer
Matt Mackall <mpm@selenic.com>
parents: 11372
diff changeset
   325
                            continue
306fef8440af bookmarks: pull known bookmarks from server that are newer
Matt Mackall <mpm@selenic.com>
parents: 11372
diff changeset
   326
                        if cr in cl.descendants():
306fef8440af bookmarks: pull known bookmarks from server that are newer
Matt Mackall <mpm@selenic.com>
parents: 11372
diff changeset
   327
                            self._bookmarks[k] = cr.node()
11774
91c4e6d2c9e5 bookmarks: replace var used as a Boolean with a Boolean
Martin Geisler <mg@aragost.com>
parents: 11705
diff changeset
   328
                            changed = True
11373
306fef8440af bookmarks: pull known bookmarks from server that are newer
Matt Mackall <mpm@selenic.com>
parents: 11372
diff changeset
   329
                            self.ui.status(_("updating bookmark %s\n") % k)
306fef8440af bookmarks: pull known bookmarks from server that are newer
Matt Mackall <mpm@selenic.com>
parents: 11372
diff changeset
   330
                        else:
306fef8440af bookmarks: pull known bookmarks from server that are newer
Matt Mackall <mpm@selenic.com>
parents: 11372
diff changeset
   331
                            self.ui.warn(_("not updating divergent"
306fef8440af bookmarks: pull known bookmarks from server that are newer
Matt Mackall <mpm@selenic.com>
parents: 11372
diff changeset
   332
                                           " bookmark %s\n") % k)
11774
91c4e6d2c9e5 bookmarks: replace var used as a Boolean with a Boolean
Martin Geisler <mg@aragost.com>
parents: 11705
diff changeset
   333
            if changed:
11373
306fef8440af bookmarks: pull known bookmarks from server that are newer
Matt Mackall <mpm@selenic.com>
parents: 11372
diff changeset
   334
                write(repo)
306fef8440af bookmarks: pull known bookmarks from server that are newer
Matt Mackall <mpm@selenic.com>
parents: 11372
diff changeset
   335
306fef8440af bookmarks: pull known bookmarks from server that are newer
Matt Mackall <mpm@selenic.com>
parents: 11372
diff changeset
   336
            return result
306fef8440af bookmarks: pull known bookmarks from server that are newer
Matt Mackall <mpm@selenic.com>
parents: 11372
diff changeset
   337
11374
e291c039d8ec bookmarks: update known bookmarks on the target on push
Matt Mackall <mpm@selenic.com>
parents: 11373
diff changeset
   338
        def push(self, remote, force=False, revs=None, newbranch=False):
e291c039d8ec bookmarks: update known bookmarks on the target on push
Matt Mackall <mpm@selenic.com>
parents: 11373
diff changeset
   339
            result = super(bookmark_repo, self).push(remote, force, revs,
e291c039d8ec bookmarks: update known bookmarks on the target on push
Matt Mackall <mpm@selenic.com>
parents: 11373
diff changeset
   340
                                                     newbranch)
e291c039d8ec bookmarks: update known bookmarks on the target on push
Matt Mackall <mpm@selenic.com>
parents: 11373
diff changeset
   341
e291c039d8ec bookmarks: update known bookmarks on the target on push
Matt Mackall <mpm@selenic.com>
parents: 11373
diff changeset
   342
            self.ui.debug("checking for updated bookmarks\n")
e291c039d8ec bookmarks: update known bookmarks on the target on push
Matt Mackall <mpm@selenic.com>
parents: 11373
diff changeset
   343
            rb = remote.listkeys('bookmarks')
e291c039d8ec bookmarks: update known bookmarks on the target on push
Matt Mackall <mpm@selenic.com>
parents: 11373
diff changeset
   344
            for k in rb.keys():
e291c039d8ec bookmarks: update known bookmarks on the target on push
Matt Mackall <mpm@selenic.com>
parents: 11373
diff changeset
   345
                if k in self._bookmarks:
13050
3790452d499b pushkey: use UTF-8
Matt Mackall <mpm@selenic.com>
parents: 13048
diff changeset
   346
                    nr, nl = rb[k], hex(self._bookmarks[k])
11374
e291c039d8ec bookmarks: update known bookmarks on the target on push
Matt Mackall <mpm@selenic.com>
parents: 11373
diff changeset
   347
                    if nr in self:
e291c039d8ec bookmarks: update known bookmarks on the target on push
Matt Mackall <mpm@selenic.com>
parents: 11373
diff changeset
   348
                        cr = self[nr]
e291c039d8ec bookmarks: update known bookmarks on the target on push
Matt Mackall <mpm@selenic.com>
parents: 11373
diff changeset
   349
                        cl = self[nl]
e291c039d8ec bookmarks: update known bookmarks on the target on push
Matt Mackall <mpm@selenic.com>
parents: 11373
diff changeset
   350
                        if cl in cr.descendants():
e291c039d8ec bookmarks: update known bookmarks on the target on push
Matt Mackall <mpm@selenic.com>
parents: 11373
diff changeset
   351
                            r = remote.pushkey('bookmarks', k, nr, nl)
e291c039d8ec bookmarks: update known bookmarks on the target on push
Matt Mackall <mpm@selenic.com>
parents: 11373
diff changeset
   352
                            if r:
e291c039d8ec bookmarks: update known bookmarks on the target on push
Matt Mackall <mpm@selenic.com>
parents: 11373
diff changeset
   353
                                self.ui.status(_("updating bookmark %s\n") % k)
e291c039d8ec bookmarks: update known bookmarks on the target on push
Matt Mackall <mpm@selenic.com>
parents: 11373
diff changeset
   354
                            else:
11434
86eea1f97eac bookmarks: Use error message consistently
David Soria Parra <dsp@php.net>
parents: 11431
diff changeset
   355
                                self.ui.warn(_('updating bookmark %s'
86eea1f97eac bookmarks: Use error message consistently
David Soria Parra <dsp@php.net>
parents: 11431
diff changeset
   356
                                               ' failed!\n') % k)
11374
e291c039d8ec bookmarks: update known bookmarks on the target on push
Matt Mackall <mpm@selenic.com>
parents: 11373
diff changeset
   357
e291c039d8ec bookmarks: update known bookmarks on the target on push
Matt Mackall <mpm@selenic.com>
parents: 11373
diff changeset
   358
            return result
e291c039d8ec bookmarks: update known bookmarks on the target on push
Matt Mackall <mpm@selenic.com>
parents: 11373
diff changeset
   359
11442
ee1ed6afac21 addchangegroup: pass in lock to release it before changegroup hook is called
Matt Mackall <mpm@selenic.com>
parents: 11440
diff changeset
   360
        def addchangegroup(self, *args, **kwargs):
ee1ed6afac21 addchangegroup: pass in lock to release it before changegroup hook is called
Matt Mackall <mpm@selenic.com>
parents: 11440
diff changeset
   361
            result = super(bookmark_repo, self).addchangegroup(*args, **kwargs)
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   362
            if result > 1:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   363
                # We have more heads than before
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   364
                return result
8944
dda4ad7c9ea9 bookmarks: Change references to "repo" by references to "self" (issue1611)
Isaac Jurado <diptongo@gmail.com>
parents: 8894
diff changeset
   365
            node = self.changelog.tip()
13032
e41e2b79883d dirstate: warn on invalid parents rather than aborting
Matt Mackall <mpm@selenic.com>
parents: 13031
diff changeset
   366
            parents = self.dirstate.parents()
10108
b6fcb5c55884 bookmarks: refactor code responsible for updates of bookmarks
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10107
diff changeset
   367
            self._bookmarksupdate(parents, node)
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   368
            return result
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   369
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9053
diff changeset
   370
        def _findtags(self):
7480
31f70804f1b1 bookmarks: Include bookmarks in tags.
Martin Geisler <mg...@daimi.au.dk>
parents: 7479
diff changeset
   371
            """Merge bookmarks with normal tags"""
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9053
diff changeset
   372
            (tags, tagtypes) = super(bookmark_repo, self)._findtags()
12747
175fb1b193f4 bookmarks: better fix for issue2016 (lookup infinite recursion)
Paul Molodowitch <pm@stanfordalumni.org>
parents: 12714
diff changeset
   373
            tags.update(self._bookmarks)
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9053
diff changeset
   374
            return (tags, tagtypes)
7480
31f70804f1b1 bookmarks: Include bookmarks in tags.
Martin Geisler <mg...@daimi.au.dk>
parents: 7479
diff changeset
   375
10597
153d688cdd06 bookmarks: add invalidate() to bookmark_repo
Paul Molodowitch <pm@stanfordalumni.org>
parents: 10510
diff changeset
   376
        if hasattr(repo, 'invalidate'):
153d688cdd06 bookmarks: add invalidate() to bookmark_repo
Paul Molodowitch <pm@stanfordalumni.org>
parents: 10510
diff changeset
   377
            def invalidate(self):
153d688cdd06 bookmarks: add invalidate() to bookmark_repo
Paul Molodowitch <pm@stanfordalumni.org>
parents: 10510
diff changeset
   378
                super(bookmark_repo, self).invalidate()
153d688cdd06 bookmarks: add invalidate() to bookmark_repo
Paul Molodowitch <pm@stanfordalumni.org>
parents: 10510
diff changeset
   379
                for attr in ('_bookmarks', '_bookmarkcurrent'):
153d688cdd06 bookmarks: add invalidate() to bookmark_repo
Paul Molodowitch <pm@stanfordalumni.org>
parents: 10510
diff changeset
   380
                    if attr in self.__dict__:
10956
a156ce543a5b bookmarks: complete the missing references from dda4ad7c9ea9 (issue2121)
Isaac Jurado <diptongo@gmail.com>
parents: 10882
diff changeset
   381
                        delattr(self, attr)
10597
153d688cdd06 bookmarks: add invalidate() to bookmark_repo
Paul Molodowitch <pm@stanfordalumni.org>
parents: 10510
diff changeset
   382
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   383
    repo.__class__ = bookmark_repo
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   384
11372
735f2d561747 bookmarks: add pushkey server-side support
Matt Mackall <mpm@selenic.com>
parents: 11321
diff changeset
   385
def listbookmarks(repo):
12026
1938954354ec bookmarks: guard against listing bookmarks on unsupported repos
Martin Geisler <mg@lazybytes.net>
parents: 11994
diff changeset
   386
    # We may try to list bookmarks on a repo type that does not
1938954354ec bookmarks: guard against listing bookmarks on unsupported repos
Martin Geisler <mg@lazybytes.net>
parents: 11994
diff changeset
   387
    # support it (e.g., statichttprepository).
1938954354ec bookmarks: guard against listing bookmarks on unsupported repos
Martin Geisler <mg@lazybytes.net>
parents: 11994
diff changeset
   388
    if not hasattr(repo, '_bookmarks'):
1938954354ec bookmarks: guard against listing bookmarks on unsupported repos
Martin Geisler <mg@lazybytes.net>
parents: 11994
diff changeset
   389
        return {}
1938954354ec bookmarks: guard against listing bookmarks on unsupported repos
Martin Geisler <mg@lazybytes.net>
parents: 11994
diff changeset
   390
11372
735f2d561747 bookmarks: add pushkey server-side support
Matt Mackall <mpm@selenic.com>
parents: 11321
diff changeset
   391
    d = {}
735f2d561747 bookmarks: add pushkey server-side support
Matt Mackall <mpm@selenic.com>
parents: 11321
diff changeset
   392
    for k, v in repo._bookmarks.iteritems():
735f2d561747 bookmarks: add pushkey server-side support
Matt Mackall <mpm@selenic.com>
parents: 11321
diff changeset
   393
        d[k] = hex(v)
735f2d561747 bookmarks: add pushkey server-side support
Matt Mackall <mpm@selenic.com>
parents: 11321
diff changeset
   394
    return d
735f2d561747 bookmarks: add pushkey server-side support
Matt Mackall <mpm@selenic.com>
parents: 11321
diff changeset
   395
735f2d561747 bookmarks: add pushkey server-side support
Matt Mackall <mpm@selenic.com>
parents: 11321
diff changeset
   396
def pushbookmark(repo, key, old, new):
735f2d561747 bookmarks: add pushkey server-side support
Matt Mackall <mpm@selenic.com>
parents: 11321
diff changeset
   397
    w = repo.wlock()
735f2d561747 bookmarks: add pushkey server-side support
Matt Mackall <mpm@selenic.com>
parents: 11321
diff changeset
   398
    try:
735f2d561747 bookmarks: add pushkey server-side support
Matt Mackall <mpm@selenic.com>
parents: 11321
diff changeset
   399
        marks = repo._bookmarks
735f2d561747 bookmarks: add pushkey server-side support
Matt Mackall <mpm@selenic.com>
parents: 11321
diff changeset
   400
        if hex(marks.get(key, '')) != old:
735f2d561747 bookmarks: add pushkey server-side support
Matt Mackall <mpm@selenic.com>
parents: 11321
diff changeset
   401
            return False
735f2d561747 bookmarks: add pushkey server-side support
Matt Mackall <mpm@selenic.com>
parents: 11321
diff changeset
   402
        if new == '':
735f2d561747 bookmarks: add pushkey server-side support
Matt Mackall <mpm@selenic.com>
parents: 11321
diff changeset
   403
            del marks[key]
735f2d561747 bookmarks: add pushkey server-side support
Matt Mackall <mpm@selenic.com>
parents: 11321
diff changeset
   404
        else:
735f2d561747 bookmarks: add pushkey server-side support
Matt Mackall <mpm@selenic.com>
parents: 11321
diff changeset
   405
            if new not in repo:
735f2d561747 bookmarks: add pushkey server-side support
Matt Mackall <mpm@selenic.com>
parents: 11321
diff changeset
   406
                return False
735f2d561747 bookmarks: add pushkey server-side support
Matt Mackall <mpm@selenic.com>
parents: 11321
diff changeset
   407
            marks[key] = repo[new].node()
735f2d561747 bookmarks: add pushkey server-side support
Matt Mackall <mpm@selenic.com>
parents: 11321
diff changeset
   408
        write(repo)
735f2d561747 bookmarks: add pushkey server-side support
Matt Mackall <mpm@selenic.com>
parents: 11321
diff changeset
   409
        return True
735f2d561747 bookmarks: add pushkey server-side support
Matt Mackall <mpm@selenic.com>
parents: 11321
diff changeset
   410
    finally:
735f2d561747 bookmarks: add pushkey server-side support
Matt Mackall <mpm@selenic.com>
parents: 11321
diff changeset
   411
        w.release()
735f2d561747 bookmarks: add pushkey server-side support
Matt Mackall <mpm@selenic.com>
parents: 11321
diff changeset
   412
11378
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   413
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
   414
    # 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
   415
    if opts.get('bookmark'):
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   416
        # 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
   417
        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
   418
                                       opts.get('branch'))
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   419
        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
   420
        rb = other.listkeys('bookmarks')
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   421
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   422
        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
   423
            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
   424
                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
   425
            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
   426
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   427
    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
   428
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   429
    # update specified bookmarks
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   430
    if opts.get('bookmark'):
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   431
        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
   432
            # 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
   433
            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
   434
            repo._bookmarks[b] = repo[rb[b]].node()
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   435
        write(repo)
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   436
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   437
    return result
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   438
11379
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   439
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
   440
    dopush = True
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   441
    if opts.get('bookmark'):
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   442
        dopush = False
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   443
        for b in opts['bookmark']:
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   444
            if b in repo._bookmarks:
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   445
                dopush = True
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   446
                opts.setdefault('rev', []).append(b)
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   447
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   448
    result = 0
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   449
    if dopush:
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   450
        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
   451
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   452
    if opts.get('bookmark'):
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   453
        # 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
   454
        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
   455
        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
   456
        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
   457
        rb = other.listkeys('bookmarks')
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   458
        for b in opts['bookmark']:
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   459
            # 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
   460
            if b in repo._bookmarks:
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   461
                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
   462
                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
   463
            elif b in rb:
11379
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   464
                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
   465
                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
   466
            else:
12146
4d12c42fe932 bookmarks: break long line found by check-code
Martin Geisler <mg@lazybytes.net>
parents: 12083
diff changeset
   467
                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
   468
                          '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
   469
                return 2
11379
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   470
            old = rb.get(b, '')
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   471
            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
   472
            if not r:
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   473
                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
   474
                if not result:
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   475
                    result = 2
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   476
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   477
    return result
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   478
11431
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
   479
def diffbookmarks(ui, repo, remote):
12851
765c98f068d3 bookmarks: improve English for diffbookmarks
timeless <timeless@gmail.com>
parents: 12823
diff changeset
   480
    ui.status(_("searching for changed bookmarks\n"))
11431
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
   481
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
   482
    lmarks = repo.listkeys('bookmarks')
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
   483
    rmarks = remote.listkeys('bookmarks')
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
   484
11682
f54ec9c70877 bookmarks: sort diffbookmarks() output
Patrick Mezard <pmezard@gmail.com>
parents: 11641
diff changeset
   485
    diff = sorted(set(rmarks) - set(lmarks))
11431
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
   486
    for k in diff:
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
   487
        ui.write("   %-25s %s\n" % (k, rmarks[k][:12]))
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
   488
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
   489
    if len(diff) <= 0:
12851
765c98f068d3 bookmarks: improve English for diffbookmarks
timeless <timeless@gmail.com>
parents: 12823
diff changeset
   490
        ui.status(_("no changed bookmarks found\n"))
11444
b9a46acdfe1f bookmarks: fix in/out return values
Matt Mackall <mpm@selenic.com>
parents: 11443
diff changeset
   491
        return 1
b9a46acdfe1f bookmarks: fix in/out return values
Matt Mackall <mpm@selenic.com>
parents: 11443
diff changeset
   492
    return 0
11431
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
   493
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
   494
def incoming(oldincoming, ui, repo, source="default", **opts):
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
   495
    if opts.get('bookmarks'):
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
   496
        source, branches = hg.parseurl(ui.expandpath(source), opts.get('branch'))
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
   497
        other = hg.repository(hg.remoteui(repo, opts), source)
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
   498
        ui.status(_('comparing with %s\n') % url.hidepassword(source))
11444
b9a46acdfe1f bookmarks: fix in/out return values
Matt Mackall <mpm@selenic.com>
parents: 11443
diff changeset
   499
        return diffbookmarks(ui, repo, other)
11431
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
   500
    else:
11444
b9a46acdfe1f bookmarks: fix in/out return values
Matt Mackall <mpm@selenic.com>
parents: 11443
diff changeset
   501
        return oldincoming(ui, repo, source, **opts)
11431
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
   502
11443
9e1bc1aafdb1 bookmarks: fix bogus cut and paste for outgoing
Matt Mackall <mpm@selenic.com>
parents: 11442
diff changeset
   503
def outgoing(oldoutgoing, ui, repo, dest=None, **opts):
11431
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
   504
    if opts.get('bookmarks'):
11443
9e1bc1aafdb1 bookmarks: fix bogus cut and paste for outgoing
Matt Mackall <mpm@selenic.com>
parents: 11442
diff changeset
   505
        dest = ui.expandpath(dest or 'default-push', dest or 'default')
9e1bc1aafdb1 bookmarks: fix bogus cut and paste for outgoing
Matt Mackall <mpm@selenic.com>
parents: 11442
diff changeset
   506
        dest, branches = hg.parseurl(dest, opts.get('branch'))
9e1bc1aafdb1 bookmarks: fix bogus cut and paste for outgoing
Matt Mackall <mpm@selenic.com>
parents: 11442
diff changeset
   507
        other = hg.repository(hg.remoteui(repo, opts), dest)
9e1bc1aafdb1 bookmarks: fix bogus cut and paste for outgoing
Matt Mackall <mpm@selenic.com>
parents: 11442
diff changeset
   508
        ui.status(_('comparing with %s\n') % url.hidepassword(dest))
11444
b9a46acdfe1f bookmarks: fix in/out return values
Matt Mackall <mpm@selenic.com>
parents: 11443
diff changeset
   509
        return diffbookmarks(ui, other, repo)
11431
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
   510
    else:
11444
b9a46acdfe1f bookmarks: fix in/out return values
Matt Mackall <mpm@selenic.com>
parents: 11443
diff changeset
   511
        return oldoutgoing(ui, repo, dest, **opts)
11431
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
   512
7638
f83a2b1d1a71 bookmarks; clean up imports and function wrapping
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   513
def uisetup(ui):
f83a2b1d1a71 bookmarks; clean up imports and function wrapping
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   514
    extensions.wrapfunction(repair, "strip", strip)
f83a2b1d1a71 bookmarks; clean up imports and function wrapping
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   515
    if ui.configbool('bookmarks', 'track.current'):
f83a2b1d1a71 bookmarks; clean up imports and function wrapping
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   516
        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
   517
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   518
    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
   519
    entry[1].append(('B', 'bookmark', [],
12302
6ad36bca3a8a bookmarks: set VALUE in push/pull
Will Maier <willmaier@ml1.net>
parents: 12152
diff changeset
   520
                     _("bookmark to import"),
6ad36bca3a8a bookmarks: set VALUE in push/pull
Will Maier <willmaier@ml1.net>
parents: 12152
diff changeset
   521
                     _('BOOKMARK')))
11379
e1a145eebb6a bookmarks: add support for push --bookmark to export bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11378
diff changeset
   522
    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
   523
    entry[1].append(('B', 'bookmark', [],
12302
6ad36bca3a8a bookmarks: set VALUE in push/pull
Will Maier <willmaier@ml1.net>
parents: 12152
diff changeset
   524
                     _("bookmark to export"),
6ad36bca3a8a bookmarks: set VALUE in push/pull
Will Maier <willmaier@ml1.net>
parents: 12152
diff changeset
   525
                     _('BOOKMARK')))
11431
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
   526
    entry = extensions.wrapcommand(commands.table, 'incoming', incoming)
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
   527
    entry[1].append(('B', 'bookmarks', False,
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
   528
                     _("compare bookmark")))
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
   529
    entry = extensions.wrapcommand(commands.table, 'outgoing', outgoing)
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
   530
    entry[1].append(('B', 'bookmarks', False,
cac256790aa4 bookmarks: Add -B option to incoming/outgoing to compare bookmarks
David Soria Parra <dsp@php.net>
parents: 11379
diff changeset
   531
                     _("compare bookmark")))
11378
cb21fb1b55ba bookmarks: add support for pull --bookmark to import remote bookmarks
Matt Mackall <mpm@selenic.com>
parents: 11374
diff changeset
   532
11372
735f2d561747 bookmarks: add pushkey server-side support
Matt Mackall <mpm@selenic.com>
parents: 11321
diff changeset
   533
    pushkey.register('bookmarks', pushbookmark, listbookmarks)
7638
f83a2b1d1a71 bookmarks; clean up imports and function wrapping
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   534
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   535
def updatecurbookmark(orig, ui, repo, *args, **opts):
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   536
    '''Set the current bookmark
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   537
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   538
    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
   539
    file.
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   540
    '''
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   541
    res = orig(ui, repo, *args, **opts)
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   542
    rev = opts['rev']
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   543
    if not rev and len(args) > 0:
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   544
        rev = args[0]
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   545
    setcurrent(repo, rev)
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   546
    return res
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   547
12714
f5178fbcd197 bookmarks: add revset for referencing bookmarks
Augie Fackler <durin42@gmail.com>
parents: 12394
diff changeset
   548
def bmrevset(repo, subset, x):
12822
f13acb96b2a7 Fix and unify transplant and bookmarks revsets doc registration
Patrick Mezard <pmezard@gmail.com>
parents: 12772
diff changeset
   549
    """``bookmark([name])``
f13acb96b2a7 Fix and unify transplant and bookmarks revsets doc registration
Patrick Mezard <pmezard@gmail.com>
parents: 12772
diff changeset
   550
    The named bookmark or all bookmarks.
f13acb96b2a7 Fix and unify transplant and bookmarks revsets doc registration
Patrick Mezard <pmezard@gmail.com>
parents: 12772
diff changeset
   551
    """
12881
161fe4879bfc i18n, bookmarks: add comments for translators
Martin Geisler <mg@lazybytes.net>
parents: 12851
diff changeset
   552
    # i18n: "bookmark" is a keyword
12714
f5178fbcd197 bookmarks: add revset for referencing bookmarks
Augie Fackler <durin42@gmail.com>
parents: 12394
diff changeset
   553
    args = revset.getargs(x, 0, 1, _('bookmark takes one or no arguments'))
f5178fbcd197 bookmarks: add revset for referencing bookmarks
Augie Fackler <durin42@gmail.com>
parents: 12394
diff changeset
   554
    if args:
f5178fbcd197 bookmarks: add revset for referencing bookmarks
Augie Fackler <durin42@gmail.com>
parents: 12394
diff changeset
   555
        bm = revset.getstring(args[0],
12881
161fe4879bfc i18n, bookmarks: add comments for translators
Martin Geisler <mg@lazybytes.net>
parents: 12851
diff changeset
   556
                              # i18n: "bookmark" is a keyword
12714
f5178fbcd197 bookmarks: add revset for referencing bookmarks
Augie Fackler <durin42@gmail.com>
parents: 12394
diff changeset
   557
                              _('the argument to bookmark must be a string'))
f5178fbcd197 bookmarks: add revset for referencing bookmarks
Augie Fackler <durin42@gmail.com>
parents: 12394
diff changeset
   558
        bmrev = listbookmarks(repo).get(bm, None)
f5178fbcd197 bookmarks: add revset for referencing bookmarks
Augie Fackler <durin42@gmail.com>
parents: 12394
diff changeset
   559
        if bmrev:
f5178fbcd197 bookmarks: add revset for referencing bookmarks
Augie Fackler <durin42@gmail.com>
parents: 12394
diff changeset
   560
            bmrev = repo.changelog.rev(bin(bmrev))
f5178fbcd197 bookmarks: add revset for referencing bookmarks
Augie Fackler <durin42@gmail.com>
parents: 12394
diff changeset
   561
        return [r for r in subset if r == bmrev]
f5178fbcd197 bookmarks: add revset for referencing bookmarks
Augie Fackler <durin42@gmail.com>
parents: 12394
diff changeset
   562
    bms = set([repo.changelog.rev(bin(r)) for r in listbookmarks(repo).values()])
f5178fbcd197 bookmarks: add revset for referencing bookmarks
Augie Fackler <durin42@gmail.com>
parents: 12394
diff changeset
   563
    return [r for r in subset if r in bms]
f5178fbcd197 bookmarks: add revset for referencing bookmarks
Augie Fackler <durin42@gmail.com>
parents: 12394
diff changeset
   564
12822
f13acb96b2a7 Fix and unify transplant and bookmarks revsets doc registration
Patrick Mezard <pmezard@gmail.com>
parents: 12772
diff changeset
   565
def extsetup(ui):
f13acb96b2a7 Fix and unify transplant and bookmarks revsets doc registration
Patrick Mezard <pmezard@gmail.com>
parents: 12772
diff changeset
   566
    revset.symbols['bookmark'] = bmrevset
12714
f5178fbcd197 bookmarks: add revset for referencing bookmarks
Augie Fackler <durin42@gmail.com>
parents: 12394
diff changeset
   567
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   568
cmdtable = {
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   569
    "bookmarks":
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   570
        (bookmark,
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   571
         [('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
   572
          ('r', 'rev', '', _('revision'), _('REV')),
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   573
          ('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
   574
          ('m', 'rename', '', _('rename a given bookmark'), _('NAME'))],
7818
b6b9065c20b3 bookmarks: change NAME to REV
Benoit Allard <benoit@aeteurope.nl>
parents: 7817
diff changeset
   575
         _('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
   576
}
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10820
diff changeset
   577
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10820
diff changeset
   578
colortable = {'bookmarks.current': 'green'}
12823
80deae3bc5ea hggettext: handle i18nfunctions declaration for docstrings translations
Patrick Mezard <pmezard@gmail.com>
parents: 12822
diff changeset
   579
80deae3bc5ea hggettext: handle i18nfunctions declaration for docstrings translations
Patrick Mezard <pmezard@gmail.com>
parents: 12822
diff changeset
   580
# tell hggettext to extract docstrings from these functions:
80deae3bc5ea hggettext: handle i18nfunctions declaration for docstrings translations
Patrick Mezard <pmezard@gmail.com>
parents: 12822
diff changeset
   581
i18nfunctions = [bmrevset]