hgext/bookmarks.py
author Cédric Duval <cedricduval@free.fr>
Mon, 22 Jun 2009 15:48:08 +0200
changeset 8894 868670dbc237
parent 8892 30b25ebaa63b
child 8944 dda4ad7c9ea9
permissions -rw-r--r--
extensions: improve the consistency of synopses Trying as much as possible to consistently: - use a present tense predicate followed by a direct object - verb referring directly to the functionality provided (ie. not "add command that does this" but simple "do that") - keep simple and to the point, leaving details for the long help (width is tight, possibly even more so for translations) Thanks to timeless, Martin Geisler, Rafael Villar Burke, Dan Villiom Podlaski Christiansen and others for the helpful suggestions.
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
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8087
diff changeset
     6
# GNU General Public License version 2, incorporated herein by reference.
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
8892
30b25ebaa63b bookmarks: help improvements
Cédric Duval <cedricduval@free.fr>
parents: 8862
diff changeset
    10
Bookmarks are local movable markers to changesets. Every bookmark
30b25ebaa63b bookmarks: help improvements
Cédric Duval <cedricduval@free.fr>
parents: 8862
diff changeset
    11
points to a changeset identified by its hash. If you commit a
30b25ebaa63b bookmarks: help improvements
Cédric Duval <cedricduval@free.fr>
parents: 8862
diff changeset
    12
changeset that is based on a changeset that has a bookmark on it,
30b25ebaa63b bookmarks: help improvements
Cédric Duval <cedricduval@free.fr>
parents: 8862
diff changeset
    13
the bookmark shifts to the new changeset.
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    14
8892
30b25ebaa63b bookmarks: help improvements
Cédric Duval <cedricduval@free.fr>
parents: 8862
diff changeset
    15
It is possible to use bookmark names in every revision lookup
30b25ebaa63b bookmarks: help improvements
Cédric Duval <cedricduval@free.fr>
parents: 8862
diff changeset
    16
(e.g. hg merge, hg update).
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    17
8892
30b25ebaa63b bookmarks: help improvements
Cédric Duval <cedricduval@free.fr>
parents: 8862
diff changeset
    18
By default, when several bookmarks point to the same changeset, they
30b25ebaa63b bookmarks: help improvements
Cédric Duval <cedricduval@free.fr>
parents: 8862
diff changeset
    19
will all move forward together. It is possible to obtain a more
30b25ebaa63b bookmarks: help improvements
Cédric Duval <cedricduval@free.fr>
parents: 8862
diff changeset
    20
git-like experience by adding the following configuration option to
30b25ebaa63b bookmarks: help improvements
Cédric Duval <cedricduval@free.fr>
parents: 8862
diff changeset
    21
your .hgrc:
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
8892
30b25ebaa63b bookmarks: help improvements
Cédric Duval <cedricduval@free.fr>
parents: 8862
diff changeset
    26
This will cause Mercurial to track the bookmark that you are currently
30b25ebaa63b bookmarks: help improvements
Cédric Duval <cedricduval@free.fr>
parents: 8862
diff changeset
    27
using, and only update it. This is similar to git's approach to
7984
5c61c75c2384 bookmarks: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7818
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 _
7638
f83a2b1d1a71 bookmarks; clean up imports and function wrapping
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
    32
from mercurial.node import nullid, nullrev, hex, short
f83a2b1d1a71 bookmarks; clean up imports and function wrapping
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
    33
from mercurial import util, commands, localrepo, repair, extensions
f83a2b1d1a71 bookmarks; clean up imports and function wrapping
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
    34
