mercurial/bookmarks.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Wed, 07 Jun 2017 22:26:43 +0100
changeset 32735 d7522f983f37
parent 32734 b5613bda454e
child 32736 173f1bdc322d
permissions -rw-r--r--
bookmarks: explicitly convert to 'node' during initialization We know the content of the file is supposed to be full hex. So we can do the translation ourselves and directly check if the node is known. As nice side effect we now have proper error handling for invalid node value. Before: ! wall 0.021580 comb 0.020000 user 0.020000 sys 0.000000 (best of 134) After: ! wall 0.009342 comb 0.010000 user 0.010000 sys 0.000000 (best of 302)
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
25917
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
     8
from __future__ import absolute_import
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
     9
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
    10
import errno
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
    11
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
    12
from .i18n import _
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
    13
from .node import (
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
    14
    bin,
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
    15
    hex,
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
    16
)
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
    17
from . import (
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
    18
    encoding,
29354
af849596752c bookmarks: abort 'push -B .' when no active bookmark
liscju <piotr.listkiewicz@gmail.com>
parents: 29300
diff changeset
    19
    error,
25917
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
    20
    lock as lockmod,
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
    21
    obsolete,
31052
0332b8fafd05 bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30634
diff changeset
    22
    txnutil,
25917
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
    23
    util,
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
    24
)
13350
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    25
27186
34d26e22a2b0 bookmarks: hoist getbkfile out of bmstore class
Augie Fackler <augie@google.com>
parents: 27185
diff changeset
    26
def _getbkfile(repo):
34d26e22a2b0 bookmarks: hoist getbkfile out of bmstore class
Augie Fackler <augie@google.com>
parents: 27185
diff changeset
    27
    """Hook so that extensions that mess with the store can hook bm storage.
34d26e22a2b0 bookmarks: hoist getbkfile out of bmstore class
Augie Fackler <augie@google.com>
parents: 27185
diff changeset
    28
34d26e22a2b0 bookmarks: hoist getbkfile out of bmstore class
Augie Fackler <augie@google.com>
parents: 27185
diff changeset
    29
    For core, this just handles wether we should see pending
34d26e22a2b0 bookmarks: hoist getbkfile out of bmstore class
Augie Fackler <augie@google.com>
parents: 27185
diff changeset
    30
    bookmarks or the committed ones. Other extensions (like share)
34d26e22a2b0 bookmarks: hoist getbkfile out of bmstore class
Augie Fackler <augie@google.com>
parents: 27185
diff changeset
    31
    may need to tweak this behavior further.
34d26e22a2b0 bookmarks: hoist getbkfile out of bmstore class
Augie Fackler <augie@google.com>
parents: 27185
diff changeset
    32
    """
31052
0332b8fafd05 bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30634
diff changeset
    33
    fp, pending = txnutil.trypending(repo.root, repo.vfs, 'bookmarks')
0332b8fafd05 bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30634
diff changeset
    34
    return fp
27186
34d26e22a2b0 bookmarks: hoist getbkfile out of bmstore class
Augie Fackler <augie@google.com>
parents: 27185
diff changeset
    35
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    36
class bmstore(dict):
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    37
    """Storage for bookmarks.
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    38
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
    39
    This object should do all bookmark-related reads and writes, so
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
    40
    that it's fairly simple to replace the storage underlying
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
    41
    bookmarks without having to clone the logic surrounding
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
    42
    bookmarks. This type also should manage the active bookmark, if
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
    43
    any.
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    44
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    45
    This particular bmstore implementation stores bookmarks as
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    46
    {hash}\s{name}\n (the same format as localtags) in
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    47
    .hg/bookmarks. The mapping is stored as {name: nodeid}.
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    48
    """
13351
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
    49
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    50
    def __init__(self, repo):
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    51
        dict.__init__(self)
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    52
        self._repo = repo
32735
d7522f983f37 bookmarks: explicitly convert to 'node' during initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32734
diff changeset
    53
        nm = repo.changelog.nodemap
d7522f983f37 bookmarks: explicitly convert to 'node' during initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32734
diff changeset
    54
        tonode = bin # force local lookup
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    55
        try:
27186
34d26e22a2b0 bookmarks: hoist getbkfile out of bmstore class
Augie Fackler <augie@google.com>
parents: 27185
diff changeset
    56
            bkfile = _getbkfile(repo)
23360
e06daad65f85 bookmark: read pending data when appropriate
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23317
diff changeset
    57
            for line in bkfile:
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    58
                line = line.strip()
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    59
                if not line:
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    60
                    continue
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    61
                if ' ' not in line:
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    62
                    repo.ui.warn(_('malformed line in .hg/bookmarks: %r\n')
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    63
                                 % line)
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    64
                    continue
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    65
                sha, refspec = line.split(' ', 1)
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    66
                try:
32735
d7522f983f37 bookmarks: explicitly convert to 'node' during initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32734
diff changeset
    67
                    node = tonode(sha)
d7522f983f37 bookmarks: explicitly convert to 'node' during initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32734
diff changeset
    68
                    if node in nm:
d7522f983f37 bookmarks: explicitly convert to 'node' during initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32734
diff changeset
    69
                        refspec = encoding.tolocal(refspec)
d7522f983f37 bookmarks: explicitly convert to 'node' during initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32734
diff changeset
    70
                        self[refspec] = node
d7522f983f37 bookmarks: explicitly convert to 'node' during initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32734
diff changeset
    71
                except (TypeError, ValueError):
d7522f983f37 bookmarks: explicitly convert to 'node' during initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32734
diff changeset
    72
                    # - bin(...) can raise TypeError
d7522f983f37 bookmarks: explicitly convert to 'node' during initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32734
diff changeset
    73
                    # - node in nm can raise ValueError for non-20-bytes entry
d7522f983f37 bookmarks: explicitly convert to 'node' during initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32734
diff changeset
    74
                    repo.ui.warn(_('malformed line in .hg/bookmarks: %r\n')
d7522f983f37 bookmarks: explicitly convert to 'node' during initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32734
diff changeset
    75
                                 % line)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25569
diff changeset
    76
        except IOError as inst:
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    77
            if inst.errno != errno.ENOENT:
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    78
                raise
27187
d9dcc5c09d77 bmstore: add basic clean-state tracking
Augie Fackler <augie@google.com>
parents: 27186
diff changeset
    79
        self._clean = True
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
    80
        self._active = _readactive(repo, self)
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
    81
        self._aclean = True
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
    82
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
    83
    @property
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
    84
    def active(self):
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
    85
        return self._active
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
    86
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
    87
    @active.setter
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
    88
    def active(self, mark):
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
    89
        if mark is not None and mark not in self:
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
    90
            raise AssertionError('bookmark %s does not exist!' % mark)
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
    91
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
    92
        self._active = mark
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
    93
        self._aclean = False
27187
d9dcc5c09d77 bmstore: add basic clean-state tracking
Augie Fackler <augie@google.com>
parents: 27186
diff changeset
    94
