mercurial/bookmarks.py
author Gregory Szorc <gregory.szorc@gmail.com>
Mon, 07 Oct 2019 00:04:04 -0400
changeset 43106 d783f945a701
parent 43089 c59eb1560c44
child 43117 8ff1ecfadcd1
permissions -rw-r--r--
py3: finish porting iteritems() to pycompat and remove source transformer This commit finishes porting .iteritems() to pycompat.iteritems() for the mercurial package. The translation of .iteritems() to .items() was the last conversion performed by the source transformer. With the porting to pycompat complete, we no longer have a need for the source transformer. So the source transformer has been removed. Good riddance! The code base is now compatible with Python 2 and Python 3. For the record, as the person who introduced the source transformer, it brings me joy to delete it. It accomplished its goal to facilitate a port to Python 3 without overly burdening people on some painful low-level differences between Python 2 and 3. It is unfortunate we still have to wallpaper over many differences with the pycompat shim. But it is what it is. Differential Revision: https://phab.mercurial-scm.org/D7015
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
35257
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
    11
import struct
25917
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
    12
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
    13
from .i18n import _
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
    14
from .node import (
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
    15
    bin,
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
    16
    hex,
32956
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
    17
    short,
35257
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
    18
    wdirid,
25917
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
    19
)
43089
c59eb1560c44 py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
    20
from .pycompat import getattr
25917
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
    21
from . import (
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
    22
    encoding,
29354
af849596752c bookmarks: abort 'push -B .' when no active bookmark
liscju <piotr.listkiewicz@gmail.com>
parents: 29300
diff changeset
    23
    error,
33146
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33092
diff changeset
    24
    obsutil,
33092
d170f59f6f55 py3: fix kwargs handling for `hg bookmarks`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33011
diff changeset
    25
    pycompat,
32955
70661eeb8ddb commands: move checkformat to bookmarks module
Sean Farley <sean@farley.io>
parents: 32794
diff changeset
    26
    scmutil,
31052
0332b8fafd05 bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30634
diff changeset
    27
    txnutil,
25917
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
    28
    util,
aa323b53e3f9 bookmarks: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25743
diff changeset
    29
)
13350
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    30
33009
4b81776baa7a commands: move activebookmarklabel to bookmarks module
Sean Farley <sean@farley.io>
parents: 33007
diff changeset
    31
# label constants
4b81776baa7a commands: move activebookmarklabel to bookmarks module
Sean Farley <sean@farley.io>
parents: 33007
diff changeset
    32
# until 3.5, bookmarks.current was the advertised name, not
4b81776baa7a commands: move activebookmarklabel to bookmarks module
Sean Farley <sean@farley.io>
parents: 33007
diff changeset
    33
# bookmarks.active, so we must use both to avoid breaking old
4b81776baa7a commands: move activebookmarklabel to bookmarks module
Sean Farley <sean@farley.io>
parents: 33007
diff changeset
    34
# custom styles
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    35
activebookmarklabel = b'bookmarks.active bookmarks.current'
33009
4b81776baa7a commands: move activebookmarklabel to bookmarks module
Sean Farley <sean@farley.io>
parents: 33007
diff changeset
    36
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    37
BOOKMARKS_IN_STORE_REQUIREMENT = b'bookmarksinstore'
42325
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
    38
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
    39
42325
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
    40
def bookmarksinstore(repo):
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
    41
    return BOOKMARKS_IN_STORE_REQUIREMENT in repo.requirements
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
    42
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
    43
42325
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
    44
def bookmarksvfs(repo):
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
    45
    return repo.svfs if bookmarksinstore(repo) else repo.vfs
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
    46
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
    47
27186
34d26e22a2b0 bookmarks: hoist getbkfile out of bmstore class
Augie Fackler <augie@google.com>
parents: 27185
diff changeset
    48
def _getbkfile(repo):
34d26e22a2b0 bookmarks: hoist getbkfile out of bmstore class
Augie Fackler <augie@google.com>
parents: 27185
diff changeset
    49
    """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
    50
34d26e22a2b0 bookmarks: hoist getbkfile out of bmstore class
Augie Fackler <augie@google.com>
parents: 27185
diff changeset
    51
    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
    52
    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
    53
    may need to tweak this behavior further.
34d26e22a2b0 bookmarks: hoist getbkfile out of bmstore class
Augie Fackler <augie@google.com>
parents: 27185
diff changeset
    54
    """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    55
    fp, pending = txnutil.trypending(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    56
        repo.root, bookmarksvfs(repo), b'bookmarks'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    57
    )
31052
0332b8fafd05 bookmarks: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30634
diff changeset
    58
    return fp
27186
34d26e22a2b0 bookmarks: hoist getbkfile out of bmstore class
Augie Fackler <augie@google.com>
parents: 27185
diff changeset
    59
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
    60
37847
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
    61
class bmstore(object):
41533
0f64091cc851 global: make some docstrings raw strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41365
diff changeset
    62
    r"""Storage for bookmarks.
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    63
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
    64
    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
    65
    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
    66
    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
    67
    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
    68
    any.
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    69
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    70
    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
    71
    {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
    72
    .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
    73
    """
13351
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
    74
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    75
    def __init__(self, repo):
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    76
        self._repo = repo
37847
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
    77
        self._refmap = refmap = {}  # refspec: node
37850
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
    78
        self._nodemap = nodemap = {}  # node: sorted([refspec, ...])
32738
999aa9cfb4d3 bookmarks: move variable initialization earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32737
diff changeset
    79
        self._clean = True
999aa9cfb4d3 bookmarks: move variable initialization earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32737
diff changeset
    80
        self._aclean = True
32735
d7522f983f37 bookmarks: explicitly convert to 'node' during initialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32734
diff changeset
    81
        nm = repo.changelog.nodemap
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
    82
        tonode = bin  # force local lookup
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
    83
        try:
32794
6f775d10e83b bookmarks: make sure we close the bookmark file after reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32793
diff changeset
    84
            with _getbkfile(repo) as bkfile:
6f775d10e83b bookmarks: make sure we close the bookmark file after reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32793
diff changeset
    85
                for line in bkfile:
6f775d10e83b bookmarks: make sure we close the bookmark file after reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32793
diff changeset
    86
                    line = line.strip()
6f775d10e83b bookmarks: make sure we close the bookmark file after reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32793
diff changeset
    87
                    if not line:
6f775d10e83b bookmarks: make sure we close the bookmark file after reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32793
diff changeset
    88
                        continue
6f775d10e83b bookmarks: make sure we close the bookmark file after reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32793
diff changeset
    89
                    try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    90
                        sha, refspec = line.split(b' ', 1)
32794
6f775d10e83b bookmarks: make sure we close the bookmark file after reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32793
diff changeset
    91
                        node = tonode(sha)
6f775d10e83b bookmarks: make sure we close the bookmark file after reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32793
diff changeset
    92
                        if node in nm:
6f775d10e83b bookmarks: make sure we close the bookmark file after reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32793
diff changeset
    93
                            refspec = encoding.tolocal(refspec)
37847
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
    94
                            refmap[refspec] = node
37850
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
    95
                            nrefs = nodemap.get(node)
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
    96
                            if nrefs is None:
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
    97
                                nodemap[node] = [refspec]
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
    98
                            else:
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
    99
                                nrefs.append(refspec)
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   100
                                if nrefs[-2] > refspec:
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   101
                                    # bookmarks weren't sorted before 4.5
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   102
                                    nrefs.sort()
32794
6f775d10e83b bookmarks: make sure we close the bookmark file after reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32793
diff changeset
   103
                    except (TypeError, ValueError):
6f775d10e83b bookmarks: make sure we close the bookmark file after reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32793
diff changeset
   104
                        # TypeError:
6f775d10e83b bookmarks: make sure we close the bookmark file after reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32793
diff changeset
   105
                        # - bin(...)
6f775d10e83b bookmarks: make sure we close the bookmark file after reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32793
diff changeset
   106
                        # ValueError:
6f775d10e83b bookmarks: make sure we close the bookmark file after reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32793
diff changeset
   107
                        # - node in nm, for non-20-bytes entry
6f775d10e83b bookmarks: make sure we close the bookmark file after reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32793
diff changeset
   108
                        # - split(...), for string without ' '
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   109
                        bookmarkspath = b'.hg/bookmarks'
42325
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
   110
                        if bookmarksinstore(repo):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   111
                            bookmarkspath = b'.hg/store/bookmarks'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   112
                        repo.ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   113
                            _(b'malformed line in %s: %r\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   114
                            % (bookmarkspath, pycompat.bytestr(line))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   115
                        )
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25569
diff changeset
   116
        except IOError as inst:
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
   117
            if inst.errno != errno.ENOENT:
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
   118
                raise
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   119
        self._active = _readactive(repo, self)
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   120
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   121
    @property
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   122
    def active(self):
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   123
        return self._active
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   124
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   125
    @active.setter
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   126
    def active(self, mark):