import os
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    35
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    36
def parse(repo):
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    37
    '''Parse .hg/bookmarks file and return a dictionary
7250
352627bcafc3 bookmarks: Remove trailing space
Joel Rosdahl <joel@rosdahl.net>
parents: 7239
diff changeset
    38
7789
e8d62d6133c2 bookmarks: escape literal backslashes in docstring
Martin Geisler <mg@daimi.au.dk>
parents: 7666
diff changeset
    39
    Bookmarks are stored as {HASH}\\s{NAME}\\n (localtags format) values
7252
104a8324798e bookmarks: Avoid long lines
Joel Rosdahl <joel@rosdahl.net>
parents: 7251
diff changeset
    40
    in the .hg/bookmarks file. They are read by the parse() method and
104a8324798e bookmarks: Avoid long lines
Joel Rosdahl <joel@rosdahl.net>
parents: 7251
diff changeset
    41
    returned as a dictionary with name => hash values.
7250
352627bcafc3 bookmarks: Remove trailing space
Joel Rosdahl <joel@rosdahl.net>
parents: 7239
diff changeset
    42
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    43
    The parsed dictionary is cached until a write() operation is done.
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    44
    '''
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    45
    try:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    46
        if repo._bookmarks:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    47
            return repo._bookmarks
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    48
        repo._bookmarks = {}
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    49
        for line in repo.opener('bookmarks'):
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    50
            sha, refspec = line.strip().split(' ', 1)
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    51
            repo._bookmarks[refspec] = repo.lookup(sha)
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    52
    except:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    53
        pass
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    54
    return repo._bookmarks
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    55
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    56
def write(repo, refs):
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    57
    '''Write bookmarks
7250
352627bcafc3 bookmarks: Remove trailing space
Joel Rosdahl <joel@rosdahl.net>
parents: 7239
diff changeset
    58
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    59
    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
    60
    in a format equal to those of localtags.
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    61
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    62
    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
    63
    can be copied back on rollback.
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    64
    '''
7253
8b81d1e2dc04 bookmarks: Only save undo.bookmarks if bookmarks exist
Joel Rosdahl <joel@rosdahl.net>
parents: 7252
diff changeset
    65
    if os.path.exists(repo.join('bookmarks')):
8b81d1e2dc04 bookmarks: Only save undo.bookmarks if bookmarks exist
Joel Rosdahl <joel@rosdahl.net>
parents: 7252
diff changeset
    66
        util.copyfile(repo.join('bookmarks'), repo.join('undo.bookmarks'))
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    67
    if current(repo) not in refs:
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    68
        setcurrent(repo, None)
8862
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
    69
    wlock = repo.wlock()
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
    70
    try:
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
    71
        file = repo.opener('bookmarks', 'w', atomictemp=True)
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
    72
        for refspec, node in refs.iteritems():
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
    73
            file.write("%s %s\n" % (hex(node), refspec))
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
    74
        file.rename()
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
    75
    finally:
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
    76
        wlock.release()
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
    77
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    78
def current(repo):
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    79
    '''Get the current bookmark
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    80
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    81
    If we use gittishsh branches we have a current bookmark that
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    82
    we are on. This function returns the name of the bookmark. It
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    83
    is stored in .hg/bookmarks.current
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    84
    '''
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    85
    if repo._bookmarkcurrent:
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    86
        return repo._bookmarkcurrent
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    87
    mark = None
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    88
    if os.path.exists(repo.join('bookmarks.current')):
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    89
        file = repo.opener('bookmarks.current')
7666
2ad81e9b075b bookmarks: work around missing posixfile_nt.readline()
Patrick Mezard <pmezard@gmail.com>
parents: 7638
diff changeset
    90
        # No readline() in posixfile_nt, reading everything is cheap
2ad81e9b075b bookmarks: work around missing posixfile_nt.readline()
Patrick Mezard <pmezard@gmail.com>
parents: 7638
diff changeset
    91
        mark = (file.readlines() or [''])[0]
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    92
        if mark == '':
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    93
            mark = None
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    94
        file.close()
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    95
    repo._bookmarkcurrent = mark
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    96
    return mark
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    97
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    98
def setcurrent(repo, mark):
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
    99
    '''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
   100
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   101
    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
   102
    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
   103
    '''
7484
167853c7e54a bookmarks: do not overwrite bookmarks.current if not necessary
David Soria Parra <dsp@php.net>
parents: 7483
diff changeset
   104
    if current(repo) == mark:
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   105
        return
7484
167853c7e54a bookmarks: do not overwrite bookmarks.current if not necessary
David Soria Parra <dsp@php.net>
parents: 7483
diff changeset
   106
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   107
    refs = parse(repo)
7484
167853c7e54a bookmarks: do not overwrite bookmarks.current if not necessary
David Soria Parra <dsp@php.net>
parents: 7483
diff changeset
   108
