mercurial/bookmarks.py
author Joerg Sonnenberger <joerg@bec.de>
Sat, 28 Nov 2020 15:04:44 +0100
changeset 46062 14ff4929ca8c
parent 45942 89a2afe31e82
child 46780 6266d19556ad
permissions -rw-r--r--
sidedata: send the correct revision data for wireproto v2 When no sidedata is present, rawdata() and revision() are the same. But as soon as sidedata is present, the way it is currently stored will change the rawdata and that is not desired here, so switch to the correct data accessor. Differential Revision: https://phab.mercurial-scm.org/D9445
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
43544
886ec3962c66 index: use `index.has_node` in `bookmarks.bmstore`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
    81
        has_node = repo.changelog.index.has_node
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)
43544
886ec3962c66 index: use `index.has_node` in `bookmarks.bmstore`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
    92
                        if has_node(node):
32794
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):
44370
edaae3616ba3 bookmarks: avoid traceback when two pushes race to delete the same bookmark
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 43601
diff changeset
   176
        if mark not in self._refmap:
edaae3616ba3 bookmarks: avoid traceback when two pushes race to delete the same bookmark
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 43601
diff changeset
   177
            return
27187
d9dcc5c09d77 bmstore: add basic clean-state tracking
Augie Fackler <augie@google.com>
parents: 27186
diff changeset
   178
        self._clean = False
37850
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   179
        node = self._refmap.pop(mark)
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   180
        nrefs = self._nodemap[node]
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   181
        if len(nrefs) == 1:
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   182
            assert nrefs[0] == mark
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   183
            del self._nodemap[node]
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   184
        else:
04ceb267271a bookmarks: cache reverse mapping (issue5868)
Yuya Nishihara <yuya@tcha.org>
parents: 37849
diff changeset
   185
            nrefs.remove(mark)
35679
5a2d505a9174 bookmark: deprecate direct update of a bookmark value
Boris Feld <boris.feld@octobus.net>
parents: 35647
diff changeset
   186
37848
6e2259847f5f bookmarks: extract function that looks up bookmark names by node
Yuya Nishihara <yuya@tcha.org>
parents: 37847
diff changeset
   187
    def names(self, node):
6e2259847f5f bookmarks: extract function that looks up bookmark names by node
Yuya Nishihara <yuya@tcha.org>
parents: 37847
diff changeset
   188
        """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
   189
        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
   190
33480
ef54789a947d bookmark: introduce a 'applychanges' function to gather bookmark movement
Boris Feld <boris.feld@octobus.net>
parents: 33146
diff changeset
   191
    def applychanges(self, repo, tr, changes):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45913
diff changeset
   192
        """Apply a list of changes to bookmarks"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   193
        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
   194
        for name, node in changes:
37847
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   195
            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
   196
            if node is None:
33518
712a85b3677f bookmark: deprecate direct del of a bookmark value
Boris Feld <boris.feld@octobus.net>
parents: 33517
diff changeset
   197
                self._del(name)
33480
ef54789a947d bookmark: introduce a 'applychanges' function to gather bookmark movement
Boris Feld <boris.feld@octobus.net>
parents: 33146
diff changeset
   198
            else:
33517
08bf0ebc6c8e bookmark: deprecate direct set of a bookmark value
Boris Feld <boris.feld@octobus.net>
parents: 33516
diff changeset
   199
                self._set(name, node)
33516
f9e6e43c7987 bookmark: track bookmark changes at the transaction level
Boris Feld <boris.feld@octobus.net>
parents: 33515
diff changeset
   200
            if bmchanges is not None:
f9e6e43c7987 bookmark: track bookmark changes at the transaction level
Boris Feld <boris.feld@octobus.net>
parents: 33515
diff changeset
   201
                # 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
   202
                previous = bmchanges.get(name)
f9e6e43c7987 bookmark: track bookmark changes at the transaction level
Boris Feld <boris.feld@octobus.net>
parents: 33515
diff changeset
   203
                if previous is not None:
f9e6e43c7987 bookmark: track bookmark changes at the transaction level
Boris Feld <boris.feld@octobus.net>
parents: 33515
diff changeset
   204
                    old = previous[0]
f9e6e43c7987 bookmark: track bookmark changes at the transaction level
Boris Feld <boris.feld@octobus.net>
parents: 33515
diff changeset
   205
                bmchanges[name] = (old, node)
33515
3325c7dcabaa bookmark: deprecate 'recordchange' in favor of 'applychanges'
Boris Feld <boris.feld@octobus.net>
parents: 33514
diff changeset
   206
        self._recordchange(tr)
33480
ef54789a947d bookmark: introduce a 'applychanges' function to gather bookmark movement
Boris Feld <boris.feld@octobus.net>
parents: 33146
diff changeset
   207
33515
3325c7dcabaa bookmark: deprecate 'recordchange' in favor of 'applychanges'
Boris Feld <boris.feld@octobus.net>
parents: 33514
diff changeset
   208
    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
   209
        """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
   210
8319f7e78395 bookmark: add a `bmstore.recordupdate` to plug bookmarks into the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22664
diff changeset
   211
        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
   212
        location = b'' if bookmarksinstore(self._repo) else b'plain'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   213
        tr.addfilegenerator(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   214
            b'bookmarks', (b'bookmarks',), self._write, location=location
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   215
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   216
        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
   217
23469
65e48b8d20f5 bookmarks: factor out repository lookup from writing bookmarks file
Ryan McElroy <rmcelroy@fb.com>
parents: 23458
diff changeset
   218
    def _writerepo(self, repo):
65e48b8d20f5 bookmarks: factor out repository lookup from writing bookmarks file
Ryan McElroy <rmcelroy@fb.com>
parents: 23458
diff changeset
   219
        """Factored out for extensibility"""
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   220
        rbm = repo._bookmarks
37847
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   221
        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
   222
            rbm.active = None
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   223
            rbm._writeactive()
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
   224
42325
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
   225
        if bookmarksinstore(repo):
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
   226
            vfs = repo.svfs
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
   227
            lock = repo.lock()
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
   228
        else:
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
   229
            vfs = repo.vfs
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
   230
            lock = repo.wlock()
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
   231
        with lock:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   232
            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
   233
                self._write(f)
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17918
diff changeset
   234
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   235
    def _writeactive(self):
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   236
        if self._aclean:
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   237
            return
27800
1c5f2c2c046b with: use context manager for wlock in _writeactive
Bryan O'Sullivan <bryano@fb.com>
parents: 27799
diff changeset
   238
        with self._repo.wlock():
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   239
            if self._active is not None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   240
                with self._repo.vfs(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   241
                    b'bookmarks.current', b'w', atomictemp=True, checkambig=True
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   242
                ) as f:
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   243
                    f.write(encoding.fromlocal(self._active))
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   244
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   245
                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
   246
        self._aclean = True
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   247
22664
6bd685d2a2de bookmarks: split bookmark serialization and file handling
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22659
diff changeset
   248
    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
   249
        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
   250
            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
   251
        self._clean = True
29066
e6f490e32863 bookmarks: properly invalidate volatile sets when writing bookmarks
Augie Fackler <augie@google.com>
parents: 28182
diff changeset
   252
        self._repo.invalidatevolatilesets()
22664
6bd685d2a2de bookmarks: split bookmark serialization and file handling
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22659
diff changeset
   253
28182
e4fe4e903e97 bookmarks: add 'hg push -B .' for pushing the active bookmark (issue4917)
liscju <piotr.listkiewicz@gmail.com>
parents: 27800
diff changeset
   254
    def expandname(self, bname):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   255
        if bname == b'.':
29354
af849596752c bookmarks: abort 'push -B .' when no active bookmark
liscju <piotr.listkiewicz@gmail.com>
parents: 29300
diff changeset
   256
            if self.active:
af849596752c bookmarks: abort 'push -B .' when no active bookmark
liscju <piotr.listkiewicz@gmail.com>
parents: 29300
diff changeset
   257
                return self.active
af849596752c bookmarks: abort 'push -B .' when no active bookmark
liscju <piotr.listkiewicz@gmail.com>
parents: 29300
diff changeset
   258
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   259
                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
   260
        return bname
e4fe4e903e97 bookmarks: add 'hg push -B .' for pushing the active bookmark (issue4917)
liscju <piotr.listkiewicz@gmail.com>
parents: 27800
diff changeset
   261
32956
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   262
    def checkconflict(self, mark, force=False, target=None):
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   263
        """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
   264
        branch, or hash
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   265
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   266
        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
   267
        forward.
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   268
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   269
        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
   270
        regardless if it is a move forward.