37847
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   127
        if mark is not None and mark not in self._refmap:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   128
            raise AssertionError(b'bookmark %s does not exist!' % mark)
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   129
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   130
        self._active = mark
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   131
        self._aclean = False
27187
d9dcc5c09d77 bmstore: add basic clean-state tracking
Augie Fackler <augie@google.com>
parents: 27186
diff changeset
   132
37847
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   133
    def __len__(self):
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   134
        return len(self._refmap)
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   135
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   136
    def __iter__(self):
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   137
        return iter(self._refmap)
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   138
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   139
    def iteritems(self):
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43089
diff changeset
   140
        return pycompat.iteritems(self._refmap)
37847
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   141
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   142
    def items(self):
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   143
        return self._refmap.items()
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   144
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   145
    # TODO: maybe rename to allnames()?
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   146
    def keys(self):
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   147
        return self._refmap.keys()
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   148
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   149
    # TODO: maybe rename to allnodes()? but nodes would have to be deduplicated
37850
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   150
    # could be self._nodemap.keys()
37847
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   151
    def values(self):
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   152
        return self._refmap.values()
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   153
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   154
    def __contains__(self, mark):
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   155
        return mark in self._refmap
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   156
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   157
    def __getitem__(self, mark):
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   158
        return self._refmap[mark]
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   159
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   160
    def get(self, mark, default=None):
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   161
        return self._refmap.get(mark, default)
33517
08bf0ebc6c8e bookmark: deprecate direct set of a bookmark value
Boris Feld <boris.feld@octobus.net>
parents: 33516
diff changeset
   162
37849
82a153e6dc4a bookmarks: make argument names of _set/_del() more specific
Yuya Nishihara <yuya@tcha.org>
parents: 37848
diff changeset
   163
    def _set(self, mark, node):
27187
d9dcc5c09d77 bmstore: add basic clean-state tracking
Augie Fackler <augie@google.com>
parents: 27186
diff changeset
   164
        self._clean = False
37850
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   165
        if mark in self._refmap:
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   166
            self._del(mark)
37849
82a153e6dc4a bookmarks: make argument names of _set/_del() more specific
Yuya Nishihara <yuya@tcha.org>
parents: 37848
diff changeset
   167
        self._refmap[mark] = node
37850
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   168
        nrefs = self._nodemap.get(node)
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   169
        if nrefs is None:
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   170
            self._nodemap[node] = [mark]
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   171
        else:
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   172
            nrefs.append(mark)
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   173
            nrefs.sort()
33518
712a85b3677f bookmark: deprecate direct del of a bookmark value
Boris Feld <boris.feld@octobus.net>
parents: 33517
diff changeset
   174
37849
82a153e6dc4a bookmarks: make argument names of _set/_del() more specific
Yuya Nishihara <yuya@tcha.org>
parents: 37848
diff changeset
   175
    def _del(self, mark):
27187
d9dcc5c09d77 bmstore: add basic clean-state tracking
Augie Fackler <augie@google.com>
parents: 27186
diff changeset
   176
        self._clean = False
37850
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   177
        node = self._refmap.pop(mark)
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   178
        nrefs = self._nodemap[node]
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   179
        if len(nrefs) == 1:
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   180
            assert nrefs[0] == mark
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   181
            del self._nodemap[node]
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   182
        else:
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   183
            nrefs.remove(mark)
35679
5a2d505a9174 bookmark: deprecate direct update of a bookmark value
Boris Feld <boris.feld@octobus.net>
parents: 35647
diff changeset
   184
37848
6e2259847f5f bookmarks: extract function that looks up bookmark names by node
Yuya Nishihara <yuya@tcha.org>
parents: 37847
diff changeset
   185
    def names(self, node):
6e2259847f5f bookmarks: extract function that looks up bookmark names by node
Yuya Nishihara <yuya@tcha.org>
parents: 37847
diff changeset
   186
        """Return a sorted list of bookmarks pointing to the specified node"""
37850
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   187
        return self._nodemap.get(node, [])
37848
6e2259847f5f bookmarks: extract function that looks up bookmark names by node
Yuya Nishihara <yuya@tcha.org>
parents: 37847
diff changeset
   188
33480
ef54789a947d bookmark: introduce a 'applychanges' function to gather bookmark movement
Boris Feld <boris.feld@octobus.net>
parents: 33146
diff changeset
   189
    def applychanges(self, repo, tr, changes):
ef54789a947d bookmark: introduce a 'applychanges' function to gather bookmark movement
Boris Feld <boris.feld@octobus.net>
parents: 33146
diff changeset
   190
        """Apply a list of changes to bookmarks
ef54789a947d bookmark: introduce a 'applychanges' function to gather bookmark movement
Boris Feld <boris.feld@octobus.net>
parents: 33146
diff changeset
   191
        """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   192
        bmchanges = tr.changes.get(b'bookmarks')
33480
ef54789a947d bookmark: introduce a 'applychanges' function to gather bookmark movement
Boris Feld <boris.feld@octobus.net>
parents: 33146
diff changeset
   193
        for name, node in changes:
37847
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   194
            old = self._refmap.get(name)
33480
ef54789a947d bookmark: introduce a 'applychanges' function to gather bookmark movement
Boris Feld <boris.feld@octobus.net>
parents: 33146
diff changeset
   195
            if node is None:
33518
712a85b3677f bookmark: deprecate direct del of a bookmark value
Boris Feld <boris.feld@octobus.net>
parents: 33517
diff changeset
   196
                self._del(name)
33480
ef54789a947d bookmark: introduce a 'applychanges' function to gather bookmark movement
Boris Feld <boris.feld@octobus.net>
parents: 33146
diff changeset
   197
            else:
33517
08bf0ebc6c8e bookmark: deprecate direct set of a bookmark value
Boris Feld <boris.feld@octobus.net>
parents: 33516
diff changeset
   198
                self._set(name, node)
33516
f9e6e43c7987 bookmark: track bookmark changes at the transaction level
Boris Feld <boris.feld@octobus.net>
parents: 33515
diff changeset
   199
            if bmchanges is not None:
f9e6e43c7987 bookmark: track bookmark changes at the transaction level
Boris Feld <boris.feld@octobus.net>
parents: 33515
diff changeset
   200
                # if a previous value exist preserve the "initial" value
f9e6e43c7987 bookmark: track bookmark changes at the transaction level
Boris Feld <boris.feld@octobus.net>
parents: 33515
diff changeset
   201
                previous = bmchanges.get(name)
f9e6e43c7987 bookmark: track bookmark changes at the transaction level
Boris Feld <boris.feld@octobus.net>
parents: 33515
diff changeset
   202
                if previous is not None:
f9e6e43c7987 bookmark: track bookmark changes at the transaction level
Boris Feld <boris.feld@octobus.net>
parents: 33515
diff changeset
   203
                    old = previous[0]
f9e6e43c7987 bookmark: track bookmark changes at the transaction level
Boris Feld <boris.feld@octobus.net>
parents: 33515
diff changeset
   204
                bmchanges[name] = (old, node)
33515
3325c7dcabaa bookmark: deprecate 'recordchange' in favor of 'applychanges'
Boris Feld <boris.feld@octobus.net>
parents: 33514
diff changeset
   205
        self._recordchange(tr)
33480
ef54789a947d bookmark: introduce a 'applychanges' function to gather bookmark movement
Boris Feld <boris.feld@octobus.net>
parents: 33146
diff changeset
   206