7491
b95ff487870e bookmarks: this is a comment, not a string
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7489
diff changeset
   109
    # 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
   110
    if (mark and mark not in refs and
7484
167853c7e54a bookmarks: do not overwrite bookmarks.current if not necessary
David Soria Parra <dsp@php.net>
parents: 7483
diff changeset
   111
        current(repo) and refs[current(repo)] == repo.changectx('.').node()):
167853c7e54a bookmarks: do not overwrite bookmarks.current if not necessary
David Soria Parra <dsp@php.net>
parents: 7483
diff changeset
   112
        return
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   113
    if mark not in refs:
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   114
        mark = ''
8862
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   115
    wlock = repo.wlock()
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   116
    try:
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   117
        file = repo.opener('bookmarks.current', 'w', atomictemp=True)
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   118
        file.write(mark)
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   119
        file.rename()
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   120
    finally:
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   121
        wlock.release()
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   122
    repo._bookmarkcurrent = mark
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   123
7255
69e431ea124d bookmarks: Rename --move to --rename
Joel Rosdahl <joel@rosdahl.net>
parents: 7254
diff changeset
   124
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
   125
    '''track a line of development with movable markers
7250
352627bcafc3 bookmarks: Remove trailing space
Joel Rosdahl <joel@rosdahl.net>
parents: 7239
diff changeset
   126
7252
104a8324798e bookmarks: Avoid long lines
Joel Rosdahl <joel@rosdahl.net>
parents: 7251
diff changeset
   127
    Bookmarks are pointers to certain commits that move when
8892
30b25ebaa63b bookmarks: help improvements
Cédric Duval <cedricduval@free.fr>
parents: 8862
diff changeset
   128
    committing. Bookmarks are local. They can be renamed, copied and
7984
5c61c75c2384 bookmarks: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7818
diff changeset
   129
    deleted. It is possible to use bookmark names in 'hg merge' and
8762
545dfd502e69 bookmarks: improve English
timeless <timeless@gmail.com>
parents: 8760
diff changeset
   130
    '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
   131
8725
353b1c160c2d bookmarks: update docstring
Abderrahim Kitouni <a.kitouni@gmail.com>
parents: 8527
diff changeset
   132
    You can use 'hg bookmark NAME' to set a bookmark on the working
353b1c160c2d bookmarks: update docstring
Abderrahim Kitouni <a.kitouni@gmail.com>
parents: 8527
diff changeset
   133
    directory's parent revision with the given name. If you specify
353b1c160c2d bookmarks: update docstring
Abderrahim Kitouni <a.kitouni@gmail.com>
parents: 8527
diff changeset
   134
    a revision using -r REV (where REV may be an existing bookmark),
353b1c160c2d bookmarks: update docstring
Abderrahim Kitouni <a.kitouni@gmail.com>
parents: 8527
diff changeset
   135
    the bookmark is assigned to that revision.
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   136
    '''
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   137
    hexfn = ui.debugflag and hex or short
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   138
    marks = parse(repo)
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   139
    cur   = repo.changectx('.').node()
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   140
7255
69e431ea124d bookmarks: Rename --move to --rename
Joel Rosdahl <joel@rosdahl.net>
parents: 7254
diff changeset
   141
    if rename:
69e431ea124d bookmarks: Rename --move to --rename
Joel Rosdahl <joel@rosdahl.net>
parents: 7254
diff changeset
   142
        if rename not in marks:
7251
444d88175e33 bookmarks: Fix spelling and grammar
Joel Rosdahl <joel@rosdahl.net>
parents: 7250
diff changeset
   143
            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
   144
        if mark in marks and not force:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   145
            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
   146
        if mark is None:
d892211d670e bookmarks: Require new bookmark name when renaming
Joel Rosdahl <joel@rosdahl.net>
parents: 7253
diff changeset
   147
            raise util.Abort(_("new bookmark name required"))
7255
69e431ea124d bookmarks: Rename --move to --rename
Joel Rosdahl <joel@rosdahl.net>
parents: 7254
diff changeset
   148
        marks[mark] = marks[rename]