33513
904894edb205 bookmark: use 'divergent2delete' in checkconflict
Boris Feld <boris.feld@octobus.net>
parents: 33512
diff changeset
   271
904894edb205 bookmark: use 'divergent2delete' in checkconflict
Boris Feld <boris.feld@octobus.net>
parents: 33512
diff changeset
   272
        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
   273
        """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   274
        cur = self._repo[b'.'].node()
37847
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   275
        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
   276
            if target:
37847
8256962e798c bookmarks: hide dict behind bmstore class
Yuya Nishihara <yuya@tcha.org>
parents: 37641
diff changeset
   277
                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
   278
                    # re-activating a bookmark
33513
904894edb205 bookmark: use 'divergent2delete' in checkconflict
Boris Feld <boris.feld@octobus.net>
parents: 33512
diff changeset
   279
                    return []
32956
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   280
                rev = self._repo[target].rev()
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   281
                anc = self._repo.changelog.ancestors([rev])
42978
e3bb2a58af1e bookmarks: remove changectx() method from bmstore (API)
Augie Fackler <augie@google.com>
parents: 42914
diff changeset
   282
                bmctx = self._repo[self[mark]]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   283
                divs = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   284
                    self._refmap[b]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   285
                    for b in self._refmap
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   286
                    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
   287
                ]
32956
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   288
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   289
                # 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
   290
                # 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
   291
                # that contains a divergent bookmark
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   292
                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
   293
                    return divergent2delete(self._repo, [target], mark)
32956
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   294
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   295
                deletefrom = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   296
                    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
   297
                ]
33513
904894edb205 bookmark: use 'divergent2delete' in checkconflict
Boris Feld <boris.feld@octobus.net>
parents: 33512
diff changeset
   298
                delbms = divergent2delete(self._repo, deletefrom, mark)
32956
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   299
                if validdest(self._repo, bmctx, self._repo[target]):
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   300
                    self._repo.ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   301
                        _(b"moving bookmark '%s' forward from %s\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   302
                        % (mark, short(bmctx.node()))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   303
                    )
33513
904894edb205 bookmark: use 'divergent2delete' in checkconflict
Boris Feld <boris.feld@octobus.net>
parents: 33512
diff changeset
   304
                    return delbms
32956
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   305
            raise error.Abort(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
   306
                _(b"bookmark '%s' already exists (use -f to force)") % mark
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   307
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   308
        if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   309
            mark in self._repo.branchmap()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   310
            or mark == self._repo.dirstate.branch()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   311
        ) and not force:
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   312
            raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   313
                _(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
   314
            )
32956
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   315
        if len(mark) > 3 and not force:
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   316
            try:
37397
46d9f998c3ed bookmarks: use isrevsymbol() for detecting collision with existing symbol
Martin von Zweigbergk <martinvonz@google.com>
parents: 37375
diff changeset
   317
                shadowhash = scmutil.isrevsymbol(self._repo, mark)
32956
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   318
            except error.LookupError:  # ambiguous identifier
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   319
                shadowhash = False
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   320
            if shadowhash:
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   321
                self._repo.ui.warn(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   322
                    _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   323
                        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
   324
                        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
   325
                        b"command?)\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   326
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   327
                    % mark
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   328
                )
33513
904894edb205 bookmark: use 'divergent2delete' in checkconflict
Boris Feld <boris.feld@octobus.net>
parents: 33512
diff changeset
   329
        return []
32956
4f0a7f604449 commands: move checkconflict to bookmarks module
Sean Farley <sean@farley.io>
parents: 32955
diff changeset
   330
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   331
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   332
def _readactive(repo, marks):
24946
c44534209a0a bookmarks: rename readcurrent to readactive (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24945
diff changeset
   333
    """