d9dcc5c09d77 bmstore: add basic clean-state tracking
Augie Fackler <augie@google.com>
parents: 27186
diff changeset
    95
    def __setitem__(self, *args, **kwargs):
d9dcc5c09d77 bmstore: add basic clean-state tracking
Augie Fackler <augie@google.com>
parents: 27186
diff changeset
    96
        self._clean = False
d9dcc5c09d77 bmstore: add basic clean-state tracking
Augie Fackler <augie@google.com>
parents: 27186
diff changeset
    97
        return dict.__setitem__(self, *args, **kwargs)
d9dcc5c09d77 bmstore: add basic clean-state tracking
Augie Fackler <augie@google.com>
parents: 27186
diff changeset
    98
d9dcc5c09d77 bmstore: add basic clean-state tracking
Augie Fackler <augie@google.com>
parents: 27186
diff changeset
    99
    def __delitem__(self, key):
d9dcc5c09d77 bmstore: add basic clean-state tracking
Augie Fackler <augie@google.com>
parents: 27186
diff changeset
   100
        self._clean = False
d9dcc5c09d77 bmstore: add basic clean-state tracking
Augie Fackler <augie@google.com>
parents: 27186
diff changeset
   101
        return dict.__delitem__(self, key)
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
   102
22665
8319f7e78395 bookmark: add a `bmstore.recordupdate` to plug bookmarks into the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22664
diff changeset
   103
    def recordchange(self, tr):
8319f7e78395 bookmark: add a `bmstore.recordupdate` to plug bookmarks into the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22664
diff changeset
   104
        """record that bookmarks have been changed in a transaction
8319f7e78395 bookmark: add a `bmstore.recordupdate` to plug bookmarks into the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22664
diff changeset
   105
8319f7e78395 bookmark: add a `bmstore.recordupdate` to plug bookmarks into the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22664
diff changeset
   106
        The transaction is then responsible for updating the file content."""
8319f7e78395 bookmark: add a `bmstore.recordupdate` to plug bookmarks into the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22664
diff changeset
   107
        tr.addfilegenerator('bookmarks', ('bookmarks',), self._write,
23317
197e17be5407 transaction: use 'location' instead of 'vfs' objects for file generation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23199
diff changeset
   108
                            location='plain')
22941
da2758c0aca0 bookmarks: inform transaction-related hooks that some bookmarks were moved
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22667
diff changeset
   109
        tr.hookargs['bookmark_moved'] = '1'
22665
8319f7e78395 bookmark: add a `bmstore.recordupdate` to plug bookmarks into the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22664
diff changeset
   110
23469
65e48b8d20f5 bookmarks: factor out repository lookup from writing bookmarks file
Ryan McElroy <rmcelroy@fb.com>
parents: 23458
diff changeset
   111
    def _writerepo(self, repo):
65e48b8d20f5 bookmarks: factor out repository lookup from writing bookmarks file
Ryan McElroy <rmcelroy@fb.com>
parents: 23458
diff changeset
   112
        """Factored out for extensibility"""
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   113
        rbm = repo._bookmarks
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   114
        if rbm.active not in self:
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   115
            rbm.active = None
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   116
            rbm._writeactive()
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
   117
27799
24b4dbb16c60 with: use context manager for wlock in _writerepo
Bryan O'Sullivan <bryano@fb.com>
parents: 27698
diff changeset
   118
        with repo.wlock():
29300
f92afd23a099 bookmarks: make writing files out avoid ambiguity of file stat
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29084
diff changeset
   119
            file_ = repo.vfs('bookmarks', 'w', atomictemp=True,
f92afd23a099 bookmarks: make writing files out avoid ambiguity of file stat
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29084
diff changeset
   120
                             checkambig=True)
27188
6a1301e22bd7 bmstore: close file in a finally block in _writerepo
Augie Fackler <augie@google.com>
parents: 27187
diff changeset
   121
            try:
6a1301e22bd7 bmstore: close file in a finally block in _writerepo
Augie Fackler <augie@google.com>
parents: 27187
diff changeset
   122
                self._write(file_)
6a1301e22bd7 bmstore: close file in a finally block in _writerepo
Augie Fackler <augie@google.com>
parents: 27187
diff changeset
   123
            except: # re-raises
6a1301e22bd7 bmstore: close file in a finally block in _writerepo
Augie Fackler <augie@google.com>
parents: 27187
diff changeset
   124
                file_.discard()
6a1301e22bd7 bmstore: close file in a finally block in _writerepo
Augie Fackler <augie@google.com>
parents: 27187
diff changeset
   125
                raise
6a1301e22bd7 bmstore: close file in a finally block in _writerepo
Augie Fackler <augie@google.com>
parents: 27187
diff changeset
   126
            finally:
6a1301e22bd7 bmstore: close file in a finally block in _writerepo
Augie Fackler <augie@google.com>
parents: 27187
diff changeset
   127
                file_.close()
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
   128
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   129
    def _writeactive(self):
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   130
        if self._aclean:
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   131
            return
27800
1c5f2c2c046b with: use context manager for wlock in _writeactive
Bryan O'Sullivan <bryano@fb.com>
parents: 27799
diff changeset
   132
        with self._repo.wlock():
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   133
            if self._active is not None:
29300
f92afd23a099 bookmarks: make writing files out avoid ambiguity of file stat
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29084
diff changeset
   134
                f = self._repo.vfs('bookmarks.current', 'w', atomictemp=True,
f92afd23a099 bookmarks: make writing files out avoid ambiguity of file stat
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29084
diff changeset
   135
                                   checkambig=True)
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   136
                try:
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   137
                    f.write(encoding.fromlocal(self._active))
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   138
                finally:
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   139
                    f.close()
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   140
            else:
31544
8a32d6352196 bookmarks: use tryunlink
Ryan McElroy <rmcelroy@fb.com>
parents: 31052
diff changeset
   141
                self._repo.vfs.tryunlink('bookmarks.current')
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   142
        self._aclean = True
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   143
22664
6bd685d2a2de bookmarks: split bookmark serialization and file handling
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22659
diff changeset
   144
    def _write(self, fp):
6bd685d2a2de bookmarks: split bookmark serialization and file handling
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22659
diff changeset
   145
        for name, node in self.iteritems():
6bd685d2a2de bookmarks: split bookmark serialization and file handling
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22659
diff changeset
   146
            fp.write("%s %s\n" % (hex(node), encoding.fromlocal(name)))
27187
d9dcc5c09d77 bmstore: add basic clean-state tracking
Augie Fackler <augie@google.com>
parents: 27186
diff changeset
   147
        self._clean = True
29066
e6f490e32863 bookmarks: properly invalidate volatile sets when writing bookmarks
Augie Fackler <augie@google.com>
parents: 28182
diff changeset
   148
        self._repo.invalidatevolatilesets()
22664
6bd685d2a2de bookmarks: split bookmark serialization and file handling
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22659
diff changeset
   149