69e431ea124d bookmarks: Rename --move to --rename
Joel Rosdahl <joel@rosdahl.net>
parents: 7254
diff changeset
   149
        del marks[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
   150
        if current(repo) == rename:
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
   151
            setcurrent(repo, mark)
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   152
        write(repo, marks)
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   153
        return
7250
352627bcafc3 bookmarks: Remove trailing space
Joel Rosdahl <joel@rosdahl.net>
parents: 7239
diff changeset
   154
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   155
    if delete:
8527
f9a80054dd3c use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
   156
        if mark is None:
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   157
            raise util.Abort(_("bookmark name required"))
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   158
        if mark not in marks:
7251
444d88175e33 bookmarks: Fix spelling and grammar
Joel Rosdahl <joel@rosdahl.net>
parents: 7250
diff changeset
   159
            raise util.Abort(_("a bookmark of this name does not exist"))
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
   160
        if mark == current(repo):
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
   161
            setcurrent(repo, None)
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   162
        del marks[mark]
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   163
        write(repo, marks)
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
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   166
    if mark != None:
7259
18c23375861f bookmarks: Correctly reject newlines in bookmark names
Joel Rosdahl <joel@rosdahl.net>
parents: 7258
diff changeset
   167
        if "\n" in mark:
18c23375861f bookmarks: Correctly reject newlines in bookmark names
Joel Rosdahl <joel@rosdahl.net>
parents: 7258
diff changeset
   168
            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
   169
        mark = mark.strip()
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   170
        if mark in marks and not force:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   171
            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
   172
        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
   173
            and not force):