33515
3325c7dcabaa bookmark: deprecate 'recordchange' in favor of 'applychanges'
Boris Feld <boris.feld@octobus.net>
parents: 33514
diff changeset
   207
    def _recordchange(self, tr):
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
   208
        """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
   209
8319f7e78395 bookmark: add a `bmstore.recordupdate` to plug bookmarks into the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22664
diff changeset
   210
        The transaction is then responsible for updating the file content."""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   211
        location = b'' if bookmarksinstore(self._repo) else b'plain'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   212
        tr.addfilegenerator(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   213
            b'bookmarks', (b'bookmarks',), self._write, location=location
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   214
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   215
        tr.hookargs[b'bookmark_moved'] = b'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
   216
23469
65e48b8d20f5 bookmarks: factor out repository lookup from writing bookmarks file
Ryan McElroy <rmcelroy@fb.com>
parents: 23458
diff changeset
   217
    def _writerepo(self, repo):
65e48b8d20f5 bookmarks: factor out repository lookup from writing bookmarks file
Ryan McElroy <rmcelroy@fb.com>
parents: 23458
diff changeset
   218
        """Factored out for extensibility"""
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   219
        rbm = repo._bookmarks
37847
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   220
        if rbm.active not in self._refmap:
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   221
            rbm.active = None
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   222
            rbm._writeactive()
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
   223
42325
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
   224
        if bookmarksinstore(repo):
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
   225
            vfs = repo.svfs
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
   226
            lock = repo.lock()
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
   227
        else:
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
   228
            vfs = repo.vfs
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
   229
            lock = repo.wlock()
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
   230
        with lock:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   231
            with vfs(b'bookmarks', b'w', atomictemp=True, checkambig=True) as f:
42311
ec5bd3ab26bf bookmarks: use context manager when writing files
Martin von Zweigbergk <martinvonz@google.com>
parents: 41533
diff changeset
   232
                self._write(f)
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
   233
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   234
    def _writeactive(self):
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   235
        if self._aclean:
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   236
            return
27800
1c5f2c2c046b with: use context manager for wlock in _writeactive
Bryan O'Sullivan <bryano@fb.com>
parents: 27799
diff changeset
   237
        with self._repo.wlock():
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   238
            if self._active is not None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   239
                with self._repo.vfs(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   240
                    b'bookmarks.current', b'w', atomictemp=True, checkambig=True
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   241
                ) as f:
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   242
                    f.write(encoding.fromlocal(self._active))
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   243
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   244
                self._repo.vfs.tryunlink(b'bookmarks.current')
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   245
        self._aclean = True
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   246
22664
6bd685d2a2de bookmarks: split bookmark serialization and file handling
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22659
diff changeset
   247
    def _write(self, fp):
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43089
diff changeset
   248
        for name, node in sorted(pycompat.iteritems(self._refmap)):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   249
            fp.write(b"%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
   250
        self._clean = True
29066
e6f490e32863 bookmarks: properly invalidate volatile sets when writing bookmarks
Augie Fackler <augie@google.com>
parents: 28182
diff changeset
   251
        self._repo.invalidatevolatilesets()
22664
6bd685d2a2de bookmarks: split bookmark serialization and file handling
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22659
diff changeset
   252
28182
e4fe4e903e97 bookmarks: add 'hg push -B .' for pushing the active bookmark (issue4917)
liscju <piotr.listkiewicz@gmail.com>
parents: 27800
diff changeset
   253
    def expandname(self, bname):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   254
        if bname == b'.':
29354
af849596752c bookmarks: abort 'push -B .' when no active bookmark
liscju <piotr.listkiewicz@gmail.com>
parents: 29300
diff changeset
   255
            if self.active:
af849596752c bookmarks: abort 'push -B .' when no active bookmark
liscju <piotr.listkiewicz@gmail.com>
parents: 29300
diff changeset
   256
                return self.active
af849596752c bookmarks: abort 'push -B .' when no active bookmark
liscju <piotr.listkiewicz@gmail.com>
parents: 29300
diff changeset
   257
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   258
                raise error.RepoLookupError(_(b"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
   259
        return bname
e4fe4e903e97 bookmarks: add 'hg push -B .' for pushing the active bookmark (issue4917)
liscju <piotr.listkiewicz@gmail.com>
parents: 27800
diff changeset
   260
32956
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   261
    def checkconflict(self, mark, force=False, target=None):
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   262
        """check repo for a potential clash of mark with an existing bookmark,
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   263
        branch, or hash
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   264
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   265
        If target is supplied, then check that we are moving the bookmark
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   266
        forward.
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   267
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   268
        If force is supplied, then forcibly move the bookmark to a new commit
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   269
        regardless if it is a move forward.
33513
904894edb205 bookmark: use 'divergent2delete' in checkconflict
Boris Feld <boris.feld@octobus.net>
parents: 33512
diff changeset
   270
904894edb205 bookmark: use 'divergent2delete' in checkconflict
Boris Feld <boris.feld@octobus.net>
parents: 33512
diff changeset
   271
        If divergent bookmark are to be deleted, they will be returned as list.
32956
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   272
        """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   273
        cur = self._repo[b'.'].node()
37847
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   274
        if mark in self._refmap and not force:
32956
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   275
            if target:
37847
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   276
                if self._refmap[mark] == target and target == cur:
32956
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   277
                    # re-activating a bookmark
33513
904894edb205 bookmark: use 'divergent2delete' in checkconflict
Boris Feld <boris.feld@octobus.net>
parents: 33512
diff changeset
   278
                    return []
32956
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   279
                rev = self._repo[target].rev()
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   280
                anc = self._repo.changelog.ancestors([rev])
42978
e3bb2a58af1e bookmarks: remove changectx() method from bmstore (API)
Augie Fackler <augie@google.com>
parents: 42914
diff changeset
   281
                bmctx = self._repo[self[mark]]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   282
                divs = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   283
                    self._refmap[b]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   284
                    for b in self._refmap
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   285
                    if b.split(b'@', 1)[0] == mark.split(b'@', 1)[0]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   286
                ]
32956
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   287
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   288
                # allow resolving a single divergent bookmark even if moving
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   289
                # the bookmark across branches when a revision is specified
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   290
                # that contains a divergent bookmark
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   291
                if bmctx.rev() not in anc and target in divs:
33513
904894edb205 bookmark: use 'divergent2delete' in checkconflict
Boris Feld <boris.feld@octobus.net>
parents: 33512
diff changeset
   292
                    return divergent2delete(self._repo, [target], mark)
32956
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   293
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   294
                deletefrom = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   295
                    b for b in divs if self._repo[b].rev() in anc or b == target
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   296
                ]
33513
904894edb205 bookmark: use 'divergent2delete' in checkconflict
Boris Feld <boris.feld@octobus.net>
parents: 33512
diff changeset
   297
                delbms = divergent2delete(self._repo, deletefrom, mark)
32956
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   298
                if validdest(self._repo, bmctx, self._repo[target]):
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   299
                    self._repo.ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   300
                        _(b"moving bookmark '%s' forward from %s\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   301
                        % (mark, short(bmctx.node()))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   302
                    )
33513
904894edb205 bookmark: use 'divergent2delete' in checkconflict
Boris Feld <boris.feld@octobus.net>
parents: 33512
diff changeset
   303
                    return delbms
32956
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   304
            raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   305
                _(b"bookmark '%s' already exists " b"(use -f to force)") % mark
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   306
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   307
        if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   308
            mark in self._repo.branchmap()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   309
            or mark == self._repo.dirstate.branch()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   310
        ) and not force:
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   311
            raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   312
                _(b"a bookmark cannot have the name of an existing branch")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   313
            )
32956
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   314
        if len(mark) > 3 and not force:
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   315
            try:
37397
46d9f998c3ed bookmarks: use isrevsymbol() for detecting collision with existing symbol
Martin von Zweigbergk <martinvonz@google.com>
parents: 37375
diff changeset
   316
                shadowhash = scmutil.isrevsymbol(self._repo, mark)
32956
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   317
            except error.LookupError:  # ambiguous identifier
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   318
                shadowhash = False
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   319
            if shadowhash:
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   320
                self._repo.ui.warn(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   321
                    _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   322
                        b"bookmark %s matches a changeset hash\n"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   323
                        b"(did you leave a -r out of an 'hg bookmark' "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   324
                        b"command?)\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   325
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   326
                    % mark
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   327
                )
33513
904894edb205 bookmark: use 'divergent2delete' in checkconflict
Boris Feld <boris.feld@octobus.net>
parents: 33512
diff changeset
   328
        return []