28182
e4fe4e903e97 bookmarks: add 'hg push -B .' for pushing the active bookmark (issue4917)
liscju <piotr.listkiewicz@gmail.com>
parents: 27800
diff changeset
   150
    def expandname(self, bname):
e4fe4e903e97 bookmarks: add 'hg push -B .' for pushing the active bookmark (issue4917)
liscju <piotr.listkiewicz@gmail.com>
parents: 27800
diff changeset
   151
        if bname == '.':
29354
af849596752c bookmarks: abort 'push -B .' when no active bookmark
liscju <piotr.listkiewicz@gmail.com>
parents: 29300
diff changeset
   152
            if self.active:
af849596752c bookmarks: abort 'push -B .' when no active bookmark
liscju <piotr.listkiewicz@gmail.com>
parents: 29300
diff changeset
   153
                return self.active
af849596752c bookmarks: abort 'push -B .' when no active bookmark
liscju <piotr.listkiewicz@gmail.com>
parents: 29300
diff changeset
   154
            else:
af849596752c bookmarks: abort 'push -B .' when no active bookmark
liscju <piotr.listkiewicz@gmail.com>
parents: 29300
diff changeset
   155
                raise error.Abort(_("no active bookmark"))
28182
e4fe4e903e97 bookmarks: add 'hg push -B .' for pushing the active bookmark (issue4917)
liscju <piotr.listkiewicz@gmail.com>
parents: 27800
diff changeset
   156
        return bname