7252
104a8324798e bookmarks: Avoid long lines
Joel Rosdahl <joel@rosdahl.net>
parents: 7251
diff changeset
   174
            raise util.Abort(
104a8324798e bookmarks: Avoid long lines
Joel Rosdahl <joel@rosdahl.net>
parents: 7251
diff changeset
   175
                _("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
   176
        if rev:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   177
            marks[mark] = repo.lookup(rev)
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   178
        else:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   179
            marks[mark] = repo.changectx('.').node()
7816
f420eafe59cd bookmarks: Set current bookmark if we create a new one on the tip
David Soria Parra <dsp@php.net>
parents: 7795
diff changeset
   180
            setcurrent(repo, mark)
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   181
        write(repo, marks)
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   182
        return
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   183
8527
f9a80054dd3c use 'x is None' instead of 'x == None'
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
   184
    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
   185
        if rev:
9bd051efbdd6 bookmarks: Require a bookmark name when a revision is specified
Joel Rosdahl <joel@rosdahl.net>
parents: 7257
diff changeset
   186
            raise util.Abort(_("bookmark name required"))
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   187
        if len(marks) == 0:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   188
            ui.status("no bookmarks set\n")
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   189
        else:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   190
            for bmark, n in marks.iteritems():
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   191
                if ui.configbool('bookmarks', 'track.current'):
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   192
                    prefix = (bmark == current(repo) and n == cur) and '*' or ' '
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   193
                else:
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   194
                    prefix = (n == cur) and '*' or ' '
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   195
7252
104a8324798e bookmarks: Avoid long lines
Joel Rosdahl <joel@rosdahl.net>
parents: 7251
diff changeset
   196
                ui.write(" %s %-25s %d:%s\n" % (
104a8324798e bookmarks: Avoid long lines
Joel Rosdahl <joel@rosdahl.net>
parents: 7251
diff changeset
   197
                    prefix, bmark, repo.changelog.rev(n), hexfn(n)))
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   198
        return
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   199
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   200
def _revstostrip(changelog, node):
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   201
    srev = changelog.rev(node)
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   202
    tostrip = [srev]
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   203
    saveheads = []
7283
b19c0200c90b bookmarks: fix strip handling
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7280
diff changeset
   204
    for r in xrange(srev, len(changelog)):
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   205
        parents = changelog.parentrevs(r)
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   206
        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
   207
            tostrip.append(r)
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   208
            if parents[1] != nullrev:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   209
                for p in parents:
7283
b19c0200c90b bookmarks: fix strip handling
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7280
diff changeset
   210
                    if p not in tostrip and p > srev:
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   211
                        saveheads.append(p)
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   212
    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
   213
7638
f83a2b1d1a71 bookmarks; clean up imports and function wrapping
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   214
def strip(oldstrip, ui, repo, node, backup="all"):
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   215
    """Strip bookmarks if revisions are stripped using
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   216
    the mercurial.strip method. This usually happens during
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   217
    qpush and qpop"""
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   218
    revisions = _revstostrip(repo.changelog, node)
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   219
    marks = parse(repo)
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   220
    update = []
7622
4dd7b28003d2 use dict.iteritems() rather than dict.items()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7552
diff changeset
   221
    for mark, n in marks.iteritems():
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   222
        if repo.changelog.rev(n) in revisions:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   223
            update.append(mark)
7280
810ca383da9c remove unused variables
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7262
diff changeset
   224
    oldstrip(ui, repo, node, backup)
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   225
    if len(update) > 0:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   226
        for m in update:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   227
            marks[m] = repo.changectx('.').node()
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   228
        write(repo, marks)
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   229
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   230
def reposetup(ui, repo):
7638
f83a2b1d1a71 bookmarks; clean up imports and function wrapping
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   231
    if not isinstance(repo, localrepo.localrepository):
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   232
        return
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   233
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   234
    # init a bookmark cache as otherwise we would get a infinite reading
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   235
    # in lookup()
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   236
    repo._bookmarks = None
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   237
    repo._bookmarkcurrent = None
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   238
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   239
    class bookmark_repo(repo.__class__):
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   240
        def rollback(self):
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   241
            if os.path.exists(self.join('undo.bookmarks')):
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   242
                util.rename(self.join('undo.bookmarks'), self.join('bookmarks'))
7250
352627bcafc3 bookmarks: Remove trailing space
Joel Rosdahl <joel@rosdahl.net>
parents: 7239
diff changeset
   243
            return super(bookmark_repo, self).rollback()
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   244
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   245
        def lookup(self, key):
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   246
            if self._bookmarks is None:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   247
                self._bookmarks = parse(self)
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   248
            if key in self._bookmarks:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   249
                key = self._bookmarks[key]
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   250
            return super(bookmark_repo, self).lookup(key)
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   251
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   252
        def commit(self, *k, **kw):
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   253
            """Add a revision to the repository and
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   254
            move the bookmark"""
8862
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   255
            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
   256
            try:
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   257
                node  = super(bookmark_repo, self).commit(*k, **kw)
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   258
                if node is None:
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   259
                    return None
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   260
                parents = repo.changelog.parents(node)
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   261
                if parents[1] == nullid:
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   262
                    parents = (parents[0],)
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   263
                marks = parse(repo)
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   264
                update = False
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   265
                for mark, n in marks.items():
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   266
                    if ui.configbool('bookmarks', 'track.current'):
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   267
                        if mark == current(repo) and n in parents:
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   268
                            marks[mark] = node
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   269
                            update = True
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   270
                    else:
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   271
                        if n in parents:
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   272
                            marks[mark] = node
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   273
                            update = True
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   274
                if update:
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   275
                    write(repo, marks)
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   276
                return node
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   277
            finally:
cd96f159a2d3 bookmarks: add appropriate locking (issue1691)
Matt Mackall <mpm@selenic.com>
parents: 8762
diff changeset
   278
                wlock.release()
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   279
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   280
        def addchangegroup(self, source, srctype, url, emptyok=False):
7316
9737041646bc bookmarks: Use dirstate to determine the current node in addchangegroup
David Soria Parra <dsp@php.net>
parents: 7283
diff changeset
   281
            parents = repo.dirstate.parents()
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   282
7252
104a8324798e bookmarks: Avoid long lines
Joel Rosdahl <joel@rosdahl.net>
parents: 7251
diff changeset
   283
            result = super(bookmark_repo, self).addchangegroup(
104a8324798e bookmarks: Avoid long lines
Joel Rosdahl <joel@rosdahl.net>
parents: 7251
diff changeset
   284
                source, srctype, url, emptyok)
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   285
            if result > 1:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   286
                # We have more heads than before
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   287
                return result
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   288
            node = repo.changelog.tip()
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   289
            marks = parse(repo)
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   290
            update = False
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   291
            for mark, n in marks.items():
7316
9737041646bc bookmarks: Use dirstate to determine the current node in addchangegroup
David Soria Parra <dsp@php.net>
parents: 7283
diff changeset
   292
                if n in parents:
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   293
                    marks[mark] = node
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   294
                    update = True
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   295
            if update:
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   296
                write(repo, marks)
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   297
            return result
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   298
7480
31f70804f1b1 bookmarks: Include bookmarks in tags.
Martin Geisler <mg...@daimi.au.dk>
parents: 7479
diff changeset
   299
        def tags(self):
31f70804f1b1 bookmarks: Include bookmarks in tags.
Martin Geisler <mg...@daimi.au.dk>
parents: 7479
diff changeset
   300
            """Merge bookmarks with normal tags"""
31f70804f1b1 bookmarks: Include bookmarks in tags.
Martin Geisler <mg...@daimi.au.dk>
parents: 7479
diff changeset
   301
            if self.tagscache:
31f70804f1b1 bookmarks: Include bookmarks in tags.
Martin Geisler <mg...@daimi.au.dk>
parents: 7479
diff changeset
   302
                return self.tagscache
31f70804f1b1 bookmarks: Include bookmarks in tags.
Martin Geisler <mg...@daimi.au.dk>
parents: 7479
diff changeset
   303
31f70804f1b1 bookmarks: Include bookmarks in tags.
Martin Geisler <mg...@daimi.au.dk>
parents: 7479
diff changeset
   304
            tagscache = super(bookmark_repo, self).tags()
31f70804f1b1 bookmarks: Include bookmarks in tags.
Martin Geisler <mg...@daimi.au.dk>
parents: 7479
diff changeset
   305
            tagscache.update(parse(repo))
31f70804f1b1 bookmarks: Include bookmarks in tags.
Martin Geisler <mg...@daimi.au.dk>
parents: 7479
diff changeset
   306
            return tagscache
31f70804f1b1 bookmarks: Include bookmarks in tags.
Martin Geisler <mg...@daimi.au.dk>
parents: 7479
diff changeset
   307
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   308
    repo.__class__ = bookmark_repo
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   309
7638
f83a2b1d1a71 bookmarks; clean up imports and function wrapping
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   310
def uisetup(ui):
f83a2b1d1a71 bookmarks; clean up imports and function wrapping
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   311
    extensions.wrapfunction(repair, "strip", strip)
f83a2b1d1a71 bookmarks; clean up imports and function wrapping
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   312
    if ui.configbool('bookmarks', 'track.current'):
f83a2b1d1a71 bookmarks; clean up imports and function wrapping
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   313
        extensions.wrapcommand(commands.table, 'update', updatecurbookmark)
f83a2b1d1a71 bookmarks; clean up imports and function wrapping
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   314
7481
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   315
def updatecurbookmark(orig, ui, repo, *args, **opts):
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   316
    '''Set the current bookmark
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   317
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   318
    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
   319
    file.
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   320
    '''
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   321
    res = orig(ui, repo, *args, **opts)
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   322
    rev = opts['rev']
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   323
    if not rev and len(args) > 0:
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   324
        rev = args[0]
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   325
    setcurrent(repo, rev)
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   326
    return res
5f681a143ede bookmarks: more git-like branches
David Soria Parra <dsp@php.net>
parents: 7480
diff changeset
   327
7239
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   328
cmdtable = {
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   329
    "bookmarks":
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   330
        (bookmark,
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   331
         [('f', 'force', False, _('force')),
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   332
          ('r', 'rev', '', _('revision')),
135003a470f3 Bookmarks: Add the bookmarks extension
David Soria Parra <dsp@php.net>
parents:
diff changeset
   333
          ('d', 'delete', False, _('delete a given bookmark')),
7255
69e431ea124d bookmarks: Rename --move to --rename
Joel Rosdahl <joel@rosdahl.net>
parents: 7254
diff changeset
   334
          ('m', 'rename', '', _('rename a given bookmark'))],
7818
b6b9065c20b3 bookmarks: change NAME to REV
Benoit Allard <benoit@aeteurope.nl>
parents: 7817
diff changeset
   335
         _('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
   336
}