32956
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   329
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   330
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   331
def _readactive(repo, marks):
24946
c44534209a0a bookmarks: rename readcurrent to readactive (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24945
diff changeset
   332
    """
c44534209a0a bookmarks: rename readcurrent to readactive (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24945
diff changeset
   333
    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
   334
    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
   335
    It is stored in .hg/bookmarks.current
c44534209a0a bookmarks: rename readcurrent to readactive (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24945
diff changeset
   336
    """
42312
2b77183ac477 bookmarks: use vfs.tryread() instead of reimplementing it
Martin von Zweigbergk <martinvonz@google.com>
parents: 42311
diff changeset
   337
    # No readline() in osutil.posixfile, reading everything is
2b77183ac477 bookmarks: use vfs.tryread() instead of reimplementing it
Martin von Zweigbergk <martinvonz@google.com>
parents: 42311
diff changeset
   338
    # cheap.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   339
    content = repo.vfs.tryread(b'bookmarks.current')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   340
    mark = encoding.tolocal((content.splitlines() or [b''])[0])
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   341
    if mark == b'' or mark not in marks:
42312
2b77183ac477 bookmarks: use vfs.tryread() instead of reimplementing it
Martin von Zweigbergk <martinvonz@google.com>
parents: 42311
diff changeset
   342
        mark = None
13351
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
   343
    return mark
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
   344
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   345
24945
e0b0fbd47491 bookmarks: rename setcurrent to activate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24944
diff changeset
   346
def activate(repo, mark):
e0b0fbd47491 bookmarks: rename setcurrent to activate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24944
diff changeset
   347
    """
e0b0fbd47491 bookmarks: rename setcurrent to activate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24944
diff changeset
   348
    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
   349
    follow new commits that are made.
13350
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   350
    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
   351
    """
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   352
    repo._bookmarks.active = mark
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   353
    repo._bookmarks._writeactive()
13352
f9cd37fca5ba bookmarks: move update into core
Matt Mackall <mpm@selenic.com>
parents: 13351
diff changeset
   354
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   355
24944
08ec11e3ae4c bookmarks: rename unsetcurrent to deactivate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24832
diff changeset
   356
def deactivate(repo):
08ec11e3ae4c bookmarks: rename unsetcurrent to deactivate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24832
diff changeset
   357
    """
26781
1aee2ab0f902 spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents: 26520
diff changeset
   358
    Unset the active bookmark in this repository.
24944
08ec11e3ae4c bookmarks: rename unsetcurrent to deactivate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24832
diff changeset
   359
    """
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   360
    repo._bookmarks.active = None
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   361
    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
   362
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   363
24986
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
   364
def isactivewdirparent(repo):
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
   365
    """
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
   366
    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
   367
    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
   368
24986
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
   369
    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
   370
    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
   371
    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
   372
    """
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
   373
    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
   374
    marks = repo._bookmarks
24986
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
   375
    parents = [p.node() for p in repo[None].parents()]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   376
    return mark in marks and marks[mark] in parents
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   377
18471
2096e025a728 update: update to current bookmark if it moved out from under us (issue3682)
Kevin Bullock <kbullock@ringworld.org>
parents: 18363
diff changeset
   378
33510
07b556d1b74e bookmark: split out target computation from 'deletedivergent'
Boris Feld <boris.feld@octobus.net>
parents: 33499
diff changeset
   379
def divergent2delete(repo, deletefrom, bm):
07b556d1b74e bookmark: split out target computation from 'deletedivergent'
Boris Feld <boris.feld@octobus.net>
parents: 33499
diff changeset
   380
    """find divergent versions of bm on nodes in deletefrom.
07b556d1b74e bookmark: split out target computation from 'deletedivergent'
Boris Feld <boris.feld@octobus.net>
parents: 33499
diff changeset
   381
07b556d1b74e bookmark: split out target computation from 'deletedivergent'
Boris Feld <boris.feld@octobus.net>
parents: 33499
diff changeset
   382
    the list of bookmark to delete."""
07b556d1b74e bookmark: split out target computation from 'deletedivergent'
Boris Feld <boris.feld@octobus.net>
parents: 33499
diff changeset
   383
    todelete = []
18513
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   384
    marks = repo._bookmarks
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   385
    divergent = [
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   386
        b for b in marks if b.split(b'@', 1)[0] == bm.split(b'@', 1)[0]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   387
    ]
18513
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   388
    for mark in divergent:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   389
        if mark == b'@' or b'@' not in mark:
21843
92666a869ea4 bookmarks: avoid deleting primary bookmarks on rebase
Matt Mackall <mpm@selenic.com>
parents: 20352
diff changeset
   390
            # can't be divergent by definition
92666a869ea4 bookmarks: avoid deleting primary bookmarks on rebase
Matt Mackall <mpm@selenic.com>
parents: 20352
diff changeset
   391
            continue
18513
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   392
        if mark and marks[mark] in deletefrom:
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   393
            if mark != bm:
33510
07b556d1b74e bookmark: split out target computation from 'deletedivergent'
Boris Feld <boris.feld@octobus.net>
parents: 33499
diff changeset
   394
                todelete.append(mark)
07b556d1b74e bookmark: split out target computation from 'deletedivergent'
Boris Feld <boris.feld@octobus.net>
parents: 33499
diff changeset
   395
    return todelete
18513
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   396
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   397
32381
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   398
def headsforactive(repo):
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   399
    """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
   400
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   401
    Args:
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   402
      repo: A repository with an active bookmark.
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   403
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   404
    Returns:
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   405
      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
   406
      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
   407
      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
   408
      only one entry.
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   409
    """
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   410
    if not repo._activebookmark:
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   411
        raise ValueError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   412
            b'headsforactive() only makes sense with an active bookmark'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   413
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   414
    name = repo._activebookmark.split(b'@', 1)[0]
32381
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   415
    heads = []
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43089
diff changeset
   416
    for mark, n in pycompat.iteritems(repo._bookmarks):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   417
        if mark.split(b'@', 1)[0] == name:
32381
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   418
            heads.append(n)
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   419
    return heads
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   420
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   421
37375
a973bb92ab71 bookmarks: drop always-None argument from calculateupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37359
diff changeset
   422
def calculateupdate(ui, repo):
37359
e27298bf11dd bookmarks: calculateupdate() returns a bookmark, not a rev
Martin von Zweigbergk <martinvonz@google.com>
parents: 37301
diff changeset
   423
    '''Return a tuple (activemark, movemarkfrom) indicating the active bookmark
e27298bf11dd bookmarks: calculateupdate() returns a bookmark, not a rev
Martin von Zweigbergk <martinvonz@google.com>
parents: 37301
diff changeset
   424
    and where to move the active bookmark from, if needed.'''
37375
a973bb92ab71 bookmarks: drop always-None argument from calculateupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37359
diff changeset
   425
    checkout, movemarkfrom = None, None
a973bb92ab71 bookmarks: drop always-None argument from calculateupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37359
diff changeset
   426
    activemark = repo._activebookmark
a973bb92ab71 bookmarks: drop always-None argument from calculateupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37359
diff changeset
   427
    if isactivewdirparent(repo):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   428
        movemarkfrom = repo[b'.'].node()
37375
a973bb92ab71 bookmarks: drop always-None argument from calculateupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37359
diff changeset
   429
    elif activemark:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   430
        ui.status(_(b"updating to active bookmark %s\n") % activemark)
37375
a973bb92ab71 bookmarks: drop always-None argument from calculateupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37359
diff changeset
   431
        checkout = activemark
19523
f37b5a17e6a0 bookmarks: pull --update updates to active bookmark if it moved (issue4007)
Kevin Bullock <kbullock@ringworld.org>
parents: 19110
diff changeset
   432
    return (checkout, movemarkfrom)
f37b5a17e6a0 bookmarks: pull --update updates to active bookmark if it moved (issue4007)
Kevin Bullock <kbullock@ringworld.org>
parents: 19110
diff changeset
   433
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   434
13352
f9cd37fca5ba bookmarks: move update into core
Matt Mackall <mpm@selenic.com>
parents: 13351
diff changeset
   435
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
   436
    deletefrom = parents
13352
f9cd37fca5ba bookmarks: move update into core
Matt Mackall <mpm@selenic.com>
parents: 13351
diff changeset
   437
    marks = repo._bookmarks
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   438
    active = marks.active
25100
d6e7ac651973 bookmarks: rename current to active in variables and comments
Ryan McElroy <rmcelroy@fb.com>
parents: 25081
diff changeset
   439
    if not active:
16706
a270ec977ba6 bookmarks: delete divergent bookmarks on merge
David Soria Parra <dsp@php.net>
parents: 16697
diff changeset
   440
        return False
a270ec977ba6 bookmarks: delete divergent bookmarks on merge
David Soria Parra <dsp@php.net>
parents: 16697
diff changeset
   441
33491
1adcb594eb6b bookmarks: use 'applychanges' for bookmark update
Boris Feld <boris.feld@octobus.net>
parents: 33485
diff changeset
   442
    bmchanges = []
25100
d6e7ac651973 bookmarks: rename current to active in variables and comments
Ryan McElroy <rmcelroy@fb.com>
parents: 25081
diff changeset
   443
    if marks[active] in parents:
18513
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   444
        new = repo[node]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   445
        divs = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   446
            repo[marks[b]]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   447
            for b in marks
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   448
            if b.split(b'@', 1)[0] == active.split(b'@', 1)[0]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   449
        ]
19110
741d94aa92e4 bookmarks: resolve divergent bookmarks when moving active bookmark forward
Sean Farley <sean.michael.farley@gmail.com>
parents: 18984
diff changeset
   450
        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
   451
        deletefrom = [b.node() for b in divs if b.rev() in anc or b == new]
42978
e3bb2a58af1e bookmarks: remove changectx() method from bmstore (API)
Augie Fackler <augie@google.com>
parents: 42914
diff changeset
   452
        if validdest(repo, repo[marks[active]], new):
33491
1adcb594eb6b bookmarks: use 'applychanges' for bookmark update
Boris Feld <boris.feld@octobus.net>
parents: 33485
diff changeset
   453
            bmchanges.append((active, new.node()))
18513
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   454
33512
1424a769f31b bookmark: use 'divergent2delete' when updating a bookmark
Boris Feld <boris.feld@octobus.net>
parents: 33510
diff changeset
   455
    for bm in divergent2delete(repo, deletefrom, active):
1424a769f31b bookmark: use 'divergent2delete' when updating a bookmark
Boris Feld <boris.feld@octobus.net>
parents: 33510
diff changeset
   456
        bmchanges.append((bm, None))
18513
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   457
33512
1424a769f31b bookmark: use 'divergent2delete' when updating a bookmark
Boris Feld <boris.feld@octobus.net>
parents: 33510
diff changeset
   458
    if bmchanges:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   459
        with repo.lock(), repo.transaction(b'bookmark') as tr:
33491
1adcb594eb6b bookmarks: use 'applychanges' for bookmark update
Boris Feld <boris.feld@octobus.net>
parents: 33485
diff changeset
   460
            marks.applychanges(repo, tr, bmchanges)