c44534209a0a bookmarks: rename readcurrent to readactive (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24945
diff changeset
   334
    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
   335
    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
   336
    It is stored in .hg/bookmarks.current
c44534209a0a bookmarks: rename readcurrent to readactive (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24945
diff changeset
   337
    """
42312
2b77183ac477 bookmarks: use vfs.tryread() instead of reimplementing it
Martin von Zweigbergk <martinvonz@google.com>
parents: 42311
diff changeset
   338
    # 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
   339
    # cheap.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   340
    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
   341
    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
   342
    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
   343
        mark = None
13351
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
   344
    return mark
6c5368cd2df9 bookmarks: move read methods to core
Matt Mackall <mpm@selenic.com>
parents: 13350
diff changeset
   345
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   346
24945
e0b0fbd47491 bookmarks: rename setcurrent to activate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24944
diff changeset
   347
def activate(repo, mark):
e0b0fbd47491 bookmarks: rename setcurrent to activate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24944
diff changeset
   348
    """
e0b0fbd47491 bookmarks: rename setcurrent to activate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24944
diff changeset
   349
    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
   350
    follow new commits that are made.
13350
a7376b92caaa bookmarks: move basic io to core
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   351
    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
   352
    """
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   353
    repo._bookmarks.active = mark
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   354
    repo._bookmarks._writeactive()
13352
f9cd37fca5ba bookmarks: move update into core
Matt Mackall <mpm@selenic.com>
parents: 13351
diff changeset
   355
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   356
24944
08ec11e3ae4c bookmarks: rename unsetcurrent to deactivate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24832
diff changeset
   357
def deactivate(repo):
08ec11e3ae4c bookmarks: rename unsetcurrent to deactivate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24832
diff changeset
   358
    """
26781
1aee2ab0f902 spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents: 26520
diff changeset
   359
    Unset the active bookmark in this repository.
24944
08ec11e3ae4c bookmarks: rename unsetcurrent to deactivate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24832
diff changeset
   360
    """
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   361
    repo._bookmarks.active = None
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   362
    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
   363
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   364
24986
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
   365
def isactivewdirparent(repo):
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
   366
    """
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
   367
    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
   368
    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
   369
24986
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
   370
    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
   371
    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
   372
    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
   373
    """
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
   374
    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
   375
    marks = repo._bookmarks
24986
fb9b7b937b3e bookmarks: simplify iscurrent to isactivewdirparent (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24962
diff changeset
   376
    parents = [p.node() for p in repo[None].parents()]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   377
    return mark in marks and marks[mark] in parents
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   378
18471
2096e025a728 update: update to current bookmark if it moved out from under us (issue3682)
Kevin Bullock <kbullock@ringworld.org>
parents: 18363
diff changeset
   379
33510
07b556d1b74e bookmark: split out target computation from 'deletedivergent'
Boris Feld <boris.feld@octobus.net>
parents: 33499
diff changeset
   380
def divergent2delete(repo, deletefrom, bm):
07b556d1b74e bookmark: split out target computation from 'deletedivergent'
Boris Feld <boris.feld@octobus.net>
parents: 33499
diff changeset
   381
    """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
   382
07b556d1b74e bookmark: split out target computation from 'deletedivergent'
Boris Feld <boris.feld@octobus.net>
parents: 33499
diff changeset
   383
    the list of bookmark to delete."""
07b556d1b74e bookmark: split out target computation from 'deletedivergent'
Boris Feld <boris.feld@octobus.net>
parents: 33499
diff changeset
   384
    todelete = []
18513
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   385
    marks = repo._bookmarks
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   386
    divergent = [
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   387
        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
   388
    ]
18513
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   389
    for mark in divergent:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   390
        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
   391
            # can't be divergent by definition
92666a869ea4 bookmarks: avoid deleting primary bookmarks on rebase
Matt Mackall <mpm@selenic.com>
parents: 20352
diff changeset
   392
            continue
18513
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   393
        if mark and marks[mark] in deletefrom:
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   394
            if mark != bm:
33510
07b556d1b74e bookmark: split out target computation from 'deletedivergent'
Boris Feld <boris.feld@octobus.net>
parents: 33499
diff changeset
   395
                todelete.append(mark)
07b556d1b74e bookmark: split out target computation from 'deletedivergent'
Boris Feld <boris.feld@octobus.net>
parents: 33499
diff changeset
   396
    return todelete
18513
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   397
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   398
32381
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   399
def headsforactive(repo):
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   400
    """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
   401
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   402
    Args:
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   403
      repo: A repository with an active bookmark.
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   404
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   405
    Returns:
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   406
      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
   407
      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
   408
      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
   409
      only one entry.
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   410
    """
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   411
    if not repo._activebookmark:
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   412
        raise ValueError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   413
            b'headsforactive() only makes sense with an active bookmark'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   414
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   415
    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
   416
    heads = []
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43089
diff changeset
   417
    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
   418
        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
   419
            heads.append(n)
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   420
    return heads
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31544
diff changeset
   421
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   422
37375
a973bb92ab71 bookmarks: drop always-None argument from calculateupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37359
diff changeset
   423
def calculateupdate(ui, repo):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45913
diff changeset
   424
    """Return a tuple (activemark, movemarkfrom) indicating the active bookmark
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45913
diff changeset
   425
    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
   426
    checkout, movemarkfrom = None, None
a973bb92ab71 bookmarks: drop always-None argument from calculateupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37359
diff changeset
   427
    activemark = repo._activebookmark
a973bb92ab71 bookmarks: drop always-None argument from calculateupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37359
diff changeset
   428
    if isactivewdirparent(repo):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   429
        movemarkfrom = repo[b'.'].node()
37375
a973bb92ab71 bookmarks: drop always-None argument from calculateupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37359
diff changeset
   430
    elif activemark:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   431
        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
   432
        checkout = activemark
19523
f37b5a17e6a0 bookmarks: pull --update updates to active bookmark if it moved (issue4007)
Kevin Bullock <kbullock@ringworld.org>
parents: 19110
diff changeset
   433
    return (checkout, movemarkfrom)
f37b5a17e6a0 bookmarks: pull --update updates to active bookmark if it moved (issue4007)
Kevin Bullock <kbullock@ringworld.org>
parents: 19110
diff changeset
   434
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   435
13352
f9cd37fca5ba bookmarks: move update into core
Matt Mackall <mpm@selenic.com>
parents: 13351
diff changeset
   436
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
   437
    deletefrom = parents
13352
f9cd37fca5ba bookmarks: move update into core
Matt Mackall <mpm@selenic.com>
parents: 13351
diff changeset
   438
    marks = repo._bookmarks
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27685
diff changeset
   439
    active = marks.active
25100
d6e7ac651973 bookmarks: rename current to active in variables and comments
Ryan McElroy <rmcelroy@fb.com>
parents: 25081
diff changeset
   440
    if not active:
16706
a270ec977ba6 bookmarks: delete divergent bookmarks on merge
David Soria Parra <dsp@php.net>
parents: 16697
diff changeset
   441
        return False
a270ec977ba6 bookmarks: delete divergent bookmarks on merge
David Soria Parra <dsp@php.net>
parents: 16697
diff changeset
   442
33491
1adcb594eb6b bookmarks: use 'applychanges' for bookmark update
Boris Feld <boris.feld@octobus.net>
parents: 33485
diff changeset
   443
    bmchanges = []
25100
d6e7ac651973 bookmarks: rename current to active in variables and comments
Ryan McElroy <rmcelroy@fb.com>
parents: 25081
diff changeset
   444
    if marks[active] in parents:
18513
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   445
        new = repo[node]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   446
        divs = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   447
            repo[marks[b]]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   448
            for b in marks
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   449
            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
   450
        ]
19110
741d94aa92e4 bookmarks: resolve divergent bookmarks when moving active bookmark forward
Sean Farley <sean.michael.farley@gmail.com>
parents: 18984
diff changeset
   451
        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
   452
        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
   453
        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
   454
            bmchanges.append((active, new.node()))
18513
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   455
33512
1424a769f31b bookmark: use 'divergent2delete' when updating a bookmark
Boris Feld <boris.feld@octobus.net>
parents: 33510
diff changeset
   456
    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
   457
        bmchanges.append((bm, None))
18513
37ce336ab2dd bookmarks: factor out delete divergent code
Siddharth Agarwal <sid0@fb.com>
parents: 18496
diff changeset
   458
33512
1424a769f31b bookmark: use 'divergent2delete' when updating a bookmark
Boris Feld <boris.feld@octobus.net>
parents: 33510
diff changeset
   459
    if bmchanges:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   460
        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
   461
            marks.applychanges(repo, tr, bmchanges)
33512
1424a769f31b bookmark: use 'divergent2delete' when updating a bookmark
Boris Feld <boris.feld@octobus.net>
parents: 33510
diff changeset
   462
    return bool(bmchanges)
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   463
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   464
44371
0275000564c4 bookmarks: refactor in preparation for next commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44370
diff changeset
   465
def isdivergent(b):
0275000564c4 bookmarks: refactor in preparation for next commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44370
diff changeset
   466
    return b'@' in b and not b.endswith(b'@')
0275000564c4 bookmarks: refactor in preparation for next commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44370
diff changeset
   467
0275000564c4 bookmarks: refactor in preparation for next commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44370
diff changeset
   468
30481
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   469
def listbinbookmarks(repo):
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   470
    # 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
   471
    # support it (e.g., statichttprepository).
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   472
    marks = getattr(repo, '_bookmarks', {})
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   473
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   474
    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
   475
    for k, v in pycompat.iteritems(marks):
30481
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   476
        # don't expose local divergent bookmarks
44371
0275000564c4 bookmarks: refactor in preparation for next commit
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44370
diff changeset
   477
        if hasnode(v) and not isdivergent(k):
30481
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   478
            yield k, v
0a3b11a7489a bookmarks: introduce listbinbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 29354
diff changeset
   479
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   480
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   481
def listbookmarks(repo):
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   482
    d = {}
30482
55ec13c82ea0 bookmarks: use listbinbookmarks() in listbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 30481
diff changeset
   483
    for book, node in listbinbookmarks(repo):
55ec13c82ea0 bookmarks: use listbinbookmarks() in listbookmarks()
Stanislau Hlebik <stash@fb.com>
parents: 30481
diff changeset
   484
        d[book] = hex(node)
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   485
    return d
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   486
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   487
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   488
def pushbookmark(repo, key, old, new):
44372
8407031f195f bookmarks: prevent pushes of divergent bookmarks (foo@remote)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44371
diff changeset
   489
    if isdivergent(key):
8407031f195f bookmarks: prevent pushes of divergent bookmarks (foo@remote)
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44371
diff changeset
   490
        return False
42325
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
   491
    if bookmarksinstore(repo):
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
   492
        wlock = util.nullcontextmanager()
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
   493
    else:
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42312
diff changeset
   494
        wlock = repo.wlock()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   495
    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
   496
        marks = repo._bookmarks
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   497
        existing = hex(marks.get(key, b''))
22364
5c153c69fdb2 bookmarks: allow pushkey if new equals current
Durham Goode <durham@fb.com>
parents: 21843
diff changeset
   498
        if existing != old and existing != new:
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   499
            return False
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   500
        if new == b'':
33485
505021482541 bookmark: use 'applychanges' when updating a bookmark through pushkey
Boris Feld <boris.feld@octobus.net>
parents: 33484
diff changeset
   501
            changes = [(key, None)]
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   502
        else:
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   503
            if new not in repo:
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   504
                return False
33485
505021482541 bookmark: use 'applychanges' when updating a bookmark through pushkey
Boris Feld <boris.feld@octobus.net>
parents: 33484
diff changeset
   505
            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
   506
        marks.applychanges(repo, tr, changes)
13353
689bf32b3bbd bookmarks: move pushkey functions into core
Matt Mackall <mpm@selenic.com>
parents: 13352
diff changeset
   507
        return True
13354
4e1ba6ead69c bookmarks: move diff to core
Matt Mackall <mpm@selenic.com>
parents: 13353
diff changeset
   508
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   509
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   510
def comparebookmarks(repo, srcmarks, dstmarks, targets=None):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45913
diff changeset
   511
    """Compare bookmarks between srcmarks and dstmarks
20024
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   512
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   513
    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
   514
    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
   515
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   516
    :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
   517
    :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
   518
    :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
   519
    :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
   520
    :diverge: diverge
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   521
    :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
   522
    :invalid: unknown on both side
23081
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
   523
    :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
   524
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   525
    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
   526
    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
   527
    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
   528
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   529
    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
   530
     "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
   531
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   532
    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
   533
    examined.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45913
diff changeset
   534
    """
20024
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   535
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   536
    if targets:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   537
        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
   538
    else:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   539
        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
   540
        dstmarkset = set(dstmarks)
23081
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
   541
        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
   542
23081
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
   543
    results = ([], [], [], [], [], [], [], [])
20024
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   544
    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
   545
    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
   546
    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
   547
    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
   548
    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
   549
    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
   550
    invalid = results[6].append
23081
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
   551
    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
   552
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   553
    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
   554
        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
   555
            if b in dstmarks:
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   556
                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
   557
            else:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   558
                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
   559
        elif b not in dstmarks:
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   560
            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
   561
        else:
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   562
            scid = srcmarks[b]
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   563
            dcid = dstmarks[b]
23081
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
   564
            if scid == dcid:
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
   565
                same((b, scid, dcid))
e62c330a044f bookmarks: explicitly track identical bookmarks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22941
diff changeset
   566
            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
   567
                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
   568
                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
   569
                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
   570
                    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
   571
                        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
   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
                        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
   574
                else:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   575
                    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
   576
                        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
   577
                    else:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   578
                        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
   579
            else:
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   580
                # 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
   581
                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
   582
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   583
    return results
059b695150c2 bookmarks: add function to centralize the logic to compare bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19951
diff changeset
   584
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   585
24355
ca4b89683078 bookmarks: reuse @number bookmark, if it refers changeset referred remotely
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24354
diff changeset
   586
def _diverge(ui, b, path, localmarks, remotenode):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45913
diff changeset
   587
    """Return appropriate diverged bookmark for specified ``path``
24353
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
   588
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
   589
    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
   590
    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
   591
ca4b89683078 bookmarks: reuse @number bookmark, if it refers changeset referred remotely
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24354
diff changeset
   592
    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
   593
    refers ``remotenode``.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45913
diff changeset
   594
    """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   595
    if b == b'@':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   596
        b = b''
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   597
    # try to use an @pathalias suffix
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   598
    # 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
   599
    if path.startswith(b"file:"):
22629
b3f74b405c20 bookmarks: fix divergent bookmark path normalization
Matt Mackall <mpm@selenic.com>
parents: 22627
diff changeset
   600
        path = util.url(path).path
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   601
    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
   602
        if u.startswith(b"file:"):
22629
b3f74b405c20 bookmarks: fix divergent bookmark path normalization
Matt Mackall <mpm@selenic.com>
parents: 22627
diff changeset
   603
            u = util.url(u).path
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   604
        if path == u:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   605
            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
   606
194e1e3ebc29 bookmarks: check @pathalias suffix before available @number for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24353
diff changeset
   607
    # 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
   608
    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
   609
        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
   610
        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
   611
            return n
194e1e3ebc29 bookmarks: check @pathalias suffix before available @number for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24353
diff changeset
   612
194e1e3ebc29 bookmarks: check @pathalias suffix before available @number for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24353
diff changeset
   613
    return None
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   614
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   615
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   616
def unhexlifybookmarks(marks):
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   617
    binremotemarks = {}
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   618
    for name, node in marks.items():
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   619
        binremotemarks[name] = bin(node)
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   620
    return binremotemarks
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   621
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   622
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   623
_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
   624
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   625
35257
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   626
def binaryencode(bookmarks):
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   627
    """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
   628
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   629
    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
   630
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   631
        <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
   632
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   633
    :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
   634
    :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
   635
    :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
   636
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   637
    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
   638
    """
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   639
    binarydata = []
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   640
    for book, node in bookmarks:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   641
        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
   642
            node = wdirid
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   643
        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
   644
        binarydata.append(book)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   645
    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
   646
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   647
35257
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   648
def binarydecode(stream):
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   649
    """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
   650
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   651
    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
   652
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   653
        <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
   654
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   655
    :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
   656
    :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
   657
    :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
   658
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   659
    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
   660
    """
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   661
    entrysize = _binaryentry.size
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   662
    books = []
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   663
    while True:
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   664
        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
   665
        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
   666
            if entry:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   667
                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
   668
            break
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   669
        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
   670
        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
   671
        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
   672
            if entry:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   673
                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
   674
        if node == wdirid:
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   675
            node = None
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   676
        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
   677
    return books
3340d46a5c3f bookmark: add methods to binary encode and decode bookmark values
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
   678
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   679
22666
0f8120c1ecf5 pull: perform bookmark updates in the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22665
diff changeset
   680
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
   681
    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
   682
    localmarks = repo._bookmarks
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   683
    (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   684
        addsrc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   685
        adddst,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   686
        advsrc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   687
        advdst,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   688
        diverge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   689
        differ,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   690
        invalid,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   691
        same,
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   692
    ) = 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
   693
22644
1ec7cdaf898f bookmarks: allow `updatefromremote` to be quiet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22629
diff changeset
   694
    status = ui.status
1ec7cdaf898f bookmarks: allow `updatefromremote` to be quiet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22629
diff changeset
   695
    warn = ui.warn
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   696
    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
   697
        status = warn = ui.debug
1ec7cdaf898f bookmarks: allow `updatefromremote` to be quiet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22629
diff changeset
   698
22659
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
   699
    explicit = set(explicit)
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   700
    changed = []
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   701
    for b, scid, dcid in addsrc:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   702
        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
   703
            changed.append(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   704
                (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
   705
            )
25564
847fce27effc bookmark: informs of failure to upgrade a bookmark
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25100
diff changeset
   706
        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
   707
            explicit.remove(b)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   708
            ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   709
                _(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
   710
                % (b, hex(scid)[:12])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   711
            )
25564
847fce27effc bookmark: informs of failure to upgrade a bookmark
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25100
diff changeset
   712
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   713
    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
   714
        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
   715
    # 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
   716
    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
   717
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   718
    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
   719
        if b in explicit:
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
   720
            explicit.discard(b)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   721
            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
   722
        else:
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   723
            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
   724
            if db:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   725
                changed.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   726
                    (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   727
                        db,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   728
                        scid,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   729
                        warn,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   730
                        _(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
   731
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   732
                )
24353
3f6bf9f29e7b bookmarks: prevent divergent bookmark from being updated unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24306
diff changeset
   733
            else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   734
                warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   735
                    _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   736
                        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
   737
                        b"to divergent bookmark %s\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   738
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   739
                    % b
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   740
                )
22659
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
   741
    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
   742
        if b in explicit:
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
   743
            explicit.discard(b)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   744
            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
   745
    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
   746
        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
   747
            explicit.remove(b)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   748
            ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   749
                _(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
   750
                % (b, hex(scid)[:12])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   751
            )
22659
798185707833 pull: merge bookmark updates and imports
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22658
diff changeset
   752
13646
31eac42d9123 bookmarks: separate bookmarks update code from localrepo's pull.
David Soria Parra <dsp@php.net>
parents: 13627
diff changeset
   753
    if changed:
22666
0f8120c1ecf5 pull: perform bookmark updates in the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22665
diff changeset
   754
        tr = trfunc()
33484
2a8ce4e79a47 bookmark: use 'applychanges' when updating from a remote
Boris Feld <boris.feld@octobus.net>
parents: 33483
diff changeset
   755
        changes = []
44824
f189c5280d48 py3: fix exception in pull when several things happen to a bookmark
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 44372
diff changeset
   756
        key = lambda t: (t[0], t[1] or b'')
f189c5280d48 py3: fix exception in pull when several things happen to a bookmark
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 44372
diff changeset
   757
        for b, node, writer, msg in sorted(changed, key=key):
33484
2a8ce4e79a47 bookmark: use 'applychanges' when updating from a remote
Boris Feld <boris.feld@octobus.net>
parents: 33483
diff changeset
   758
            changes.append((b, node))
20025
e8a11791abfc bookmarks: rewrite "updatefromremote()" by "compare()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20024
diff changeset
   759
            writer(msg)
33484
2a8ce4e79a47 bookmark: use 'applychanges' when updating from a remote
Boris Feld <boris.feld@octobus.net>
parents: 33483
diff changeset
   760
        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
   761
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   762
37641
add129811176 bookmarks: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37450
diff changeset
   763
def incoming(ui, repo, peer):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45913
diff changeset
   764
    """Show bookmarks incoming from other to repo"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   765
    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
   766
37641
add129811176 bookmarks: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37450
diff changeset
   767
    with peer.commandexecutor() as e:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   768
        remotemarks = unhexlifybookmarks(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45913
diff changeset
   769
            e.callcommand(
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45913
diff changeset
   770
                b'listkeys',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45913
diff changeset
   771
                {
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45913
diff changeset
   772
                    b'namespace': b'bookmarks',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45913
diff changeset
   773
                },
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45913
diff changeset
   774
            ).result()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   775
        )
37641
add129811176 bookmarks: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37450
diff changeset
   776
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   777
    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
   778
    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
   779
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   780
    incomings = []
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   781
    if ui.debugflag:
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   782
        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
   783
    else:
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   784
        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
   785
    if ui.verbose:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   786
24660
bf13b44bbb0a bookmarks: show detailed status about incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24658
diff changeset
   787
        def add(b, id, st):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   788
            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
   789
24660
bf13b44bbb0a bookmarks: show detailed status about incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24658
diff changeset
   790
    else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   791
24660
bf13b44bbb0a bookmarks: show detailed status about incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24658
diff changeset
   792
        def add(b, id, st):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   793
            incomings.append(b"   %-25s %s\n" % (b, getid(id)))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   794
24397
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   795
    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
   796
        # 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
   797
        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
   798
    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
   799
        # 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
   800
        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
   801
    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
   802
        # 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
   803
        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
   804
    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
   805
        # 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
   806
        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
   807
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   808
    if not incomings:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   809
        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
   810
        return 1
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   811
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   812
    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
   813
        ui.write(s)
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   814
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   815
    return 0
d0ea2028e8e6 bookmarks: add incoming() to replace diff() for incoming bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24355
diff changeset
   816
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   817
24398
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   818
def outgoing(ui, repo, other):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45913
diff changeset
   819
    """Show bookmarks outgoing from repo to other"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   820
    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
   821
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   822
    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
   823
    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
   824
    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
   825
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   826
    outgoings = []
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   827
    if ui.debugflag:
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   828
        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
   829
    else:
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   830
        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
   831
    if ui.verbose:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   832
24661
8cf70c97a6e1 bookmarks: show detailed status about outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24660
diff changeset
   833
        def add(b, id, st):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   834
            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
   835
24661
8cf70c97a6e1 bookmarks: show detailed status about outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24660
diff changeset
   836
    else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   837
24661
8cf70c97a6e1 bookmarks: show detailed status about outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24660
diff changeset
   838
        def add(b, id, st):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   839
            outgoings.append(b"   %-25s %s\n" % (b, getid(id)))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   840
24398
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   841
    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
   842
        # 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
   843
        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
   844
    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
   845
        # 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
   846
        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
   847
    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
   848
        # 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
   849
        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
   850
    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
   851
        # 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
   852
        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
   853
    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
   854
        # 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
   855
        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
   856
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   857
    if not outgoings:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   858
        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
   859
        return 1
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   860
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   861
    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
   862
        ui.write(s)
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   863
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   864
    return 0
c0096a2bd3ff bookmarks: add outgoing() to replace diff() for outgoing bookmarks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24397
diff changeset
   865
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   866
37641
add129811176 bookmarks: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37450
diff changeset
   867
def summary(repo, peer):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45913
diff changeset
   868
    """Compare bookmarks between repo and other for "hg summary" output
24400
03c84c966ef5 bookmarks: rewrite comparing bookmarks in commands.summary() by compare()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24399
diff changeset
   869
03c84c966ef5 bookmarks: rewrite comparing bookmarks in commands.summary() by compare()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24399
diff changeset
   870
    This returns "(# of incoming, # of outgoing)" tuple.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45913
diff changeset
   871
    """
37641
add129811176 bookmarks: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37450
diff changeset
   872
    with peer.commandexecutor() as e:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   873
        remotemarks = unhexlifybookmarks(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45913
diff changeset
   874
            e.callcommand(
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45913
diff changeset
   875
                b'listkeys',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45913
diff changeset
   876
                {
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45913
diff changeset
   877
                    b'namespace': b'bookmarks',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45913
diff changeset
   878
                },
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45913
diff changeset
   879
            ).result()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   880
        )
37641
add129811176 bookmarks: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37450
diff changeset
   881
30583
8f8211903b83 bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
Stanislau Hlebik <stash@fb.com>
parents: 30582
diff changeset
   882
    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
   883
    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
   884
    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
   885
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   886
17550
fc530080013b bookmarks: extract valid destination logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17425
diff changeset
   887
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
   888
    """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
   889
    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
   890
    if old == new:
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
   891
        # 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
   892
        return False
17551
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
   893
    elif not old:
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
   894
        # 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
   895
        # (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
   896
        return True
17551
a7b3fdaf768d bookmark: take successors into account when updating (issue3561)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17550
diff changeset
   897
    elif repo.obsstore:
33146
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33092
diff changeset
   898
        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
   899
    else:
24180
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23877
diff changeset
   900
        # 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
   901
        return old.isancestorof(new)
32955
70661eeb8ddb commands: move checkformat to bookmarks module
Sean Farley <sean@farley.io>
parents: 32794
diff changeset
   902
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   903
32955
70661eeb8ddb commands: move checkformat to bookmarks module
Sean Farley <sean@farley.io>
parents: 32794
diff changeset
   904
def checkformat(repo, mark):
70661eeb8ddb commands: move checkformat to bookmarks module
Sean Farley <sean@farley.io>
parents: 32794
diff changeset
   905
    """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
   906
70661eeb8ddb commands: move checkformat to bookmarks module
Sean Farley <sean@farley.io>
parents: 32794
diff changeset
   907
    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
   908
    """
70661eeb8ddb commands: move checkformat to bookmarks module
Sean Farley <sean@farley.io>
parents: 32794
diff changeset
   909
    mark = mark.strip()
70661eeb8ddb commands: move checkformat to bookmarks module
Sean Farley <sean@farley.io>
parents: 32794
diff changeset
   910
    if not mark:
45913
9acbe30953e8 errors: raise InputError on bad bookmark argument
Martin von Zweigbergk <martinvonz@google.com>
parents: 44824
diff changeset
   911
        raise error.InputError(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
   912
            _(b"bookmark names cannot consist entirely of whitespace")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   913
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   914
    scmutil.checknewlabel(repo, mark, b'bookmark')
32955
70661eeb8ddb commands: move checkformat to bookmarks module
Sean Farley <sean@farley.io>
parents: 32794
diff changeset
   915
    return mark
33005
9343fce87789 bookmarks: factor out delete logic from commands
Sean Farley <sean@farley.io>
parents: 32956
diff changeset
   916
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   917
33005
9343fce87789 bookmarks: factor out delete logic from commands
Sean Farley <sean@farley.io>
parents: 32956
diff changeset
   918
def delete(repo, tr, names):
9343fce87789 bookmarks: factor out delete logic from commands
Sean Farley <sean@farley.io>
parents: 32956
diff changeset
   919
    """remove a mark from the bookmark store
9343fce87789 bookmarks: factor out delete logic from commands
Sean Farley <sean@farley.io>
parents: 32956
diff changeset
   920
9343fce87789 bookmarks: factor out delete logic from commands
Sean Farley <sean@farley.io>
parents: 32956
diff changeset
   921
    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
   922
    """
9343fce87789 bookmarks: factor out delete logic from commands
Sean Farley <sean@farley.io>
parents: 32956
diff changeset
   923
    marks = repo._bookmarks
33481
67b5f81f17cf bookmark: use 'applychanges' for bookmark deletion
Boris Feld <boris.feld@octobus.net>
parents: 33480
diff changeset
   924
    changes = []
33005
9343fce87789 bookmarks: factor out delete logic from commands
Sean Farley <sean@farley.io>
parents: 32956
diff changeset
   925
    for mark in names:
9343fce87789 bookmarks: factor out delete logic from commands
Sean Farley <sean@farley.io>
parents: 32956
diff changeset
   926
        if mark not in marks:
45913
9acbe30953e8 errors: raise InputError on bad bookmark argument
Martin von Zweigbergk <martinvonz@google.com>
parents: 44824
diff changeset
   927
            raise error.InputError(_(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
   928
        if mark == repo._activebookmark:
9343fce87789 bookmarks: factor out delete logic from commands
Sean Farley <sean@farley.io>
parents: 32956
diff changeset
   929
            deactivate(repo)
33481
67b5f81f17cf bookmark: use 'applychanges' for bookmark deletion
Boris Feld <boris.feld@octobus.net>
parents: 33480
diff changeset
   930
        changes.append((mark, None))
67b5f81f17cf bookmark: use 'applychanges' for bookmark deletion
Boris Feld <boris.feld@octobus.net>
parents: 33480
diff changeset
   931
    marks.applychanges(repo, tr, changes)
33006
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   932
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   933
33006
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   934
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
   935
    """rename a bookmark from old to new
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   936
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   937
    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
   938
    bookmark.
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   939
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   940
    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
   941
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   942
    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
   943
    """
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   944
    marks = repo._bookmarks
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   945
    mark = checkformat(repo, new)
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   946
    if old not in marks:
45913
9acbe30953e8 errors: raise InputError on bad bookmark argument
Martin von Zweigbergk <martinvonz@google.com>
parents: 44824
diff changeset
   947
        raise error.InputError(_(b"bookmark '%s' does not exist") % old)
33513
904894edb205 bookmark: use 'divergent2delete' in checkconflict
Boris Feld <boris.feld@octobus.net>
parents: 33512
diff changeset
   948
    changes = []
904894edb205 bookmark: use 'divergent2delete' in checkconflict
Boris Feld <boris.feld@octobus.net>
parents: 33512
diff changeset
   949
    for bm in marks.checkconflict(mark, force):
904894edb205 bookmark: use 'divergent2delete' in checkconflict
Boris Feld <boris.feld@octobus.net>
parents: 33512
diff changeset
   950
        changes.append((bm, None))
904894edb205 bookmark: use 'divergent2delete' in checkconflict
Boris Feld <boris.feld@octobus.net>
parents: 33512
diff changeset
   951
    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
   952
    marks.applychanges(repo, tr, changes)
33006
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   953
    if repo._activebookmark == old and not inactive:
e0a8dd6c87c7 bookmarks: factor out rename logic from commands
Sean Farley <sean@farley.io>
parents: 33005
diff changeset
   954
        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
   955
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
   956
33007
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   957
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
   958
    """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
   959
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   960
    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
   961
    bookmark.
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   962
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   963
    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
   964
    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
   965
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   966
    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
   967
    """
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   968
    marks = repo._bookmarks
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   969
    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
   970
    newact = None
33483
146c0371eadf bookmark: use 'applychanges' for adding new bookmark
Boris Feld <boris.feld@octobus.net>
parents: 33482
diff changeset
   971
    changes = []
35647
fc39e2bfcd70 bookmarks: calculate visibility exceptions only once
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35611
diff changeset
   972
fc39e2bfcd70 bookmarks: calculate visibility exceptions only once
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35611
diff changeset
   973
    # unhide revs if any
fc39e2bfcd70 bookmarks: calculate visibility exceptions only once
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35611
diff changeset
   974
    if rev:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   975
        repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
43600
fe2e0d100187 bookmarks: use changectx instead of remembering hex of hidden revision
Yuya Nishihara <yuya@tcha.org>
parents: 43599
diff changeset
   976
43601
a80d5ddecc2d bookmarks: accept explicit -r 'wdir()' when adding new bookmarks (issue6218)
Yuya Nishihara <yuya@tcha.org>
parents: 43600
diff changeset
   977
    ctx = scmutil.revsingle(repo, rev, None)
a80d5ddecc2d bookmarks: accept explicit -r 'wdir()' when adding new bookmarks (issue6218)
Yuya Nishihara <yuya@tcha.org>
parents: 43600
diff changeset
   978
    # bookmarking wdir means creating a bookmark on p1 and activating it
a80d5ddecc2d bookmarks: accept explicit -r 'wdir()' when adding new bookmarks (issue6218)
Yuya Nishihara <yuya@tcha.org>
parents: 43600
diff changeset
   979
    activatenew = not inactive and ctx.rev() is None
a80d5ddecc2d bookmarks: accept explicit -r 'wdir()' when adding new bookmarks (issue6218)
Yuya Nishihara <yuya@tcha.org>
parents: 43600
diff changeset
   980
    if ctx.node() is None:
a80d5ddecc2d bookmarks: accept explicit -r 'wdir()' when adding new bookmarks (issue6218)
Yuya Nishihara <yuya@tcha.org>
parents: 43600
diff changeset
   981
        ctx = ctx.p1()
43600
fe2e0d100187 bookmarks: use changectx instead of remembering hex of hidden revision
Yuya Nishihara <yuya@tcha.org>
parents: 43599
diff changeset
   982
    tgt = ctx.node()
43601
a80d5ddecc2d bookmarks: accept explicit -r 'wdir()' when adding new bookmarks (issue6218)
Yuya Nishihara <yuya@tcha.org>
parents: 43600
diff changeset
   983
    assert tgt
35647
fc39e2bfcd70 bookmarks: calculate visibility exceptions only once
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35611
diff changeset
   984
33007
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   985
    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
   986
        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
   987
        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
   988
            newact = mark
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
   989
        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
   990
            deactivate(repo)
43598
2a8cd7edf409 bookmarks: fix handling of multiple bookmarks with one to be deactivated
Yuya Nishihara <yuya@tcha.org>
parents: 43544
diff changeset
   991
            continue
33513
904894edb205 bookmark: use 'divergent2delete' in checkconflict
Boris Feld <boris.feld@octobus.net>
parents: 33512
diff changeset
   992
        for bm in marks.checkconflict(mark, force, tgt):
904894edb205 bookmark: use 'divergent2delete' in checkconflict
Boris Feld <boris.feld@octobus.net>
parents: 33512
diff changeset
   993
            changes.append((bm, None))
33483
146c0371eadf bookmark: use 'applychanges' for adding new bookmark
Boris Feld <boris.feld@octobus.net>
parents: 33482
diff changeset
   994
        changes.append((mark, tgt))
35647
fc39e2bfcd70 bookmarks: calculate visibility exceptions only once
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35611
diff changeset
   995
43598
2a8cd7edf409 bookmarks: fix handling of multiple bookmarks with one to be deactivated
Yuya Nishihara <yuya@tcha.org>
parents: 43544
diff changeset
   996
    # nothing changed but for the one deactivated above
2a8cd7edf409 bookmarks: fix handling of multiple bookmarks with one to be deactivated
Yuya Nishihara <yuya@tcha.org>
parents: 43544
diff changeset
   997
    if not changes:
2a8cd7edf409 bookmarks: fix handling of multiple bookmarks with one to be deactivated
Yuya Nishihara <yuya@tcha.org>
parents: 43544
diff changeset
   998
        return
2a8cd7edf409 bookmarks: fix handling of multiple bookmarks with one to be deactivated
Yuya Nishihara <yuya@tcha.org>
parents: 43544
diff changeset
   999
43600
fe2e0d100187 bookmarks: use changectx instead of remembering hex of hidden revision
Yuya Nishihara <yuya@tcha.org>
parents: 43599
diff changeset
  1000
    if ctx.hidden():
fe2e0d100187 bookmarks: use changectx instead of remembering hex of hidden revision
Yuya Nishihara <yuya@tcha.org>
parents: 43599
diff changeset
  1001
        repo.ui.warn(_(b"bookmarking hidden changeset %s\n") % ctx.hex()[:12])
35712
a1a5c3842b6f bookmarks: display the obsfate of hidden revision we create a bookmark on
Boris Feld <boris.feld@octobus.net>
parents: 35679
diff changeset
  1002
a1a5c3842b6f bookmarks: display the obsfate of hidden revision we create a bookmark on
Boris Feld <boris.feld@octobus.net>
parents: 35679
diff changeset
  1003
        if ctx.obsolete():
43600
fe2e0d100187 bookmarks: use changectx instead of remembering hex of hidden revision
Yuya Nishihara <yuya@tcha.org>
parents: 43599
diff changeset
  1004
            msg = obsutil._getfilteredreason(repo, ctx.hex()[:12], ctx)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1005
            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
  1006
33483
146c0371eadf bookmark: use 'applychanges' for adding new bookmark
Boris Feld <boris.feld@octobus.net>
parents: 33482
diff changeset
  1007
    marks.applychanges(repo, tr, changes)
43601
a80d5ddecc2d bookmarks: accept explicit -r 'wdir()' when adding new bookmarks (issue6218)
Yuya Nishihara <yuya@tcha.org>
parents: 43600
diff changeset
  1008
    if activatenew and cur == marks[newact]:
33007
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
  1009
        activate(repo, newact)
ee081f91b179 bookmarks: factor out adding a list of bookmarks logic from commands
Sean Farley <sean@farley.io>
parents: 33006
diff changeset
  1010
    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
  1011
        deactivate(repo)
33010
f5f4c72de71a bookmarks: factor out bookmark printing from commands
Sean Farley <sean@farley.io>
parents: 33009
diff changeset
  1012
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
  1013
39746
25cc5616adc9 bookmarks: pass in formatter to printbookmarks() instead of opts (API)
Yuya Nishihara <yuya@tcha.org>
parents: 39624
diff changeset
  1014
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
  1015
    """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
  1016
8299eb9b08c7 bookmarks: factor method _printer out of for loop in printbookmarks
Sean Farley <sean@farley.io>
parents: 33010
diff changeset
  1017
    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
  1018
    prepend or postpend names)
8299eb9b08c7 bookmarks: factor method _printer out of for loop in printbookmarks
Sean Farley <sean@farley.io>
parents: 33010
diff changeset
  1019
    """
8299eb9b08c7 bookmarks: factor method _printer out of for loop in printbookmarks
Sean Farley <sean@farley.io>
parents: 33010
diff changeset
  1020
    hexfn = fm.hexfunc
8299eb9b08c7 bookmarks: factor method _printer out of for loop in printbookmarks
Sean Farley <sean@farley.io>
parents: 33010
diff changeset
  1021
    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
  1022
        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
  1023
    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
  1024
        fm.startitem()
39624
713085b45810 formatter: replace contexthint() with demand loading of ctx object
Yuya Nishihara <yuya@tcha.org>
parents: 39304
diff changeset
  1025
        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
  1026
        if not ui.quiet:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1027
            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
  1028
        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
  1029
        pad = b" " * (25 - encoding.colwidth(bmark))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
  1030
        fm.condwrite(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
  1031
            not ui.quiet,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1032
            b'rev node',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1033
            pad + b' %d:%s',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
  1034
            repo.changelog.rev(n),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
  1035
            hexfn(n),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
  1036
            label=label,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
  1037
        )
33011
8299eb9b08c7 bookmarks: factor method _printer out of for loop in printbookmarks
Sean Farley <sean@farley.io>
parents: 33010
diff changeset
  1038
        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
  1039
        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
  1040
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
  1041
39753
b05b4b91de3d bookmarks: add explicit option to list bookmarks of the given names
Yuya Nishihara <yuya@tcha.org>
parents: 39746
diff changeset
  1042
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
  1043
    """print bookmarks by the given formatter
33010
f5f4c72de71a bookmarks: factor out bookmark printing from commands
Sean Farley <sean@farley.io>
parents: 33009
diff changeset
  1044
f5f4c72de71a bookmarks: factor out bookmark printing from commands
Sean Farley <sean@farley.io>
parents: 33009
diff changeset
  1045
    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
  1046
    """
f5f4c72de71a bookmarks: factor out bookmark printing from commands
Sean Farley <sean@farley.io>
parents: 33009
diff changeset
  1047
    marks = repo._bookmarks
33011
8299eb9b08c7 bookmarks: factor method _printer out of for loop in printbookmarks
Sean Farley <sean@farley.io>
parents: 33010
diff changeset
  1048
    bmarks = {}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
  1049
    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
  1050
        if bmark not in marks:
45913
9acbe30953e8 errors: raise InputError on bad bookmark argument
Martin von Zweigbergk <martinvonz@google.com>
parents: 44824
diff changeset
  1051
            raise error.InputError(_(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
  1052
        active = repo._activebookmark
f5f4c72de71a bookmarks: factor out bookmark printing from commands
Sean Farley <sean@farley.io>
parents: 33009
diff changeset
  1053
        if bmark == active:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1054
            prefix, label = b'*', activebookmarklabel
33010
f5f4c72de71a bookmarks: factor out bookmark printing from commands
Sean Farley <sean@farley.io>
parents: 33009
diff changeset
  1055
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1056
            prefix, label = b' ', b''
33010
f5f4c72de71a bookmarks: factor out bookmark printing from commands
Sean Farley <sean@farley.io>
parents: 33009
diff changeset
  1057
39753
b05b4b91de3d bookmarks: add explicit option to list bookmarks of the given names
Yuya Nishihara <yuya@tcha.org>
parents: 39746
diff changeset
  1058
        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
  1059
    _printbookmarks(ui, repo, fm, bmarks)
34708
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 33518
diff changeset
  1060
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42978
diff changeset
  1061
34708
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 33518
diff changeset
  1062
def preparehookargs(name, old, new):
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 33518
diff changeset
  1063
    if new is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1064
        new = b''
34708
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 33518
diff changeset
  1065
    if old is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1066
        old = b''
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1067
    return {b'bookmark': name, b'node': hex(new), b'oldnode': hex(old)}