mercurial/bookmarks.py
author Matt Mackall <mpm@selenic.com>
Thu, 10 Feb 2011 13:46:27 -0600
changeset 13350 a7376b92caaa
child 13351 6c5368cd2df9
permissions -rw-r--r--
bookmarks: move basic io to core
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13350
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     1
# Mercurial bookmark support code
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     2
#
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     3
# Copyright 2008 David Soria Parra <dsp@php.net>
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     4
#
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     6
# GNU General Public License version 2 or any later version.
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     7
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     8
from mercurial.i18n import _
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     9
from mercurial.node import nullid, nullrev, bin, hex, short
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    10
from mercurial import encoding
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    11
import os
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    12
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    13
def write(repo):
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    14
    '''Write bookmarks
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    15
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    16
    Write the given bookmark => hash dictionary to the .hg/bookmarks file
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    17
    in a format equal to those of localtags.
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    18
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    19
    We also store a backup of the previous state in undo.bookmarks that
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    20
    can be copied back on rollback.
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    21
    '''
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    22
    refs = repo._bookmarks
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    23
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    24
    try:
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    25
        bms = repo.opener('bookmarks').read()
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    26
    except IOError:
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    27
        bms = ''
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    28
    repo.opener('undo.bookmarks', 'w').write(bms)
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    29
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    30
    if repo._bookmarkcurrent not in refs:
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    31
        setcurrent(repo, None)
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    32
    wlock = repo.wlock()
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    33
    try:
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    34
        file = repo.opener('bookmarks', 'w', atomictemp=True)
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    35
        for refspec, node in refs.iteritems():
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    36
            file.write("%s %s\n" % (hex(node), encoding.fromlocal(refspec)))
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    37
        file.rename()
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    38
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    39
        # touch 00changelog.i so hgweb reloads bookmarks (no lock needed)
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    40
        try:
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    41
            os.utime(repo.sjoin('00changelog.i'), None)
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    42
        except OSError:
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    43
            pass
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    44
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    45
    finally:
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    46
        wlock.release()
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    47
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    48
def setcurrent(repo, mark):
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    49
    '''Set the name of the bookmark that we are currently on
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    50
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    51
    Set the name of the bookmark that we are on (hg update <bookmark>).
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    52
    The name is recorded in .hg/bookmarks.current
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    53
    '''
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    54
    current = repo._bookmarkcurrent
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    55
    if current == mark:
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    56
        return
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    57
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    58
    refs = repo._bookmarks
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    59
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    60
    # do not update if we do update to a rev equal to the current bookmark
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    61
    if (mark and mark not in refs and
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    62
        current and refs[current] == repo.changectx('.').node()):
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    63
        return
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    64
    if mark not in refs:
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    65
        mark = ''
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    66
    wlock = repo.wlock()
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    67
    try:
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    68
        file = repo.opener('bookmarks.current', 'w', atomictemp=True)
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    69
        file.write(mark)
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    70
        file.rename()
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    71
    finally:
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    72
        wlock.release()
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    73
    repo._bookmarkcurrent = mark