33512
1424a769f31b bookmark: use 'divergent2delete' when updating a bookmark
Boris Feld <boris.feld@octobus.net>
parents: 33510
diff changeset
   461
    return bool(bmchanges)
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   462
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   463
30481
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   464
def listbinbookmarks(repo):
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   465
    # 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
   466
    # support it (e.g., statichttprepository).
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   467
    marks = getattr(repo, '_bookmarks', {})
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   468
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   469
    hasnode = repo.changelog.hasnode
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43089
diff changeset
   470
    for k, v in pycompat.iteritems(marks):
30481
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   471
        # don't expose local divergent bookmarks
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   472
        if hasnode(v) and (b'@' not in k or k.endswith(b'@')):
30481
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   473
            yield k, v
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   474
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   475
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   476
def listbookmarks(repo):
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   477
    d = {}
30482
55ec13c82ea0 bookmarks: use listbinbookmarks() in listbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 30481
diff changeset
   478
    for book, node in listbinbookmarks(repo):
55ec13c82ea0 bookmarks: use listbinbookmarks() in listbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 30481
diff changeset
   479
        d[book] = hex(node)
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   480
    return d
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   481
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   482
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   483
def pushbookmark(repo, key, old, new):
42325
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
   484
    if bookmarksinstore(repo):
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
   485
        wlock = util.nullcontextmanager()
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
   486
    else:
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
   487
        wlock = repo.wlock()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   488
    with wlock, repo.lock(), repo.transaction(b'bookmarks') as tr:
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   489
        marks = repo._bookmarks
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   490
        existing = hex(marks.get(key, b''))
22364
5c153c69fdb2 bookmarks: allow pushkey if new equals current
Durham Goode <durham@fb.com>
parents: 21843
diff changeset
   491
        if existing != old and existing != new:
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   492
            return False
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   493
        if new == b'':
33485
505021482541 bookmark: use 'applychanges' when updating a bookmark through pushkey
Boris Feld <boris.feld@octobus.net>
parents: 33484
diff changeset
   494
            changes = [(key, None)]
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   495
        else:
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   496
            if new not in repo:
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   497
                return False
33485
505021482541 bookmark: use 'applychanges' when updating a bookmark through pushkey
Boris Feld <boris.feld@octobus.net>
parents: 33484
diff changeset
   498
            changes = [(key, repo[new].node())]
505021482541 bookmark: use 'applychanges' when updating a bookmark through pushkey
Boris Feld <boris.feld@octobus.net>
parents: 33484
diff changeset
   499
        marks.applychanges(repo, tr, changes)
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   500
        return True
13354
4e1ba6ead69c bookmarks: move diff to core
Matt Mackall <mpm@selenic.com>
parents: 13353
diff changeset
   501
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   502
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   503
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
   504
    '''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
   505
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   506
    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
   507
    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
   508
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   509
    :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
   510
    :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
   511
    :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
   512
    :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
   513
    :diverge: diverge
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   514
    :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
   515
    :invalid: unknown on both side
23081
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
   516
    :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
   517
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   518
    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
   519
    changeset ID on source side, changeset ID on destination
42914
08fce968d00b doc: fix up confusing doc comment
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42325
diff changeset
   520
    side)". Each changeset ID is a binary node or None.
20024
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   521
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   522
    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
   523
     "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
   524
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   525
    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
   526
    examined.
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   527
    '''
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   528
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   529
    if targets:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   530
        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
   531
    else:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   532
        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
   533
        dstmarkset = set(dstmarks)
23081
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
   534
        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
   535
23081
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
   536
    results = ([], [], [], [], [], [], [], [])
20024
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   537
    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
   538
    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
   539
    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
   540
    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
   541
    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
   542
    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
   543
    invalid = results[6].append
23081
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
   544
    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
   545
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   546
    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
   547
        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
   548
            if b in dstmarks:
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   549
                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
   550
            else:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   551
                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
   552
        elif b not in dstmarks:
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   553
            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
   554
        else:
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   555
            scid = srcmarks[b]
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   556
            dcid = dstmarks[b]
23081
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
   557
            if scid == dcid:
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
   558
                same((b, scid, dcid))
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
   559
            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
   560
                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
   561
                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
   562
                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
   563
                    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
   564
                        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
   565
                    else:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   566
                        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
   567
                else:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   568
                    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
   569
                        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
   570
                    else:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   571
                        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
   572
            else:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   573
                # 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
   574
                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
   575
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   576
    return results
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   577
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   578
24355
ca4b89683078 bookmarks: reuse @number bookmark, if it refers changeset referred remotely
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24354
diff changeset
   579
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
   580
    '''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
   581
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
   582
    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
   583
    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
   584
ca4b89683078 bookmarks: reuse @number bookmark, if it refers changeset referred remotely
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24354
diff changeset
   585
    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
   586
    refers ``remotenode``.
24353
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
   587
    '''
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   588
    if b == b'@':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   589
        b = b''
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   590
    # try to use an @pathalias suffix
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   591
    # if an @pathalias already exists, we overwrite (update) it
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   592
    if path.startswith(b"file:"):
22629
b3f74b405c20 bookmarks: fix divergent bookmark path normalization
Matt Mackall <mpm@selenic.com>
parents: 22627
diff changeset
   593
        path = util.url(path).path
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   594
    for p, u in ui.configitems(b"paths"):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   595
        if u.startswith(b"file:"):
22629
b3f74b405c20 bookmarks: fix divergent bookmark path normalization
Matt Mackall <mpm@selenic.com>
parents: 22627
diff changeset
   596
            u = util.url(u).path
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   597
        if path == u:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   598
            return b'%s@%s' % (b, p)
24354
194e1e3ebc29 bookmarks: check @pathalias suffix before available @number for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24353
diff changeset
   599
194e1e3ebc29 bookmarks: check @pathalias suffix before available @number for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24353
diff changeset
   600
    # 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
   601
    for x in range(1, 100):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   602
        n = b'%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
   603
        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
   604
            return n
194e1e3ebc29 bookmarks: check @pathalias suffix before available @number for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24353
diff changeset
   605
194e1e3ebc29 bookmarks: check @pathalias suffix before available @number for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24353
diff changeset
   606
    return None
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   607
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   608
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   609
def unhexlifybookmarks(marks):
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   610
    binremotemarks = {}
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   611
    for name, node in marks.items():
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   612
        binremotemarks[name] = bin(node)
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   613
    return binremotemarks
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   614
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   615
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   616
_binaryentry = struct.Struct(b'>20sH')
35257
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   617
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   618
35257
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   619
def binaryencode(bookmarks):
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   620
    """encode a '(bookmark, node)' iterable into a binary stream
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   621
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   622
    the binary format is:
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   623
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   624
        <node><bookmark-length><bookmark-name>
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   625
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   626
    :node: is a 20 bytes binary node,
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   627
    :bookmark-length: an unsigned short,
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   628
    :bookmark-name: the name of the bookmark (of length <bookmark-length>)
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   629
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   630
    wdirid (all bits set) will be used as a special value for "missing"
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   631
    """
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   632
    binarydata = []
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   633
    for book, node in bookmarks:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   634
        if not node:  # None or ''
35257
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   635
            node = wdirid
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   636
        binarydata.append(_binaryentry.pack(node, len(book)))
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   637
        binarydata.append(book)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   638
    return b''.join(binarydata)
35257
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   639
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   640
35257
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   641
def binarydecode(stream):
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   642
    """decode a binary stream into an '(bookmark, node)' iterable
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   643
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   644
    the binary format is:
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   645
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   646
        <node><bookmark-length><bookmark-name>
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   647
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   648
    :node: is a 20 bytes binary node,
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   649
    :bookmark-length: an unsigned short,
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   650
    :bookmark-name: the name of the bookmark (of length <bookmark-length>))
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   651
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   652
    wdirid (all bits set) will be used as a special value for "missing"
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   653
    """
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   654
    entrysize = _binaryentry.size
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   655
    books = []
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   656
    while True:
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   657
        entry = stream.read(entrysize)
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   658
        if len(entry) < entrysize:
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   659
            if entry:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   660
                raise error.Abort(_(b'bad bookmark stream'))
35257
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   661
            break
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   662
        node, length = _binaryentry.unpack(entry)
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   663
        bookmark = stream.read(length)
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   664
        if len(bookmark) < length:
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   665
            if entry:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   666
                raise error.Abort(_(b'bad bookmark stream'))
35257
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   667
        if node == wdirid:
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   668
            node = None
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   669
        books.append((bookmark, node))
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   670
    return books
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   671
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   672
22666
0f8120c1ecf5 pull: perform bookmark updates in the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22665
diff changeset
   673
def updatefromremote(ui, repo, remotemarks, path, trfunc, explicit=()):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   674
    ui.debug(b"checking for updated bookmarks\n")
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
   675
    localmarks = repo._bookmarks
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   676
    (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   677
        addsrc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   678
        adddst,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   679
        advsrc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   680
        advdst,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   681
        diverge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   682
        differ,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   683
        invalid,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   684
        same,
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   685
    ) = 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
   686