e4fe4e903e97 bookmarks: add 'hg push -B .' for pushing the active bookmark (issue4917)
liscju <piotr.listkiewicz@gmail.com>
parents: 27800
diff changeset
   157
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   158
def _readactive(repo, marks):
24946
c44534209a0a bookmarks: rename readcurrent to readactive (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24945
diff changeset
   159
    """
c44534209a0a bookmarks: rename readcurrent to readactive (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24945
diff changeset
   160
    Get the active bookmark. We can have an active bookmark that updates
c44534209a0a bookmarks: rename readcurrent to readactive (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24945
diff changeset
   161
    itself as we commit. This function returns the name of that bookmark.
c44534209a0a bookmarks: rename readcurrent to readactive (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24945
diff changeset
   162
    It is stored in .hg/bookmarks.current
c44534209a0a bookmarks: rename readcurrent to readactive (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24945
diff changeset
   163
    """
13351
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
   164
    mark = None
14027
78ab705a8147 bookmarks: be more restrictive in our Exception catching
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14004
diff changeset
   165
    try:
23877
7cc77030c557 localrepo: remove all external users of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23469
diff changeset
   166
        file = repo.vfs('bookmarks.current')
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25569
diff changeset
   167
    except IOError as inst:
14027
78ab705a8147 bookmarks: be more restrictive in our Exception catching
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14004
diff changeset
   168
        if inst.errno != errno.ENOENT:
78ab705a8147 bookmarks: be more restrictive in our Exception catching
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14004
diff changeset
   169
            raise
78ab705a8147 bookmarks: be more restrictive in our Exception catching
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14004
diff changeset
   170
        return None
78ab705a8147 bookmarks: be more restrictive in our Exception catching
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14004
diff changeset
   171
    try:
27685
9fbae70faf65 bookmarks: make _readactive safe when readlines raises ENOENT
Augie Fackler <augie@google.com>
parents: 27276
diff changeset
   172
        # No readline() in osutil.posixfile, reading everything is
9fbae70faf65 bookmarks: make _readactive safe when readlines raises ENOENT
Augie Fackler <augie@google.com>
parents: 27276
diff changeset
   173
        # cheap.
9fbae70faf65 bookmarks: make _readactive safe when readlines raises ENOENT
Augie Fackler <augie@google.com>
parents: 27276
diff changeset
   174
        # Note that it's possible for readlines() here to raise
9fbae70faf65 bookmarks: make _readactive safe when readlines raises ENOENT
Augie Fackler <augie@google.com>
parents: 27276
diff changeset
   175
        # IOError, since we might be reading the active mark over
9fbae70faf65 bookmarks: make _readactive safe when readlines raises ENOENT
Augie Fackler <augie@google.com>
parents: 27276
diff changeset
   176
        # static-http which only tries to load the file when we try
9fbae70faf65 bookmarks: make _readactive safe when readlines raises ENOENT
Augie Fackler <augie@google.com>
parents: 27276
diff changeset
   177
        # to read from it.
13381
d073468e3c5f bookmarks: read current bookmark as utf-8 and convert it to local
David Soria Parra <dsp@php.net>
parents: 13354
diff changeset
   178
        mark = encoding.tolocal((file.readlines() or [''])[0])
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   179
        if mark == '' or mark not in marks:
13351
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
   180
            mark = None
27685
9fbae70faf65 bookmarks: make _readactive safe when readlines raises ENOENT
Augie Fackler <augie@google.com>
parents: 27276
diff changeset
   181
    except IOError as inst:
9fbae70faf65 bookmarks: make _readactive safe when readlines raises ENOENT
Augie Fackler <augie@google.com>
parents: 27276
diff changeset
   182
        if inst.errno != errno.ENOENT:
9fbae70faf65 bookmarks: make _readactive safe when readlines raises ENOENT
Augie Fackler <augie@google.com>
parents: 27276
diff changeset
   183
            raise
9fbae70faf65 bookmarks: make _readactive safe when readlines raises ENOENT
Augie Fackler <augie@google.com>
parents: 27276
diff changeset
   184
        return None
14027
78ab705a8147 bookmarks: be more restrictive in our Exception catching
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14004
diff changeset
   185
    finally:
13351
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
   186
        file.close()
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
   187
    return mark
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
   188
24945
e0b0fbd47491 bookmarks: rename setcurrent to activate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24944
diff changeset
   189
def activate(repo, mark):
e0b0fbd47491 bookmarks: rename setcurrent to activate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24944
diff changeset
   190
    """
e0b0fbd47491 bookmarks: rename setcurrent to activate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24944
diff changeset
   191
    Set the given bookmark to be 'active', meaning that this bookmark will
e0b0fbd47491 bookmarks: rename setcurrent to activate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24944
diff changeset
   192
    follow new commits that are made.
13350
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   193
    The name is recorded in .hg/bookmarks.current
24945
e0b0fbd47491 bookmarks: rename setcurrent to activate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24944
diff changeset
   194
    """
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   195
    repo._bookmarks.active = mark
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   196
    repo._bookmarks._writeactive()
13352
f9cd37fca5ba bookmarks: move update into core
Matt Mackall <mpm@selenic.com>
parents: 13351
diff changeset
   197
24944
08ec11e3ae4c bookmarks: rename unsetcurrent to deactivate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24832
diff changeset
   198
def deactivate(repo):
08ec11e3ae4c bookmarks: rename unsetcurrent to deactivate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24832
diff changeset
   199
    """
26781
1aee2ab0f902 spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents: 26520
diff changeset
   200
    Unset the active bookmark in this repository.
24944
08ec11e3ae4c bookmarks: rename unsetcurrent to deactivate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24832
diff changeset
   201
    """
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   202
    repo._bookmarks.active = None
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   203
    repo._bookmarks._writeactive()
16191
7c75924a6926 update: delete bookmarks.current when explicitly updating to a rev (issue3276)
Idan Kamara <idankk86@gmail.com>
parents: 15984
diff changeset
   204
24986
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
   205
def isactivewdirparent(repo):
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
   206
    """
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
   207
    Tell whether the 'active' bookmark (the one that follows new commits)
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
   208
    points to one of the parents of the current working directory (wdir).
18471
2096e025a728 update: update to current bookmark if it moved out from under us (issue3682)
Kevin Bullock <kbullock@ringworld.org>
parents: 18363
diff changeset
   209
24986
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
   210
    While this is normally the case, it can on occasion be false; for example,
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
   211
    immediately after a pull, the active bookmark can be moved to point
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
   212
    to a place different than the wdir. This is solved by running `hg update`.
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
   213
    """
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
   214
    mark = repo._activebookmark
18471
2096e025a728 update: update to current bookmark if it moved out from under us (issue3682)
Kevin Bullock <kbullock@ringworld.org>
parents: 18363
diff changeset
   215
    marks = repo._bookmarks
24986
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
   216
    parents = [p.node() for p in repo[None].parents()]
18471
2096e025a728 update: update to current bookmark if it moved out from under us (issue3682)
Kevin Bullock <kbullock@ringworld.org>
parents: 18363
diff changeset
   217
    return (mark in marks and marks[mark] in parents)
2096e025a728 update: update to current bookmark if it moved out from under us (issue3682)
Kevin Bullock <kbullock@ringworld.org>
parents: 18363
diff changeset
   218
18513
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   219
def deletedivergent(repo, deletefrom, bm):
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   220
    '''Delete divergent versions of bm on nodes in deletefrom.
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   221
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   222
    Return True if at least one bookmark was deleted, False otherwise.'''
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   223
    deleted = False
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   224
    marks = repo._bookmarks
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   225
    divergent = [b for b in marks if b.split('@', 1)[0] == bm.split('@', 1)[0]]
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   226
    for mark in divergent:
21843
92666a869ea4 bookmarks: avoid deleting primary bookmarks on rebase
Matt Mackall <mpm@selenic.com>
parents: 20352
diff changeset
   227
        if mark == '@' or '@' not in mark:
92666a869ea4 bookmarks: avoid deleting primary bookmarks on rebase
Matt Mackall <mpm@selenic.com>
parents: 20352
diff changeset
   228
            # can't be divergent by definition
92666a869ea4 bookmarks: avoid deleting primary bookmarks on rebase
Matt Mackall <mpm@selenic.com>
parents: 20352
diff changeset
   229
            continue
18513
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   230
        if mark and marks[mark] in deletefrom:
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   231
            if mark != bm:
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   232
                del marks[mark]
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   233
                deleted = True
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   234
    return deleted
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   235
32381
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   236
def headsforactive(repo):
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   237
    """Given a repo with an active bookmark, return divergent bookmark nodes.
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   238
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   239
    Args:
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   240
      repo: A repository with an active bookmark.
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   241
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   242
    Returns:
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   243
      A list of binary node ids that is the full list of other
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   244
      revisions with bookmarks divergent from the active bookmark. If
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   245
      there were no divergent bookmarks, then this list will contain
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   246
      only one entry.
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   247
    """
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   248
    if not repo._activebookmark:
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   249
        raise ValueError(
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   250
            'headsforactive() only makes sense with an active bookmark')
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   251
    name = repo._activebookmark.split('@', 1)[0]
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   252
    heads = []
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   253
    for mark, n in repo._bookmarks.iteritems():
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   254
        if mark.split('@', 1)[0] == name:
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   255
            heads.append(n)
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   256
    return heads
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   257
19523
f37b5a17e6a0 bookmarks: pull --update updates to active bookmark if it moved (issue4007)
Kevin Bullock <kbullock@ringworld.org>
parents: 19110
diff changeset
   258
def calculateupdate(ui, repo, checkout):
f37b5a17e6a0 bookmarks: pull --update updates to active bookmark if it moved (issue4007)
Kevin Bullock <kbullock@ringworld.org>
parents: 19110
diff changeset
   259
    '''Return a tuple (targetrev, movemarkfrom) indicating the rev to
f37b5a17e6a0 bookmarks: pull --update updates to active bookmark if it moved (issue4007)
Kevin Bullock <kbullock@ringworld.org>
parents: 19110
diff changeset
   260
    check out and where to move the active bookmark from, if needed.'''
f37b5a17e6a0 bookmarks: pull --update updates to active bookmark if it moved (issue4007)
Kevin Bullock <kbullock@ringworld.org>
parents: 19110
diff changeset
   261
    movemarkfrom = None
f37b5a17e6a0 bookmarks: pull --update updates to active bookmark if it moved (issue4007)
Kevin Bullock <kbullock@ringworld.org>
parents: 19110
diff changeset
   262
    if checkout is None:
25100
d6e7ac651973 bookmarks: rename current to active in variables and comments
Ryan McElroy <rmcelroy@fb.com>
parents: 25081
diff changeset
   263
        activemark = repo._activebookmark
24986
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
   264
        if isactivewdirparent(repo):
19523
f37b5a17e6a0 bookmarks: pull --update updates to active bookmark if it moved (issue4007)
Kevin Bullock <kbullock@ringworld.org>
parents: 19110
diff changeset
   265
            movemarkfrom = repo['.'].node()
25100
d6e7ac651973 bookmarks: rename current to active in variables and comments
Ryan McElroy <rmcelroy@fb.com>
parents: 25081
diff changeset
   266
        elif activemark:
d6e7ac651973 bookmarks: rename current to active in variables and comments
Ryan McElroy <rmcelroy@fb.com>
parents: 25081
diff changeset
   267
            ui.status(_("updating to active bookmark %s\n") % activemark)
d6e7ac651973 bookmarks: rename current to active in variables and comments
Ryan McElroy <rmcelroy@fb.com>
parents: 25081
diff changeset
   268
            checkout = activemark
19523
f37b5a17e6a0 bookmarks: pull --update updates to active bookmark if it moved (issue4007)
Kevin Bullock <kbullock@ringworld.org>
parents: 19110
diff changeset
   269
    return (checkout, movemarkfrom)
f37b5a17e6a0 bookmarks: pull --update updates to active bookmark if it moved (issue4007)
Kevin Bullock <kbullock@ringworld.org>
parents: 19110
diff changeset
   270
13352
f9cd37fca5ba bookmarks: move update into core
Matt Mackall <mpm@selenic.com>
parents: 13351
diff changeset
   271
def update(repo, parents, node):
19110
741d94aa92e4 bookmarks: resolve divergent bookmarks when moving active bookmark forward
Sean Farley <sean.michael.farley@gmail.com>
parents: 18984
diff changeset
   272
    deletefrom = parents
13352
f9cd37fca5ba bookmarks: move update into core
Matt Mackall <mpm@selenic.com>
parents: 13351
diff changeset
   273
    marks = repo._bookmarks
f9cd37fca5ba bookmarks: move update into core
Matt Mackall <mpm@selenic.com>
parents: 13351
diff changeset
   274
    update = False
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   275
    active = marks.active
25100
d6e7ac651973 bookmarks: rename current to active in variables and comments
Ryan McElroy <rmcelroy@fb.com>
parents: 25081
diff changeset
   276
    if not active:
16706
a270ec977ba6 bookmarks: delete divergent bookmarks on merge
David Soria Parra <dsp@php.net>
parents: 16697
diff changeset
   277
        return False
a270ec977ba6 bookmarks: delete divergent bookmarks on merge
David Soria Parra <dsp@php.net>
parents: 16697
diff changeset
   278
25100
d6e7ac651973 bookmarks: rename current to active in variables and comments
Ryan McElroy <rmcelroy@fb.com>
parents: 25081
diff changeset
   279
    if marks[active] in parents:
18513
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   280
        new = repo[node]
19110
741d94aa92e4 bookmarks: resolve divergent bookmarks when moving active bookmark forward
Sean Farley <sean.michael.farley@gmail.com>
parents: 18984
diff changeset
   281
        divs = [repo[b] for b in marks
25100
d6e7ac651973 bookmarks: rename current to active in variables and comments
Ryan McElroy <rmcelroy@fb.com>
parents: 25081
diff changeset
   282
                if b.split('@', 1)[0] == active.split('@', 1)[0]]
19110
741d94aa92e4 bookmarks: resolve divergent bookmarks when moving active bookmark forward
Sean Farley <sean.michael.farley@gmail.com>
parents: 18984
diff changeset
   283
        anc = repo.changelog.ancestors([new.rev()])
741d94aa92e4 bookmarks: resolve divergent bookmarks when moving active bookmark forward
Sean Farley <sean.michael.farley@gmail.com>
parents: 18984
diff changeset
   284
        deletefrom = [b.node() for b in divs if b.rev() in anc or b == new]
25100
d6e7ac651973 bookmarks: rename current to active in variables and comments
Ryan McElroy <rmcelroy@fb.com>
parents: 25081
diff changeset
   285
        if validdest(repo, repo[marks[active]], new):
d6e7ac651973 bookmarks: rename current to active in variables and comments
Ryan McElroy <rmcelroy@fb.com>
parents: 25081
diff changeset
   286
            marks[active] = new.node()
18513
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   287
            update = True
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   288
25100
d6e7ac651973 bookmarks: rename current to active in variables and comments
Ryan McElroy <rmcelroy@fb.com>
parents: 25081
diff changeset
   289
    if deletedivergent(repo, deletefrom, active):
18513
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   290
        update = True
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   291
13352
f9cd37fca5ba bookmarks: move update into core
Matt Mackall <mpm@selenic.com>
parents: 13351
diff changeset
   292
    if update:
26999
2d79a354d843 bookmarks: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26781
diff changeset
   293
        lock = tr = None
2d79a354d843 bookmarks: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26781
diff changeset
   294
        try:
2d79a354d843 bookmarks: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26781
diff changeset
   295
            lock = repo.lock()
2d79a354d843 bookmarks: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26781
diff changeset
   296
            tr = repo.transaction('bookmark')
2d79a354d843 bookmarks: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26781
diff changeset
   297
            marks.recordchange(tr)
2d79a354d843 bookmarks: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26781
diff changeset
   298
            tr.close()
2d79a354d843 bookmarks: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26781
diff changeset
   299
        finally:
2d79a354d843 bookmarks: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26781
diff changeset
   300
            lockmod.release(tr, lock)
15621
013688350c7d bookmarks: update and updatecurrentbookmark return status
Kevin Bullock <kbullock@ringworld.org>
parents: 15614
diff changeset
   301
    return update
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   302
30481
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   303
def listbinbookmarks(repo):
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   304
    # We may try to list bookmarks on a repo type that does not
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   305
    # support it (e.g., statichttprepository).
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   306
    marks = getattr(repo, '_bookmarks', {})
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   307
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   308
    hasnode = repo.changelog.hasnode
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   309
    for k, v in marks.iteritems():
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   310
        # don't expose local divergent bookmarks
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   311
        if hasnode(v) and ('@' not in k or k.endswith('@')):
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   312
            yield k, v
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   313
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   314
def listbookmarks(repo):
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   315
    d = {}
30482
55ec13c82ea0 bookmarks: use listbinbookmarks() in listbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 30481
diff changeset
   316
    for book, node in listbinbookmarks(repo):
55ec13c82ea0 bookmarks: use listbinbookmarks() in listbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 30481
diff changeset
   317
        d[book] = hex(node)
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   318
    return d
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   319
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   320
def pushbookmark(repo, key, old, new):
22667
3acc3f95548c push: update bookmarks (on server) within a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22666
diff changeset
   321
    w = l = tr = None
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   322
    try:
22667
3acc3f95548c push: update bookmarks (on server) within a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22666
diff changeset
   323
        w = repo.wlock()
3acc3f95548c push: update bookmarks (on server) within a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22666
diff changeset
   324
        l = repo.lock()
3acc3f95548c push: update bookmarks (on server) within a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22666
diff changeset
   325
        tr = repo.transaction('bookmarks')
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   326
        marks = repo._bookmarks
22364
5c153c69fdb2 bookmarks: allow pushkey if new equals current
Durham Goode <durham@fb.com>
parents: 21843
diff changeset
   327
        existing = hex(marks.get(key, ''))
5c153c69fdb2 bookmarks: allow pushkey if new equals current
Durham Goode <durham@fb.com>
parents: 21843
diff changeset
   328
        if existing != old and existing != new:
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   329
            return False
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   330
        if new == '':
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   331
            del marks[key]
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   332
        else:
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   333
            if new not in repo:
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   334
                return False
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   335
            marks[key] = repo[new].node()
22667
3acc3f95548c push: update bookmarks (on server) within a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22666
diff changeset
   336
        marks.recordchange(tr)
3acc3f95548c push: update bookmarks (on server) within a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22666
diff changeset
   337
        tr.close()
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   338
        return True
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   339
    finally:
22667
3acc3f95548c push: update bookmarks (on server) within a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22666
diff changeset
   340
        lockmod.release(tr, l, w)
13354
4e1ba6ead69c bookmarks: move diff to core
Matt Mackall <mpm@selenic.com>
parents: 13353
diff changeset
   341
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   342
def comparebookmarks(repo, srcmarks, dstmarks, targets=None):
20024
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   343
    '''Compare bookmarks between srcmarks and dstmarks
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   344
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   345
    This returns tuple "(addsrc, adddst, advsrc, advdst, diverge,
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   346
    differ, invalid)", each are list of bookmarks below:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   347
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   348
    :addsrc:  added on src side (removed on dst side, perhaps)
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   349
    :adddst:  added on dst side (removed on src side, perhaps)
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   350
    :advsrc:  advanced on src side
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   351
    :advdst:  advanced on dst side
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   352
    :diverge: diverge
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   353
    :differ:  changed, but changeset referred on src is unknown on dst
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   354
    :invalid: unknown on both side
23081
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
   355
    :same:    same on both side
20024
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   356
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   357
    Each elements of lists in result tuple is tuple "(bookmark name,
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   358
    changeset ID on source side, changeset ID on destination
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   359
    side)". Each changeset IDs are 40 hexadecimal digit string or
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   360
    None.
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   361
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   362
    Changeset IDs of tuples in "addsrc", "adddst", "differ" or
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   363
     "invalid" list may be unknown for repo.
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   364
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   365
    If "targets" is specified, only bookmarks listed in it are
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   366
    examined.
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   367
    '''
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   368
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   369
    if targets:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   370
        bset = set(targets)
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   371
    else:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   372
        srcmarkset = set(srcmarks)
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   373
        dstmarkset = set(dstmarks)
23081
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
   374
        bset = srcmarkset | dstmarkset
20024
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   375
23081
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
   376
    results = ([], [], [], [], [], [], [], [])
20024
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   377
    addsrc = results[0].append
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   378
    adddst = results[1].append
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   379
    advsrc = results[2].append
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   380
    advdst = results[3].append
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   381
    diverge = results[4].append
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   382
    differ = results[5].append
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   383
    invalid = results[6].append
23081
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
   384
    same = results[7].append
20024
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   385
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   386
    for b in sorted(bset):
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   387
        if b not in srcmarks:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   388
            if b in dstmarks:
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   389
                adddst((b, None, dstmarks[b]))
20024
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   390
            else:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   391
                invalid((b, None, None))
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   392
        elif b not in dstmarks:
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   393
            addsrc((b, srcmarks[b], None))
20024
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   394
        else:
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   395
            scid = srcmarks[b]
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   396
            dcid = dstmarks[b]
23081
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
   397
            if scid == dcid:
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
   398
                same((b, scid, dcid))
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
   399
            elif scid in repo and dcid in repo:
20024
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   400
                sctx = repo[scid]
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   401
                dctx = repo[dcid]
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   402
                if sctx.rev() < dctx.rev():
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   403
                    if validdest(repo, sctx, dctx):
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   404
                        advdst((b, scid, dcid))
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   405
                    else:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   406
                        diverge((b, scid, dcid))
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   407
                else:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   408
                    if validdest(repo, dctx, sctx):
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   409
                        advsrc((b, scid, dcid))
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   410
                    else:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   411
                        diverge((b, scid, dcid))
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   412
            else:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   413
                # it is too expensive to examine in detail, in this case
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   414
                differ((b, scid, dcid))
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   415
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   416
    return results
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   417
24355
ca4b89683078 bookmarks: reuse @number bookmark, if it refers changeset referred remotely
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24354
diff changeset
   418
def _diverge(ui, b, path, localmarks, remotenode):
24353
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
   419
    '''Return appropriate diverged bookmark for specified ``path``
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
   420
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
   421
    This returns None, if it is failed to assign any divergent
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
   422
    bookmark name.
24355
ca4b89683078 bookmarks: reuse @number bookmark, if it refers changeset referred remotely
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24354
diff changeset
   423
ca4b89683078 bookmarks: reuse @number bookmark, if it refers changeset referred remotely
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24354
diff changeset
   424
    This reuses already existing one with "@number" suffix, if it
ca4b89683078 bookmarks: reuse @number bookmark, if it refers changeset referred remotely
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24354
diff changeset
   425
    refers ``remotenode``.
24353
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
   426
    '''
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   427
    if b == '@':
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   428
        b = ''
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   429
    # try to use an @pathalias suffix
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   430
    # if an @pathalias already exists, we overwrite (update) it
22629
b3f74b405c20 bookmarks: fix divergent bookmark path normalization
Matt Mackall <mpm@selenic.com>
parents: 22627
diff changeset
   431
    if path.startswith("file:"):
b3f74b405c20 bookmarks: fix divergent bookmark path normalization
Matt Mackall <mpm@selenic.com>
parents: 22627
diff changeset
   432
        path = util.url(path).path
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   433
    for p, u in ui.configitems("paths"):
22629
b3f74b405c20 bookmarks: fix divergent bookmark path normalization
Matt Mackall <mpm@selenic.com>
parents: 22627
diff changeset
   434
        if u.startswith("file:"):
b3f74b405c20 bookmarks: fix divergent bookmark path normalization
Matt Mackall <mpm@selenic.com>
parents: 22627
diff changeset
   435
            u = util.url(u).path
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   436
        if path == u:
24354
194e1e3ebc29 bookmarks: check @pathalias suffix before available @number for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24353
diff changeset
   437
            return '%s@%s' % (b, p)
194e1e3ebc29 bookmarks: check @pathalias suffix before available @number for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24353
diff changeset
   438
194e1e3ebc29 bookmarks: check @pathalias suffix before available @number for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24353
diff changeset
   439
    # assign a unique "@number" suffix newly
194e1e3ebc29 bookmarks: check @pathalias suffix before available @number for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24353
diff changeset
   440
    for x in range(1, 100):
194e1e3ebc29 bookmarks: check @pathalias suffix before available @number for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24353
diff changeset
   441
        n = '%s@%d' % (b, x)
24355
ca4b89683078 bookmarks: reuse @number bookmark, if it refers changeset referred remotely
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24354
diff changeset
   442
        if n not in localmarks or localmarks[n] == remotenode:
24354
194e1e3ebc29 bookmarks: check @pathalias suffix before available @number for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24353
diff changeset
   443
            return n
194e1e3ebc29 bookmarks: check @pathalias suffix before available @number for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24353
diff changeset
   444
194e1e3ebc29 bookmarks: check @pathalias suffix before available @number for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24353
diff changeset
   445
    return None
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   446
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   447
def unhexlifybookmarks(marks):
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   448
    binremotemarks = {}
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   449
    for name, node in marks.items():
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   450
        binremotemarks[name] = bin(node)
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   451
    return binremotemarks
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   452
22666
0f8120c1ecf5 pull: perform bookmark updates in the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22665
diff changeset
   453
def updatefromremote(ui, repo, remotemarks, path, trfunc, explicit=()):
13646
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
   454
    ui.debug("checking for updated bookmarks\n")
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
   455
    localmarks = repo._bookmarks
23081
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
   456
    (addsrc, adddst, advsrc, advdst, diverge, differ, invalid, same
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   457
    ) = comparebookmarks(repo, remotemarks, localmarks)
15614
260a6449d83a bookmarks: mark divergent bookmarks with book@pathalias when source in [paths]
Matt Mackall <mpm@selenic.com>
parents: 15613
diff changeset
   458
22644
1ec7cdaf898f bookmarks: allow `updatefromremote` to be quiet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22629
diff changeset
   459
    status = ui.status
1ec7cdaf898f bookmarks: allow `updatefromremote` to be quiet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22629
diff changeset
   460
    warn = ui.warn
1ec7cdaf898f bookmarks: allow `updatefromremote` to be quiet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22629
diff changeset
   461
    if ui.configbool('ui', 'quietbookmarkmove', False):
1ec7cdaf898f bookmarks: allow `updatefromremote` to be quiet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22629
diff changeset
   462
        status = warn = ui.debug
1ec7cdaf898f bookmarks: allow `updatefromremote` to be quiet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22629
diff changeset
   463
22659
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
   464
    explicit = set(explicit)
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   465
    changed = []
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   466
    for b, scid, dcid in addsrc:
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   467
        if scid in repo: # add remote bookmarks for changes we already have
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   468
            changed.append((b, scid, status,
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   469
                            _("adding remote bookmark %s\n") % (b)))
25564
847fce27effc bookmark: informs of failure to upgrade a bookmark
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25100
diff changeset
   470
        elif b in explicit:
847fce27effc bookmark: informs of failure to upgrade a bookmark
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25100
diff changeset
   471
            explicit.remove(b)
847fce27effc bookmark: informs of failure to upgrade a bookmark
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25100
diff changeset
   472
            ui.warn(_("remote bookmark %s points to locally missing %s\n")
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   473
                    % (b, hex(scid)[:12]))
25564
847fce27effc bookmark: informs of failure to upgrade a bookmark
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25100
diff changeset
   474
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   475
    for b, scid, dcid in advsrc:
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   476
        changed.append((b, scid, status,
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   477
                        _("updating bookmark %s\n") % (b)))
22659
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
   478
    # remove normal movement from explicit set
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
   479
    explicit.difference_update(d[0] for d in changed)
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
   480
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   481
    for b, scid, dcid in diverge:
22659
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
   482
        if b in explicit:
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
   483
            explicit.discard(b)
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   484
            changed.append((b, scid, status,
23199
c35ffa4249ca bookmarks: fix formatting of exchange message (issue4439)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23081
diff changeset
   485
                            _("importing bookmark %s\n") % (b)))
22659
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
   486
        else:
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   487
            db = _diverge(ui, b, path, localmarks, scid)
24353
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
   488
            if db:
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   489
                changed.append((db, scid, warn,
24353
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
   490
                                _("divergent bookmark %s stored as %s\n") %
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
   491
                                (b, db)))
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
   492
            else:
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
   493
                warn(_("warning: failed to assign numbered name "
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
   494
                       "to divergent bookmark %s\n") % (b))
22659
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
   495
    for b, scid, dcid in adddst + advdst:
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
   496
        if b in explicit:
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
   497
            explicit.discard(b)
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   498
            changed.append((b, scid, status,
23199
c35ffa4249ca bookmarks: fix formatting of exchange message (issue4439)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23081
diff changeset
   499
                            _("importing bookmark %s\n") % (b)))
25564
847fce27effc bookmark: informs of failure to upgrade a bookmark
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25100
diff changeset
   500
    for b, scid, dcid in differ:
847fce27effc bookmark: informs of failure to upgrade a bookmark
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25100
diff changeset
   501
        if b in explicit:
847fce27effc bookmark: informs of failure to upgrade a bookmark
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25100
diff changeset
   502
            explicit.remove(b)
847fce27effc bookmark: informs of failure to upgrade a bookmark
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25100
diff changeset
   503
            ui.warn(_("remote bookmark %s points to locally missing %s\n")
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   504
                    % (b, hex(scid)[:12]))
22659
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
   505
13646
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
   506
    if changed:
22666
0f8120c1ecf5 pull: perform bookmark updates in the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22665
diff changeset
   507
        tr = trfunc()
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   508
        for b, node, writer, msg in sorted(changed):
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   509
            localmarks[b] = node
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   510
            writer(msg)
22666
0f8120c1ecf5 pull: perform bookmark updates in the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22665
diff changeset
   511
        localmarks.recordchange(tr)
13646
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
   512
24397
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   513
def incoming(ui, repo, other):
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   514
    '''Show bookmarks incoming from other to repo
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   515
    '''
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   516
    ui.status(_("searching for changed bookmarks\n"))
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   517
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   518
    remotemarks = unhexlifybookmarks(other.listkeys('bookmarks'))
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   519
    r = comparebookmarks(repo, remotemarks, repo._bookmarks)
24397
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   520
    addsrc, adddst, advsrc, advdst, diverge, differ, invalid, same = r
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   521
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   522
    incomings = []
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   523
    if ui.debugflag:
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   524
        getid = lambda id: id
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   525
    else:
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   526
        getid = lambda id: id[:12]
24660
bf13b44bbb0a bookmarks: show detailed status about incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24658
diff changeset
   527
    if ui.verbose:
bf13b44bbb0a bookmarks: show detailed status about incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24658
diff changeset
   528
        def add(b, id, st):
bf13b44bbb0a bookmarks: show detailed status about incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24658
diff changeset
   529
            incomings.append("   %-25s %s %s\n" % (b, getid(id), st))
bf13b44bbb0a bookmarks: show detailed status about incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24658
diff changeset
   530
    else:
bf13b44bbb0a bookmarks: show detailed status about incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24658
diff changeset
   531
        def add(b, id, st):
bf13b44bbb0a bookmarks: show detailed status about incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24658
diff changeset
   532
            incomings.append("   %-25s %s\n" % (b, getid(id)))
24397
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   533
    for b, scid, dcid in addsrc:
24832
5947a68fa271 bookmarks: add i18n hints to bookmark sync states
Wagner Bruna <wbruna@yahoo.com>
parents: 24661
diff changeset
   534
        # i18n: "added" refers to a bookmark
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   535
        add(b, hex(scid), _('added'))
24657
3d7c512b258d bookmarks: show incoming bookmarks more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24400
diff changeset
   536
    for b, scid, dcid in advsrc:
24832
5947a68fa271 bookmarks: add i18n hints to bookmark sync states
Wagner Bruna <wbruna@yahoo.com>
parents: 24661
diff changeset
   537
        # i18n: "advanced" refers to a bookmark
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   538
        add(b, hex(scid), _('advanced'))
24657
3d7c512b258d bookmarks: show incoming bookmarks more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24400
diff changeset
   539
    for b, scid, dcid in diverge:
24832
5947a68fa271 bookmarks: add i18n hints to bookmark sync states
Wagner Bruna <wbruna@yahoo.com>
parents: 24661
diff changeset
   540
        # i18n: "diverged" refers to a bookmark
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   541
        add(b, hex(scid), _('diverged'))
24657
3d7c512b258d bookmarks: show incoming bookmarks more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24400
diff changeset
   542
    for b, scid, dcid in differ:
24832
5947a68fa271 bookmarks: add i18n hints to bookmark sync states
Wagner Bruna <wbruna@yahoo.com>
parents: 24661
diff changeset
   543
        # i18n: "changed" refers to a bookmark
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   544
        add(b, hex(scid), _('changed'))
24397
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   545
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   546
    if not incomings:
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   547
        ui.status(_("no changed bookmarks found\n"))
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   548
        return 1
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   549
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   550
    for s in sorted(incomings):
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   551
        ui.write(s)
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   552
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   553
    return 0
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   554
24398
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   555
def outgoing(ui, repo, other):
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   556
    '''Show bookmarks outgoing from repo to other
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   557
    '''
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   558
    ui.status(_("searching for changed bookmarks\n"))
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   559
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   560
    remotemarks = unhexlifybookmarks(other.listkeys('bookmarks'))
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   561
    r = comparebookmarks(repo, repo._bookmarks, remotemarks)
24398
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   562
    addsrc, adddst, advsrc, advdst, diverge, differ, invalid, same = r
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   563
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   564
    outgoings = []
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   565
    if ui.debugflag:
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   566
        getid = lambda id: id
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   567
    else:
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   568
        getid = lambda id: id[:12]
24661
8cf70c97a6e1 bookmarks: show detailed status about outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24660
diff changeset
   569
    if ui.verbose:
8cf70c97a6e1 bookmarks: show detailed status about outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24660
diff changeset
   570
        def add(b, id, st):
8cf70c97a6e1 bookmarks: show detailed status about outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24660
diff changeset
   571
            outgoings.append("   %-25s %s %s\n" % (b, getid(id), st))
8cf70c97a6e1 bookmarks: show detailed status about outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24660
diff changeset
   572
    else:
8cf70c97a6e1 bookmarks: show detailed status about outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24660
diff changeset
   573
        def add(b, id, st):
8cf70c97a6e1 bookmarks: show detailed status about outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24660
diff changeset
   574
            outgoings.append("   %-25s %s\n" % (b, getid(id)))
24398
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   575
    for b, scid, dcid in addsrc:
24832
5947a68fa271 bookmarks: add i18n hints to bookmark sync states
Wagner Bruna <wbruna@yahoo.com>
parents: 24661
diff changeset
   576
        # i18n: "added refers to a bookmark
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   577
        add(b, hex(scid), _('added'))
24658
8ea893ab0572 bookmarks: show outgoing bookmarks more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24657
diff changeset
   578
    for b, scid, dcid in adddst:
24832
5947a68fa271 bookmarks: add i18n hints to bookmark sync states
Wagner Bruna <wbruna@yahoo.com>
parents: 24661
diff changeset
   579
        # i18n: "deleted" refers to a bookmark
24661
8cf70c97a6e1 bookmarks: show detailed status about outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24660
diff changeset
   580
        add(b, ' ' * 40, _('deleted'))
24658
8ea893ab0572 bookmarks: show outgoing bookmarks more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24657
diff changeset
   581
    for b, scid, dcid in advsrc:
24832
5947a68fa271 bookmarks: add i18n hints to bookmark sync states
Wagner Bruna <wbruna@yahoo.com>
parents: 24661
diff changeset
   582
        # i18n: "advanced" refers to a bookmark
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   583
        add(b, hex(scid), _('advanced'))
24658
8ea893ab0572 bookmarks: show outgoing bookmarks more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24657
diff changeset
   584
    for b, scid, dcid in diverge:
24832
5947a68fa271 bookmarks: add i18n hints to bookmark sync states
Wagner Bruna <wbruna@yahoo.com>
parents: 24661
diff changeset
   585
        # i18n: "diverged" refers to a bookmark
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   586
        add(b, hex(scid), _('diverged'))
24658
8ea893ab0572 bookmarks: show outgoing bookmarks more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24657
diff changeset
   587
    for b, scid, dcid in differ:
24832
5947a68fa271 bookmarks: add i18n hints to bookmark sync states
Wagner Bruna <wbruna@yahoo.com>
parents: 24661
diff changeset
   588
        # i18n: "changed" refers to a bookmark
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   589
        add(b, hex(scid), _('changed'))
24398
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   590
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   591
    if not outgoings:
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   592
        ui.status(_("no changed bookmarks found\n"))
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   593
        return 1
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   594
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   595
    for s in sorted(outgoings):
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   596
        ui.write(s)
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   597
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   598
    return 0
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   599
24400
03c84c966ef5 bookmarks: rewrite comparing bookmarks in commands.summary() by compare()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24399
diff changeset
   600
def summary(repo, other):
03c84c966ef5 bookmarks: rewrite comparing bookmarks in commands.summary() by compare()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24399
diff changeset
   601
    '''Compare bookmarks between repo and other for "hg summary" output
03c84c966ef5 bookmarks: rewrite comparing bookmarks in commands.summary() by compare()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24399
diff changeset
   602
03c84c966ef5 bookmarks: rewrite comparing bookmarks in commands.summary() by compare()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24399
diff changeset
   603
    This returns "(# of incoming, # of outgoing)" tuple.
03c84c966ef5 bookmarks: rewrite comparing bookmarks in commands.summary() by compare()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24399
diff changeset
   604
    '''
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   605
    remotemarks = unhexlifybookmarks(other.listkeys('bookmarks'))
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   606
    r = comparebookmarks(repo, remotemarks, repo._bookmarks)
24400
03c84c966ef5 bookmarks: rewrite comparing bookmarks in commands.summary() by compare()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24399
diff changeset
   607
    addsrc, adddst, advsrc, advdst, diverge, differ, invalid, same = r
03c84c966ef5 bookmarks: rewrite comparing bookmarks in commands.summary() by compare()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24399
diff changeset
   608
    return (len(addsrc), len(adddst))
03c84c966ef5 bookmarks: rewrite comparing bookmarks in commands.summary() by compare()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24399
diff changeset
   609
17550
fc530080013b bookmarks: extract valid destination logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17425
diff changeset
   610
def validdest(repo, old, new):
fc530080013b bookmarks: extract valid destination logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17425
diff changeset
   611
    """Is the new bookmark destination a valid update from the old one"""
18008
cf91b36f368c clfilter: `bookmark.validdest` should run on unfiltered repo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17922
diff changeset
   612
    repo = repo.unfiltered()
17551
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
   613
    if old == new:
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
   614
        # Old == new -> nothing to update.
17625
b83c18204c36 bookmarks: avoid redundant creation/assignment of "validdests" in "validdest()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17551
diff changeset
   615
        return False
17551
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
   616
    elif not old:
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
   617
        # old is nullrev, anything is valid.
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
   618
        # (new != nullrev has been excluded by the previous check)
17625
b83c18204c36 bookmarks: avoid redundant creation/assignment of "validdests" in "validdest()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17551
diff changeset
   619
        return True
17551
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
   620
    elif repo.obsstore:
18984
efef056b1ae9 obsolete: extract foreground computation from bookmark.validdest
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18851
diff changeset
   621
        return new.node() in obsolete.foreground(repo, [old.node()])
17551
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
   622
    else:
24180
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23877
diff changeset
   623
        # still an independent clause as it is lazier (and therefore faster)
17627
84f12b832ee8 bookmarks: use "changectx.descendant()" for efficient descendant examination
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17625
diff changeset
   624
        return old.descendant(new)