22644
1ec7cdaf898f bookmarks: allow `updatefromremote` to be quiet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22629
diff changeset
   687
    status = ui.status
1ec7cdaf898f bookmarks: allow `updatefromremote` to be quiet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22629
diff changeset
   688
    warn = ui.warn
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   689
    if ui.configbool(b'ui', b'quietbookmarkmove'):
22644
1ec7cdaf898f bookmarks: allow `updatefromremote` to be quiet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22629
diff changeset
   690
        status = warn = ui.debug
1ec7cdaf898f bookmarks: allow `updatefromremote` to be quiet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22629
diff changeset
   691
22659
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
   692
    explicit = set(explicit)
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   693
    changed = []
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   694
    for b, scid, dcid in addsrc:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   695
        if scid in repo:  # add remote bookmarks for changes we already have
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   696
            changed.append(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   697
                (b, scid, status, _(b"adding remote bookmark %s\n") % b)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   698
            )
25564
847fce27effc bookmark: informs of failure to upgrade a bookmark
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25100
diff changeset
   699
        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
   700
            explicit.remove(b)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   701
            ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   702
                _(b"remote bookmark %s points to locally missing %s\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   703
                % (b, hex(scid)[:12])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   704
            )
25564
847fce27effc bookmark: informs of failure to upgrade a bookmark
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25100
diff changeset
   705
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   706
    for b, scid, dcid in advsrc:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   707
        changed.append((b, scid, status, _(b"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
   708
    # 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
   709
    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
   710
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   711
    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
   712
        if b in explicit:
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
   713
            explicit.discard(b)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   714
            changed.append((b, scid, status, _(b"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
   715
        else:
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   716
            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
   717
            if db:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   718
                changed.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   719
                    (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   720
                        db,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   721
                        scid,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   722
                        warn,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   723
                        _(b"divergent bookmark %s stored as %s\n") % (b, db),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   724
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   725
                )
24353
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
   726
            else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   727
                warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   728
                    _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   729
                        b"warning: failed to assign numbered name "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   730
                        b"to divergent bookmark %s\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   731
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   732
                    % b
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   733
                )
22659
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
   734
    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
   735
        if b in explicit:
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
   736
            explicit.discard(b)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   737
            changed.append((b, scid, status, _(b"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
   738
    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
   739
        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
   740
            explicit.remove(b)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   741
            ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   742
                _(b"remote bookmark %s points to locally missing %s\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   743
                % (b, hex(scid)[:12])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   744
            )
22659
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
   745
13646
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
   746
    if changed:
22666
0f8120c1ecf5 pull: perform bookmark updates in the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22665
diff changeset
   747
        tr = trfunc()
33484
2a8ce4e79a47 bookmark: use 'applychanges' when updating from a remote
Boris Feld <boris.feld@octobus.net>
parents: 33483
diff changeset
   748
        changes = []
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   749
        for b, node, writer, msg in sorted(changed):
33484
2a8ce4e79a47 bookmark: use 'applychanges' when updating from a remote
Boris Feld <boris.feld@octobus.net>
parents: 33483
diff changeset
   750
            changes.append((b, node))
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   751
            writer(msg)
33484
2a8ce4e79a47 bookmark: use 'applychanges' when updating from a remote
Boris Feld <boris.feld@octobus.net>
parents: 33483
diff changeset
   752
        localmarks.applychanges(repo, tr, changes)
13646
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
   753
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   754
37641
add129811176 bookmarks: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37450
diff changeset
   755
def incoming(ui, repo, peer):
24397
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   756
    '''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
   757
    '''
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   758
    ui.status(_(b"searching for changed bookmarks\n"))
24397
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   759
37641
add129811176 bookmarks: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37450
diff changeset
   760
    with peer.commandexecutor() as e:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   761
        remotemarks = unhexlifybookmarks(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   762
            e.callcommand(b'listkeys', {b'namespace': b'bookmarks',}).result()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   763
        )
37641
add129811176 bookmarks: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37450
diff changeset
   764
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   765
    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
   766
    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
   767
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   768
    incomings = []
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   769
    if ui.debugflag:
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   770
        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
   771
    else:
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   772
        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
   773
    if ui.verbose:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   774
24660
bf13b44bbb0a bookmarks: show detailed status about incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24658
diff changeset
   775
        def add(b, id, st):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   776
            incomings.append(b"   %-25s %s %s\n" % (b, getid(id), st))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   777
24660
bf13b44bbb0a bookmarks: show detailed status about incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24658
diff changeset
   778
    else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   779
24660
bf13b44bbb0a bookmarks: show detailed status about incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24658
diff changeset
   780
        def add(b, id, st):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   781
            incomings.append(b"   %-25s %s\n" % (b, getid(id)))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   782
24397
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   783
    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
   784
        # i18n: "added" refers to a bookmark
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   785
        add(b, hex(scid), _(b'added'))
24657
3d7c512b258d bookmarks: show incoming bookmarks more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24400
diff changeset
   786
    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
   787
        # i18n: "advanced" refers to a bookmark
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   788
        add(b, hex(scid), _(b'advanced'))
24657
3d7c512b258d bookmarks: show incoming bookmarks more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24400
diff changeset
   789
    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
   790
        # i18n: "diverged" refers to a bookmark
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   791
        add(b, hex(scid), _(b'diverged'))
24657
3d7c512b258d bookmarks: show incoming bookmarks more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24400
diff changeset
   792
    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
   793
        # i18n: "changed" refers to a bookmark
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   794
        add(b, hex(scid), _(b'changed'))
24397
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   795
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   796
    if not incomings:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   797
        ui.status(_(b"no changed bookmarks found\n"))
24397
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   798
        return 1
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   799
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   800
    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
   801
        ui.write(s)
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   802
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   803
    return 0
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   804
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   805
24398
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   806
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
   807
    '''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
   808
    '''
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   809
    ui.status(_(b"searching for changed bookmarks\n"))
24398
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   810
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   811
    remotemarks = unhexlifybookmarks(other.listkeys(b'bookmarks'))
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   812
    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
   813
    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
   814
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   815
    outgoings = []
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   816
    if ui.debugflag:
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   817
        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
   818
    else:
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   819
        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
   820
    if ui.verbose:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   821
24661
8cf70c97a6e1 bookmarks: show detailed status about outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24660
diff changeset
   822
        def add(b, id, st):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   823
            outgoings.append(b"   %-25s %s %s\n" % (b, getid(id), st))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   824
24661
8cf70c97a6e1 bookmarks: show detailed status about outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24660
diff changeset
   825
    else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   826
24661
8cf70c97a6e1 bookmarks: show detailed status about outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24660
diff changeset
   827
        def add(b, id, st):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   828
            outgoings.append(b"   %-25s %s\n" % (b, getid(id)))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   829
24398
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   830
    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
   831
        # i18n: "added refers to a bookmark
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   832
        add(b, hex(scid), _(b'added'))
24658
8ea893ab0572 bookmarks: show outgoing bookmarks more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24657
diff changeset
   833
    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
   834
        # i18n: "deleted" refers to a bookmark
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   835
        add(b, b' ' * 40, _(b'deleted'))
24658
8ea893ab0572 bookmarks: show outgoing bookmarks more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24657
diff changeset
   836
    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
   837
        # i18n: "advanced" refers to a bookmark
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   838
        add(b, hex(scid), _(b'advanced'))
24658
8ea893ab0572 bookmarks: show outgoing bookmarks more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24657
diff changeset
   839
    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
   840
        # i18n: "diverged" refers to a bookmark
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   841
        add(b, hex(scid), _(b'diverged'))
24658
8ea893ab0572 bookmarks: show outgoing bookmarks more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24657
diff changeset
   842
    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
   843
        # i18n: "changed" refers to a bookmark
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   844
        add(b, hex(scid), _(b'changed'))
24398
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   845
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   846
    if not outgoings:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   847
        ui.status(_(b"no changed bookmarks found\n"))
24398
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   848
        return 1
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   849
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   850
    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
   851
        ui.write(s)
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   852
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   853
    return 0
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   854
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   855
37641
add129811176 bookmarks: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37450
diff changeset
   856
def summary(repo, peer):
24400
03c84c966ef5 bookmarks: rewrite comparing bookmarks in commands.summary() by compare()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24399
diff changeset
   857
    '''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
   858
03c84c966ef5 bookmarks: rewrite comparing bookmarks in commands.summary() by compare()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24399
diff changeset
   859
    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
   860
    '''
37641
add129811176 bookmarks: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37450
diff changeset
   861
    with peer.commandexecutor() as e:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   862
        remotemarks = unhexlifybookmarks(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   863
            e.callcommand(b'listkeys', {b'namespace': b'bookmarks',}).result()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   864
        )
37641
add129811176 bookmarks: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37450
diff changeset
   865
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   866
    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
   867
    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
   868
    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
   869
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   870
17550
fc530080013b bookmarks: extract valid destination logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17425
diff changeset
   871
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
   872
    """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
   873
    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
   874
    if old == new:
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
   875
        # 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
   876
        return False
17551
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
   877
    elif not old:
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
   878
        # 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
   879
        # (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
   880
        return True
17551
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
   881
    elif repo.obsstore:
33146
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33092
diff changeset
   882
        return new.node() in obsutil.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
   883
    else:
24180
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23877
diff changeset
   884
        # still an independent clause as it is lazier (and therefore faster)
38670
fbec9c0b32d3 context: rename descendant() to isancestorof()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38538
diff changeset
   885
        return old.isancestorof(new)
32955
70661eeb8ddb commands: move checkformat to bookmarks module
Sean Farley <sean@farley.io>
parents: 32794
diff changeset
   886
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   887
32955
70661eeb8ddb commands: move checkformat to bookmarks module
Sean Farley <sean@farley.io>
parents: 32794
diff changeset
   888
def checkformat(repo, mark):
70661eeb8ddb commands: move checkformat to bookmarks module
Sean Farley <sean@farley.io>
parents: 32794
diff changeset
   889
    """return a valid version of a potential bookmark name
70661eeb8ddb commands: move checkformat to bookmarks module
Sean Farley <sean@farley.io>
parents: 32794
diff changeset
   890
70661eeb8ddb commands: move checkformat to bookmarks module
Sean Farley <sean@farley.io>
parents: 32794
diff changeset
   891
    Raises an abort error if the bookmark name is not valid.
70661eeb8ddb commands: move checkformat to bookmarks module
Sean Farley <sean@farley.io>
parents: 32794
diff changeset
   892
    """
70661eeb8ddb commands: move checkformat to bookmarks module
Sean Farley <sean@farley.io>
parents: 32794
diff changeset
   893
    mark = mark.strip()
70661eeb8ddb commands: move checkformat to bookmarks module
Sean Farley <sean@farley.io>
parents: 32794
diff changeset
   894
    if not mark:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   895
        raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   896
            _(b"bookmark names cannot consist entirely of " b"whitespace")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   897
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   898
    scmutil.checknewlabel(repo, mark, b'bookmark')
32955
70661eeb8ddb commands: move checkformat to bookmarks module
Sean Farley <sean@farley.io>
parents: 32794
diff changeset
   899
    return mark
33005
9343fce87789 bookmarks: factor out delete logic from commands
Sean Farley <sean@farley.io>
parents: 32956
diff changeset
   900
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   901
33005
9343fce87789 bookmarks: factor out delete logic from commands
Sean Farley <sean@farley.io>
parents: 32956
diff changeset
   902
def delete(repo, tr, names):
9343fce87789 bookmarks: factor out delete logic from commands
Sean Farley <sean@farley.io>
parents: 32956
diff changeset
   903
    """remove a mark from the bookmark store
9343fce87789 bookmarks: factor out delete logic from commands
Sean Farley <sean@farley.io>
parents: 32956
diff changeset
   904
9343fce87789 bookmarks: factor out delete logic from commands
Sean Farley <sean@farley.io>
parents: 32956
diff changeset
   905
    Raises an abort error if mark does not exist.
9343fce87789 bookmarks: factor out delete logic from commands
Sean Farley <sean@farley.io>
parents: 32956
diff changeset
   906
    """
9343fce87789 bookmarks: factor out delete logic from commands
Sean Farley <sean@farley.io>
parents: 32956
diff changeset
   907
    marks = repo._bookmarks
33481
67b5f81f17cf bookmark: use 'applychanges' for bookmark deletion
Boris Feld <boris.feld@octobus.net>
parents: 33480
diff changeset
   908
    changes = []
33005
9343fce87789 bookmarks: factor out delete logic from commands
Sean Farley <sean@farley.io>
parents: 32956
diff changeset
   909
    for mark in names:
9343fce87789 bookmarks: factor out delete logic from commands
Sean Farley <sean@farley.io>
parents: 32956
diff changeset
   910
        if mark not in marks:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   911
            raise error.Abort(_(b"bookmark '%s' does not exist") % mark)
33005
9343fce87789 bookmarks: factor out delete logic from commands
Sean Farley <sean@farley.io>
parents: 32956
diff changeset
   912
        if mark == repo._activebookmark:
9343fce87789 bookmarks: factor out delete logic from commands
Sean Farley <sean@farley.io>
parents: 32956
diff changeset
   913
            deactivate(repo)
33481
67b5f81f17cf bookmark: use 'applychanges' for bookmark deletion
Boris Feld <boris.feld@octobus.net>
parents: 33480
diff changeset
   914
        changes.append((mark, None))
67b5f81f17cf bookmark: use 'applychanges' for bookmark deletion
Boris Feld <boris.feld@octobus.net>
parents: 33480
diff changeset
   915
    marks.applychanges(repo, tr, changes)
33006
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   916
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   917
33006
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   918
def rename(repo, tr, old, new, force=False, inactive=False):
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   919
    """rename a bookmark from old to new
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   920
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   921
    If force is specified, then the new name can overwrite an existing
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   922
    bookmark.
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   923
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   924
    If inactive is specified, then do not activate the new bookmark.
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   925
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   926
    Raises an abort error if old is not in the bookmark store.
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   927
    """
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   928
    marks = repo._bookmarks
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   929
    mark = checkformat(repo, new)
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   930
    if old not in marks:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   931
        raise error.Abort(_(b"bookmark '%s' does not exist") % old)
33513
904894edb205 bookmark: use 'divergent2delete' in checkconflict
Boris Feld <boris.feld@octobus.net>
parents: 33512
diff changeset
   932
    changes = []
904894edb205 bookmark: use 'divergent2delete' in checkconflict
Boris Feld <boris.feld@octobus.net>
parents: 33512
diff changeset
   933
    for bm in marks.checkconflict(mark, force):
904894edb205 bookmark: use 'divergent2delete' in checkconflict
Boris Feld <boris.feld@octobus.net>
parents: 33512
diff changeset
   934
        changes.append((bm, None))
904894edb205 bookmark: use 'divergent2delete' in checkconflict
Boris Feld <boris.feld@octobus.net>
parents: 33512
diff changeset
   935
    changes.extend([(mark, marks[old]), (old, None)])
33482
916d4cde530e bookmark: use 'applychanges' for bookmark renaming
Boris Feld <boris.feld@octobus.net>
parents: 33481
diff changeset
   936
    marks.applychanges(repo, tr, changes)
33006
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   937
    if repo._activebookmark == old and not inactive:
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   938
        activate(repo, mark)
33007
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   939
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   940
33007
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   941
def addbookmarks(repo, tr, names, rev=None, force=False, inactive=False):
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   942
    """add a list of bookmarks
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   943
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   944
    If force is specified, then the new name can overwrite an existing
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   945
    bookmark.
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   946
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   947
    If inactive is specified, then do not activate any bookmark. Otherwise, the
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   948
    first bookmark is activated.
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   949
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   950
    Raises an abort error if old is not in the bookmark store.
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   951
    """
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   952
    marks = repo._bookmarks
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   953
    cur = repo[b'.'].node()
33007
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   954
    newact = None
33483
146c0371eadf bookmark: use 'applychanges' for adding new bookmark
Boris Feld <boris.feld@octobus.net>
parents: 33482
diff changeset
   955
    changes = []
35647
fc39e2bfcd70 bookmarks: calculate visibility exceptions only once
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35611
diff changeset
   956
    hiddenrev = None
fc39e2bfcd70 bookmarks: calculate visibility exceptions only once
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35611
diff changeset
   957
fc39e2bfcd70 bookmarks: calculate visibility exceptions only once
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35611
diff changeset
   958
    # unhide revs if any
fc39e2bfcd70 bookmarks: calculate visibility exceptions only once
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35611
diff changeset
   959
    if rev:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   960
        repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
35647
fc39e2bfcd70 bookmarks: calculate visibility exceptions only once
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35611
diff changeset
   961
33007
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   962
    for mark in names:
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   963
        mark = checkformat(repo, mark)
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   964
        if newact is None:
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   965
            newact = mark
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   966
        if inactive and mark == repo._activebookmark:
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   967
            deactivate(repo)
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   968
            return
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   969
        tgt = cur
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   970
        if rev:
35611
7336ac5e786e bookmarks: add bookmarks to hidden revs if directaccess config is set
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35577
diff changeset
   971
            ctx = scmutil.revsingle(repo, rev)
7336ac5e786e bookmarks: add bookmarks to hidden revs if directaccess config is set
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35577
diff changeset
   972
            if ctx.hidden():
35647
fc39e2bfcd70 bookmarks: calculate visibility exceptions only once
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35611
diff changeset
   973
                hiddenrev = ctx.hex()[:12]
35611
7336ac5e786e bookmarks: add bookmarks to hidden revs if directaccess config is set
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35577
diff changeset
   974
            tgt = ctx.node()
33513
904894edb205 bookmark: use 'divergent2delete' in checkconflict
Boris Feld <boris.feld@octobus.net>
parents: 33512
diff changeset
   975
        for bm in marks.checkconflict(mark, force, tgt):
904894edb205 bookmark: use 'divergent2delete' in checkconflict
Boris Feld <boris.feld@octobus.net>
parents: 33512
diff changeset
   976
            changes.append((bm, None))
33483
146c0371eadf bookmark: use 'applychanges' for adding new bookmark
Boris Feld <boris.feld@octobus.net>
parents: 33482
diff changeset
   977
        changes.append((mark, tgt))
35647
fc39e2bfcd70 bookmarks: calculate visibility exceptions only once
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35611
diff changeset
   978
fc39e2bfcd70 bookmarks: calculate visibility exceptions only once
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35611
diff changeset
   979
    if hiddenrev:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   980
        repo.ui.warn(_(b"bookmarking hidden changeset %s\n") % hiddenrev)
35712
a1a5c3842b6f bookmarks: display the obsfate of hidden revision we create a bookmark on
Boris Feld <boris.feld@octobus.net>
parents: 35679
diff changeset
   981
a1a5c3842b6f bookmarks: display the obsfate of hidden revision we create a bookmark on
Boris Feld <boris.feld@octobus.net>
parents: 35679
diff changeset
   982
        if ctx.obsolete():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   983
            msg = obsutil._getfilteredreason(repo, b"%s" % hiddenrev, ctx)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   984
            repo.ui.warn(b"(%s)\n" % msg)
35712
a1a5c3842b6f bookmarks: display the obsfate of hidden revision we create a bookmark on
Boris Feld <boris.feld@octobus.net>
parents: 35679
diff changeset
   985
33483
146c0371eadf bookmark: use 'applychanges' for adding new bookmark
Boris Feld <boris.feld@octobus.net>
parents: 33482
diff changeset
   986
    marks.applychanges(repo, tr, changes)
33007
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   987
    if not inactive and cur == marks[newact] and not rev:
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   988
        activate(repo, newact)
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   989
    elif cur != tgt and newact == repo._activebookmark:
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   990
        deactivate(repo)
33010
f5f4c72de71a bookmarks: factor out bookmark printing from commands
Sean Farley <sean@farley.io>
parents: 33009
diff changeset
   991
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   992
39746
25cc5616adc9 bookmarks: pass in formatter to printbookmarks() instead of opts (API)
Yuya Nishihara <yuya@tcha.org>
parents: 39624
diff changeset
   993
def _printbookmarks(ui, repo, fm, bmarks):
33011
8299eb9b08c7 bookmarks: factor method _printer out of for loop in printbookmarks
Sean Farley <sean@farley.io>
parents: 33010
diff changeset
   994
    """private method to print bookmarks
8299eb9b08c7 bookmarks: factor method _printer out of for loop in printbookmarks
Sean Farley <sean@farley.io>
parents: 33010
diff changeset
   995
8299eb9b08c7 bookmarks: factor method _printer out of for loop in printbookmarks
Sean Farley <sean@farley.io>
parents: 33010
diff changeset
   996
    Provides a way for extensions to control how bookmarks are printed (e.g.
8299eb9b08c7 bookmarks: factor method _printer out of for loop in printbookmarks
Sean Farley <sean@farley.io>
parents: 33010
diff changeset
   997
    prepend or postpend names)
8299eb9b08c7 bookmarks: factor method _printer out of for loop in printbookmarks
Sean Farley <sean@farley.io>
parents: 33010
diff changeset
   998
    """
8299eb9b08c7 bookmarks: factor method _printer out of for loop in printbookmarks
Sean Farley <sean@farley.io>
parents: 33010
diff changeset
   999
    hexfn = fm.hexfunc
8299eb9b08c7 bookmarks: factor method _printer out of for loop in printbookmarks
Sean Farley <sean@farley.io>
parents: 33010
diff changeset
  1000
    if len(bmarks) == 0 and fm.isplain():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1001
        ui.status(_(b"no bookmarks set\n"))
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43089
diff changeset
  1002
    for bmark, (n, prefix, label) in sorted(pycompat.iteritems(bmarks)):
33011
8299eb9b08c7 bookmarks: factor method _printer out of for loop in printbookmarks
Sean Farley <sean@farley.io>
parents: 33010
diff changeset
  1003
        fm.startitem()
39624
713085b45810 formatter: replace contexthint() with demand loading of ctx object
Yuya Nishihara <yuya@tcha.org>
parents: 39304
diff changeset
  1004
        fm.context(repo=repo)
33011
8299eb9b08c7 bookmarks: factor method _printer out of for loop in printbookmarks
Sean Farley <sean@farley.io>
parents: 33010
diff changeset
  1005
        if not ui.quiet:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1006
            fm.plain(b' %s ' % prefix, label=label)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1007
        fm.write(b'bookmark', b'%s', bmark, label=label)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1008
        pad = b" " * (25 - encoding.colwidth(bmark))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
  1009
        fm.condwrite(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
  1010
            not ui.quiet,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1011
            b'rev node',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1012
            pad + b' %d:%s',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
  1013
            repo.changelog.rev(n),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
  1014
            hexfn(n),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
  1015
            label=label,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
  1016
        )
33011
8299eb9b08c7 bookmarks: factor method _printer out of for loop in printbookmarks
Sean Farley <sean@farley.io>
parents: 33010
diff changeset
  1017
        fm.data(active=(activebookmarklabel in label))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1018
        fm.plain(b'\n')
33011
8299eb9b08c7 bookmarks: factor method _printer out of for loop in printbookmarks
Sean Farley <sean@farley.io>
parents: 33010
diff changeset
  1019
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
  1020
39753
b05b4b91de3d bookmarks: add explicit option to list bookmarks of the given names
Yuya Nishihara <yuya@tcha.org>
parents: 39746
diff changeset
  1021
def printbookmarks(ui, repo, fm, names=None):
39746
25cc5616adc9 bookmarks: pass in formatter to printbookmarks() instead of opts (API)
Yuya Nishihara <yuya@tcha.org>
parents: 39624
diff changeset
  1022
    """print bookmarks by the given formatter
33010
f5f4c72de71a bookmarks: factor out bookmark printing from commands
Sean Farley <sean@farley.io>
parents: 33009
diff changeset
  1023
f5f4c72de71a bookmarks: factor out bookmark printing from commands
Sean Farley <sean@farley.io>
parents: 33009
diff changeset
  1024
    Provides a way for extensions to control how bookmarks are printed.
f5f4c72de71a bookmarks: factor out bookmark printing from commands
Sean Farley <sean@farley.io>
parents: 33009
diff changeset
  1025
    """
f5f4c72de71a bookmarks: factor out bookmark printing from commands
Sean Farley <sean@farley.io>
parents: 33009
diff changeset
  1026
    marks = repo._bookmarks
33011
8299eb9b08c7 bookmarks: factor method _printer out of for loop in printbookmarks
Sean Farley <sean@farley.io>
parents: 33010
diff changeset
  1027
    bmarks = {}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
  1028
    for bmark in names or marks:
39753
b05b4b91de3d bookmarks: add explicit option to list bookmarks of the given names
Yuya Nishihara <yuya@tcha.org>
parents: 39746
diff changeset
  1029
        if bmark not in marks:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1030
            raise error.Abort(_(b"bookmark '%s' does not exist") % bmark)
33010
f5f4c72de71a bookmarks: factor out bookmark printing from commands
Sean Farley <sean@farley.io>
parents: 33009
diff changeset
  1031
        active = repo._activebookmark
f5f4c72de71a bookmarks: factor out bookmark printing from commands
Sean Farley <sean@farley.io>
parents: 33009
diff changeset
  1032
        if bmark == active:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1033
            prefix, label = b'*', activebookmarklabel
33010
f5f4c72de71a bookmarks: factor out bookmark printing from commands
Sean Farley <sean@farley.io>
parents: 33009
diff changeset
  1034
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1035
            prefix, label = b' ', b''
33010
f5f4c72de71a bookmarks: factor out bookmark printing from commands
Sean Farley <sean@farley.io>
parents: 33009
diff changeset
  1036
39753
b05b4b91de3d bookmarks: add explicit option to list bookmarks of the given names
Yuya Nishihara <yuya@tcha.org>
parents: 39746
diff changeset
  1037
        bmarks[bmark] = (marks[bmark], prefix, label)
39746
25cc5616adc9 bookmarks: pass in formatter to printbookmarks() instead of opts (API)
Yuya Nishihara <yuya@tcha.org>
parents: 39624
diff changeset
  1038
    _printbookmarks(ui, repo, fm, bmarks)
34708
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 33518
diff changeset
  1039
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
  1040
34708
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 33518
diff changeset
  1041
def preparehookargs(name, old, new):
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 33518
diff changeset
  1042
    if new is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1043
        new = b''
34708
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 33518
diff changeset
  1044
    if old is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1045
        old = b''
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1046
    return {b'bookmark': name, b'node': hex(new), b'oldnode': hex(old)}