mercurial/localrepo.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Tue, 20 Feb 2024 17:18:15 +0100
changeset 51403 68289ed170c7
parent 51401 8f2ea3fa50fd
child 51404 04111ef08fb0
permissions -rw-r--r--
phases: mark `phasecache.phaseroots` private We are about to change its content from nodeid to revnum. So anyone directly using the content might be in unexpected troubles. We start by making it private to explicitly break any such user (and discourage them to do so).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1089
142b5d5ec9cc Break apart hg.py
mpm@selenic.com
parents: 1072
diff changeset
     1
# localrepo.py - read/write repository class for mercurial
48466
bf2738e03e96 share: make it possible to control the working copy format variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48465
diff changeset
     2
# coding: utf-8
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
     3
#
46819
d4ba4d51f85f contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents: 46794
diff changeset
     4
# Copyright 2005-2007 Olivia Mackall <olivia@selenic.com>
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
     5
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8210
diff changeset
     6
# This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9954
diff changeset
     7
# GNU General Public License version 2 or any later version.
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
     8
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
     9
45418
4111954cf86d localrepo: use functools.wraps() in unfilteredmethod decorator
Augie Fackler <raf@durin42.com>
parents: 45386
diff changeset
    10
import functools
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    11
import os
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    12
import random
50070
c8f32aa80dca rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50069
diff changeset
    13
import re
37630
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
    14
import sys
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    15
import time
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    16
import weakref
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    17
48835
a0da5075bca3 cleanup: directly use concurrent.futures instead of via pycompat
Augie Fackler <augie@google.com>
parents: 48793
diff changeset
    18
from concurrent import futures
49571
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
    19
from typing import (
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
    20
    Optional,
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
    21
)
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
    22
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    23
from .i18n import _
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    24
from .node import (
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
    25
    bin,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    26
    hex,
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
    27
    nullrev,
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46713
diff changeset
    28
    sha1nodeconstants,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    29
    short,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    30
)
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    31
from . import (
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    32
    bookmarks,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    33
    branchmap,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    34
    bundle2,
45785
80f32ec8653a clonebundle: move the manifest filename to a constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45783
diff changeset
    35
    bundlecaches,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    36
    changegroup,
31111
95ec3ad62f62 color: initialize color for the localrepo ui
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31054
diff changeset
    37
    color,
45203
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45202
diff changeset
    38
    commit,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    39
    context,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    40
    dirstate,
34097
f7d41b85bbf6 changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents: 33803
diff changeset
    41
    discovery,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    42
    encoding,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    43
    error,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    44
    exchange,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    45
    extensions,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    46
    filelog,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    47
    hook,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    48
    lock as lockmod,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    49
    match as matchmod,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44852
diff changeset
    50
    mergestate as mergestatemod,
30496
a90867a22daf localrepo: refer to checkunresolved by its new name
Augie Fackler <augie@google.com>
parents: 30492
diff changeset
    51
    mergeutil,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    52
    namespaces,
36471
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
    53
    narrowspec,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    54
    obsolete,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    55
    pathutil,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    56
    phases,
50759
f0ae403bf704 configitems: use standard "dynamicdefault" approach in edge case
Raphaël Gomès <rgomes@octobus.net>
parents: 50699
diff changeset
    57
    policy,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    58
    pushkey,
31508
590319c07259 localrepo: ensure transaction id is fully bytes on py3
Augie Fackler <augie@google.com>
parents: 31476
diff changeset
    59
    pycompat,
44243
238790674d69 config: add a function in `rcutil` to abstract HGRCSKIPREPO
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44124
diff changeset
    60
    rcutil,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    61
    repoview,
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
    62
    requirements as requirementsmod,
46310
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46309
diff changeset
    63
    revlog,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    64
    revset,
31024
0b8356705de6 revset: split language services to revsetlang module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30989
diff changeset
    65
    revsetlang,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    66
    scmutil,
33373
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33336
diff changeset
    67
    sparse,
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
    68
    store as storemod,
36009
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35896
diff changeset
    69
    subrepoutil,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    70
    tags as tagsmod,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    71
    transaction,
31054
59e69ed81776 localrepo: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31025
diff changeset
    72
    txnutil,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    73
    util,
31231
0a38a313033e vfs: use 'vfs' module directly in 'mercurial.localrepo'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31209
diff changeset
    74
    vfs as vfsmod,
46902
631001150e13 narrow: add capabilities for local repos, not just remote peers
Charles Chamberlain <cchamberlain@janestreet.com>
parents: 46888
diff changeset
    75
    wireprototypes,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    76
)
42813
268662aac075 interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42712
diff changeset
    77
268662aac075 interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42712
diff changeset
    78
from .interfaces import (
268662aac075 interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42712
diff changeset
    79
    repository,
42814
2c4f656c8e9f interfaceutil: move to interfaces/
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42813
diff changeset
    80
    util as interfaceutil,
42813
268662aac075 interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42712
diff changeset
    81
)
268662aac075 interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42712
diff changeset
    82
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36952
diff changeset
    83
from .utils import (
44060
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 44052
diff changeset
    84
    hashutil,
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
    85
    procutil,
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36952
diff changeset
    86
    stringutil,
46907
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46902
diff changeset
    87
    urlutil,
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36952
diff changeset
    88
)
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    89
46607
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46414
diff changeset
    90
from .revlogutils import (
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46414
diff changeset
    91
    concurrency_checker as revlogchecker,
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46414
diff changeset
    92
    constants as revlogconst,
47085
3aab2330b7d3 sidedata: move sidedata-related utils to the dedicated module
Raphaël Gomès <rgomes@octobus.net>
parents: 47083
diff changeset
    93
    sidedata as sidedatamod,
46607
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46414
diff changeset
    94
)
39506
b66ea3fc3a86 sparse-revlog: set max delta chain length to on thousand
Boris Feld <boris.feld@octobus.net>
parents: 39312
diff changeset
    95
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    96
release = lockmod.release
28883
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28876
diff changeset
    97
urlerr = util.urlerr
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28876
diff changeset
    98
urlreq = util.urlreq
8109
496ae1ea4698 switch lock releasing in the core from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8108
diff changeset
    99
50195
11e6eee4b063 transaction: use the standard transaction mechanism to backup branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50194
diff changeset
   100
RE_SKIP_DIRSTATE_ROLLBACK = re.compile(
11e6eee4b063 transaction: use the standard transaction mechanism to backup branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50194
diff changeset
   101
    b"^((dirstate|narrowspec.dirstate).*|branch$)"
11e6eee4b063 transaction: use the standard transaction mechanism to backup branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50194
diff changeset
   102
)
50070
c8f32aa80dca rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50069
diff changeset
   103
33277
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
   104
# set of (path, vfs-location) tuples. vfs-location is:
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
   105
# - 'plain for vfs relative paths
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
   106
# - '' for svfs relative paths
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
   107
_cachedfiles = set()
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
   108
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   109
33176
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32895
diff changeset
   110
class _basefilecache(scmutil.filecache):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
   111
    """All filecache usage on repo are done for logic that should be unfiltered"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   112
18014
a39fe76c4c65 clfilter: ensure that filecache on localrepo is unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18013
diff changeset
   113
    def __get__(self, repo, type=None):
29373
36fbd72c2f39 scmutil: allow access to filecache descriptor on class
Martijn Pieters <mjpieters@fb.com>
parents: 29352
diff changeset
   114
        if repo is None:
36fbd72c2f39 scmutil: allow access to filecache descriptor on class
Martijn Pieters <mjpieters@fb.com>
parents: 29352
diff changeset
   115
            return self
40424
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40423
diff changeset
   116
        # proxy to unfiltered __dict__ since filtered repo has no entry
40423
597bb5a6867f filecache: use try-except for faster __dict__ lookup
Yuya Nishihara <yuya@tcha.org>
parents: 40390
diff changeset
   117
        unfi = repo.unfiltered()
597bb5a6867f filecache: use try-except for faster __dict__ lookup
Yuya Nishihara <yuya@tcha.org>
parents: 40390
diff changeset
   118
        try:
597bb5a6867f filecache: use try-except for faster __dict__ lookup
Yuya Nishihara <yuya@tcha.org>
parents: 40390
diff changeset
   119
            return unfi.__dict__[self.sname]
597bb5a6867f filecache: use try-except for faster __dict__ lookup
Yuya Nishihara <yuya@tcha.org>
parents: 40390
diff changeset
   120
        except KeyError:
597bb5a6867f filecache: use try-except for faster __dict__ lookup
Yuya Nishihara <yuya@tcha.org>
parents: 40390
diff changeset
   121
            pass
597bb5a6867f filecache: use try-except for faster __dict__ lookup
Yuya Nishihara <yuya@tcha.org>
parents: 40390
diff changeset
   122
        return super(_basefilecache, self).__get__(unfi, type)
40424
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40423
diff changeset
   123
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40423
diff changeset
   124
    def set(self, repo, value):
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40423
diff changeset
   125
        return super(_basefilecache, self).set(repo.unfiltered(), value)
18014
a39fe76c4c65 clfilter: ensure that filecache on localrepo is unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18013
diff changeset
   126
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   127
33176
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32895
diff changeset
   128
class repofilecache(_basefilecache):
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32895
diff changeset
   129
    """filecache for files in .hg but outside of .hg/store"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   130
33277
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
   131
    def __init__(self, *paths):
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
   132
        super(repofilecache, self).__init__(*paths)
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
   133
        for path in paths:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   134
            _cachedfiles.add((path, b'plain'))
33277
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
   135
33176
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32895
diff changeset
   136
    def join(self, obj, fname):
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32895
diff changeset
   137
        return obj.vfs.join(fname)
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32895
diff changeset
   138
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   139
33176
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32895
diff changeset
   140
class storecache(_basefilecache):
16198
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16144
diff changeset
   141
    """filecache for files in the store"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   142
33277
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
   143
    def __init__(self, *paths):
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
   144
        super(storecache, self).__init__(*paths)
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
   145
        for path in paths:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   146
            _cachedfiles.add((path, b''))
33277
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
   147
16198
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16144
diff changeset
   148
    def join(self, obj, fname):
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16144
diff changeset
   149
        return obj.sjoin(fname)
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16144
diff changeset
   150
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   151
48039
c094e829e848 changelog: also monitor `00changelog.n` when applicable (issue6554)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47822
diff changeset
   152
class changelogcache(storecache):
c094e829e848 changelog: also monitor `00changelog.n` when applicable (issue6554)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47822
diff changeset
   153
    """filecache for the changelog"""
c094e829e848 changelog: also monitor `00changelog.n` when applicable (issue6554)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47822
diff changeset
   154
c094e829e848 changelog: also monitor `00changelog.n` when applicable (issue6554)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47822
diff changeset
   155
    def __init__(self):
c094e829e848 changelog: also monitor `00changelog.n` when applicable (issue6554)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47822
diff changeset
   156
        super(changelogcache, self).__init__()
c094e829e848 changelog: also monitor `00changelog.n` when applicable (issue6554)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47822
diff changeset
   157
        _cachedfiles.add((b'00changelog.i', b''))
c094e829e848 changelog: also monitor `00changelog.n` when applicable (issue6554)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47822
diff changeset
   158
        _cachedfiles.add((b'00changelog.n', b''))
c094e829e848 changelog: also monitor `00changelog.n` when applicable (issue6554)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47822
diff changeset
   159
c094e829e848 changelog: also monitor `00changelog.n` when applicable (issue6554)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47822
diff changeset
   160
    def tracked_paths(self, obj):
c094e829e848 changelog: also monitor `00changelog.n` when applicable (issue6554)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47822
diff changeset
   161
        paths = [self.join(obj, b'00changelog.i')]
c094e829e848 changelog: also monitor `00changelog.n` when applicable (issue6554)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47822
diff changeset
   162
        if obj.store.opener.options.get(b'persistent-nodemap', False):
c094e829e848 changelog: also monitor `00changelog.n` when applicable (issue6554)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47822
diff changeset
   163
            paths.append(self.join(obj, b'00changelog.n'))
c094e829e848 changelog: also monitor `00changelog.n` when applicable (issue6554)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47822
diff changeset
   164
        return paths
c094e829e848 changelog: also monitor `00changelog.n` when applicable (issue6554)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47822
diff changeset
   165
c094e829e848 changelog: also monitor `00changelog.n` when applicable (issue6554)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47822
diff changeset
   166
48040
7970895a21cb manifestlog: also monitor `00manifest.n` when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48039
diff changeset
   167
class manifestlogcache(storecache):
7970895a21cb manifestlog: also monitor `00manifest.n` when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48039
diff changeset
   168
    """filecache for the manifestlog"""
7970895a21cb manifestlog: also monitor `00manifest.n` when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48039
diff changeset
   169
7970895a21cb manifestlog: also monitor `00manifest.n` when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48039
diff changeset
   170
    def __init__(self):
7970895a21cb manifestlog: also monitor `00manifest.n` when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48039
diff changeset
   171
        super(manifestlogcache, self).__init__()
7970895a21cb manifestlog: also monitor `00manifest.n` when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48039
diff changeset
   172
        _cachedfiles.add((b'00manifest.i', b''))
7970895a21cb manifestlog: also monitor `00manifest.n` when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48039
diff changeset
   173
        _cachedfiles.add((b'00manifest.n', b''))
7970895a21cb manifestlog: also monitor `00manifest.n` when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48039
diff changeset
   174
7970895a21cb manifestlog: also monitor `00manifest.n` when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48039
diff changeset
   175
    def tracked_paths(self, obj):
7970895a21cb manifestlog: also monitor `00manifest.n` when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48039
diff changeset
   176
        paths = [self.join(obj, b'00manifest.i')]
7970895a21cb manifestlog: also monitor `00manifest.n` when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48039
diff changeset
   177
        if obj.store.opener.options.get(b'persistent-nodemap', False):
7970895a21cb manifestlog: also monitor `00manifest.n` when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48039
diff changeset
   178
            paths.append(self.join(obj, b'00manifest.n'))
7970895a21cb manifestlog: also monitor `00manifest.n` when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48039
diff changeset
   179
        return paths
7970895a21cb manifestlog: also monitor `00manifest.n` when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48039
diff changeset
   180
7970895a21cb manifestlog: also monitor `00manifest.n` when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48039
diff changeset
   181
42323
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
   182
class mixedrepostorecache(_basefilecache):
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
   183
    """filecache for a mix files in .hg/store and outside"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   184
42323
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
   185
    def __init__(self, *pathsandlocations):
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
   186
        # scmutil.filecache only uses the path for passing back into our
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
   187
        # join(), so we can safely pass a list of paths and locations
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
   188
        super(mixedrepostorecache, self).__init__(*pathsandlocations)
42439
aae93201f758 mixedrepostorecache: fix a silly redundant updating of set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42422
diff changeset
   189
        _cachedfiles.update(pathsandlocations)
42323
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
   190
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
   191
    def join(self, obj, fnameandlocation):
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
   192
        fname, location = fnameandlocation
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   193
        if location == b'plain':
42323
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
   194
            return obj.vfs.join(fname)
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
   195
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   196
            if location != b'':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   197
                raise error.ProgrammingError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   198
                    b'unexpected location: %s' % location
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   199
                )
42323
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
   200
            return obj.sjoin(fname)
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
   201
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   202
33382
b107a7660f4e localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33373
diff changeset
   203
def isfilecached(repo, name):
b107a7660f4e localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33373
diff changeset
   204
    """check if a repo has already cached "name" filecache-ed property
b107a7660f4e localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33373
diff changeset
   205
b107a7660f4e localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33373
diff changeset
   206
    This returns (cachedobj-or-None, iscached) tuple.
b107a7660f4e localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33373
diff changeset
   207
    """
b107a7660f4e localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33373
diff changeset
   208
    cacheentry = repo.unfiltered()._filecache.get(name, None)
b107a7660f4e localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33373
diff changeset
   209
    if not cacheentry:
b107a7660f4e localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33373
diff changeset
   210
        return None, False
b107a7660f4e localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33373
diff changeset
   211
    return cacheentry.obj, True
b107a7660f4e localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33373
diff changeset
   212
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   213
29104
b207653ada10 localrepo: remove a couple of local type aliases
Augie Fackler <augie@google.com>
parents: 29075
diff changeset
   214
class unfilteredpropertycache(util.propertycache):
18013
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
   215
    """propertycache that apply to unfiltered repo only"""
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
   216
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
   217
    def __get__(self, repo, type=None):
19846
9789670992d6 repoview: have unfilteredpropertycache using the underlying cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19515
diff changeset
   218
        unfi = repo.unfiltered()
9789670992d6 repoview: have unfilteredpropertycache using the underlying cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19515
diff changeset
   219
        if unfi is repo:
9789670992d6 repoview: have unfilteredpropertycache using the underlying cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19515
diff changeset
   220
            return super(unfilteredpropertycache, self).__get__(unfi)
9789670992d6 repoview: have unfilteredpropertycache using the underlying cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19515
diff changeset
   221
        return getattr(unfi, self.name)
18013
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
   222
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   223
29104
b207653ada10 localrepo: remove a couple of local type aliases
Augie Fackler <augie@google.com>
parents: 29075
diff changeset
   224
class filteredpropertycache(util.propertycache):
18013
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
   225
    """propertycache that must take filtering in account"""
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
   226
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
   227
    def cachevalue(self, obj, value):
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
   228
        object.__setattr__(obj, self.name, value)
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
   229
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
   230
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
   231
def hasunfilteredcache(repo, name):
18644
3e92772d5383 spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents: 18520
diff changeset
   232
    """check if a repo has an unfilteredpropertycache value for <name>"""
18013
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
   233
    return name in vars(repo.unfiltered())
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
   234
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   235
18016
2a393df0f5cc clfilter: rename `unfilteredmeth` to `unfilteredmethod`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18014
diff changeset
   236
def unfilteredmethod(orig):
17994
8899bf48116a clfilter: introduce an `unfilteredmethod` decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17993
diff changeset
   237
    """decorate method that always need to be run on unfiltered version"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   238
45418
4111954cf86d localrepo: use functools.wraps() in unfilteredmethod decorator
Augie Fackler <raf@durin42.com>
parents: 45386
diff changeset
   239
    @functools.wraps(orig)
17994
8899bf48116a clfilter: introduce an `unfilteredmethod` decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17993
diff changeset
   240
    def wrapper(repo, *args, **kwargs):
8899bf48116a clfilter: introduce an `unfilteredmethod` decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17993
diff changeset
   241
        return orig(repo.unfiltered(), *args, **kwargs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   242
17994
8899bf48116a clfilter: introduce an `unfilteredmethod` decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17993
diff changeset
   243
    return wrapper
8899bf48116a clfilter: introduce an `unfilteredmethod` decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17993
diff changeset
   244
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   245
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   246
moderncaps = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   247
    b'lookup',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   248
    b'branchmap',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   249
    b'pushkey',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   250
    b'known',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   251
    b'getbundle',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   252
    b'unbundle',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   253
}
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   254
legacycaps = moderncaps.union({b'changegroupsubset'})
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   255
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   256
37810
856f381ad74b interfaceutil: module to stub out zope.interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37797
diff changeset
   257
@interfaceutil.implementer(repository.ipeercommandexecutor)
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48935
diff changeset
   258
class localcommandexecutor:
37630
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   259
    def __init__(self, peer):
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   260
        self._peer = peer
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   261
        self._sent = False
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   262
        self._closed = False
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   263
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   264
    def __enter__(self):
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   265
        return self
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   266
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   267
    def __exit__(self, exctype, excvalue, exctb):
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   268
        self.close()
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   269
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   270
    def callcommand(self, command, args):
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   271
        if self._sent:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   272
            raise error.ProgrammingError(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
   273
                b'callcommand() cannot be used after sendcommands()'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   274
            )
37630
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   275
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   276
        if self._closed:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   277
            raise error.ProgrammingError(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
   278
                b'callcommand() cannot be used after close()'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   279
            )
37630
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   280
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   281
        # We don't need to support anything fancy. Just call the named
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   282
        # method on the peer and return a resolved future.
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   283
        fn = getattr(self._peer, pycompat.sysstr(command))
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   284
48835
a0da5075bca3 cleanup: directly use concurrent.futures instead of via pycompat
Augie Fackler <augie@google.com>
parents: 48793
diff changeset
   285
        f = futures.Future()
37630
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   286
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   287
        try:
37670
719b8cb22936 localrepo: add some overlooked strkwargs love for py3
Augie Fackler <augie@google.com>
parents: 37669
diff changeset
   288
            result = fn(**pycompat.strkwargs(args))
37630
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   289
        except Exception:
37669
1cb54e6193a6 py3: paper over differences in future exception handling
Augie Fackler <augie@google.com>
parents: 37650
diff changeset
   290
            pycompat.future_set_exception_info(f, sys.exc_info()[1:])
37630
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   291
        else:
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   292
            f.set_result(result)
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   293
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   294
        return f
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   295
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   296
    def sendcommands(self):
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   297
        self._sent = True
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   298
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   299
    def close(self):
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   300
        self._closed = True
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   301
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   302
37810
856f381ad74b interfaceutil: module to stub out zope.interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37797
diff changeset
   303
@interfaceutil.implementer(repository.ipeercommands)
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   304
class localpeer(repository.peer):
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   305
    '''peer for a local repo; reflects only the most recent API'''
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   306
50440
3a2df812e1c7 pull: add --remote-hidden option and pass it through peer creation
Manuel Jacob <me@manueljacob.de>
parents: 50324
diff changeset
   307
    def __init__(self, repo, caps=None, path=None, remotehidden=False):
3a2df812e1c7 pull: add --remote-hidden option and pass it through peer creation
Manuel Jacob <me@manueljacob.de>
parents: 50324
diff changeset
   308
        super(localpeer, self).__init__(
3a2df812e1c7 pull: add --remote-hidden option and pass it through peer creation
Manuel Jacob <me@manueljacob.de>
parents: 50324
diff changeset
   309
            repo.ui, path=path, remotehidden=remotehidden
3a2df812e1c7 pull: add --remote-hidden option and pass it through peer creation
Manuel Jacob <me@manueljacob.de>
parents: 50324
diff changeset
   310
        )
3a2df812e1c7 pull: add --remote-hidden option and pass it through peer creation
Manuel Jacob <me@manueljacob.de>
parents: 50324
diff changeset
   311
31412
ecc87acb4d10 localrepo: don't use mutable default argument value
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31373
diff changeset
   312
        if caps is None:
ecc87acb4d10 localrepo: don't use mutable default argument value
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31373
diff changeset
   313
            caps = moderncaps.copy()
50441
b15b6e2c3309 hidden: add support for --remote-hidden to localpeer
Manuel Jacob <me@manueljacob.de>
parents: 50440
diff changeset
   314
        if remotehidden:
b15b6e2c3309 hidden: add support for --remote-hidden to localpeer
Manuel Jacob <me@manueljacob.de>
parents: 50440
diff changeset
   315
            self._repo = repo.filtered(b'served.hidden')
b15b6e2c3309 hidden: add support for --remote-hidden to localpeer
Manuel Jacob <me@manueljacob.de>
parents: 50440
diff changeset
   316
        else:
b15b6e2c3309 hidden: add support for --remote-hidden to localpeer
Manuel Jacob <me@manueljacob.de>
parents: 50440
diff changeset
   317
            self._repo = repo.filtered(b'served')
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
   318
        if repo._wanted_sidedata:
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
   319
            formatted = bundle2.format_remote_wanted_sidedata(repo)
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
   320
            caps.add(b'exp-wanted-sidedata=' + formatted)
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
   321
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   322
        self._caps = repo._restrictcapabilities(caps)
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   323
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   324
    # Begin of _basepeer interface.
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   325
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   326
    def url(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   327
        return self._repo.url()
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   328
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   329
    def local(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   330
        return self._repo
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   331
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   332
    def canpush(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   333
        return True
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   334
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   335
    def close(self):
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   336
        self._repo.close()
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   337
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   338
    # End of _basepeer interface.
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   339
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   340
    # Begin of _basewirecommands interface.
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   341
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   342
    def branchmap(self):
18279
679767c38cb5 clfilter: drop extra filtering in localpeer
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18278
diff changeset
   343
        return self._repo.branchmap()
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   344
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   345
    def capabilities(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   346
        return self._caps
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   347
50699
2aaabd8f4471 clone-bundle: rename the methods and wireprotole command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50673
diff changeset
   348
    def get_cached_bundle_inline(self, path):
50666
60f9602b413e clonebundles: add support for inline (streaming) clonebundles
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 50586
diff changeset
   349
        # not needed with local peer
60f9602b413e clonebundles: add support for inline (streaming) clonebundles
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 50586
diff changeset
   350
        raise NotImplementedError
60f9602b413e clonebundles: add support for inline (streaming) clonebundles
Mathias De Mare <mathias.de_mare@nokia.com>
parents: 50586
diff changeset
   351
37649
a168799687e5 wireproto: properly call clonebundles command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37646
diff changeset
   352
    def clonebundles(self):
50544
e6948aafda6f clonebundles: move the manifest reading in a dedicated function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50441
diff changeset
   353
        return bundlecaches.get_manifest(self._repo)
37649
a168799687e5 wireproto: properly call clonebundles command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37646
diff changeset
   354
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   355
    def debugwireargs(self, one, two, three=None, four=None, five=None):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   356
        """Used to test argument passing over the wire"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   357
        return b"%s %s %s %s %s" % (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   358
            one,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   359
            two,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   360
            pycompat.bytestr(three),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   361
            pycompat.bytestr(four),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   362
            pycompat.bytestr(five),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   363
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   364
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   365
    def getbundle(
46711
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46705
diff changeset
   366
        self,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46705
diff changeset
   367
        source,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46705
diff changeset
   368
        heads=None,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46705
diff changeset
   369
        common=None,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46705
diff changeset
   370
        bundlecaps=None,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46705
diff changeset
   371
        remote_sidedata=None,
51284
58d39c7865e5 usage: configure uncompressed chunk cache through resource configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51134
diff changeset
   372
        **kwargs,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   373
    ):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   374
        chunks = exchange.getbundlechunks(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   375
            self._repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   376
            source,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   377
            heads=heads,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   378
            common=common,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   379
            bundlecaps=bundlecaps,
46711
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46705
diff changeset
   380
            remote_sidedata=remote_sidedata,
51284
58d39c7865e5 usage: configure uncompressed chunk cache through resource configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51134
diff changeset
   381
            **kwargs,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   382
        )[1]
30187
3e86261bf110 exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29975
diff changeset
   383
        cb = util.chunkbuffer(chunks)
3e86261bf110 exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29975
diff changeset
   384
32149
9a9d54ae9963 localrepo: reuse exchange.bundle2requested()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32121
diff changeset
   385
        if exchange.bundle2requested(bundlecaps):
21068
c15b66a6bbb4 bundle2: return a stream from exchange.getbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21043
diff changeset
   386
            # When requesting a bundle2, getbundle returns a stream to make the
c15b66a6bbb4 bundle2: return a stream from exchange.getbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21043
diff changeset
   387
            # wire level function happier. We need to build a proper object
c15b66a6bbb4 bundle2: return a stream from exchange.getbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21043
diff changeset
   388
            # from it in local peer.
30187
3e86261bf110 exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29975
diff changeset
   389
            return bundle2.getunbundler(self.ui, cb)
3e86261bf110 exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29975
diff changeset
   390
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   391
            return changegroup.getunbundler(b'01', cb, None)
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   392
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   393
    def heads(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   394
        return self._repo.heads()
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   395
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   396
    def known(self, nodes):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   397
        return self._repo.known(nodes)
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   398
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   399
    def listkeys(self, namespace):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   400
        return self._repo.listkeys(namespace)
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   401
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   402
    def lookup(self, key):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   403
        return self._repo.lookup(key)
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   404
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   405
    def pushkey(self, namespace, key, old, new):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   406
        return self._repo.pushkey(namespace, key, old, new)
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   407
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   408
    def stream_out(self):
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
   409
        raise error.Abort(_(b'cannot perform stream clone against local peer'))
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   410
37646
72e26319f3b8 wireproto: use command executor for unbundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37635
diff changeset
   411
    def unbundle(self, bundle, heads, url):
20969
7a679918ee2b localrepo: add unbundle support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20963
diff changeset
   412
        """apply a bundle on a repo
7a679918ee2b localrepo: add unbundle support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20963
diff changeset
   413
7a679918ee2b localrepo: add unbundle support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20963
diff changeset
   414
        This function handles the repo locking itself."""
7a679918ee2b localrepo: add unbundle support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20963
diff changeset
   415
        try:
24798
9fbf0a2a72a1 bundle2: add on more layer of exception catching in localrepo.unbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24792
diff changeset
   416
            try:
37646
72e26319f3b8 wireproto: use command executor for unbundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37635
diff changeset
   417
                bundle = exchange.readbundle(self.ui, bundle, None)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   418
                ret = exchange.unbundle(self._repo, bundle, heads, b'push', url)
50928
d718eddf01d9 safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50919
diff changeset
   419
                if hasattr(ret, 'getchunks'):
24798
9fbf0a2a72a1 bundle2: add on more layer of exception catching in localrepo.unbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24792
diff changeset
   420
                    # This is a bundle20 object, turn it into an unbundler.
9fbf0a2a72a1 bundle2: add on more layer of exception catching in localrepo.unbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24792
diff changeset
   421
                    # This little dance should be dropped eventually when the
9fbf0a2a72a1 bundle2: add on more layer of exception catching in localrepo.unbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24792
diff changeset
   422
                    # API is finally improved.
9fbf0a2a72a1 bundle2: add on more layer of exception catching in localrepo.unbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24792
diff changeset
   423
                    stream = util.chunkbuffer(ret.getchunks())
9fbf0a2a72a1 bundle2: add on more layer of exception catching in localrepo.unbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24792
diff changeset
   424
                    ret = bundle2.getunbundler(self.ui, stream)
9fbf0a2a72a1 bundle2: add on more layer of exception catching in localrepo.unbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24792
diff changeset
   425
                return ret
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25629
diff changeset
   426
            except Exception as exc:
24799
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
   427
                # If the exception contains output salvaged from a bundle2
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
   428
                # reply, we need to make sure it is printed before continuing
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
   429
                # to fail. So we build a bundle2 with such output and consume
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
   430
                # it directly.
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
   431
                #
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
   432
                # This is not very elegant but allows a "simple" solution for
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
   433
                # issue4594
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
   434
                output = getattr(exc, '_bundle2salvagedoutput', ())
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
   435
                if output:
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
   436
                    bundler = bundle2.bundle20(self._repo.ui)
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
   437
                    for out in output:
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
   438
                        bundler.addpart(out)
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
   439
                    stream = util.chunkbuffer(bundler.getchunks())
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
   440
                    b = bundle2.getunbundler(self.ui, stream)
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
   441
                    bundle2.processbundle(self._repo, b)
24798
9fbf0a2a72a1 bundle2: add on more layer of exception catching in localrepo.unbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24792
diff changeset
   442
                raise
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25629
diff changeset
   443
        except error.PushRaced as exc:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   444
            raise error.ResponseError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   445
                _(b'push failed:'), stringutil.forcebytestr(exc)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   446
            )
20969
7a679918ee2b localrepo: add unbundle support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20963
diff changeset
   447
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   448
    # End of _basewirecommands interface.
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   449
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   450
    # Begin of peer interface.
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   451
37630
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   452
    def commandexecutor(self):
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   453
        return localcommandexecutor(self)
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   454
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   455
    # End of peer interface.
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   456
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   457
37810
856f381ad74b interfaceutil: module to stub out zope.interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37797
diff changeset
   458
@interfaceutil.implementer(repository.ipeerlegacycommands)
37635
cc8c06835097 wireproto: convert legacy commands to command executor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37633
diff changeset
   459
class locallegacypeer(localpeer):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
   460
    """peer extension which implements legacy methods too; used for tests with
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
   461
    restricted capabilities"""
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   462
50440
3a2df812e1c7 pull: add --remote-hidden option and pass it through peer creation
Manuel Jacob <me@manueljacob.de>
parents: 50324
diff changeset
   463
    def __init__(self, repo, path=None, remotehidden=False):
3a2df812e1c7 pull: add --remote-hidden option and pass it through peer creation
Manuel Jacob <me@manueljacob.de>
parents: 50324
diff changeset
   464
        super(locallegacypeer, self).__init__(
3a2df812e1c7 pull: add --remote-hidden option and pass it through peer creation
Manuel Jacob <me@manueljacob.de>
parents: 50324
diff changeset
   465
            repo, caps=legacycaps, path=path, remotehidden=remotehidden
3a2df812e1c7 pull: add --remote-hidden option and pass it through peer creation
Manuel Jacob <me@manueljacob.de>
parents: 50324
diff changeset
   466
        )
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   467
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   468
    # Begin of baselegacywirecommands interface.
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   469
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   470
    def between(self, pairs):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   471
        return self._repo.between(pairs)
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   472
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   473
    def branches(self, nodes):
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   474
        return self._repo.branches(nodes)
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   475
37635
cc8c06835097 wireproto: convert legacy commands to command executor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37633
diff changeset
   476
    def changegroup(self, nodes, source):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   477
        outgoing = discovery.outgoing(
45144
c93dd9d9f1e6 discovery: change users of `outgoing.missingheads` to `outgoing.ancestorsof`
Manuel Jacob <me@manueljacob.de>
parents: 45106
diff changeset
   478
            self._repo, missingroots=nodes, ancestorsof=self._repo.heads()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   479
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   480
        return changegroup.makechangegroup(self._repo, outgoing, b'01', source)
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   481
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   482
    def changegroupsubset(self, bases, heads, source):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   483
        outgoing = discovery.outgoing(
45144
c93dd9d9f1e6 discovery: change users of `outgoing.missingheads` to `outgoing.ancestorsof`
Manuel Jacob <me@manueljacob.de>
parents: 45106
diff changeset
   484
            self._repo, missingroots=bases, ancestorsof=heads
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   485
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   486
        return changegroup.makechangegroup(self._repo, outgoing, b'01', source)
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   487
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   488
    # End of baselegacywirecommands interface.
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   489
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   490
37135
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
   491
# Functions receiving (ui, features) that extensions can register to impact
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
   492
# the ability to load repositories with custom requirements. Only
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
   493
# functions defined in loaded extensions are called.
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
   494
#
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
   495
# The function receives a set of requirement strings that the repository
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
   496
# is capable of opening. Functions will typically add elements to the
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
   497
# set to reflect that the extension knows how to handle that requirements.
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
   498
featuresetupfuncs = set()
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
   499
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   500
45353
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   501
def _getsharedvfs(hgvfs, requirements):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
   502
    """returns the vfs object pointing to root of shared source
45353
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   503
    repo for a shared repository
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   504
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   505
    hgvfs is vfs pointing at .hg/ of current repo (shared one)
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   506
    requirements is a set of requirements of current repo (shared one)
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   507
    """
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   508
    # The ``shared`` or ``relshared`` requirements indicate the
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   509
    # store lives in the path contained in the ``.hg/sharedpath`` file.
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   510
    # This is an absolute path for ``shared`` and relative to
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   511
    # ``.hg/`` for ``relshared``.
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   512
    sharedpath = hgvfs.read(b'sharedpath').rstrip(b'\n')
45386
034d94f8761b requirements: introduce constants for `shared` and `relshared` requirements
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45373
diff changeset
   513
    if requirementsmod.RELATIVE_SHARED_REQUIREMENT in requirements:
46888
218a26df7813 share: store relative share paths with '/' separators
Matt Harbison <matt_harbison@yahoo.com>
parents: 46851
diff changeset
   514
        sharedpath = util.normpath(hgvfs.join(sharedpath))
45353
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   515
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   516
    sharedvfs = vfsmod.vfs(sharedpath, realpath=True)
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   517
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   518
    if not sharedvfs.exists():
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   519
        raise error.RepoError(
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   520
            _(b'.hg/sharedpath points to nonexistent directory %s')
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   521
            % sharedvfs.base
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   522
        )
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   523
    return sharedvfs
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   524
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   525
45354
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
   526
def _readrequires(vfs, allowmissing):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
   527
    """reads the require file present at root of this vfs
45354
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
   528
    and return a set of requirements
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
   529
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49284
diff changeset
   530
    If allowmissing is True, we suppress FileNotFoundError if raised"""
45354
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
   531
    # requires file contains a newline-delimited list of
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
   532
    # features/capabilities the opener (us) must have in order to use
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
   533
    # the repository. This file was introduced in Mercurial 0.9.2,
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
   534
    # which means very old repositories may not have one. We assume
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
   535
    # a missing file translates to no requirements.
49493
4367c46a89ee requires: re-use vfs.tryread for simplicity
Jason R. Coombs <jaraco@jaraco.com>
parents: 49473
diff changeset
   536
    read = vfs.tryread if allowmissing else vfs.read
4367c46a89ee requires: re-use vfs.tryread for simplicity
Jason R. Coombs <jaraco@jaraco.com>
parents: 49473
diff changeset
   537
    return set(read(b'requires').splitlines())
45354
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
   538
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
   539
49571
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
   540
def makelocalrepository(baseui, path: bytes, intents=None):
39687
bfeab472e3c0 localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39668
diff changeset
   541
    """Create a local repository object.
bfeab472e3c0 localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39668
diff changeset
   542
bfeab472e3c0 localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39668
diff changeset
   543
    Given arguments needed to construct a local repository, this function
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   544
    performs various early repository loading functionality (such as
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   545
    reading the ``.hg/requires`` and ``.hg/hgrc`` files), validates that
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   546
    the repository can be opened, derives a type suitable for representing
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   547
    that repository, and returns an instance of it.
39687
bfeab472e3c0 localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39668
diff changeset
   548
bfeab472e3c0 localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39668
diff changeset
   549
    The returned object conforms to the ``repository.completelocalrepository``
bfeab472e3c0 localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39668
diff changeset
   550
    interface.
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   551
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   552
    The repository type is derived by calling a series of factory functions
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   553
    for each aspect/interface of the final repository. These are defined by
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   554
    ``REPO_INTERFACES``.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   555
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   556
    Each factory function is called to produce a type implementing a specific
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   557
    interface. The cumulative list of returned types will be combined into a
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   558
    new type and that type will be instantiated to represent the local
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   559
    repository.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   560
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   561
    The factory functions each receive various state that may be consulted
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   562
    as part of deriving a type.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   563
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   564
    Extensions should wrap these factory functions to customize repository type
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   565
    creation. Note that an extension's wrapped function may be called even if
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   566
    that extension is not loaded for the repo being constructed. Extensions
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   567
    should check if their ``__name__`` appears in the
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   568
    ``extensionmodulenames`` set passed to the factory function and no-op if
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   569
    not.
39687
bfeab472e3c0 localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39668
diff changeset
   570
    """
39689
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
   571
    ui = baseui.copy()
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
   572
    # Prevent copying repo configuration.
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
   573
    ui.copy = baseui.copy
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
   574
39688
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   575
    # Working directory VFS rooted at repository root.
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   576
    wdirvfs = vfsmod.vfs(path, expandpath=True, realpath=True)
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   577
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   578
    # Main VFS for .hg/ directory.
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   579
    hgpath = wdirvfs.join(b'.hg')
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   580
    hgvfs = vfsmod.vfs(hgpath, cacheaudited=True)
45353
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   581
    # Whether this repository is shared one or not
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   582
    shared = False
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   583
    # If this repository is shared, vfs pointing to shared repo
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   584
    sharedvfs = None
39688
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   585
39691
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
   586
    # The .hg/ path should exist and should be a directory. All other
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
   587
    # cases are errors.
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
   588
    if not hgvfs.isdir():
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
   589
        try:
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
   590
            hgvfs.stat()
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49284
diff changeset
   591
        except FileNotFoundError:
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49284
diff changeset
   592
            pass
44943
9e5b4dbe8ff2 localrepo: handle ValueError during repository opening
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44941
diff changeset
   593
        except ValueError as e:
9e5b4dbe8ff2 localrepo: handle ValueError during repository opening
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44941
diff changeset
   594
            # Can be raised on Python 3.8 when path is invalid.
9e5b4dbe8ff2 localrepo: handle ValueError during repository opening
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44941
diff changeset
   595
            raise error.Abort(
46572
d5d9177c0045 localrepo: fix conversion of exceptions to strings flagged by pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46571
diff changeset
   596
                _(b'invalid path %s: %s') % (path, stringutil.forcebytestr(e))
44943
9e5b4dbe8ff2 localrepo: handle ValueError during repository opening
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44941
diff changeset
   597
            )
39691
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
   598
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
   599
        raise error.RepoError(_(b'repository %s not found') % path)
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
   600
45354
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
   601
    requirements = _readrequires(hgvfs, True)
45483
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
   602
    shared = (
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
   603
        requirementsmod.SHARED_REQUIREMENT in requirements
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
   604
        or requirementsmod.RELATIVE_SHARED_REQUIREMENT in requirements
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
   605
    )
46234
9804162a4053 localrepo: move storevfs calculation out of if statement
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46114
diff changeset
   606
    storevfs = None
45483
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
   607
    if shared:
46234
9804162a4053 localrepo: move storevfs calculation out of if statement
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46114
diff changeset
   608
        # This is a shared repo
45483
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
   609
        sharedvfs = _getsharedvfs(hgvfs, requirements)
46234
9804162a4053 localrepo: move storevfs calculation out of if statement
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46114
diff changeset
   610
        storevfs = vfsmod.vfs(sharedvfs.join(b'store'))
9804162a4053 localrepo: move storevfs calculation out of if statement
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46114
diff changeset
   611
    else:
9804162a4053 localrepo: move storevfs calculation out of if statement
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46114
diff changeset
   612
        storevfs = vfsmod.vfs(hgvfs.join(b'store'))
45483
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
   613
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
   614
    # if .hg/requires contains the sharesafe requirement, it means
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
   615
    # there exists a `.hg/store/requires` too and we should read it
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
   616
    # NOTE: presence of SHARESAFE_REQUIREMENT imply that store requirement
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
   617
    # is present. We never write SHARESAFE_REQUIREMENT for a repo if store
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
   618
    # is not present, refer checkrequirementscompat() for that
46004
49b4ab1d9f5e share: show warning if share is outdated while source supports share-safe
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 46003
diff changeset
   619
    #
49b4ab1d9f5e share: show warning if share is outdated while source supports share-safe
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 46003
diff changeset
   620
    # However, if SHARESAFE_REQUIREMENT is not present, it means that the
49b4ab1d9f5e share: show warning if share is outdated while source supports share-safe
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 46003
diff changeset
   621
    # repository was shared the old way. We check the share source .hg/requires
49b4ab1d9f5e share: show warning if share is outdated while source supports share-safe
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 46003
diff changeset
   622
    # for SHARESAFE_REQUIREMENT to detect whether the current repository needs
49b4ab1d9f5e share: show warning if share is outdated while source supports share-safe
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 46003
diff changeset
   623
    # to be reshared
46571
25392c48da8a localrepo: fix a UI string to be bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 46549
diff changeset
   624
    hint = _(b"see `hg help config.format.use-share-safe` for more information")
45483
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
   625
    if requirementsmod.SHARESAFE_REQUIREMENT in requirements:
46003
c6a1fa42e325 upgrade: add support to downgrade share safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45942
diff changeset
   626
        if (
c6a1fa42e325 upgrade: add support to downgrade share safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45942
diff changeset
   627
            shared
c6a1fa42e325 upgrade: add support to downgrade share safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45942
diff changeset
   628
            and requirementsmod.SHARESAFE_REQUIREMENT
c6a1fa42e325 upgrade: add support to downgrade share safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45942
diff changeset
   629
            not in _readrequires(sharedvfs, True)
c6a1fa42e325 upgrade: add support to downgrade share safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45942
diff changeset
   630
        ):
46333
2eb5fe13461b share: rename share-safe warning config
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46332
diff changeset
   631
            mismatch_warn = ui.configbool(
2eb5fe13461b share: rename share-safe warning config
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46332
diff changeset
   632
                b'share', b'safe-mismatch.source-not-safe.warn'
2eb5fe13461b share: rename share-safe warning config
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46332
diff changeset
   633
            )
46332
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   634
            mismatch_config = ui.config(
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   635
                b'share', b'safe-mismatch.source-not-safe'
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   636
            )
49343
4f04bb0d8deb auto-upgrade: add an option to silence the safe-mismatch message
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49313
diff changeset
   637
            mismatch_verbose_upgrade = ui.configbool(
4f04bb0d8deb auto-upgrade: add an option to silence the safe-mismatch message
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49313
diff changeset
   638
                b'share', b'safe-mismatch.source-not-safe:verbose-upgrade'
4f04bb0d8deb auto-upgrade: add an option to silence the safe-mismatch message
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49313
diff changeset
   639
            )
46332
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   640
            if mismatch_config in (
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   641
                b'downgrade-allow',
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   642
                b'allow',
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   643
                b'downgrade-abort',
46236
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
   644
            ):
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
   645
                # prevent cyclic import localrepo -> upgrade -> localrepo
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
   646
                from . import upgrade
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
   647
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
   648
                upgrade.downgrade_share_to_non_safe(
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
   649
                    ui,
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
   650
                    hgvfs,
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
   651
                    sharedvfs,
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
   652
                    requirements,
46332
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   653
                    mismatch_config,
46333
2eb5fe13461b share: rename share-safe warning config
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46332
diff changeset
   654
                    mismatch_warn,
49343
4f04bb0d8deb auto-upgrade: add an option to silence the safe-mismatch message
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49313
diff changeset
   655
                    mismatch_verbose_upgrade,
46236
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
   656
                )
46332
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   657
            elif mismatch_config == b'abort':
46236
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
   658
                raise error.Abort(
46351
085294a8c0e0 share-safe: fix an abort message that references the experimental requirement
Matt Harbison <matt_harbison@yahoo.com>
parents: 46348
diff changeset
   659
                    _(b"share source does not support share-safe requirement"),
46348
4a58561ace0f share-share: have the hint issue more consistently and point to the right doc
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46334
diff changeset
   660
                    hint=hint,
46236
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
   661
                )
46332
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   662
            else:
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   663
                raise error.Abort(
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   664
                    _(
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   665
                        b"share-safe mismatch with source.\nUnrecognized"
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   666
                        b" value '%s' of `share.safe-mismatch.source-not-safe`"
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   667
                        b" set."
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   668
                    )
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   669
                    % mismatch_config,
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   670
                    hint=hint,
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   671
                )
46236
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
   672
        else:
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
   673
            requirements |= _readrequires(storevfs, False)
46004
49b4ab1d9f5e share: show warning if share is outdated while source supports share-safe
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 46003
diff changeset
   674
    elif shared:
49b4ab1d9f5e share: show warning if share is outdated while source supports share-safe
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 46003
diff changeset
   675
        sourcerequires = _readrequires(sharedvfs, False)
49b4ab1d9f5e share: show warning if share is outdated while source supports share-safe
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 46003
diff changeset
   676
        if requirementsmod.SHARESAFE_REQUIREMENT in sourcerequires:
46332
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   677
            mismatch_config = ui.config(b'share', b'safe-mismatch.source-safe')
46333
2eb5fe13461b share: rename share-safe warning config
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46332
diff changeset
   678
            mismatch_warn = ui.configbool(
2eb5fe13461b share: rename share-safe warning config
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46332
diff changeset
   679
                b'share', b'safe-mismatch.source-safe.warn'
2eb5fe13461b share: rename share-safe warning config
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46332
diff changeset
   680
            )
49343
4f04bb0d8deb auto-upgrade: add an option to silence the safe-mismatch message
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49313
diff changeset
   681
            mismatch_verbose_upgrade = ui.configbool(
4f04bb0d8deb auto-upgrade: add an option to silence the safe-mismatch message
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49313
diff changeset
   682
                b'share', b'safe-mismatch.source-safe:verbose-upgrade'
4f04bb0d8deb auto-upgrade: add an option to silence the safe-mismatch message
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49313
diff changeset
   683
            )
46332
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   684
            if mismatch_config in (
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   685
                b'upgrade-allow',
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   686
                b'allow',
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   687
                b'upgrade-abort',
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   688
            ):
46235
0babe12ef35d sharesafe: introduce functionality to automatically upgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46234
diff changeset
   689
                # prevent cyclic import localrepo -> upgrade -> localrepo
0babe12ef35d sharesafe: introduce functionality to automatically upgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46234
diff changeset
   690
                from . import upgrade
0babe12ef35d sharesafe: introduce functionality to automatically upgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46234
diff changeset
   691
0babe12ef35d sharesafe: introduce functionality to automatically upgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46234
diff changeset
   692
                upgrade.upgrade_share_to_safe(
0babe12ef35d sharesafe: introduce functionality to automatically upgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46234
diff changeset
   693
                    ui,
0babe12ef35d sharesafe: introduce functionality to automatically upgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46234
diff changeset
   694
                    hgvfs,
0babe12ef35d sharesafe: introduce functionality to automatically upgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46234
diff changeset
   695
                    storevfs,
0babe12ef35d sharesafe: introduce functionality to automatically upgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46234
diff changeset
   696
                    requirements,
46332
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   697
                    mismatch_config,
46333
2eb5fe13461b share: rename share-safe warning config
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46332
diff changeset
   698
                    mismatch_warn,
49343
4f04bb0d8deb auto-upgrade: add an option to silence the safe-mismatch message
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49313
diff changeset
   699
                    mismatch_verbose_upgrade,
46004
49b4ab1d9f5e share: show warning if share is outdated while source supports share-safe
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 46003
diff changeset
   700
                )
46332
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   701
            elif mismatch_config == b'abort':
46331
8788981c95f8 localrepo: disallow share if there is a version mismatch by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46312
diff changeset
   702
                raise error.Abort(
46235
0babe12ef35d sharesafe: introduce functionality to automatically upgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46234
diff changeset
   703
                    _(
46331
8788981c95f8 localrepo: disallow share if there is a version mismatch by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46312
diff changeset
   704
                        b'version mismatch: source uses share-safe'
8788981c95f8 localrepo: disallow share if there is a version mismatch by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46312
diff changeset
   705
                        b' functionality while the current share does not'
46348
4a58561ace0f share-share: have the hint issue more consistently and point to the right doc
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46334
diff changeset
   706
                    ),
4a58561ace0f share-share: have the hint issue more consistently and point to the right doc
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46334
diff changeset
   707
                    hint=hint,
46235
0babe12ef35d sharesafe: introduce functionality to automatically upgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46234
diff changeset
   708
                )
46332
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   709
            else:
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   710
                raise error.Abort(
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   711
                    _(
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   712
                        b"share-safe mismatch with source.\nUnrecognized"
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   713
                        b" value '%s' of `share.safe-mismatch.source-safe` set."
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   714
                    )
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   715
                    % mismatch_config,
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   716
                    hint=hint,
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
   717
                )
39692
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
   718
39690
e0c5017124b3 localrepo: load extensions in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39689
diff changeset
   719
    # The .hg/hgrc file may load extensions or contain config options
e0c5017124b3 localrepo: load extensions in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39689
diff changeset
   720
    # that influence repository construction. Attempt to load it and
e0c5017124b3 localrepo: load extensions in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39689
diff changeset
   721
    # process any new extensions that it may have pulled in.
45485
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45483
diff changeset
   722
    if loadhgrc(ui, wdirvfs, hgvfs, requirements, sharedvfs):
39852
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   723
        afterhgrcload(ui, wdirvfs, hgvfs, requirements)
39690
e0c5017124b3 localrepo: load extensions in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39689
diff changeset
   724
        extensions.loadall(ui)
40729
c93d046d4300 extensions: add "uipopulate" hook, called per instance, not per process
Yuya Nishihara <yuya@tcha.org>
parents: 40718
diff changeset
   725
        extensions.populateui(ui)
39690
e0c5017124b3 localrepo: load extensions in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39689
diff changeset
   726
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   727
    # Set of module names of extensions loaded for this repository.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   728
    extensionmodulenames = {m.__name__ for n, m in extensions.extensions(ui)}
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   729
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   730
    supportedrequirements = gathersupportedrequirements(ui)
39695
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   731
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   732
    # We first validate the requirements are known.
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   733
    ensurerequirementsrecognized(requirements, supportedrequirements)
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   734
39695
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   735
    # Then we validate that the known set is reasonable to use together.
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   736
    ensurerequirementscompatible(ui, requirements)
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   737
39696
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
   738
    # TODO there are unhandled edge cases related to opening repositories with
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
   739
    # shared storage. If storage is shared, we should also test for requirements
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
   740
    # compatibility in the pointed-to repo. This entails loading the .hg/hgrc in
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
   741
    # that repo, as that repo may load extensions needed to open it. This is a
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
   742
    # bit complicated because we don't want the other hgrc to overwrite settings
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
   743
    # in this hgrc.
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
   744
    #
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
   745
    # This bug is somewhat mitigated by the fact that we copy the .hg/requires
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
   746
    # file when sharing repos. But if a requirement is added after the share is
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
   747
    # performed, thereby introducing a new requirement for the opener, we may
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
   748
    # will not see that and could encounter a run-time error interacting with
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
   749
    # that shared store since it has an unknown-to-us requirement.
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
   750
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   751
    # At this point, we know we should be capable of opening the repository.
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   752
    # Now get on with doing that.
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   753
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
   754
    features = set()
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
   755
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   756
    # The "store" part of the repository holds versioned data. How it is
45353
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   757
    # accessed is determined by various requirements. If `shared` or
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   758
    # `relshared` requirements are present, this indicates current repository
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   759
    # is a share and store exists in path mentioned in `.hg/sharedpath`
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   760
    if shared:
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   761
        storebasepath = sharedvfs.base
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   762
        cachepath = sharedvfs.join(b'cache')
45353
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
   763
        features.add(repository.REPO_FEATURE_SHARED_STORAGE)
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   764
    else:
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   765
        storebasepath = hgvfs.base
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   766
        cachepath = hgvfs.join(b'cache')
40795
e1c3a2e9df59 repo: add a `wcachevfs` to access the `.hg/wcache/` directory
Boris Feld <boris.feld@octobus.net>
parents: 40794
diff changeset
   767
    wcachepath = hgvfs.join(b'wcache')
e1c3a2e9df59 repo: add a `wcachevfs` to access the `.hg/wcache/` directory
Boris Feld <boris.feld@octobus.net>
parents: 40794
diff changeset
   768
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   769
    # The store has changed over time and the exact layout is dictated by
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   770
    # requirements. The store interface abstracts differences across all
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   771
    # of them.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   772
    store = makestore(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   773
        requirements,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   774
        storebasepath,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   775
        lambda base: vfsmod.vfs(base, cacheaudited=True),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   776
    )
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   777
    hgvfs.createmode = store.createmode
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   778
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   779
    storevfs = store.vfs
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
   780
    storevfs.options = resolvestorevfsoptions(ui, requirements, features)
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   781
47263
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47260
diff changeset
   782
    if (
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47260
diff changeset
   783
        requirementsmod.REVLOGV2_REQUIREMENT in requirements
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47260
diff changeset
   784
        or requirementsmod.CHANGELOGV2_REQUIREMENT in requirements
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47260
diff changeset
   785
    ):
47226
19d4802cb304 sidedata: add a 'side-data' repository feature and use it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47221
diff changeset
   786
        features.add(repository.REPO_FEATURE_SIDE_DATA)
47238
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47233
diff changeset
   787
        # the revlogv2 docket introduced race condition that we need to fix
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47233
diff changeset
   788
        features.discard(repository.REPO_FEATURE_STREAM_CLONE)
47226
19d4802cb304 sidedata: add a 'side-data' repository feature and use it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47221
diff changeset
   789
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   790
    # The cache vfs is used to manage cache files.
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   791
    cachevfs = vfsmod.vfs(cachepath, cacheaudited=True)
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   792
    cachevfs.createmode = store.createmode
40795
e1c3a2e9df59 repo: add a `wcachevfs` to access the `.hg/wcache/` directory
Boris Feld <boris.feld@octobus.net>
parents: 40794
diff changeset
   793
    # The cache vfs is used to manage cache files related to the working copy
e1c3a2e9df59 repo: add a `wcachevfs` to access the `.hg/wcache/` directory
Boris Feld <boris.feld@octobus.net>
parents: 40794
diff changeset
   794
    wcachevfs = vfsmod.vfs(wcachepath, cacheaudited=True)
e1c3a2e9df59 repo: add a `wcachevfs` to access the `.hg/wcache/` directory
Boris Feld <boris.feld@octobus.net>
parents: 40794
diff changeset
   795
    wcachevfs.createmode = store.createmode
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   796
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   797
    # Now resolve the type for the repository object. We do this by repeatedly
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   798
    # calling a factory function to produces types for specific aspects of the
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   799
    # repo's operation. The aggregate returned types are used as base classes
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   800
    # for a dynamically-derived type, which will represent our new repository.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   801
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   802
    bases = []
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   803
    extrastate = {}
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   804
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   805
    for iface, fn in REPO_INTERFACES:
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   806
        # We pass all potentially useful state to give extensions tons of
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   807
        # flexibility.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   808
        typ = fn()(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   809
            ui=ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   810
            intents=intents,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   811
            requirements=requirements,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   812
            features=features,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   813
            wdirvfs=wdirvfs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   814
            hgvfs=hgvfs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   815
            store=store,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   816
            storevfs=storevfs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   817
            storeoptions=storevfs.options,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   818
            cachevfs=cachevfs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   819
            wcachevfs=wcachevfs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   820
            extensionmodulenames=extensionmodulenames,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   821
            extrastate=extrastate,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   822
            baseclasses=bases,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   823
        )
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   824
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   825
        if not isinstance(typ, type):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   826
            raise error.ProgrammingError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   827
                b'unable to construct type for %s' % iface
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   828
            )
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   829
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   830
        bases.append(typ)
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   831
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   832
    # type() allows you to use characters in type names that wouldn't be
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   833
    # recognized as Python symbols in source code. We abuse that to add
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   834
    # rich information about our constructed repo.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   835
    name = pycompat.sysstr(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   836
        b'derivedrepo:%s<%s>' % (wdirvfs.base, b','.join(sorted(requirements)))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   837
    )
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   838
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   839
    cls = type(name, tuple(bases), {})
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   840
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   841
    return cls(
39689
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
   842
        baseui=baseui,
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
   843
        ui=ui,
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
   844
        origroot=path,
39688
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   845
        wdirvfs=wdirvfs,
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   846
        hgvfs=hgvfs,
39692
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
   847
        requirements=requirements,
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   848
        supportedrequirements=supportedrequirements,
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   849
        sharedpath=storebasepath,
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   850
        store=store,
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   851
        cachevfs=cachevfs,
40795
e1c3a2e9df59 repo: add a `wcachevfs` to access the `.hg/wcache/` directory
Boris Feld <boris.feld@octobus.net>
parents: 40794
diff changeset
   852
        wcachevfs=wcachevfs,
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
   853
        features=features,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   854
        intents=intents,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   855
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   856
39687
bfeab472e3c0 localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39668
diff changeset
   857
49571
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
   858
def loadhgrc(
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
   859
    ui,
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
   860
    wdirvfs: vfsmod.vfs,
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
   861
    hgvfs: vfsmod.vfs,
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
   862
    requirements,
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
   863
    sharedvfs: Optional[vfsmod.vfs] = None,
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
   864
):
40535
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   865
    """Load hgrc files/content into a ui instance.
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   866
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   867
    This is called during repository opening to load any additional
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   868
    config files or settings relevant to the current repository.
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   869
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   870
    Returns a bool indicating whether any additional configs were loaded.
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   871
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   872
    Extensions should monkeypatch this function to modify how per-repo
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   873
    configs are loaded. For example, an extension may wish to pull in
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   874
    configs from alternate files or sources.
45485
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45483
diff changeset
   875
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45483
diff changeset
   876
    sharedvfs is vfs object pointing to source repo if the current one is a
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45483
diff changeset
   877
    shared one
40535
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   878
    """
44243
238790674d69 config: add a function in `rcutil` to abstract HGRCSKIPREPO
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44124
diff changeset
   879
    if not rcutil.use_repo_hgrc():
44124
d56a2d6f34f0 hgrc: introduce HGRCSKIPREPO to skip reading the repository's hgrc
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44107
diff changeset
   880
        return False
45485
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45483
diff changeset
   881
45783
88a47cbf063c config: add a .hg/hgrc-not-shared which won't be shared in share-safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
   882
    ret = False
45485
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45483
diff changeset
   883
    # first load config from shared source if we has to
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45483
diff changeset
   884
    if requirementsmod.SHARESAFE_REQUIREMENT in requirements and sharedvfs:
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45483
diff changeset
   885
        try:
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45483
diff changeset
   886
            ui.readconfig(sharedvfs.join(b'hgrc'), root=sharedvfs.base)
45783
88a47cbf063c config: add a .hg/hgrc-not-shared which won't be shared in share-safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
   887
            ret = True
45485
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45483
diff changeset
   888
        except IOError:
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45483
diff changeset
   889
            pass
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45483
diff changeset
   890
40535
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   891
    try:
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   892
        ui.readconfig(hgvfs.join(b'hgrc'), root=wdirvfs.base)
45783
88a47cbf063c config: add a .hg/hgrc-not-shared which won't be shared in share-safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
   893
        ret = True
40535
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   894
    except IOError:
45783
88a47cbf063c config: add a .hg/hgrc-not-shared which won't be shared in share-safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
   895
        pass
88a47cbf063c config: add a .hg/hgrc-not-shared which won't be shared in share-safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
   896
88a47cbf063c config: add a .hg/hgrc-not-shared which won't be shared in share-safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
   897
    try:
88a47cbf063c config: add a .hg/hgrc-not-shared which won't be shared in share-safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
   898
        ui.readconfig(hgvfs.join(b'hgrc-not-shared'), root=wdirvfs.base)
88a47cbf063c config: add a .hg/hgrc-not-shared which won't be shared in share-safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
   899
        ret = True
88a47cbf063c config: add a .hg/hgrc-not-shared which won't be shared in share-safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
   900
    except IOError:
88a47cbf063c config: add a .hg/hgrc-not-shared which won't be shared in share-safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
   901
        pass
88a47cbf063c config: add a .hg/hgrc-not-shared which won't be shared in share-safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
   902
88a47cbf063c config: add a .hg/hgrc-not-shared which won't be shared in share-safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
   903
    return ret
40535
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   904
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   905
39852
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   906
def afterhgrcload(ui, wdirvfs, hgvfs, requirements):
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   907
    """Perform additional actions after .hg/hgrc is loaded.
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   908
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   909
    This function is called during repository loading immediately after
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   910
    the .hg/hgrc file is loaded and before per-repo extensions are loaded.
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   911
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   912
    The function can be used to validate configs, automatically add
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   913
    options (including extensions) based on requirements, etc.
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   914
    """
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   915
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   916
    # Map of requirements to list of extensions to load automatically when
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   917
    # requirement is present.
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   918
    autoextensions = {
44482
21893ff382cd localrepo: add git extension to autoextensions list
Augie Fackler <raf@durin42.com>
parents: 44452
diff changeset
   919
        b'git': [b'git'],
39854
823a580448d7 largefiles: automatically load largefiles extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39852
diff changeset
   920
        b'largefiles': [b'largefiles'],
39852
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   921
        b'lfs': [b'lfs'],
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   922
    }
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   923
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   924
    for requirement, names in sorted(autoextensions.items()):
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   925
        if requirement not in requirements:
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   926
            continue
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   927
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   928
        for name in names:
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   929
            if not ui.hasconfig(b'extensions', name):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   930
                ui.setconfig(b'extensions', name, b'', source=b'autoload')
39852
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   931
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   932
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   933
def gathersupportedrequirements(ui):
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   934
    """Determine the complete set of recognized requirements."""
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   935
    # Start with all requirements supported by this file.
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   936
    supported = set(localrepository._basesupported)
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   937
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   938
    # Execute ``featuresetupfuncs`` entries if they belong to an extension
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   939
    # relevant to this ui instance.
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   940
    modules = {m.__name__ for n, m in extensions.extensions(ui)}
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   941
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   942
    for fn in featuresetupfuncs:
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   943
        if fn.__module__ in modules:
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   944
            fn(ui, supported)
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   945
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   946
    # Add derived requirements from registered compression engines.
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   947
    for name in util.compengines:
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   948
        engine = util.compengines[name]
42135
b970fece153d compression: only declare revlog support for available engine
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42127
diff changeset
   949
        if engine.available() and engine.revlogheader():
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   950
            supported.add(b'exp-compression-%s' % name)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   951
            if engine.name() == b'zstd':
48652
6fd9a17c32ab requirements: add an official `REVLOG_COMPRESSION_ZSTD` const
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48604
diff changeset
   952
                supported.add(requirementsmod.REVLOG_COMPRESSION_ZSTD)
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   953
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   954
    return supported
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   955
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   956
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   957
def ensurerequirementsrecognized(requirements, supported):
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   958
    """Validate that a set of local requirements is recognized.
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   959
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   960
    Receives a set of requirements. Raises an ``error.RepoError`` if there
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   961
    exists any requirement in that set that currently loaded code doesn't
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   962
    recognize.
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   963
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   964
    Returns a set of supported requirements.
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   965
    """
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   966
    missing = set()
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   967
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   968
    for requirement in requirements:
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   969
        if requirement in supported:
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   970
            continue
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   971
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   972
        if not requirement or not requirement[0:1].isalnum():
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   973
            raise error.RequirementError(_(b'.hg/requires file is corrupt'))
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   974
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   975
        missing.add(requirement)
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   976
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   977
    if missing:
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   978
        raise error.RequirementError(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   979
            _(b'repository requires features unknown to this Mercurial: %s')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   980
            % b' '.join(sorted(missing)),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   981
            hint=_(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   982
                b'see https://mercurial-scm.org/wiki/MissingRequirement '
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   983
                b'for more information'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   984
            ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   985
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
   986
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   987
39695
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   988
def ensurerequirementscompatible(ui, requirements):
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   989
    """Validates that a set of recognized requirements is mutually compatible.
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   990
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   991
    Some requirements may not be compatible with others or require
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   992
    config options that aren't enabled. This function is called during
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   993
    repository opening to ensure that the set of requirements needed
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   994
    to open a repository is sane and compatible with config options.
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   995
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   996
    Extensions can monkeypatch this function to perform additional
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   997
    checking.
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   998
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   999
    ``error.RepoError`` should be raised on failure.
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
  1000
    """
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
  1001
    if (
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
  1002
        requirementsmod.SPARSE_REQUIREMENT in requirements
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
  1003
        and not sparse.enabled
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
  1004
    ):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1005
        raise error.RepoError(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1006
            _(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1007
                b'repository is using sparse feature but '
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1008
                b'sparse is not enabled; enable the '
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1009
                b'"sparse" extensions to access'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1010
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1011
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1012
39695
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
  1013
39698
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
  1014
def makestore(requirements, path, vfstype):
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
  1015
    """Construct a storage object for a repository."""
46637
ab58098bebed requirements: also add a store constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46636
diff changeset
  1016
    if requirementsmod.STORE_REQUIREMENT in requirements:
46638
b4c2a2af25e2 requirements: also add a fncache constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46637
diff changeset
  1017
        if requirementsmod.FNCACHE_REQUIREMENT in requirements:
46636
c3773636ddbb requirements: also add a dotencode constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46627
diff changeset
  1018
            dotencode = requirementsmod.DOTENCODE_REQUIREMENT in requirements
c3773636ddbb requirements: also add a dotencode constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46627
diff changeset
  1019
            return storemod.fncachestore(path, vfstype, dotencode)
39698
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
  1020
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
  1021
        return storemod.encodedstore(path, vfstype)
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
  1022
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
  1023
    return storemod.basicstore(path, vfstype)
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
  1024
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1025
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
  1026
def resolvestorevfsoptions(ui, requirements, features):
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1027
    """Resolve the options to pass to the store vfs opener.
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1028
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1029
    The returned dict is used to influence behavior of the storage layer.
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1030
    """
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1031
    options = {}
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1032
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
  1033
    if requirementsmod.TREEMANIFEST_REQUIREMENT in requirements:
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1034
        options[b'treemanifest'] = True
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1035
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1036
    # experimental config: format.manifestcachesize
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1037
    manifestcachesize = ui.configint(b'format', b'manifestcachesize')
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1038
    if manifestcachesize is not None:
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1039
        options[b'manifestcachesize'] = manifestcachesize
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1040
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1041
    # In the absence of another requirement superseding a revlog-related
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1042
    # requirement, we have to assume the repo is using revlog version 0.
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1043
    # This revlog format is super old and we don't bother trying to parse
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1044
    # opener options for it because those options wouldn't do anything
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1045
    # meaningful on such old repos.
45373
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
  1046
    if (
46626
ee91966aec0f requirements: add constant for revlog v1 requirement
Raphaël Gomès <rgomes@octobus.net>
parents: 46607
diff changeset
  1047
        requirementsmod.REVLOGV1_REQUIREMENT in requirements
45373
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
  1048
        or requirementsmod.REVLOGV2_REQUIREMENT in requirements
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
  1049
    ):
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
  1050
        options.update(resolverevlogstorevfsoptions(ui, requirements, features))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1051
    else:  # explicitly mark repo as using revlogv0
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1052
        options[b'revlogv0'] = True
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1053
45373
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
  1054
    if requirementsmod.COPIESSDC_REQUIREMENT in requirements:
43142
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43137
diff changeset
  1055
        options[b'copies-storage'] = b'changeset-sidedata'
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43137
diff changeset
  1056
    else:
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43137
diff changeset
  1057
        writecopiesto = ui.config(b'experimental', b'copies.write-to')
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43137
diff changeset
  1058
        copiesextramode = (b'changeset-only', b'compatibility')
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43137
diff changeset
  1059
        if writecopiesto in copiesextramode:
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43137
diff changeset
  1060
            options[b'copies-storage'] = b'extra'
43026
0b87eb2fba67 copies: prepare changelog for more copies storage mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43024
diff changeset
  1061
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1062
    return options
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1063
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1064
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
  1065
def resolverevlogstorevfsoptions(ui, requirements, features):
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1066
    """Resolve opener options specific to revlogs."""
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1067
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1068
    options = {}
40267
9d5ddf55415b revlog: allow flag processors to be applied via store options
Matt Harbison <matt_harbison@yahoo.com>
parents: 40086
diff changeset
  1069
    options[b'flagprocessors'] = {}
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1070
51031
133f5a54ed9d revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50929
diff changeset
  1071
    feature_config = options[b'feature-config'] = revlog.FeatureConfig()
133f5a54ed9d revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50929
diff changeset
  1072
    data_config = options[b'data-config'] = revlog.DataConfig()
133f5a54ed9d revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50929
diff changeset
  1073
    delta_config = options[b'delta-config'] = revlog.DeltaConfig()
133f5a54ed9d revlog: create the revlog object at the repository level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50929
diff changeset
  1074
46626
ee91966aec0f requirements: add constant for revlog v1 requirement
Raphaël Gomès <rgomes@octobus.net>
parents: 46607
diff changeset
  1075
    if requirementsmod.REVLOGV1_REQUIREMENT in requirements:
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1076
        options[b'revlogv1'] = True
45373
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
  1077
    if requirementsmod.REVLOGV2_REQUIREMENT in requirements:
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1078
        options[b'revlogv2'] = True
47263
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47260
diff changeset
  1079
    if requirementsmod.CHANGELOGV2_REQUIREMENT in requirements:
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47260
diff changeset
  1080
        options[b'changelogv2'] = True
49663
45d7b8c380d7 changelog-v2: add a configuration to disable rank computation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49657
diff changeset
  1081
        cmp_rank = ui.configbool(b'experimental', b'changelog-v2.compute-rank')
45d7b8c380d7 changelog-v2: add a configuration to disable rank computation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49657
diff changeset
  1082
        options[b'changelogv2.compute-rank'] = cmp_rank
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1083
46627
f4c325bf80fc requirements: also add a generaldelta constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46626
diff changeset
  1084
    if requirementsmod.GENERALDELTA_REQUIREMENT in requirements:
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1085
        options[b'generaldelta'] = True
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1086
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1087
    # experimental config: format.chunkcachesize
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1088
    chunkcachesize = ui.configint(b'format', b'chunkcachesize')
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1089
    if chunkcachesize is not None:
51032
774c00348f9f revlog: skip opener option to pass chunk_cache_size value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51031
diff changeset
  1090
        data_config.chunk_cache_size = chunkcachesize
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1091
51284
58d39c7865e5 usage: configure uncompressed chunk cache through resource configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51134
diff changeset
  1092
    memory_profile = scmutil.get_resource_profile(ui, b'memory')
58d39c7865e5 usage: configure uncompressed chunk cache through resource configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51134
diff changeset
  1093
    if memory_profile >= scmutil.RESOURCE_MEDIUM:
58d39c7865e5 usage: configure uncompressed chunk cache through resource configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51134
diff changeset
  1094
        data_config.uncompressed_cache_count = 10_000
58d39c7865e5 usage: configure uncompressed chunk cache through resource configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51134
diff changeset
  1095
        data_config.uncompressed_cache_factor = 4
58d39c7865e5 usage: configure uncompressed chunk cache through resource configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51134
diff changeset
  1096
        if memory_profile >= scmutil.RESOURCE_HIGH:
58d39c7865e5 usage: configure uncompressed chunk cache through resource configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51134
diff changeset
  1097
            data_config.uncompressed_cache_factor = 10
51108
0250e45040f1 revlog: add a small cache of unfiltered chunk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51104
diff changeset
  1098
51033
cd16b6895f62 revlog: skip opener option to pass delta_both_parents value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51032
diff changeset
  1099
    delta_config.delta_both_parents = ui.configbool(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1100
        b'storage', b'revlog.optimize-delta-parent-choice'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1101
    )
51034
a11179fb6bd9 revlog: skip opener options to pass candidate_group_chunk_size value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51033
diff changeset
  1102
    delta_config.candidate_group_chunk_size = ui.configint(
49657
f5f113f1b011 delta-find: add a way to control the number of bases tested at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49585
diff changeset
  1103
        b'storage',
f5f113f1b011 delta-find: add a way to control the number of bases tested at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49585
diff changeset
  1104
        b'revlog.delta-parent-search.candidate-group-chunk-size',
f5f113f1b011 delta-find: add a way to control the number of bases tested at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49585
diff changeset
  1105
    )
51035
6ccb07b9eeeb revlog: skip opener options to pass debug_delta value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51034
diff changeset
  1106
    delta_config.debug_delta = ui.configbool(b'debug', b'revlog.debug-delta')
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1107
47822
2813d406b036 issue6528: add a config option to control the fixing on the fly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47441
diff changeset
  1108
    issue6528 = ui.configbool(b'storage', b'revlog.issue6528.fix-incoming')
2813d406b036 issue6528: add a config option to control the fixing on the fly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47441
diff changeset
  1109
    options[b'issue6528.fix-incoming'] = issue6528
2813d406b036 issue6528: add a config option to control the fixing on the fly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47441
diff changeset
  1110
41819
688fc33e105d storage: introduce a `revlog.reuse-external-delta` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41818
diff changeset
  1111
    lazydelta = ui.configbool(b'storage', b'revlog.reuse-external-delta')
688fc33e105d storage: introduce a `revlog.reuse-external-delta` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41818
diff changeset
  1112
    lazydeltabase = False
688fc33e105d storage: introduce a `revlog.reuse-external-delta` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41818
diff changeset
  1113
    if lazydelta:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1114
        lazydeltabase = ui.configbool(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1115
            b'storage', b'revlog.reuse-external-delta-parent'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1116
        )
51036
83ce99f5e7f2 revlog: skip opener options to pass lazy_delta values
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51035
diff changeset
  1117
        if lazydeltabase is None:
83ce99f5e7f2 revlog: skip opener options to pass lazy_delta values
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51035
diff changeset
  1118
            lazydeltabase = not scmutil.gddeltaconfig(ui)
83ce99f5e7f2 revlog: skip opener options to pass lazy_delta values
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51035
diff changeset
  1119
    delta_config.lazy_delta = lazydelta
83ce99f5e7f2 revlog: skip opener options to pass lazy_delta values
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51035
diff changeset
  1120
    delta_config.lazy_delta_base = lazydeltabase
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1121
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1122
    chainspan = ui.configbytes(b'experimental', b'maxdeltachainspan')
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1123
    if 0 <= chainspan:
51037
d900f74456cc revlog: skip opener options to pass max_deltachain_span
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51036
diff changeset
  1124
        delta_config.max_deltachain_span = chainspan
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1125
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1126
    mmapindexthreshold = ui.configbytes(b'experimental', b'mmapindexthreshold')
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1127
    if mmapindexthreshold is not None:
51042
027bc364524b revlog: skip opener options to pass mmap_index_threshold value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51041
diff changeset
  1128
        data_config.mmap_index_threshold = mmapindexthreshold
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1129
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1130
    withsparseread = ui.configbool(b'experimental', b'sparse-read')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1131
    srdensitythres = float(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1132
        ui.config(b'experimental', b'sparse-read.density-threshold')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1133
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1134
    srmingapsize = ui.configbytes(b'experimental', b'sparse-read.min-gap-size')
51044
e2941c398f10 revlog: skip opener options to pass sparse reading values
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51043
diff changeset
  1135
    data_config.with_sparse_read = withsparseread
e2941c398f10 revlog: skip opener options to pass sparse reading values
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51043
diff changeset
  1136
    data_config.sr_density_threshold = srdensitythres
e2941c398f10 revlog: skip opener options to pass sparse reading values
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51043
diff changeset
  1137
    data_config.sr_min_gap_size = srmingapsize
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1138
45373
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
  1139
    sparserevlog = requirementsmod.SPARSEREVLOG_REQUIREMENT in requirements
51043
8ed03f773eac revlog: skip opener options to pass sparse_revlog value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51042
diff changeset
  1140
    delta_config.sparse_revlog = sparserevlog
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1141
    if sparserevlog:
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1142
        options[b'generaldelta'] = True
51044
e2941c398f10 revlog: skip opener options to pass sparse reading values
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51043
diff changeset
  1143
        data_config.with_sparse_read = True
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1144
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1145
    maxchainlen = None
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1146
    if sparserevlog:
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1147
        maxchainlen = revlogconst.SPARSE_REVLOG_MAX_CHAIN_LENGTH
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1148
    # experimental config: format.maxchainlen
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1149
    maxchainlen = ui.configint(b'format', b'maxchainlen', maxchainlen)
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1150
    if maxchainlen is not None:
51038
8228e8dd96dd revlog: skip opener options to pass max_chain_len
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51037
diff changeset
  1151
        delta_config.max_chain_len = maxchainlen
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1152
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1153
    for r in requirements:
42136
10a6725dca6e compression: introduce an official `zstd-revlog` requirement
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42135
diff changeset
  1154
        # we allow multiple compression engine requirement to co-exist because
10a6725dca6e compression: introduce an official `zstd-revlog` requirement
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42135
diff changeset
  1155
        # strickly speaking, revlog seems to support mixed compression style.
10a6725dca6e compression: introduce an official `zstd-revlog` requirement
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42135
diff changeset
  1156
        #
10a6725dca6e compression: introduce an official `zstd-revlog` requirement
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42135
diff changeset
  1157
        # The compression used for new entries will be "the last one"
10a6725dca6e compression: introduce an official `zstd-revlog` requirement
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42135
diff changeset
  1158
        prefix = r.startswith
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1159
        if prefix(b'revlog-compression-') or prefix(b'exp-compression-'):
51039
940445de2b09 revlog: skip opener options to pass compression_engine value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51038
diff changeset
  1160
            feature_config.compression_engine = r.split(b'-', 2)[2]
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1161
51040
7d66621c5349 revlog: skip opener options to pass compression option values
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51039
diff changeset
  1162
    zlib_level = ui.configint(b'storage', b'revlog.zlib.level')
7d66621c5349 revlog: skip opener options to pass compression option values
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51039
diff changeset
  1163
    if zlib_level is not None:
7d66621c5349 revlog: skip opener options to pass compression option values
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51039
diff changeset
  1164
        if not (0 <= zlib_level <= 9):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1165
            msg = _(b'invalid value for `storage.revlog.zlib.level` config: %d')
51040
7d66621c5349 revlog: skip opener options to pass compression option values
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51039
diff changeset
  1166
            raise error.Abort(msg % zlib_level)
7d66621c5349 revlog: skip opener options to pass compression option values
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51039
diff changeset
  1167
    feature_config.compression_engine_options[b'zlib.level'] = zlib_level
7d66621c5349 revlog: skip opener options to pass compression option values
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51039
diff changeset
  1168
    zstd_level = ui.configint(b'storage', b'revlog.zstd.level')
7d66621c5349 revlog: skip opener options to pass compression option values
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51039
diff changeset
  1169
    if zstd_level is not None:
7d66621c5349 revlog: skip opener options to pass compression option values
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51039
diff changeset
  1170
        if not (0 <= zstd_level <= 22):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1171
            msg = _(b'invalid value for `storage.revlog.zstd.level` config: %d')
51040
7d66621c5349 revlog: skip opener options to pass compression option values
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51039
diff changeset
  1172
            raise error.Abort(msg % zstd_level)
7d66621c5349 revlog: skip opener options to pass compression option values
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51039
diff changeset
  1173
    feature_config.compression_engine_options[b'zstd.level'] = zstd_level
42043
1fac9b931d46 compression: introduce a `storage.revlog.zlib.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42004
diff changeset
  1174
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
  1175
    if requirementsmod.NARROW_REQUIREMENT in requirements:
51041
683b96c416d8 revlog: skip opener options to pass enable_ellipsis
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51040
diff changeset
  1176
        feature_config.enable_ellipsis = True
39770
7aa440222323 localrepo: enable ellipsis flag on revlogs when repo is narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39765
diff changeset
  1177
44043
b958419b6c53 py3: byteify some `ui.configbool()` parameters
Matt Harbison <matt_harbison@yahoo.com>
parents: 44023
diff changeset
  1178
    if ui.configbool(b'experimental', b'rust.index'):
44014
8042856c90b6 rust-index: add a `experimental.rust.index` option to use the wrapper
Georges Racinet <georges.racinet@octobus.net>
parents: 43778
diff changeset
  1179
        options[b'rust.index'] = True
45373
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
  1180
    if requirementsmod.NODEMAP_REQUIREMENT in requirements:
46309
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
  1181
        slow_path = ui.config(
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
  1182
            b'storage', b'revlog.persistent-nodemap.slow-path'
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
  1183
        )
46311
014ac7a32048 persistent-nodemap: add a "abort" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46310
diff changeset
  1184
        if slow_path not in (b'allow', b'warn', b'abort'):
46309
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
  1185
            default = ui.config_default(
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
  1186
                b'storage', b'revlog.persistent-nodemap.slow-path'
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
  1187
            )
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
  1188
            msg = _(
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
  1189
                b'unknown value for config '
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
  1190
                b'"storage.revlog.persistent-nodemap.slow-path": "%s"\n'
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
  1191
            )
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
  1192
            ui.warn(msg % slow_path)
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
  1193
            if not ui.quiet:
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
  1194
                ui.warn(_(b'falling back to default value: %s\n') % default)
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
  1195
            slow_path = default
46310
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46309
diff changeset
  1196
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46309
diff changeset
  1197
        msg = _(
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46309
diff changeset
  1198
            b"accessing `persistent-nodemap` repository without associated "
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46309
diff changeset
  1199
            b"fast implementation."
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46309
diff changeset
  1200
        )
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46309
diff changeset
  1201
        hint = _(
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46309
diff changeset
  1202
            b"check `hg help config.format.use-persistent-nodemap` "
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46309
diff changeset
  1203
            b"for details"
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46309
diff changeset
  1204
        )
46311
014ac7a32048 persistent-nodemap: add a "abort" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46310
diff changeset
  1205
        if not revlog.HAS_FAST_PERSISTENT_NODEMAP:
014ac7a32048 persistent-nodemap: add a "abort" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46310
diff changeset
  1206
            if slow_path == b'warn':
014ac7a32048 persistent-nodemap: add a "abort" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46310
diff changeset
  1207
                msg = b"warning: " + msg + b'\n'
014ac7a32048 persistent-nodemap: add a "abort" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46310
diff changeset
  1208
                ui.warn(msg)
014ac7a32048 persistent-nodemap: add a "abort" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46310
diff changeset
  1209
                if not ui.quiet:
014ac7a32048 persistent-nodemap: add a "abort" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46310
diff changeset
  1210
                    hint = b'(' + hint + b')\n'
014ac7a32048 persistent-nodemap: add a "abort" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46310
diff changeset
  1211
                    ui.warn(hint)
014ac7a32048 persistent-nodemap: add a "abort" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46310
diff changeset
  1212
            if slow_path == b'abort':
014ac7a32048 persistent-nodemap: add a "abort" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46310
diff changeset
  1213
                raise error.Abort(msg, hint=hint)
44792
5e3c718692bb nodemap: drop the 'exp-' prefix for internal opener option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44791
diff changeset
  1214
        options[b'persistent-nodemap'] = True
48235
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
  1215
    if requirementsmod.DIRSTATE_V2_REQUIREMENT in requirements:
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
  1216
        slow_path = ui.config(b'storage', b'dirstate-v2.slow-path')
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
  1217
        if slow_path not in (b'allow', b'warn', b'abort'):
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
  1218
            default = ui.config_default(b'storage', b'dirstate-v2.slow-path')
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
  1219
            msg = _(b'unknown value for config "dirstate-v2.slow-path": "%s"\n')
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
  1220
            ui.warn(msg % slow_path)
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
  1221
            if not ui.quiet:
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
  1222
                ui.warn(_(b'falling back to default value: %s\n') % default)
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
  1223
            slow_path = default
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
  1224
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
  1225
        msg = _(
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
  1226
            b"accessing `dirstate-v2` repository without associated "
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
  1227
            b"fast implementation."
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
  1228
        )
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
  1229
        hint = _(
48674
f7086f6173f8 dirstate-v2: rename the configuration to enable the format
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48295
diff changeset
  1230
            b"check `hg help config.format.use-dirstate-v2` " b"for details"
48235
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
  1231
        )
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
  1232
        if not dirstate.HAS_FAST_DIRSTATE_V2:
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
  1233
            if slow_path == b'warn':
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
  1234
                msg = b"warning: " + msg + b'\n'
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
  1235
                ui.warn(msg)
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
  1236
                if not ui.quiet:
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
  1237
                    hint = b'(' + hint + b')\n'
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
  1238
                    ui.warn(hint)
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
  1239
            if slow_path == b'abort':
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
  1240
                raise error.Abort(msg, hint=hint)
46306
7d096e5a5b90 persistent-nodemap: rename the storage.revlog.nodemap.mmap option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46263
diff changeset
  1241
    if ui.configbool(b'storage', b'revlog.persistent-nodemap.mmap'):
44792
5e3c718692bb nodemap: drop the 'exp-' prefix for internal opener option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44791
diff changeset
  1242
        options[b'persistent-nodemap.mmap'] = True
44313
6f9e8e142cea nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44308
diff changeset
  1243
    if ui.configbool(b'devel', b'persistent-nodemap'):
6f9e8e142cea nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44308
diff changeset
  1244
        options[b'devel-force-nodemap'] = True
44014
8042856c90b6 rust-index: add a `experimental.rust.index` option to use the wrapper
Georges Racinet <georges.racinet@octobus.net>
parents: 43778
diff changeset
  1245
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1246
    return options
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
  1247
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1248
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1249
def makemain(**kwargs):
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1250
    """Produce a type conforming to ``ilocalrepositorymain``."""
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1251
    return localrepository
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1252
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1253
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1254
@interfaceutil.implementer(repository.ilocalrepositoryfilestorage)
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48935
diff changeset
  1255
class revlogfilestorage:
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1256
    """File storage when using revlogs."""
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1257
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1258
    def file(self, path):
46549
9842c00f0252 log: fix handling of root (or empty) path provided by matcher (issue6478)
Yuya Nishihara <yuya@tcha.org>
parents: 46351
diff changeset
  1259
        if path.startswith(b'/'):
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1260
            path = path[1:]
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1261
50316
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50301
diff changeset
  1262
        try_split = (
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50301
diff changeset
  1263
            self.currenttransaction() is not None
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50301
diff changeset
  1264
            or txnutil.mayhavepending(self.root)
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50301
diff changeset
  1265
        )
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50301
diff changeset
  1266
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50301
diff changeset
  1267
        return filelog.filelog(self.svfs, path, try_split=try_split)
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1268
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1269
39765
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
  1270
@interfaceutil.implementer(repository.ilocalrepositoryfilestorage)
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48935
diff changeset
  1271
class revlognarrowfilestorage:
39765
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
  1272
    """File storage when using revlogs and narrow files."""
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
  1273
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
  1274
    def file(self, path):
46549
9842c00f0252 log: fix handling of root (or empty) path provided by matcher (issue6478)
Yuya Nishihara <yuya@tcha.org>
parents: 46351
diff changeset
  1275
        if path.startswith(b'/'):
39765
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
  1276
            path = path[1:]
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
  1277
50316
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50301
diff changeset
  1278
        try_split = (
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50301
diff changeset
  1279
            self.currenttransaction() is not None
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50301
diff changeset
  1280
            or txnutil.mayhavepending(self.root)
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50301
diff changeset
  1281
        )
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50301
diff changeset
  1282
        return filelog.narrowfilelog(
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50301
diff changeset
  1283
            self.svfs, path, self._storenarrowmatch, try_split=try_split
87f0155d68aa revlog: improve the robustness of the splitting process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50301
diff changeset
  1284
        )
39765
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
  1285
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1286
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
  1287
def makefilestorage(requirements, features, **kwargs):
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1288
    """Produce a type conforming to ``ilocalrepositoryfilestorage``."""
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
  1289
    features.add(repository.REPO_FEATURE_REVLOG_FILE_STORAGE)
40027
83146d176c03 localrepo: add repository feature when repo can be stream cloned
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39996
diff changeset
  1290
    features.add(repository.REPO_FEATURE_STREAM_CLONE)
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
  1291
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
  1292
    if requirementsmod.NARROW_REQUIREMENT in requirements:
39765
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
  1293
        return revlognarrowfilestorage
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
  1294
    else:
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
  1295
        return revlogfilestorage
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1296
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1297
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1298
# List of repository interfaces and factory functions for them. Each
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1299
# will be called in order during ``makelocalrepository()`` to iteratively
39994
6962ebc8f817 localrepo: capture repo interface factory functions as lambas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39959
diff changeset
  1300
# derive the final type for a local repository instance. We capture the
6962ebc8f817 localrepo: capture repo interface factory functions as lambas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39959
diff changeset
  1301
# function as a lambda so we don't hold a reference and the module-level
6962ebc8f817 localrepo: capture repo interface factory functions as lambas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39959
diff changeset
  1302
# functions can be wrapped.
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1303
REPO_INTERFACES = [
39994
6962ebc8f817 localrepo: capture repo interface factory functions as lambas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39959
diff changeset
  1304
    (repository.ilocalrepositorymain, lambda: makemain),
6962ebc8f817 localrepo: capture repo interface factory functions as lambas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39959
diff changeset
  1305
    (repository.ilocalrepositoryfilestorage, lambda: makefilestorage),
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1306
]
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1307
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1308
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1309
@interfaceutil.implementer(repository.ilocalrepositorymain)
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48935
diff changeset
  1310
class localrepository:
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1311
    """Main class for representing local repositories.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1312
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1313
    All local repositories are instances of this class.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1314
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1315
    Constructed on its own, instances of this class are not usable as
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1316
    repository objects. To obtain a usable repository object, call
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1317
    ``hg.repository()``, ``localrepo.instance()``, or
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1318
    ``localrepo.makelocalrepository()``. The latter is the lowest-level.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1319
    ``instance()`` adds support for creating new repositories.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1320
    ``hg.repository()`` adds more extension integration, including calling
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1321
    ``reposetup()``. Generally speaking, ``hg.repository()`` should be
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1322
    used.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
  1323
    """
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
  1324
48604
348d2c6b5048 requirements: remove the `localrepo.supportedformat` attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48603
diff changeset
  1325
    _basesupported = {
49451
0c70d888a484 phase: introduce a dedicated requirement for the `archived` phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49355
diff changeset
  1326
        requirementsmod.ARCHIVED_PHASE_REQUIREMENT,
48604
348d2c6b5048 requirements: remove the `localrepo.supportedformat` attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48603
diff changeset
  1327
        requirementsmod.BOOKMARKS_IN_STORE_REQUIREMENT,
47263
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47260
diff changeset
  1328
        requirementsmod.CHANGELOGV2_REQUIREMENT,
48604
348d2c6b5048 requirements: remove the `localrepo.supportedformat` attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48603
diff changeset
  1329
        requirementsmod.COPIESSDC_REQUIREMENT,
48793
6e559391f96e tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48792
diff changeset
  1330
        requirementsmod.DIRSTATE_TRACKED_HINT_V1,
48223
b4f83c9e7905 dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48040
diff changeset
  1331
        requirementsmod.DIRSTATE_V2_REQUIREMENT,
48603
3a8bc0b48e51 requirements: sort _basesupported
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48602
diff changeset
  1332
        requirementsmod.DOTENCODE_REQUIREMENT,
46638
b4c2a2af25e2 requirements: also add a fncache constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46637
diff changeset
  1333
        requirementsmod.FNCACHE_REQUIREMENT,
48604
348d2c6b5048 requirements: remove the `localrepo.supportedformat` attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48603
diff changeset
  1334
        requirementsmod.GENERALDELTA_REQUIREMENT,
48603
3a8bc0b48e51 requirements: sort _basesupported
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48602
diff changeset
  1335
        requirementsmod.INTERNAL_PHASE_REQUIREMENT,
48604
348d2c6b5048 requirements: remove the `localrepo.supportedformat` attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48603
diff changeset
  1336
        requirementsmod.NODEMAP_REQUIREMENT,
45386
034d94f8761b requirements: introduce constants for `shared` and `relshared` requirements
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45373
diff changeset
  1337
        requirementsmod.RELATIVE_SHARED_REQUIREMENT,
46626
ee91966aec0f requirements: add constant for revlog v1 requirement
Raphaël Gomès <rgomes@octobus.net>
parents: 46607
diff changeset
  1338
        requirementsmod.REVLOGV1_REQUIREMENT,
45373
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
  1339
        requirementsmod.REVLOGV2_REQUIREMENT,
48603
3a8bc0b48e51 requirements: sort _basesupported
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48602
diff changeset
  1340
        requirementsmod.SHARED_REQUIREMENT,
48604
348d2c6b5048 requirements: remove the `localrepo.supportedformat` attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48603
diff changeset
  1341
        requirementsmod.SHARESAFE_REQUIREMENT,
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
  1342
        requirementsmod.SPARSE_REQUIREMENT,
45373
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
  1343
        requirementsmod.SPARSEREVLOG_REQUIREMENT,
46637
ab58098bebed requirements: also add a store constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46636
diff changeset
  1344
        requirementsmod.STORE_REQUIREMENT,
48604
348d2c6b5048 requirements: remove the `localrepo.supportedformat` attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48603
diff changeset
  1345
        requirementsmod.TREEMANIFEST_REQUIREMENT,
32314
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32312
diff changeset
  1346
    }
17137
b090601a80d1 localrepo: make requirements and openerreqs mutable by subclasses
Bryan O'Sullivan <bryano@fb.com>
parents: 17075
diff changeset
  1347
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1348
    # list of prefix for file which can be written without 'wlock'
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1349
    # Extensions should extend this list when needed
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1350
    _wlockfreeprefix = {
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1351
        # We migh consider requiring 'wlock' for the next
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1352
        # two, but pretty much all the existing code assume
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1353
        # wlock is not needed so we keep them excluded for
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1354
        # now.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1355
        b'hgrc',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1356
        b'requires',
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1357
        # XXX cache is a complicatged business someone
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1358
        # should investigate this in depth at some point
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1359
        b'cache/',
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1360
        # XXX bisect was still a bit too messy at the time
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1361
        # this changeset was introduced. Someone should fix
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1362
        # the remainig bit and drop this line
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1363
        b'bisect.state',
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1364
    }
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1365
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1366
    def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1367
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1368
        baseui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1369
        ui,
49571
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  1370
        origroot: bytes,
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  1371
        wdirvfs: vfsmod.vfs,
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  1372
        hgvfs: vfsmod.vfs,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1373
        requirements,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1374
        supportedrequirements,
49571
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  1375
        sharedpath: bytes,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1376
        store,
49571
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  1377
        cachevfs: vfsmod.vfs,
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  1378
        wcachevfs: vfsmod.vfs,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1379
        features,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1380
        intents=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1381
    ):
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  1382
        """Create a new local repository instance.
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  1383
39688
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1384
        Most callers should use ``hg.repository()``, ``localrepo.instance()``,
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1385
        or ``localrepo.makelocalrepository()`` for obtaining a new repository
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1386
        object.
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1387
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1388
        Arguments:
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1389
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1390
        baseui
39689
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
  1391
           ``ui.ui`` instance that ``ui`` argument was based off of.
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
  1392
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
  1393
        ui
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
  1394
           ``ui.ui`` instance for use by the repository.
39688
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1395
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1396
        origroot
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1397
           ``bytes`` path to working directory root of this repository.
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1398
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1399
        wdirvfs
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1400
           ``vfs.vfs`` rooted at the working directory.
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1401
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1402
        hgvfs
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1403
           ``vfs.vfs`` rooted at .hg/
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1404
39692
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
  1405
        requirements
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
  1406
           ``set`` of bytestrings representing repository opening requirements.
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
  1407
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
  1408
        supportedrequirements
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
  1409
           ``set`` of bytestrings representing repository requirements that we
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
  1410
           know how to open. May be a supetset of ``requirements``.
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
  1411
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
  1412
        sharedpath
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
  1413
           ``bytes`` Defining path to storage base directory. Points to a
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
  1414
           ``.hg/`` directory somewhere.
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
  1415
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
  1416
        store
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
  1417
           ``store.basicstore`` (or derived) instance providing access to
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
  1418
           versioned storage.
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
  1419
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
  1420
        cachevfs
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
  1421
           ``vfs.vfs`` used for cache files.
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
  1422
40795
e1c3a2e9df59 repo: add a `wcachevfs` to access the `.hg/wcache/` directory
Boris Feld <boris.feld@octobus.net>
parents: 40794
diff changeset
  1423
        wcachevfs
e1c3a2e9df59 repo: add a `wcachevfs` to access the `.hg/wcache/` directory
Boris Feld <boris.feld@octobus.net>
parents: 40794
diff changeset
  1424
           ``vfs.vfs`` used for cache files related to the working copy.
e1c3a2e9df59 repo: add a `wcachevfs` to access the `.hg/wcache/` directory
Boris Feld <boris.feld@octobus.net>
parents: 40794
diff changeset
  1425
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
  1426
        features
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
  1427
           ``set`` of bytestrings defining features/capabilities of this
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
  1428
           instance.
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
  1429
39688
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1430
        intents
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1431
           ``set`` of system strings indicating what this repo will be used
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1432
           for.
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  1433
        """
39688
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1434
        self.baseui = baseui
39689
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
  1435
        self.ui = ui
39688
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1436
        self.origroot = origroot
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1437
        # vfs rooted at working directory.
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1438
        self.wvfs = wdirvfs
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1439
        self.root = wdirvfs.base
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1440
        # vfs rooted at .hg/. Used to access most non-store paths.
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1441
        self.vfs = hgvfs
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1442
        self.path = hgvfs.base
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
  1443
        self.requirements = requirements
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46713
diff changeset
  1444
        self.nodeconstants = sha1nodeconstants
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46713
diff changeset
  1445
        self.nullid = self.nodeconstants.nullid
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
  1446
        self.supported = supportedrequirements
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
  1447
        self.sharedpath = sharedpath
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
  1448
        self.store = store
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
  1449
        self.cachevfs = cachevfs
40795
e1c3a2e9df59 repo: add a `wcachevfs` to access the `.hg/wcache/` directory
Boris Feld <boris.feld@octobus.net>
parents: 40794
diff changeset
  1450
        self.wcachevfs = wcachevfs
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
  1451
        self.features = features
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  1452
32730
b8ff7d0ff361 localrepo: move filtername to __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32729
diff changeset
  1453
        self.filtername = None
39688
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1454
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1455
        if self.ui.configbool(b'devel', b'all-warnings') or self.ui.configbool(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1456
            b'devel', b'check-locks'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1457
        ):
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1458
            self.vfs.audit = self._getvfsward(self.vfs.audit)
15922
23921c17299a phases: mechanism to allow extension to alter initial computation of phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15892
diff changeset
  1459
        # A list of callback to shape the phase if no data were found.
23921c17299a phases: mechanism to allow extension to alter initial computation of phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15892
diff changeset
  1460
        # Callback are in the form: func(repo, roots) --> processed root.
23921c17299a phases: mechanism to allow extension to alter initial computation of phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15892
diff changeset
  1461
        # This list it to be filled by extension during repo setup
23921c17299a phases: mechanism to allow extension to alter initial computation of phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15892
diff changeset
  1462
        self._phasedefaults = []
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
  1463
31111
95ec3ad62f62 color: initialize color for the localrepo ui
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31054
diff changeset
  1464
        color.setup(self.ui)
19778
55ef79031009 localrepo: make supported features manageable in each repositories individually
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19650
diff changeset
  1465
6840
80e51429cb9a introduce store classes
Adrian Buehlmann <adrian@cadifra.com>
parents: 6839
diff changeset
  1466
        self.spath = self.store.path
17654
1dc37491e9fb localrepo: use "vfs" constructor/field for initialization around "store"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17650
diff changeset
  1467
        self.svfs = self.store.vfs
6840
80e51429cb9a introduce store classes
Adrian Buehlmann <adrian@cadifra.com>
parents: 6839
diff changeset
  1468
        self.sjoin = self.store.join
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1469
        if self.ui.configbool(b'devel', b'all-warnings') or self.ui.configbool(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1470
            b'devel', b'check-locks'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1471
        ):
50928
d718eddf01d9 safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50919
diff changeset
  1472
            if hasattr(self.svfs, 'vfs'):  # this is filtervfs
33437
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1473
                self.svfs.vfs.audit = self._getsvfsward(self.svfs.vfs.audit)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1474
            else:  # standard vfs
33437
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1475
                self.svfs.audit = self._getsvfsward(self.svfs.audit)
3850
a4457828ca1a move code around
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3803
diff changeset
  1476
26155
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
  1477
        self._dirstatevalidatewarned = False
9146
5614a628d173 localrepo: rename in-memory tag cache instance attributes (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9145
diff changeset
  1478
41615
328ca3b9e545 branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents: 41529
diff changeset
  1479
        self._branchcaches = branchmap.BranchMapCache()
24373
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
  1480
        self._revbranchcache = None
37137
db90a5793103 localrepo: make filterpats private (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37135
diff changeset
  1481
        self._filterpats = {}
5966
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
  1482
        self._datafilters = {}
4916
5c5d23d93447 Use a weakref for recursive transactions
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
  1483
        self._transref = self._lockref = self._wlockref = None
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
  1484
14929
4bf9493e7b07 localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents: 14905
diff changeset
  1485
        # A cache for various files under .hg/ that tracks file changes,
4bf9493e7b07 localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents: 14905
diff changeset
  1486
        # (used by the filecache decorator)
4bf9493e7b07 localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents: 14905
diff changeset
  1487
        #
4bf9493e7b07 localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents: 14905
diff changeset
  1488
        # Maps a property name to its util.filecacheentry
4bf9493e7b07 localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents: 14905
diff changeset
  1489
        self._filecache = {}
4bf9493e7b07 localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents: 14905
diff changeset
  1490
18101
a464deecc9dd clfilter: add a cache on repo for set of revision to filter for a given set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18100
diff changeset
  1491
        # hold sets of revision to be filtered
a464deecc9dd clfilter: add a cache on repo for set of revision to filter for a given set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18100
diff changeset
  1492
        # should be cleared when something might have changed the filter value:
a464deecc9dd clfilter: add a cache on repo for set of revision to filter for a given set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18100
diff changeset
  1493
        # - new changesets,
a464deecc9dd clfilter: add a cache on repo for set of revision to filter for a given set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18100
diff changeset
  1494
        # - phase change,
a464deecc9dd clfilter: add a cache on repo for set of revision to filter for a given set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18100
diff changeset
  1495
        # - new obsolescence marker,
a464deecc9dd clfilter: add a cache on repo for set of revision to filter for a given set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18100
diff changeset
  1496
        # - working directory parent change,
a464deecc9dd clfilter: add a cache on repo for set of revision to filter for a given set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18100
diff changeset
  1497
        # - bookmark changes
a464deecc9dd clfilter: add a cache on repo for set of revision to filter for a given set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18100
diff changeset
  1498
        self.filteredrevcache = {}
a464deecc9dd clfilter: add a cache on repo for set of revision to filter for a given set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18100
diff changeset
  1499
50128
2f60cd6442fd dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50127
diff changeset
  1500
        self._dirstate = None
32814
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  1501
        # post-dirstate-status hooks
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  1502
        self._postdsstatus = []
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  1503
50186
8bc14ac53a41 narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50128
diff changeset
  1504
        self._pending_narrow_pats = None
50187
f18e4608bb61 narrow: delegate the dirstate's narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50186
diff changeset
  1505
        self._pending_narrow_pats_dirstate = None
50186
8bc14ac53a41 narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50128
diff changeset
  1506
23558
3198aac7a95d namespaces: add bookmarks to the names data structure
Sean Farley <sean.michael.farley@gmail.com>
parents: 23546
diff changeset
  1507
        # generic mapping between names and nodes
23561
3c2419e07df5 namespaces: remove weakref; always pass in repo
Ryan McElroy <rmcelroy@fb.com>
parents: 23558
diff changeset
  1508
        self.names = namespaces.namespaces()
23558
3198aac7a95d namespaces: add bookmarks to the names data structure
Sean Farley <sean.michael.farley@gmail.com>
parents: 23546
diff changeset
  1509
33302
36a415b5a4b2 localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33278
diff changeset
  1510
        # Key to signature value.
36a415b5a4b2 localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33278
diff changeset
  1511
        self._sparsesignaturecache = {}
36a415b5a4b2 localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33278
diff changeset
  1512
        # Signature to cached matcher instance.
36a415b5a4b2 localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33278
diff changeset
  1513
        self._sparsematchercache = {}
36a415b5a4b2 localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33278
diff changeset
  1514
42231
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
  1515
        self._extrafilterid = repoview.extrafilter(ui)
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
  1516
43142
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43137
diff changeset
  1517
        self.filecopiesmode = None
45373
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
  1518
        if requirementsmod.COPIESSDC_REQUIREMENT in self.requirements:
43142
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43137
diff changeset
  1519
            self.filecopiesmode = b'changeset-sidedata'
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43137
diff changeset
  1520
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
  1521
        self._wanted_sidedata = set()
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
  1522
        self._sidedata_computers = {}
47085
3aab2330b7d3 sidedata: move sidedata-related utils to the dedicated module
Raphaël Gomès <rgomes@octobus.net>
parents: 47083
diff changeset
  1523
        sidedatamod.set_sidedata_spec_for_repo(self)
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
  1524
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1525
    def _getvfsward(self, origfunc):
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1526
        """build a ward for self.vfs"""
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1527
        rref = weakref.ref(self)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1528
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1529
        def checkvfs(path, mode=None):
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1530
            ret = origfunc(path, mode=mode)
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1531
            repo = rref()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1532
            if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1533
                repo is None
50928
d718eddf01d9 safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50919
diff changeset
  1534
                or not hasattr(repo, '_wlockref')
d718eddf01d9 safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50919
diff changeset
  1535
                or not hasattr(repo, '_lockref')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1536
            ):
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1537
                return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1538
            if mode in (None, b'r', b'rb'):
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1539
                return
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1540
            if path.startswith(repo.path):
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1541
                # truncate name relative to the repository (.hg)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1542
                path = path[len(repo.path) + 1 :]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1543
            if path.startswith(b'cache/'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1544
                msg = b'accessing cache with vfs instead of cachevfs: "%s"'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1545
                repo.ui.develwarn(msg % path, stacklevel=3, config=b"cache-vfs")
45015
5797dbb630df locks: expect repo lock, not wlock, when writing to .hg/strip-backup/
Martin von Zweigbergk <martinvonz@google.com>
parents: 44943
diff changeset
  1546
            # path prefixes covered by 'lock'
45433
324ad3e7ef41 localrepo: warn if we are writing to cache without a lock
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45418
diff changeset
  1547
            vfs_path_prefixes = (
324ad3e7ef41 localrepo: warn if we are writing to cache without a lock
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45418
diff changeset
  1548
                b'journal.',
324ad3e7ef41 localrepo: warn if we are writing to cache without a lock
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45418
diff changeset
  1549
                b'undo.',
324ad3e7ef41 localrepo: warn if we are writing to cache without a lock
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45418
diff changeset
  1550
                b'strip-backup/',
324ad3e7ef41 localrepo: warn if we are writing to cache without a lock
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45418
diff changeset
  1551
                b'cache/',
324ad3e7ef41 localrepo: warn if we are writing to cache without a lock
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45418
diff changeset
  1552
            )
45015
5797dbb630df locks: expect repo lock, not wlock, when writing to .hg/strip-backup/
Martin von Zweigbergk <martinvonz@google.com>
parents: 44943
diff changeset
  1553
            if any(path.startswith(prefix) for prefix in vfs_path_prefixes):
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1554
                if repo._currentlock(repo._lockref) is None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1555
                    repo.ui.develwarn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1556
                        b'write with no lock: "%s"' % path,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1557
                        stacklevel=3,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1558
                        config=b'check-locks',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1559
                    )
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1560
            elif repo._currentlock(repo._wlockref) is None:
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1561
                # rest of vfs files are covered by 'wlock'
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1562
                #
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1563
                # exclude special files
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1564
                for prefix in self._wlockfreeprefix:
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1565
                    if path.startswith(prefix):
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1566
                        return
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1567
                repo.ui.develwarn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1568
                    b'write with no wlock: "%s"' % path,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1569
                    stacklevel=3,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1570
                    config=b'check-locks',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1571
                )
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1572
            return ret
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1573
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1574
        return checkvfs
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1575
33437
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1576
    def _getsvfsward(self, origfunc):
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1577
        """build a ward for self.svfs"""
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1578
        rref = weakref.ref(self)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1579
33437
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1580
        def checksvfs(path, mode=None):
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1581
            ret = origfunc(path, mode=mode)
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1582
            repo = rref()
50928
d718eddf01d9 safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50919
diff changeset
  1583
            if repo is None or not hasattr(repo, '_lockref'):
33437
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1584
                return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1585
            if mode in (None, b'r', b'rb'):
33437
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1586
                return
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1587
            if path.startswith(repo.sharedpath):
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1588
                # truncate name relative to the repository (.hg)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1589
                path = path[len(repo.sharedpath) + 1 :]
33437
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1590
            if repo._currentlock(repo._lockref) is None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1591
                repo.ui.develwarn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1592
                    b'write with no lock: "%s"' % path, stacklevel=4
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1593
                )
33437
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1594
            return ret
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1595
33437
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1596
        return checksvfs
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1597
50281
f34887316f1f undo-files: factor the vfs map in a repository property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50267
diff changeset
  1598
    @property
f34887316f1f undo-files: factor the vfs map in a repository property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50267
diff changeset
  1599
    def vfs_map(self):
f34887316f1f undo-files: factor the vfs map in a repository property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50267
diff changeset
  1600
        return {
f34887316f1f undo-files: factor the vfs map in a repository property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50267
diff changeset
  1601
            b'': self.svfs,
f34887316f1f undo-files: factor the vfs map in a repository property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50267
diff changeset
  1602
            b'plain': self.vfs,
f34887316f1f undo-files: factor the vfs map in a repository property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50267
diff changeset
  1603
            b'store': self.svfs,
f34887316f1f undo-files: factor the vfs map in a repository property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50267
diff changeset
  1604
        }
f34887316f1f undo-files: factor the vfs map in a repository property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50267
diff changeset
  1605
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
  1606
    def close(self):
24378
9347c15d8136 revbranchcache: write cache even during read operations
Durham Goode <durham@fb.com>
parents: 24373
diff changeset
  1607
        self._writecaches()
9347c15d8136 revbranchcache: write cache even during read operations
Durham Goode <durham@fb.com>
parents: 24373
diff changeset
  1608
9347c15d8136 revbranchcache: write cache even during read operations
Durham Goode <durham@fb.com>
parents: 24373
diff changeset
  1609
    def _writecaches(self):
9347c15d8136 revbranchcache: write cache even during read operations
Durham Goode <durham@fb.com>
parents: 24373
diff changeset
  1610
        if self._revbranchcache:
9347c15d8136 revbranchcache: write cache even during read operations
Durham Goode <durham@fb.com>
parents: 24373
diff changeset
  1611
            self._revbranchcache.write()
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
  1612
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
  1613
    def _restrictcapabilities(self, caps):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1614
        if self.ui.configbool(b'experimental', b'bundle2-advertise'):
20955
12f161f08d74 bundle2: allow pulling changegroups using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20954
diff changeset
  1615
            caps = set(caps)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1616
            capsblob = bundle2.encodecaps(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1617
                bundle2.getrepocaps(self, role=b'client')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1618
            )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1619
            caps.add(b'bundle2=' + urlreq.quote(capsblob))
46902
631001150e13 narrow: add capabilities for local repos, not just remote peers
Charles Chamberlain <cchamberlain@janestreet.com>
parents: 46888
diff changeset
  1620
        if self.ui.configbool(b'experimental', b'narrow'):
631001150e13 narrow: add capabilities for local repos, not just remote peers
Charles Chamberlain <cchamberlain@janestreet.com>
parents: 46888
diff changeset
  1621
            caps.add(wireprototypes.NARROWCAP)
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
  1622
        return caps
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
  1623
39312
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
  1624
    # Don't cache auditor/nofsauditor, or you'll end up with reference cycle:
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
  1625
    # self -> auditor -> self._checknested -> self
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
  1626
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
  1627
    @property
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
  1628
    def auditor(self):
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
  1629
        # This is only used by context.workingctx.match in order to
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
  1630
        # detect files in subrepos.
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
  1631
        return pathutil.pathauditor(self.root, callback=self._checknested)
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
  1632
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
  1633
    @property
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
  1634
    def nofsauditor(self):
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
  1635
        # This is only used by context.basectx.match in order to detect
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
  1636
        # files in subrepos.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1637
        return pathutil.pathauditor(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1638
            self.root, callback=self._checknested, realfs=False, cached=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1639
        )
39312
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
  1640
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1641
    def _checknested(self, path):
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1642
        """Determine if path is a legal nested repository."""
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1643
        if not path.startswith(self.root):
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1644
            return False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1645
        subpath = path[len(self.root) + 1 :]
15722
417127af3996 windows: use normalized path to check repository nesting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15604
diff changeset
  1646
        normsubpath = util.pconvert(subpath)
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1647
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1648
        # XXX: Checking against the current working copy is wrong in
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1649
        # the sense that it can reject things like
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1650
        #
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1651
        #   $ hg cat -r 10 sub/x.txt
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1652
        #
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1653
        # if sub/ is no longer a subrepository in the working copy
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1654
        # parent revision.
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1655
        #
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1656
        # However, it can of course also allow things that would have
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1657
        # been rejected before, such as the above cat command if sub/
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1658
        # is a subrepository now, but was a normal directory before.
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1659
        # The old path auditor would have rejected by mistake since it
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1660
        # panics when it sees sub/.hg/.
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1661
        #
12174
7bccd04292a2 localrepo: check nested repos against working directory
Martin Geisler <mg@lazybytes.net>
parents: 12166
diff changeset
  1662
        # All in all, checking against the working copy seems sensible
7bccd04292a2 localrepo: check nested repos against working directory
Martin Geisler <mg@lazybytes.net>
parents: 12166
diff changeset
  1663
        # since we want to prevent access to nested repositories on
7bccd04292a2 localrepo: check nested repos against working directory
Martin Geisler <mg@lazybytes.net>
parents: 12166
diff changeset
  1664
        # the filesystem *now*.
7bccd04292a2 localrepo: check nested repos against working directory
Martin Geisler <mg@lazybytes.net>
parents: 12166
diff changeset
  1665
        ctx = self[None]
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1666
        parts = util.splitpath(subpath)
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1667
        while parts:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1668
            prefix = b'/'.join(parts)
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1669
            if prefix in ctx.substate:
15722
417127af3996 windows: use normalized path to check repository nesting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15604
diff changeset
  1670
                if prefix == normsubpath:
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1671
                    return True
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1672
                else:
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1673
                    sub = ctx.sub(prefix)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1674
                    return sub.checknested(subpath[len(prefix) + 1 :])
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1675
            else:
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1676
                parts.pop()
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1677
        return False
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1678
50440
3a2df812e1c7 pull: add --remote-hidden option and pass it through peer creation
Manuel Jacob <me@manueljacob.de>
parents: 50324
diff changeset
  1679
    def peer(self, path=None, remotehidden=False):
3a2df812e1c7 pull: add --remote-hidden option and pass it through peer creation
Manuel Jacob <me@manueljacob.de>
parents: 50324
diff changeset
  1680
        return localpeer(
3a2df812e1c7 pull: add --remote-hidden option and pass it through peer creation
Manuel Jacob <me@manueljacob.de>
parents: 50324
diff changeset
  1681
            self, path=path, remotehidden=remotehidden
3a2df812e1c7 pull: add --remote-hidden option and pass it through peer creation
Manuel Jacob <me@manueljacob.de>
parents: 50324
diff changeset
  1682
        )  # not cached to avoid reference cycle
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
  1683
17993
1a6f8820eb71 clfilter: introduce an "unfiltered" method on localrepo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17922
diff changeset
  1684
    def unfiltered(self):
1a6f8820eb71 clfilter: introduce an "unfiltered" method on localrepo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17922
diff changeset
  1685
        """Return unfiltered version of the repository
1a6f8820eb71 clfilter: introduce an "unfiltered" method on localrepo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17922
diff changeset
  1686
18644
3e92772d5383 spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents: 18520
diff changeset
  1687
        Intended to be overwritten by filtered repo."""
17993
1a6f8820eb71 clfilter: introduce an "unfiltered" method on localrepo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17922
diff changeset
  1688
        return self
1a6f8820eb71 clfilter: introduce an "unfiltered" method on localrepo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17922
diff changeset
  1689
35492
3ad582b2895c repoview: add visibilityexceptions as an optional argument to repo.filtered()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35309
diff changeset
  1690
    def filtered(self, name, visibilityexceptions=None):
42105
e0357a46c39d repoview: improve documentation for `repo.filtered` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42079
diff changeset
  1691
        """Return a filtered version of a repository
e0357a46c39d repoview: improve documentation for `repo.filtered` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42079
diff changeset
  1692
e0357a46c39d repoview: improve documentation for `repo.filtered` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42079
diff changeset
  1693
        The `name` parameter is the identifier of the requested view. This
e0357a46c39d repoview: improve documentation for `repo.filtered` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42079
diff changeset
  1694
        will return a repoview object set "exactly" to the specified view.
e0357a46c39d repoview: improve documentation for `repo.filtered` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42079
diff changeset
  1695
e0357a46c39d repoview: improve documentation for `repo.filtered` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42079
diff changeset
  1696
        This function does not apply recursive filtering to a repository. For
e0357a46c39d repoview: improve documentation for `repo.filtered` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42079
diff changeset
  1697
        example calling `repo.filtered("served")` will return a repoview using
e0357a46c39d repoview: improve documentation for `repo.filtered` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42079
diff changeset
  1698
        the "served" view, regardless of the initial view used by `repo`.
e0357a46c39d repoview: improve documentation for `repo.filtered` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42079
diff changeset
  1699
e0357a46c39d repoview: improve documentation for `repo.filtered` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42079
diff changeset
  1700
        In other word, there is always only one level of `repoview` "filtering".
e0357a46c39d repoview: improve documentation for `repo.filtered` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42079
diff changeset
  1701
        """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1702
        if self._extrafilterid is not None and b'%' not in name:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1703
            name = name + b'%' + self._extrafilterid
42231
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
  1704
35248
c752fbe228fb repoview: extract a factory function of proxy class
Yuya Nishihara <yuya@tcha.org>
parents: 35247
diff changeset
  1705
        cls = repoview.newtype(self.unfiltered().__class__)
35492
3ad582b2895c repoview: add visibilityexceptions as an optional argument to repo.filtered()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35309
diff changeset
  1706
        return cls(self, name, visibilityexceptions)
18100
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18092
diff changeset
  1707
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1708
    @mixedrepostorecache(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1709
        (b'bookmarks', b'plain'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1710
        (b'bookmarks.current', b'plain'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1711
        (b'bookmarks', b''),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1712
        (b'00changelog.i', b''),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1713
    )
13355
cce2e7b77e36 bookmarks: move property methods into localrepo
Matt Mackall <mpm@selenic.com>
parents: 13341
diff changeset
  1714
    def _bookmarks(self):
42682
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1715
        # Since the multiple files involved in the transaction cannot be
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1716
        # written atomically (with current repository format), there is a race
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1717
        # condition here.
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1718
        #
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1719
        # 1) changelog content A is read
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1720
        # 2) outside transaction update changelog to content B
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1721
        # 3) outside transaction update bookmark file referring to content B
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1722
        # 4) bookmarks file content is read and filtered against changelog-A
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1723
        #
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1724
        # When this happens, bookmarks against nodes missing from A are dropped.
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1725
        #
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1726
        # Having this happening during read is not great, but it become worse
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1727
        # when this happen during write because the bookmarks to the "unknown"
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1728
        # nodes will be dropped for good. However, writes happen within locks.
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1729
        # This locking makes it possible to have a race free consistent read.
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1730
        # For this purpose data read from disc before locking  are
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1731
        # "invalidated" right after the locks are taken. This invalidations are
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1732
        # "light", the `filecache` mechanism keep the data in memory and will
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1733
        # reuse them if the underlying files did not changed. Not parsing the
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1734
        # same data multiple times helps performances.
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1735
        #
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1736
        # Unfortunately in the case describe above, the files tracked by the
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1737
        # bookmarks file cache might not have changed, but the in-memory
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1738
        # content is still "wrong" because we used an older changelog content
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1739
        # to process the on-disk data. So after locking, the changelog would be
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1740
        # refreshed but `_bookmarks` would be preserved.
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1741
        # Adding `00changelog.i` to the list of tracked file is not
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1742
        # enough, because at the time we build the content for `_bookmarks` in
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1743
        # (4), the changelog file has already diverged from the content used
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1744
        # for loading `changelog` in (1)
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1745
        #
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1746
        # To prevent the issue, we force the changelog to be explicitly
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1747
        # reloaded while computing `_bookmarks`. The data race can still happen
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1748
        # without the lock (with a narrower window), but it would no longer go
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1749
        # undetected during the lock time refresh.
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1750
        #
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1751
        # The new schedule is as follow
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1752
        #
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1753
        # 1) filecache logic detect that `_bookmarks` needs to be computed
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1754
        # 2) cachestat for `bookmarks` and `changelog` are captured (for book)
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1755
        # 3) We force `changelog` filecache to be tested
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1756
        # 4) cachestat for `changelog` are captured (for changelog)
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1757
        # 5) `_bookmarks` is computed and cached
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1758
        #
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1759
        # The step in (3) ensure we have a changelog at least as recent as the
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1760
        # cache stat computed in (1). As a result at locking time:
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1761
        #  * if the changelog did not changed since (1) -> we can reuse the data
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1762
        #  * otherwise -> the bookmarks get refreshed.
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1763
        self._refreshchangelog()
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17857
diff changeset
  1764
        return bookmarks.bmstore(self)
13355
cce2e7b77e36 bookmarks: move property methods into localrepo
Matt Mackall <mpm@selenic.com>
parents: 13341
diff changeset
  1765
42510
3472a3f9d785 localrepo: introduce a `_refreshchangelog` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42421
diff changeset
  1766
    def _refreshchangelog(self):
3472a3f9d785 localrepo: introduce a `_refreshchangelog` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42421
diff changeset
  1767
        """make sure the in memory changelog match the on-disk one"""
43414
a0916e8819f6 localrepo: use str for lookup in vars()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43202
diff changeset
  1768
        if 'changelog' in vars(self) and self.currenttransaction() is None:
42510
3472a3f9d785 localrepo: introduce a `_refreshchangelog` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42421
diff changeset
  1769
            del self.changelog
3472a3f9d785 localrepo: introduce a `_refreshchangelog` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42421
diff changeset
  1770
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27522
diff changeset
  1771
    @property
24947
a02d293a1079 bookmarks: rename bookmarkcurrent to activebookmark (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24946
diff changeset
  1772
    def _activebookmark(self):
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27522
diff changeset
  1773
        return self._bookmarks.active
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1774
35309
d13526333835 phases: drop the list with phase of each rev, always comput phase sets
Joerg Sonnenberger <joerg@bec.de>
parents: 35308
diff changeset
  1775
    # _phasesets depend on changelog. what we need is to call
d13526333835 phases: drop the list with phase of each rev, always comput phase sets
Joerg Sonnenberger <joerg@bec.de>
parents: 35308
diff changeset
  1776
    # _phasecache.invalidate() if '00changelog.i' was changed, but it
26405
c15d8f84343e localrepo: recreate phasecache if changelog was modified (issue4855)
Yuya Nishihara <yuya@tcha.org>
parents: 25878
diff changeset
  1777
    # can't be easily expressed in filecache mechanism.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1778
    @storecache(b'phaseroots', b'00changelog.i')
16657
b6081c2c4647 phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents: 16646
diff changeset
  1779
    def _phasecache(self):
b6081c2c4647 phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents: 16646
diff changeset
  1780
        return phases.phasecache(self, self._phasedefaults)
15420
e80d0d3198f0 phases: add a cache allowing to know in which phase a changeset is
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15418
diff changeset
  1781
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1782
    @storecache(b'obsstore')
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents: 17013
diff changeset
  1783
    def obsstore(self):
32729
c8177792fef6 obsolete: move obsstore creation logic from localrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32697
diff changeset
  1784
        return obsolete.makestore(self.ui, self)
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents: 17013
diff changeset
  1785
48039
c094e829e848 changelog: also monitor `00changelog.n` when applicable (issue6554)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47822
diff changeset
  1786
    @changelogcache()
c094e829e848 changelog: also monitor `00changelog.n` when applicable (issue6554)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47822
diff changeset
  1787
    def changelog(repo):
44826
35b255e474d9 dirstate: make sure the dirstate is loaded before the changelog (issue6303)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44687
diff changeset
  1788
        # load dirstate before changelog to avoid race see issue6303
48039
c094e829e848 changelog: also monitor `00changelog.n` when applicable (issue6554)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47822
diff changeset
  1789
        repo.dirstate.prefetch_parents()
c094e829e848 changelog: also monitor `00changelog.n` when applicable (issue6554)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47822
diff changeset
  1790
        return repo.store.changelog(
c094e829e848 changelog: also monitor `00changelog.n` when applicable (issue6554)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47822
diff changeset
  1791
            txnutil.mayhavepending(repo.root),
c094e829e848 changelog: also monitor `00changelog.n` when applicable (issue6554)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47822
diff changeset
  1792
            concurrencychecker=revlogchecker.get_checker(repo.ui, b'changelog'),
46607
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46414
diff changeset
  1793
        )
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8244
diff changeset
  1794
48040
7970895a21cb manifestlog: also monitor `00manifest.n` when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48039
diff changeset
  1795
    @manifestlogcache()
29825
426d931e5db2 manifest: introduce manifestlog and manifestctx classes
Durham Goode <durham@fb.com>
parents: 29709
diff changeset
  1796
    def manifestlog(self):
42905
3df3b139a43d localrepo: push manifestlog and changelog construction code into store
Augie Fackler <augie@google.com>
parents: 42814
diff changeset
  1797
        return self.store.manifestlog(self, self._storenarrowmatch)
29825
426d931e5db2 manifest: introduce manifestlog and manifestctx classes
Durham Goode <durham@fb.com>
parents: 29709
diff changeset
  1798
50127
ec769cbc1fa2 dirstate: directly manage the dirstate property on localrepo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50085
diff changeset
  1799
    @unfilteredpropertycache
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8244
diff changeset
  1800
    def dirstate(self):
50128
2f60cd6442fd dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50127
diff changeset
  1801
        if self._dirstate is None:
2f60cd6442fd dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50127
diff changeset
  1802
            self._dirstate = self._makedirstate()
2f60cd6442fd dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50127
diff changeset
  1803
        else:
2f60cd6442fd dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50127
diff changeset
  1804
            self._dirstate.refresh()
2f60cd6442fd dirstate: only reload the dirstate when it may have changed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50127
diff changeset
  1805
        return self._dirstate
38128
1cba497491be narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents: 37848
diff changeset
  1806
1cba497491be narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents: 37848
diff changeset
  1807
    def _makedirstate(self):
38132
2b8cb0ab231c localrepo: add docstring to _makedirstate to make it less likely to be removed
Kyle Lippincott <spectral@google.com>
parents: 38128
diff changeset
  1808
        """Extension point for wrapping the dirstate per-repo."""
49355
0540c1628fd4 sparse: use None as the sparse matcher value when disabled
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49343
diff changeset
  1809
        sparsematchfn = None
0540c1628fd4 sparse: use None as the sparse matcher value when disabled
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49343
diff changeset
  1810
        if sparse.use_sparse(self):
0540c1628fd4 sparse: use None as the sparse matcher value when disabled
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49343
diff changeset
  1811
            sparsematchfn = lambda: sparse.matcher(self)
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47279
diff changeset
  1812
        v2_req = requirementsmod.DIRSTATE_V2_REQUIREMENT
48793
6e559391f96e tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48792
diff changeset
  1813
        th = requirementsmod.DIRSTATE_TRACKED_HINT_V1
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47279
diff changeset
  1814
        use_dirstate_v2 = v2_req in self.requirements
48793
6e559391f96e tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48792
diff changeset
  1815
        use_tracked_hint = th in self.requirements
33373
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33336
diff changeset
  1816
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1817
        return dirstate.dirstate(
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46713
diff changeset
  1818
            self.vfs,
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46713
diff changeset
  1819
            self.ui,
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46713
diff changeset
  1820
            self.root,
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46713
diff changeset
  1821
            self._dirstatevalidate,
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46713
diff changeset
  1822
            sparsematchfn,
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46713
diff changeset
  1823
            self.nodeconstants,
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47279
diff changeset
  1824
            use_dirstate_v2,
48793
6e559391f96e tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48792
diff changeset
  1825
            use_tracked_hint=use_tracked_hint,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1826
        )
13032
e41e2b79883d dirstate: warn on invalid parents rather than aborting
Matt Mackall <mpm@selenic.com>
parents: 13001
diff changeset
  1827
26155
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
  1828
    def _dirstatevalidate(self, node):
50324
e6532a7336d0 dirstate: try refreshing the changelog when parent are unknown
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50323
diff changeset
  1829
        okay = True
26155
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
  1830
        try:
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
  1831
            self.changelog.rev(node)
50324
e6532a7336d0 dirstate: try refreshing the changelog when parent are unknown
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50323
diff changeset
  1832
        except error.LookupError:
e6532a7336d0 dirstate: try refreshing the changelog when parent are unknown
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50323
diff changeset
  1833
            # If the parent are unknown it might just be because the changelog
e6532a7336d0 dirstate: try refreshing the changelog when parent are unknown
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50323
diff changeset
  1834
            # in memory is lagging behind the dirstate in memory. So try to
e6532a7336d0 dirstate: try refreshing the changelog when parent are unknown
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50323
diff changeset
  1835
            # refresh the changelog first.
e6532a7336d0 dirstate: try refreshing the changelog when parent are unknown
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50323
diff changeset
  1836
            #
e6532a7336d0 dirstate: try refreshing the changelog when parent are unknown
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50323
diff changeset
  1837
            # We only do so if we don't hold the lock, if we do hold the lock
e6532a7336d0 dirstate: try refreshing the changelog when parent are unknown
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50323
diff changeset
  1838
            # the invalidation at that time should have taken care of this and
e6532a7336d0 dirstate: try refreshing the changelog when parent are unknown
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50323
diff changeset
  1839
            # something is very fishy.
e6532a7336d0 dirstate: try refreshing the changelog when parent are unknown
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50323
diff changeset
  1840
            if self.currentlock() is None:
e6532a7336d0 dirstate: try refreshing the changelog when parent are unknown
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50323
diff changeset
  1841
                self.invalidate()
e6532a7336d0 dirstate: try refreshing the changelog when parent are unknown
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50323
diff changeset
  1842
                try:
e6532a7336d0 dirstate: try refreshing the changelog when parent are unknown
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50323
diff changeset
  1843
                    self.changelog.rev(node)
e6532a7336d0 dirstate: try refreshing the changelog when parent are unknown
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50323
diff changeset
  1844
                except error.LookupError:
e6532a7336d0 dirstate: try refreshing the changelog when parent are unknown
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50323
diff changeset
  1845
                    okay = False
e6532a7336d0 dirstate: try refreshing the changelog when parent are unknown
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50323
diff changeset
  1846
            else:
e6532a7336d0 dirstate: try refreshing the changelog when parent are unknown
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50323
diff changeset
  1847
                # XXX we should consider raising an error here.
e6532a7336d0 dirstate: try refreshing the changelog when parent are unknown
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50323
diff changeset
  1848
                okay = False
e6532a7336d0 dirstate: try refreshing the changelog when parent are unknown
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50323
diff changeset
  1849
        if okay:
26155
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
  1850
            return node
50324
e6532a7336d0 dirstate: try refreshing the changelog when parent are unknown
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50323
diff changeset
  1851
        else:
26155
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
  1852
            if not self._dirstatevalidatewarned:
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
  1853
                self._dirstatevalidatewarned = True
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1854
                self.ui.warn(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
  1855
                    _(b"warning: ignoring unknown working parent %s!\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1856
                    % short(node)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1857
                )
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
  1858
            return self.nullid
2155
ff255b41b4aa support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2150
diff changeset
  1859
38872
576eef1ab43d narrow: move .hg/narrowspec to .hg/store/narrowspec (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 38869
diff changeset
  1860
    @storecache(narrowspec.FILENAME)
36471
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1861
    def narrowpats(self):
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1862
        """matcher patterns for this repository's narrowspec
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1863
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1864
        A tuple of (includes, excludes).
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1865
        """
50186
8bc14ac53a41 narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50128
diff changeset
  1866
        # the narrow management should probably move into its own object
8bc14ac53a41 narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50128
diff changeset
  1867
        val = self._pending_narrow_pats
8bc14ac53a41 narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50128
diff changeset
  1868
        if val is None:
8bc14ac53a41 narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50128
diff changeset
  1869
            val = narrowspec.load(self)
8bc14ac53a41 narrow: delegate the narrow spec writing to the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50128
diff changeset
  1870
        return val
36471
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1871
38872
576eef1ab43d narrow: move .hg/narrowspec to .hg/store/narrowspec (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 38869
diff changeset
  1872
    @storecache(narrowspec.FILENAME)
41230
d2d716cc0700 narrow: extract repo property for store narrowmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 41229
diff changeset
  1873
    def _storenarrowmatch(self):
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
  1874
        if requirementsmod.NARROW_REQUIREMENT not in self.requirements:
41676
0531dff73d0b match: delete unused root and cwd arguments from {always,never,exact}() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41675
diff changeset
  1875
            return matchmod.always()
41230
d2d716cc0700 narrow: extract repo property for store narrowmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 41229
diff changeset
  1876
        include, exclude = self.narrowpats
d2d716cc0700 narrow: extract repo property for store narrowmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 41229
diff changeset
  1877
        return narrowspec.match(self.root, include=include, exclude=exclude)
d2d716cc0700 narrow: extract repo property for store narrowmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 41229
diff changeset
  1878
d2d716cc0700 narrow: extract repo property for store narrowmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 41229
diff changeset
  1879
    @storecache(narrowspec.FILENAME)
36471
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1880
    def _narrowmatch(self):
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
  1881
        if requirementsmod.NARROW_REQUIREMENT not in self.requirements:
41676
0531dff73d0b match: delete unused root and cwd arguments from {always,never,exact}() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41675
diff changeset
  1882
            return matchmod.always()
41043
ce0bc2952e2a narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents: 41038
diff changeset
  1883
        narrowspec.checkworkingcopynarrowspec(self)
36471
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1884
        include, exclude = self.narrowpats
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1885
        return narrowspec.match(self.root, include=include, exclude=exclude)
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1886
40086
41fcdfe3bfeb narrow: allow repo.narrowmatch(match) to include exact matches from "match"
Martin von Zweigbergk <martinvonz@google.com>
parents: 40082
diff changeset
  1887
    def narrowmatch(self, match=None, includeexact=False):
40082
4fd0fac48922 localrepo: allow narrowmatch() to accept matcher to intersect with
Martin von Zweigbergk <martinvonz@google.com>
parents: 40064
diff changeset
  1888
        """matcher corresponding the the repo's narrowspec
4fd0fac48922 localrepo: allow narrowmatch() to accept matcher to intersect with
Martin von Zweigbergk <martinvonz@google.com>
parents: 40064
diff changeset
  1889
4fd0fac48922 localrepo: allow narrowmatch() to accept matcher to intersect with
Martin von Zweigbergk <martinvonz@google.com>
parents: 40064
diff changeset
  1890
        If `match` is given, then that will be intersected with the narrow
4fd0fac48922 localrepo: allow narrowmatch() to accept matcher to intersect with
Martin von Zweigbergk <martinvonz@google.com>
parents: 40064
diff changeset
  1891
        matcher.
40086
41fcdfe3bfeb narrow: allow repo.narrowmatch(match) to include exact matches from "match"
Martin von Zweigbergk <martinvonz@google.com>
parents: 40082
diff changeset
  1892
41fcdfe3bfeb narrow: allow repo.narrowmatch(match) to include exact matches from "match"
Martin von Zweigbergk <martinvonz@google.com>
parents: 40082
diff changeset
  1893
        If `includeexact` is True, then any exact matches from `match` will
41fcdfe3bfeb narrow: allow repo.narrowmatch(match) to include exact matches from "match"
Martin von Zweigbergk <martinvonz@google.com>
parents: 40082
diff changeset
  1894
        be included even if they're outside the narrowspec.
40082
4fd0fac48922 localrepo: allow narrowmatch() to accept matcher to intersect with
Martin von Zweigbergk <martinvonz@google.com>
parents: 40064
diff changeset
  1895
        """
4fd0fac48922 localrepo: allow narrowmatch() to accept matcher to intersect with
Martin von Zweigbergk <martinvonz@google.com>
parents: 40064
diff changeset
  1896
        if match:
40086
41fcdfe3bfeb narrow: allow repo.narrowmatch(match) to include exact matches from "match"
Martin von Zweigbergk <martinvonz@google.com>
parents: 40082
diff changeset
  1897
            if includeexact and not self._narrowmatch.always():
41fcdfe3bfeb narrow: allow repo.narrowmatch(match) to include exact matches from "match"
Martin von Zweigbergk <martinvonz@google.com>
parents: 40082
diff changeset
  1898
                # do not exclude explicitly-specified paths so that they can
41fcdfe3bfeb narrow: allow repo.narrowmatch(match) to include exact matches from "match"
Martin von Zweigbergk <martinvonz@google.com>
parents: 40082
diff changeset
  1899
                # be warned later on
41676
0531dff73d0b match: delete unused root and cwd arguments from {always,never,exact}() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41675
diff changeset
  1900
                em = matchmod.exact(match.files())
40086
41fcdfe3bfeb narrow: allow repo.narrowmatch(match) to include exact matches from "match"
Martin von Zweigbergk <martinvonz@google.com>
parents: 40082
diff changeset
  1901
                nm = matchmod.unionmatcher([self._narrowmatch, em])
41fcdfe3bfeb narrow: allow repo.narrowmatch(match) to include exact matches from "match"
Martin von Zweigbergk <martinvonz@google.com>
parents: 40082
diff changeset
  1902
                return matchmod.intersectmatchers(match, nm)
40082
4fd0fac48922 localrepo: allow narrowmatch() to accept matcher to intersect with
Martin von Zweigbergk <martinvonz@google.com>
parents: 40064
diff changeset
  1903
            return matchmod.intersectmatchers(match, self._narrowmatch)
36471
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1904
        return self._narrowmatch
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1905
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1906
    def setnarrowpats(self, newincludes, newexcludes):
39557
623081f2abc2 narrow: remove hack to write narrowspec to shared .hg directory
Yuya Nishihara <yuya@tcha.org>
parents: 39551
diff changeset
  1907
        narrowspec.save(self, newincludes, newexcludes)
36471
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1908
        self.invalidate(clearfilecache=True)
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1909
44104
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1910
    @unfilteredpropertycache
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1911
    def _quick_access_changeid_null(self):
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1912
        return {
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
  1913
            b'null': (nullrev, self.nodeconstants.nullid),
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
  1914
            nullrev: (nullrev, self.nodeconstants.nullid),
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
  1915
            self.nullid: (nullrev, self.nullid),
44104
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1916
        }
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1917
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1918
    @unfilteredpropertycache
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1919
    def _quick_access_changeid_wc(self):
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1920
        # also fast path access to the working copy parents
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1921
        # however, only do it for filter that ensure wc is visible.
45464
4a0ccbecbaa6 repo: avoid copying/updating a dict on every `repo.__getitem__`
Kyle Lippincott <spectral@google.com>
parents: 45433
diff changeset
  1922
        quick = self._quick_access_changeid_null.copy()
44104
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1923
        cl = self.unfiltered().changelog
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1924
        for node in self.dirstate.parents():
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
  1925
            if node == self.nullid:
44104
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1926
                continue
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1927
            rev = cl.index.get_rev(node)
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1928
            if rev is None:
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1929
                # unknown working copy parent case:
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1930
                #
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1931
                #   skip the fast path and let higher code deal with it
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1932
                continue
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1933
            pair = (rev, node)
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1934
            quick[rev] = pair
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1935
            quick[node] = pair
44107
5a012404503b localrepo: also fast past the parents of working copies parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44106
diff changeset
  1936
            # also add the parents of the parents
5a012404503b localrepo: also fast past the parents of working copies parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44106
diff changeset
  1937
            for r in cl.parentrevs(rev):
5a012404503b localrepo: also fast past the parents of working copies parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44106
diff changeset
  1938
                if r == nullrev:
5a012404503b localrepo: also fast past the parents of working copies parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44106
diff changeset
  1939
                    continue
5a012404503b localrepo: also fast past the parents of working copies parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44106
diff changeset
  1940
                n = cl.node(r)
5a012404503b localrepo: also fast past the parents of working copies parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44106
diff changeset
  1941
                pair = (r, n)
5a012404503b localrepo: also fast past the parents of working copies parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44106
diff changeset
  1942
                quick[r] = pair
5a012404503b localrepo: also fast past the parents of working copies parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44106
diff changeset
  1943
                quick[n] = pair
44105
d86dede17392 localrepo: fastpath access to "."
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44104
diff changeset
  1944
        p1node = self.dirstate.p1()
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
  1945
        if p1node != self.nullid:
44105
d86dede17392 localrepo: fastpath access to "."
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44104
diff changeset
  1946
            quick[b'.'] = quick[p1node]
44104
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1947
        return quick
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1948
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1949
    @unfilteredmethod
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1950
    def _quick_access_changeid_invalidate(self):
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1951
        if '_quick_access_changeid_wc' in vars(self):
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1952
            del self.__dict__['_quick_access_changeid_wc']
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1953
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1954
    @property
43765
e89e3275f658 localrepo: introduce a `_quick_access_changeid` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43763
diff changeset
  1955
    def _quick_access_changeid(self):
e89e3275f658 localrepo: introduce a `_quick_access_changeid` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43763
diff changeset
  1956
        """an helper dictionnary for __getitem__ calls
e89e3275f658 localrepo: introduce a `_quick_access_changeid` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43763
diff changeset
  1957
e89e3275f658 localrepo: introduce a `_quick_access_changeid` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43763
diff changeset
  1958
        This contains a list of symbol we can recognise right away without
e89e3275f658 localrepo: introduce a `_quick_access_changeid` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43763
diff changeset
  1959
        further processing.
e89e3275f658 localrepo: introduce a `_quick_access_changeid` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43763
diff changeset
  1960
        """
44104
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  1961
        if self.filtername in repoview.filter_has_wc:
45464
4a0ccbecbaa6 repo: avoid copying/updating a dict on every `repo.__getitem__`
Kyle Lippincott <spectral@google.com>
parents: 45433
diff changeset
  1962
            return self._quick_access_changeid_wc
4a0ccbecbaa6 repo: avoid copying/updating a dict on every `repo.__getitem__`
Kyle Lippincott <spectral@google.com>
parents: 45433
diff changeset
  1963
        return self._quick_access_changeid_null
43765
e89e3275f658 localrepo: introduce a `_quick_access_changeid` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43763
diff changeset
  1964
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
  1965
    def __getitem__(self, changeid):
43750
9c83d28776af localrepo: add some basic comment for block in __getitem__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43735
diff changeset
  1966
        # dealing with special cases
32660
a722c8e17363 localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 32481
diff changeset
  1967
        if changeid is None:
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
  1968
            return context.workingctx(self)
37174
bb47dc2f71a0 context: move reuse of context object to repo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37172
diff changeset
  1969
        if isinstance(changeid, context.basectx):
bb47dc2f71a0 context: move reuse of context object to repo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37172
diff changeset
  1970
            return changeid
43750
9c83d28776af localrepo: add some basic comment for block in __getitem__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43735
diff changeset
  1971
9c83d28776af localrepo: add some basic comment for block in __getitem__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43735
diff changeset
  1972
        # dealing with multiple revisions
23630
b9af235810cc localrepo.__getitem__: add slicing support
Eric Sumner <ericsumner@fb.com>
parents: 23561
diff changeset
  1973
        if isinstance(changeid, slice):
32660
a722c8e17363 localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 32481
diff changeset
  1974
            # wdirrev isn't contiguous so the slice shouldn't include it
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1975
            return [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1976
                self[i]
49284
d44e3c45f0e4 py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents: 49227
diff changeset
  1977
                for i in range(*changeid.indices(len(self)))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1978
                if i not in self.changelog.filteredrevs
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  1979
            ]
43750
9c83d28776af localrepo: add some basic comment for block in __getitem__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43735
diff changeset
  1980
43751
6237cb11753e localrepo: extract handling of some special value in __getitem__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43750
diff changeset
  1981
        # dealing with some special values
43765
e89e3275f658 localrepo: introduce a `_quick_access_changeid` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43763
diff changeset
  1982
        quick_access = self._quick_access_changeid.get(changeid)
e89e3275f658 localrepo: introduce a `_quick_access_changeid` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43763
diff changeset
  1983
        if quick_access is not None:
e89e3275f658 localrepo: introduce a `_quick_access_changeid` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43763
diff changeset
  1984
            rev, node = quick_access
e89e3275f658 localrepo: introduce a `_quick_access_changeid` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43763
diff changeset
  1985
            return context.changectx(self, rev, node, maybe_filtered=False)
43752
657bdb724b47 localrepo: extract handling of some special value in __getitem__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43751
diff changeset
  1986
        if changeid == b'tip':
657bdb724b47 localrepo: extract handling of some special value in __getitem__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43751
diff changeset
  1987
            node = self.changelog.tip()
657bdb724b47 localrepo: extract handling of some special value in __getitem__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43751
diff changeset
  1988
            rev = self.changelog.rev(node)
657bdb724b47 localrepo: extract handling of some special value in __getitem__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43751
diff changeset
  1989
            return context.changectx(self, rev, node)
657bdb724b47 localrepo: extract handling of some special value in __getitem__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43751
diff changeset
  1990
43750
9c83d28776af localrepo: add some basic comment for block in __getitem__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43735
diff changeset
  1991
        # dealing with arbitrary values
32660
a722c8e17363 localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 32481
diff changeset
  1992
        try:
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1993
            if isinstance(changeid, int):
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1994
                node = self.changelog.node(changeid)
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1995
                rev = changeid
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1996
            elif changeid == b'.':
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1997
                # this is a hack to delay/avoid loading obsmarkers
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1998
                # when we know that '.' won't be hidden
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1999
                node = self.dirstate.p1()
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  2000
                rev = self.unfiltered().changelog.rev(node)
47042
c5e1cc0b4c77 core: don't hard-code node length
Joerg Sonnenberger <joerg@bec.de>
parents: 47041
diff changeset
  2001
            elif len(changeid) == self.nodeconstants.nodelen:
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  2002
                try:
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  2003
                    node = changeid
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  2004
                    rev = self.changelog.rev(changeid)
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  2005
                except error.FilteredLookupError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2006
                    changeid = hex(changeid)  # for the error message
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  2007
                    raise
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  2008
                except LookupError:
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  2009
                    # check if it might have come from damaged dirstate
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  2010
                    #
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  2011
                    # XXX we could avoid the unfiltered if we had a recognizable
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  2012
                    # exception for filtered changeset access
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2013
                    if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2014
                        self.local()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2015
                        and changeid in self.unfiltered().dirstate.parents()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2016
                    ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2017
                        msg = _(b"working directory has unknown parent '%s'!")
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  2018
                        raise error.Abort(msg % short(changeid))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2019
                    changeid = hex(changeid)  # for the error message
40063
f84d7ed3bb35 repo: remove the last few "pass" statements in localrepo.__getitem__
Martin von Zweigbergk <martinvonz@google.com>
parents: 40056
diff changeset
  2020
                    raise
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  2021
47041
a407fe56d6e8 core: don't hard-code hex node lengths
Joerg Sonnenberger <joerg@bec.de>
parents: 47012
diff changeset
  2022
            elif len(changeid) == 2 * self.nodeconstants.nodelen:
40063
f84d7ed3bb35 repo: remove the last few "pass" statements in localrepo.__getitem__
Martin von Zweigbergk <martinvonz@google.com>
parents: 40056
diff changeset
  2023
                node = bin(changeid)
f84d7ed3bb35 repo: remove the last few "pass" statements in localrepo.__getitem__
Martin von Zweigbergk <martinvonz@google.com>
parents: 40056
diff changeset
  2024
                rev = self.changelog.rev(node)
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  2025
            else:
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  2026
                raise error.ProgrammingError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2027
                    b"unsupported changeid '%s' of type %s"
43710
c5bcd946a34b py3: use pycompat.bytestr() instead of pycompat.sysstr()
Manuel Jacob <me@manueljacob.de>
parents: 43587
diff changeset
  2028
                    % (changeid, pycompat.bytestr(type(changeid)))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2029
                )
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  2030
40064
5c3585a58845 repo: create changectx in a single place in localrepo.__getitem__
Martin von Zweigbergk <martinvonz@google.com>
parents: 40063
diff changeset
  2031
            return context.changectx(self, rev, node)
5c3585a58845 repo: create changectx in a single place in localrepo.__getitem__
Martin von Zweigbergk <martinvonz@google.com>
parents: 40063
diff changeset
  2032
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  2033
        except (error.FilteredIndexError, error.FilteredLookupError):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2034
            raise error.FilteredRepoLookupError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2035
                _(b"filtered revision '%s'") % pycompat.bytestr(changeid)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2036
            )
40063
f84d7ed3bb35 repo: remove the last few "pass" statements in localrepo.__getitem__
Martin von Zweigbergk <martinvonz@google.com>
parents: 40056
diff changeset
  2037
        except (IndexError, LookupError):
40353
a2ebdca4d10e localrepo: ensure we properly %-format int in exception throw
Augie Fackler <augie@google.com>
parents: 40324
diff changeset
  2038
            raise error.RepoLookupError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2039
                _(b"unknown revision '%s'") % pycompat.bytestr(changeid)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2040
            )
32660
a722c8e17363 localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 32481
diff changeset
  2041
        except error.WdirUnsupported:
a722c8e17363 localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 32481
diff changeset
  2042
            return context.workingctx(self)
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
  2043
9924
ea3acaae25bb localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9820
diff changeset
  2044
    def __contains__(self, changeid):
46114
c6ae1982b2a1 localrepo: delete obsolete comment about `prefix in repo` raising exception
Martin von Zweigbergk <martinvonz@google.com>
parents: 46096
diff changeset
  2045
        """True if the given changeid exists"""
9924
ea3acaae25bb localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9820
diff changeset
  2046
        try:
24320
b9f7f3eeb99c localrepo: extend "changeid in repo" to return True for workingctx revision
Yuya Nishihara <yuya@tcha.org>
parents: 24306
diff changeset
  2047
            self[changeid]
b9f7f3eeb99c localrepo: extend "changeid in repo" to return True for workingctx revision
Yuya Nishihara <yuya@tcha.org>
parents: 24306
diff changeset
  2048
            return True
37797
43221a57e22f context: translate FilteredIndex/LookupError at repo[changeid] (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37717
diff changeset
  2049
        except error.RepoLookupError:
9924
ea3acaae25bb localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9820
diff changeset
  2050
            return False
ea3acaae25bb localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9820
diff changeset
  2051
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
  2052
    def __nonzero__(self):
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
  2053
        return True
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
  2054
31476
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31466
diff changeset
  2055
    __bool__ = __nonzero__
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31466
diff changeset
  2056
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
  2057
    def __len__(self):
35736
29f57ce416ed localrepo: micro-optimize __len__() to bypass repoview
Yuya Nishihara <yuya@tcha.org>
parents: 35726
diff changeset
  2058
        # no need to pay the cost of repoview.changelog
29f57ce416ed localrepo: micro-optimize __len__() to bypass repoview
Yuya Nishihara <yuya@tcha.org>
parents: 35726
diff changeset
  2059
        unfi = self.unfiltered()
29f57ce416ed localrepo: micro-optimize __len__() to bypass repoview
Yuya Nishihara <yuya@tcha.org>
parents: 35726
diff changeset
  2060
        return len(unfi.changelog)
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
  2061
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
  2062
    def __iter__(self):
17675
8575f4a2126e clfilter: remove usage of `range` in favor of iteration over changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17670
diff changeset
  2063
        return iter(self.changelog)
2155
ff255b41b4aa support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2150
diff changeset
  2064
49571
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  2065
    def revs(self, expr: bytes, *args):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  2066
        """Find revisions matching a revset.
27071
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
  2067
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
  2068
        The revset is specified as a string ``expr`` that may contain
31024
0b8356705de6 revset: split language services to revsetlang module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30989
diff changeset
  2069
        %-formatting to escape certain types. See ``revsetlang.formatspec``.
27071
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
  2070
29417
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29373
diff changeset
  2071
        Revset aliases from the configuration are not expanded. To expand
31025
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31024
diff changeset
  2072
        user aliases, consider calling ``scmutil.revrange()`` or
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31024
diff changeset
  2073
        ``repo.anyrevs([expr], user=True)``.
29417
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29373
diff changeset
  2074
44075
2122ffa903ea doc: fix references to `revset.abstractsmartset`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44060
diff changeset
  2075
        Returns a smartset.abstractsmartset, which is a list-like interface
27071
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
  2076
        that contains integer revisions.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  2077
        """
41222
8aca89a694d4 revset: introduce an API that avoids `formatspec` input serialization
Boris Feld <boris.feld@octobus.net>
parents: 41202
diff changeset
  2078
        tree = revsetlang.spectree(expr, *args)
8aca89a694d4 revset: introduce an API that avoids `formatspec` input serialization
Boris Feld <boris.feld@octobus.net>
parents: 41202
diff changeset
  2079
        return revset.makematcher(tree)(self)
15403
e27561eb4a76 localrepo: add revs helper method
Matt Mackall <mpm@selenic.com>
parents: 15381
diff changeset
  2080
49571
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  2081
    def set(self, expr: bytes, *args):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  2082
        """Find revisions matching a revset and emit changectx instances.
27071
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
  2083
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
  2084
        This is a convenience wrapper around ``revs()`` that iterates the
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
  2085
        result and is a generator of changectx instances.
29417
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29373
diff changeset
  2086
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29373
diff changeset
  2087
        Revset aliases from the configuration are not expanded. To expand
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29373
diff changeset
  2088
        user aliases, consider calling ``scmutil.revrange()``.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  2089
        """
15403
e27561eb4a76 localrepo: add revs helper method
Matt Mackall <mpm@selenic.com>
parents: 15381
diff changeset
  2090
        for r in self.revs(expr, *args):
14902
96a72cbc6c29 localrepo: add set method to iterate over a given revset
Matt Mackall <mpm@selenic.com>
parents: 14870
diff changeset
  2091
            yield self[r]
96a72cbc6c29 localrepo: add set method to iterate over a given revset
Matt Mackall <mpm@selenic.com>
parents: 14870
diff changeset
  2092
49571
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  2093
    def anyrevs(self, specs: bytes, user=False, localalias=None):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  2094
        """Find revisions matching one of the given revsets.
31025
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31024
diff changeset
  2095
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31024
diff changeset
  2096
        Revset aliases from the configuration are not expanded by default. To
33336
4672db164c98 revset: make repo.anyrevs accept customized alias override (API)
Jun Wu <quark@fb.com>
parents: 33302
diff changeset
  2097
        expand user aliases, specify ``user=True``. To provide some local
4672db164c98 revset: make repo.anyrevs accept customized alias override (API)
Jun Wu <quark@fb.com>
parents: 33302
diff changeset
  2098
        definitions overriding user aliases, set ``localalias`` to
4672db164c98 revset: make repo.anyrevs accept customized alias override (API)
Jun Wu <quark@fb.com>
parents: 33302
diff changeset
  2099
        ``{name: definitionstring}``.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  2100
        """
43758
09409a3fc3cc localrepo: recognize trivial "null" queries in `anyrev`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43757
diff changeset
  2101
        if specs == [b'null']:
09409a3fc3cc localrepo: recognize trivial "null" queries in `anyrev`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43757
diff changeset
  2102
            return revset.baseset([nullrev])
44106
bfaf4c673bec localrepo: recognize trivial request for '.'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44105
diff changeset
  2103
        if specs == [b'.']:
bfaf4c673bec localrepo: recognize trivial request for '.'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44105
diff changeset
  2104
            quick_data = self._quick_access_changeid.get(b'.')
bfaf4c673bec localrepo: recognize trivial request for '.'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44105
diff changeset
  2105
            if quick_data is not None:
bfaf4c673bec localrepo: recognize trivial request for '.'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44105
diff changeset
  2106
                return revset.baseset([quick_data[0]])
31025
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31024
diff changeset
  2107
        if user:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2108
            m = revset.matchany(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2109
                self.ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2110
                specs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2111
                lookup=revset.lookupfn(self),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2112
                localalias=localalias,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2113
            )
31025
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31024
diff changeset
  2114
        else:
33336
4672db164c98 revset: make repo.anyrevs accept customized alias override (API)
Jun Wu <quark@fb.com>
parents: 33302
diff changeset
  2115
            m = revset.matchany(None, specs, localalias=localalias)
31025
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31024
diff changeset
  2116
        return m(self)
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31024
diff changeset
  2117
49571
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  2118
    def url(self) -> bytes:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2119
        return b'file:' + self.root
2673
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2661
diff changeset
  2120
1718
c1996b84d4f5 make hook code nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1717
diff changeset
  2121
    def hook(self, name, throw=False, **args):
21866
a2ca9dcb4b77 localrepo: document localrepo.hook()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21702
diff changeset
  2122
        """Call a hook, passing this repo instance.
a2ca9dcb4b77 localrepo: document localrepo.hook()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21702
diff changeset
  2123
a2ca9dcb4b77 localrepo: document localrepo.hook()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21702
diff changeset
  2124
        This a convenience method to aid invoking hooks. Extensions likely
a2ca9dcb4b77 localrepo: document localrepo.hook()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21702
diff changeset
  2125
        won't call this unless they have registered a custom hook or are
a2ca9dcb4b77 localrepo: document localrepo.hook()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21702
diff changeset
  2126
        replacing code that is expected to call a hook.
a2ca9dcb4b77 localrepo: document localrepo.hook()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21702
diff changeset
  2127
        """
4622
fff50306e6dd hooks: separate hook code into a separate module
Matt Mackall <mpm@selenic.com>
parents: 4619
diff changeset
  2128
        return hook.hook(self.ui, self, name, throw, **args)
487
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
  2129
18013
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
  2130
    @filteredpropertycache
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2131
    def _tagscache(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  2132
        """Returns a tagscache object that contains various tags related
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  2133
        caches."""
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2134
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2135
        # This simplifies its cache management by having one decorated
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2136
        # function (this one) and the rest simply fetch things from it.
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48935
diff changeset
  2137
        class tagscache:
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2138
            def __init__(self):
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2139
                # These two define the set of tags for this repository. tags
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2140
                # maps tag name to node; tagtypes maps tag name to 'global' or
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2141
                # 'local'. (Global tags are defined by .hgtags across all
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2142
                # heads, and local tags are defined in .hg/localtags.)
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2143
                # They constitute the in-memory cache of tags.
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2144
                self.tags = self.tagtypes = None
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2145
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2146
                self.nodetagscache = self.tagslist = None
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2147
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2148
        cache = tagscache()
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2149
        cache.tags, cache.tagtypes = self._findtags()
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2150
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2151
        return cache
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2152
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
  2153
    def tags(self):
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
  2154
        '''return a mapping of tag to node'''
16371
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
  2155
        t = {}
17715
21c503480986 clfilter: do not use tags cache if there are filtered changesets
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17714
diff changeset
  2156
        if self.changelog.filteredrevs:
21c503480986 clfilter: do not use tags cache if there are filtered changesets
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17714
diff changeset
  2157
            tags, tt = self._findtags()
21c503480986 clfilter: do not use tags cache if there are filtered changesets
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17714
diff changeset
  2158
        else:
21c503480986 clfilter: do not use tags cache if there are filtered changesets
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17714
diff changeset
  2159
            tags = self._tagscache.tags
40745
300f8564220f tags: cache `repo.changelog` access when checking tags nodes
Boris Feld <boris.feld@octobus.net>
parents: 40729
diff changeset
  2160
        rev = self.changelog.rev
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
  2161
        for k, v in tags.items():
16371
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
  2162
            try:
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
  2163
                # ignore tags to unknown nodes
40745
300f8564220f tags: cache `repo.changelog` access when checking tags nodes
Boris Feld <boris.feld@octobus.net>
parents: 40729
diff changeset
  2164
                rev(v)
16371
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
  2165
                t[k] = v
16679
2950d186a927 parsers: strictly check for 20-byte hashes where they're required
Bryan O'Sullivan <bryano@fb.com>
parents: 16551
diff changeset
  2166
            except (error.LookupError, ValueError):
16371
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
  2167
                pass
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
  2168
        return t
4210
caff92047e87 Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents: 4178
diff changeset
  2169
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
  2170
    def _findtags(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  2171
        """Do the hard work of finding tags.  Return a pair of dicts
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
  2172
        (tags, tagtypes) where tags maps tag name to node, and tagtypes
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
  2173
        maps tag name to a string like \'global\' or \'local\'.
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
  2174
        Subclasses or extensions are free to add their own tags, but
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
  2175
        should be aware that the returned dicts will be retained for the
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  2176
        duration of the localrepo object."""
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
  2177
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
  2178
        # XXX what tagtype should subclasses/extensions use?  Currently
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
  2179
        # mq and bookmarks add tags, but do not set the tagtype at all.
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
  2180
        # Should each extension invent its own tag type?  Should there
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
  2181
        # be one tagtype for all such "virtual" tags?  Or is the status
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
  2182
        # quo fine?
4210
caff92047e87 Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents: 4178
diff changeset
  2183
31709
c34c170b25f3 tags: only return 'alltags' in 'findglobaltags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31706
diff changeset
  2184
        # map tag name to (node, hist)
c34c170b25f3 tags: only return 'alltags' in 'findglobaltags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31706
diff changeset
  2185
        alltags = tagsmod.findglobaltags(self.ui, self)
c34c170b25f3 tags: only return 'alltags' in 'findglobaltags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31706
diff changeset
  2186
        # map tag name to tag type
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44445
diff changeset
  2187
        tagtypes = {tag: b'global' for tag in alltags}
31706
63d4deda1b31 tags: do not feed dictionaries to 'findglobaltags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31672
diff changeset
  2188
10651
5f091fc1bab7 style: use consistent variable names (*mod) with imports which would shadow
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10547
diff changeset
  2189
        tagsmod.readlocaltags(self.ui, self, alltags, tagtypes)
5657
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
  2190
9152
4017291c4c48 tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents: 9151
diff changeset
  2191
        # Build the return dicts.  Have to re-encode tag names because
4017291c4c48 tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents: 9151
diff changeset
  2192
        # the tags module always uses UTF-8 (in order not to lose info
4017291c4c48 tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents: 9151
diff changeset
  2193
        # writing to the cache), but the rest of Mercurial wants them in
4017291c4c48 tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents: 9151
diff changeset
  2194
        # local encoding.
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
  2195
        tags = {}
50022
e333cc169c45 dirstate: rename `pendingparentchange` to `is_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49959
diff changeset
  2196
        for name, (node, hist) in alltags.items():
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
  2197
            if node != self.nullid:
16371
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
  2198
                tags[encoding.tolocal(name)] = node
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2199
        tags[b'tip'] = self.changelog.tip()
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44445
diff changeset
  2200
        tagtypes = {
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
  2201
            encoding.tolocal(name): value for (name, value) in tagtypes.items()
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44445
diff changeset
  2202
        }
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
  2203
        return (tags, tagtypes)
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
  2204
5657
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
  2205
    def tagtype(self, tagname):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  2206
        """
5657
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
  2207
        return the type of the given tag. result can be:
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
  2208
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
  2209
        'local'  : a local tag
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
  2210
        'global' : a global tag
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
  2211
        None     : tag does not exist
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  2212
        """
5657
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
  2213
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2214
        return self._tagscache.tagtypes.get(tagname)
5657
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
  2215
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
  2216
    def tagslist(self):
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
  2217
        '''return a list of tags ordered by revision'''
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2218
        if not self._tagscache.tagslist:
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2219
            l = []
48925
1414b65303d5 localrepo: remove pycompat.iteritems()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
  2220
            for t, n in self.tags().items():
22201
269688a398c4 cleanup: fix some list comprehension redefinitions of existing vars
Mads Kiilerich <madski@unity3d.com>
parents: 22080
diff changeset
  2221
                l.append((self.changelog.rev(n), t, n))
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2222
            self._tagscache.tagslist = [(t, n) for r, t, n in sorted(l)]
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2223
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2224
        return self._tagscache.tagslist
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
  2225
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
  2226
    def nodetags(self, node):
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
  2227
        '''return the tags associated with a node'''
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2228
        if not self._tagscache.nodetagscache:
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2229
            nodetagscache = {}
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
  2230
            for t, n in self._tagscache.tags.items():
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2231
                nodetagscache.setdefault(n, []).append(t)
48935
2cce2fa5bcf7 py3: replace pycompat.itervalues(x) with x.values()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48925
diff changeset
  2232
            for tags in nodetagscache.values():
11047
c7dbd6c4877a tags: return tags in sorted order
Eric Eisner <ede@mit.edu>
parents: 10970
diff changeset
  2233
                tags.sort()
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2234
            self._tagscache.nodetagscache = nodetagscache
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2235
        return self._tagscache.nodetagscache.get(node, [])
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
  2236
13384
caa561759538 context: add method to return all bookmarks pointing to a node
David Soria Parra <dsp@php.net>
parents: 13365
diff changeset
  2237
    def nodebookmarks(self, node):
27166
263db31329a6 localrepo: document nodebookmarks
Augie Fackler <augie@google.com>
parents: 27165
diff changeset
  2238
        """return the list of bookmarks pointing to the specified node"""
37848
6e2259847f5f bookmarks: extract function that looks up bookmark names by node
Yuya Nishihara <yuya@tcha.org>
parents: 37810
diff changeset
  2239
        return self._bookmarks.names(node)
13384
caa561759538 context: add method to return all bookmarks pointing to a node
David Soria Parra <dsp@php.net>
parents: 13365
diff changeset
  2240
12066
d01e28657429 localrepo: introduce method for explicit branch cache update
Georg Brandl <georg@python.org>
parents: 12035
diff changeset
  2241
    def branchmap(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  2242
        """returns a dictionary {branch: [branchheads]} with branchheads
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  2243
        ordered by increasing revision number"""
41615
328ca3b9e545 branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents: 41529
diff changeset
  2244
        return self._branchcaches[self]
17714
5210e5a556d9 clfilter: do not use branchmap cache if there are filtered changesets
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17675
diff changeset
  2245
24373
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
  2246
    @unfilteredmethod
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
  2247
    def revbranchcache(self):
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
  2248
        if not self._revbranchcache:
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
  2249
            self._revbranchcache = branchmap.revbranchcache(self.unfiltered())
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
  2250
        return self._revbranchcache
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
  2251
46371
0903d6b9b1df repository: introduce register_changeset callback
Joerg Sonnenberger <joerg@bec.de>
parents: 46334
diff changeset
  2252
    def register_changeset(self, rev, changelogrevision):
46372
3e91d9978bec branchmap: update rev-branch-cache incrementally
Joerg Sonnenberger <joerg@bec.de>
parents: 46371
diff changeset
  2253
        self.revbranchcache().setdata(rev, changelogrevision)
46371
0903d6b9b1df repository: introduce register_changeset callback
Joerg Sonnenberger <joerg@bec.de>
parents: 46334
diff changeset
  2254
23775
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  2255
    def branchtip(self, branch, ignoremissing=False):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  2256
        """return the tip node for a given branch
23775
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  2257
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  2258
        If ignoremissing is True, then this method will not raise an error.
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  2259
        This is helpful for callers that only expect None for a missing branch
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  2260
        (e.g. namespace).
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  2261
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  2262
        """
20187
4d6d5ef88538 localrepo: refactor repo.branchtip() to use repo.branchmap().branchtip()
Brodie Rao <brodie@sf.io>
parents: 20184
diff changeset
  2263
        try:
4d6d5ef88538 localrepo: refactor repo.branchtip() to use repo.branchmap().branchtip()
Brodie Rao <brodie@sf.io>
parents: 20184
diff changeset
  2264
            return self.branchmap().branchtip(branch)
4d6d5ef88538 localrepo: refactor repo.branchtip() to use repo.branchmap().branchtip()
Brodie Rao <brodie@sf.io>
parents: 20184
diff changeset
  2265
        except KeyError:
23775
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  2266
            if not ignoremissing:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2267
                raise error.RepoLookupError(_(b"unknown branch '%s'") % branch)
23775
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  2268
            else:
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  2269
                pass
16719
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16716
diff changeset
  2270
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
  2271
    def lookup(self, key):
42079
fcd7a91dec23 localrepo: don't allow lookup of working directory revision
Martin von Zweigbergk <martinvonz@google.com>
parents: 42062
diff changeset
  2272
        node = scmutil.revsymbol(self, key).node()
fcd7a91dec23 localrepo: don't allow lookup of working directory revision
Martin von Zweigbergk <martinvonz@google.com>
parents: 42062
diff changeset
  2273
        if node is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2274
            raise error.RepoLookupError(_(b"unknown revision '%s'") % key)
42079
fcd7a91dec23 localrepo: don't allow lookup of working directory revision
Martin von Zweigbergk <martinvonz@google.com>
parents: 42062
diff changeset
  2275
        return node
67
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
  2276
37351
fdd22bf6398f localrepo: drop "remote" argument from lookupbranch() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37321
diff changeset
  2277
    def lookupbranch(self, key):
42004
0bd730fbcc2b branchcache: introduce hasbranch()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42001
diff changeset
  2278
        if self.branchmap().hasbranch(key):
10960
ca739acf1a98 commands: add more robust support for 'hg log -b' (issue2078)
Steve Losh <steve@stevelosh.com>
parents: 10926
diff changeset
  2279
            return key
ca739acf1a98 commands: add more robust support for 'hg log -b' (issue2078)
Steve Losh <steve@stevelosh.com>
parents: 10926
diff changeset
  2280
37352
92171562c7f3 localrepo: use revsymbol in lookupbranch() too
Martin von Zweigbergk <martinvonz@google.com>
parents: 37351
diff changeset
  2281
        return scmutil.revsymbol(self, key).branch()
10960
ca739acf1a98 commands: add more robust support for 'hg log -b' (issue2078)
Steve Losh <steve@stevelosh.com>
parents: 10926
diff changeset
  2282
13723
e615765fdcc7 wireproto: add known([id]) function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13720
diff changeset
  2283
    def known(self, nodes):
27319
b64b6fdc5c9b discovery: properly filter changeset in 'peer.known' (issue4982)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27291
diff changeset
  2284
        cl = self.changelog
43555
ded3d545b6f0 index: use `index.get_rev` in `localrepo.known`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43537
diff changeset
  2285
        get_rev = cl.index.get_rev
27319
b64b6fdc5c9b discovery: properly filter changeset in 'peer.known' (issue4982)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27291
diff changeset
  2286
        filtered = cl.filteredrevs
15889
816209eaf963 phases: make secret changeset undiscoverable in all case
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15888
diff changeset
  2287
        result = []
816209eaf963 phases: make secret changeset undiscoverable in all case
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15888
diff changeset
  2288
        for n in nodes:
43555
ded3d545b6f0 index: use `index.get_rev` in `localrepo.known`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43537
diff changeset
  2289
            r = get_rev(n)
27319
b64b6fdc5c9b discovery: properly filter changeset in 'peer.known' (issue4982)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27291
diff changeset
  2290
            resp = not (r is None or r in filtered)
15889
816209eaf963 phases: make secret changeset undiscoverable in all case
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15888
diff changeset
  2291
            result.append(resp)
816209eaf963 phases: make secret changeset undiscoverable in all case
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15888
diff changeset
  2292
        return result
13723
e615765fdcc7 wireproto: add known([id]) function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13720
diff changeset
  2293
926
b765e970c9ff Add a local() method to repository classes
mpm@selenic.com
parents: 923
diff changeset
  2294
    def local(self):
14603
68a43fdd7d80 localrepo: local() returns self
Matt Mackall <mpm@selenic.com>
parents: 14549
diff changeset
  2295
        return self
926
b765e970c9ff Add a local() method to repository classes
mpm@selenic.com
parents: 923
diff changeset
  2296
25623
0bee97fa1fa8 publishing: add helper method to localrepo
Matt Mackall <mpm@selenic.com>
parents: 25290
diff changeset
  2297
    def publishing(self):
25625
ce9e231265c1 publishing: unconditionally trust publishing flag
Matt Mackall <mpm@selenic.com>
parents: 25624
diff changeset
  2298
        # it's safe (and desirable) to trust the publish flag unconditionally
ce9e231265c1 publishing: unconditionally trust publishing flag
Matt Mackall <mpm@selenic.com>
parents: 25624
diff changeset
  2299
        # so that we don't finalize changes shared between users via ssh or nfs
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2300
        return self.ui.configbool(b'phases', b'publish', untrusted=True)
25623
0bee97fa1fa8 publishing: add helper method to localrepo
Matt Mackall <mpm@selenic.com>
parents: 25290
diff changeset
  2301
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
  2302
    def cancopy(self):
20332
a959f7167077 clone: do not turn hidden changeset public on publishing clone (issue3935)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20314
diff changeset
  2303
        # so statichttprepo's override of local() works
a959f7167077 clone: do not turn hidden changeset public on publishing clone (issue3935)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20314
diff changeset
  2304
        if not self.local():
a959f7167077 clone: do not turn hidden changeset public on publishing clone (issue3935)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20314
diff changeset
  2305
            return False
25624
f0745da75056 publishing: use new helper method
Matt Mackall <mpm@selenic.com>
parents: 25623
diff changeset
  2306
        if not self.publishing():
20332
a959f7167077 clone: do not turn hidden changeset public on publishing clone (issue3935)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20314
diff changeset
  2307
            return True
a959f7167077 clone: do not turn hidden changeset public on publishing clone (issue3935)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20314
diff changeset
  2308
        # if publishing we can't copy if there is filtered content
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2309
        return not self.filtered(b'visible').changelog.filteredrevs
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
  2310
23666
965788d9ae09 localrepo: introduce shared method to check if a repository is shared
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23648
diff changeset
  2311
    def shared(self):
965788d9ae09 localrepo: introduce shared method to check if a repository is shared
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23648
diff changeset
  2312
        '''the type of shared repository (None if not shared)'''
965788d9ae09 localrepo: introduce shared method to check if a repository is shared
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23648
diff changeset
  2313
        if self.sharedpath != self.path:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2314
            return b'store'
23666
965788d9ae09 localrepo: introduce shared method to check if a repository is shared
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23648
diff changeset
  2315
        return None
965788d9ae09 localrepo: introduce shared method to check if a repository is shared
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23648
diff changeset
  2316
49571
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  2317
    def wjoin(self, f: bytes, *insidef: bytes) -> bytes:
23714
e3a0e7e21f54 localrepo: use vfs.reljoin rather than os.path.join in the localrepository class
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23710
diff changeset
  2318
        return self.vfs.reljoin(self.root, f, *insidef)
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
  2319
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
  2320
    def setparents(self, p1, p2=None):
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
  2321
        if p2 is None:
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
  2322
            p2 = self.nullid
44052
b74270da5eee workingctx: move setparents() logic from localrepo to mirror overlayworkingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 44043
diff changeset
  2323
        self[None].setparents(p1, p2)
44104
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  2324
        self._quick_access_changeid_invalidate()
16551
ebf6d38c9063 localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents: 16536
diff changeset
  2325
49571
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  2326
    def filectx(self, path: bytes, changeid=None, fileid=None, changectx=None):
40718
5bcf264bb1a0 localrepo: correct docstring of filectx()
Yuya Nishihara <yuya@tcha.org>
parents: 40535
diff changeset
  2327
        """changeid must be a changeset revision, if specified.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  2328
        fileid can be a file revision or node."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2329
        return context.filectx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2330
            self, path, changeid, fileid, changectx=changectx
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2331
        )
2564
55e592041076 Add context helper functions to localrepo
Matt Mackall <mpm@selenic.com>
parents: 2491
diff changeset
  2332
49571
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  2333
    def getcwd(self) -> bytes:
870
a82eae840447 Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents: 839
diff changeset
  2334
        return self.dirstate.getcwd()
627
b6c42714d900 Add locate command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 624
diff changeset
  2335
49571
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  2336
    def pathto(self, f: bytes, cwd: Optional[bytes] = None) -> bytes:
4525
78b6add1f966 Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4516
diff changeset
  2337
        return self.dirstate.pathto(f, cwd)
78b6add1f966 Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4516
diff changeset
  2338
11698
9df481f8036d localrepo: refactor filter computation
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11669
diff changeset
  2339
    def _loadfilter(self, filter):
37137
db90a5793103 localrepo: make filterpats private (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37135
diff changeset
  2340
        if filter not in self._filterpats:
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
  2341
            l = []
4004
c83c35f2f4e2 unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents: 4003
diff changeset
  2342
            for pat, cmd in self.ui.configitems(filter):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2343
                if cmd == b'!':
7226
b71a52f101dc Make it possible to disable filtering for a pattern.
Mads Kiilerich <mads@kiilerich.com>
parents: 7208
diff changeset
  2344
                    continue
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2345
                mf = matchmod.match(self.root, b'', [pat])
5966
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
  2346
                fn = None
6066
f3a8b5360100 Strip filter name from command before passing to filter function.
Jesse Glick <jesse.glick@sun.com>
parents: 6065
diff changeset
  2347
                params = cmd
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
  2348
                for name, filterfn in self._datafilters.items():
6210
942287cb1f57 Removed trailing spaces from everything except test output
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6201
diff changeset
  2349
                    if cmd.startswith(name):
5966
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
  2350
                        fn = filterfn
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2351
                        params = cmd[len(name) :].lstrip()
5966
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
  2352
                        break
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
  2353
                if not fn:
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
  2354
                    fn = lambda s, c, **kwargs: procutil.filter(s, c)
43201
6ceb3721e203 localrepo: debug log of filter name when filtering through a function
Mads Kiilerich <mads@kiilerich.com>
parents: 43167
diff changeset
  2355
                    fn.__name__ = 'commandfilter'
5967
f8ad3b76e923 Provide better context for custom Python encode/decode filters.
Jesse Glick <jesse.glick@sun.com>
parents: 5966
diff changeset
  2356
                # Wrap old filters not supporting keyword arguments
36178
646002338365 py3: introduce and use pycompat.getargspec
Augie Fackler <augie@google.com>
parents: 36009
diff changeset
  2357
                if not pycompat.getargspec(fn)[2]:
5967
f8ad3b76e923 Provide better context for custom Python encode/decode filters.
Jesse Glick <jesse.glick@sun.com>
parents: 5966
diff changeset
  2358
                    oldfn = fn
43202
8864aa96f1f6 localrepo: fix variable binding in handling of old filters
Mads Kiilerich <mads@kiilerich.com>
parents: 43201
diff changeset
  2359
                    fn = lambda s, c, oldfn=oldfn, **kwargs: oldfn(s, c)
43201
6ceb3721e203 localrepo: debug log of filter name when filtering through a function
Mads Kiilerich <mads@kiilerich.com>
parents: 43167
diff changeset
  2360
                    fn.__name__ = 'compat-' + oldfn.__name__
6066
f3a8b5360100 Strip filter name from command before passing to filter function.
Jesse Glick <jesse.glick@sun.com>
parents: 6065
diff changeset
  2361
                l.append((mf, fn, params))
37137
db90a5793103 localrepo: make filterpats private (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37135
diff changeset
  2362
            self._filterpats[filter] = l
db90a5793103 localrepo: make filterpats private (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37135
diff changeset
  2363
        return self._filterpats[filter]
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
  2364
12707
2216ab103ea8 localrepo: load filter patterns outside of _filter
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12706
diff changeset
  2365
    def _filter(self, filterpats, filename, data):
2216ab103ea8 localrepo: load filter patterns outside of _filter
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12706
diff changeset
  2366
        for mf, fn, cmd in filterpats:
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
  2367
            if mf(filename):
43201
6ceb3721e203 localrepo: debug log of filter name when filtering through a function
Mads Kiilerich <mads@kiilerich.com>
parents: 43167
diff changeset
  2368
                self.ui.debug(
6ceb3721e203 localrepo: debug log of filter name when filtering through a function
Mads Kiilerich <mads@kiilerich.com>
parents: 43167
diff changeset
  2369
                    b"filtering %s through %s\n"
6ceb3721e203 localrepo: debug log of filter name when filtering through a function
Mads Kiilerich <mads@kiilerich.com>
parents: 43167
diff changeset
  2370
                    % (filename, cmd or pycompat.sysbytes(fn.__name__))
6ceb3721e203 localrepo: debug log of filter name when filtering through a function
Mads Kiilerich <mads@kiilerich.com>
parents: 43167
diff changeset
  2371
                )
5967
f8ad3b76e923 Provide better context for custom Python encode/decode filters.
Jesse Glick <jesse.glick@sun.com>
parents: 5966
diff changeset
  2372
                data = fn(data, cmd, ui=self.ui, repo=self, filename=filename)
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
  2373
                break
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
  2374
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
  2375
        return data
1019
a9cca981c423 Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents: 1013
diff changeset
  2376
18013
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
  2377
    @unfilteredpropertycache
12708
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
  2378
    def _encodefilterpats(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2379
        return self._loadfilter(b'encode')
12708
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
  2380
18013
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
  2381
    @unfilteredpropertycache
12708
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
  2382
    def _decodefilterpats(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2383
        return self._loadfilter(b'decode')
12708
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
  2384
5966
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
  2385
    def adddatafilter(self, name, filter):
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
  2386
        self._datafilters[name] = filter
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
  2387
49571
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  2388
    def wread(self, filename: bytes) -> bytes:
31428
9b361478b03a localrepo: use self.wvfs.islink directly
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31418
diff changeset
  2389
        if self.wvfs.islink(filename):
18950
647e3b0c8751 localrepo: use "vfs.readlink()" instead of "os.readlink()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18949
diff changeset
  2390
            data = self.wvfs.readlink(filename)
4004
c83c35f2f4e2 unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents: 4003
diff changeset
  2391
        else:
23854
f6070d3a9cb8 localrepo: remove all internal uses of localrepo.wopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23853
diff changeset
  2392
            data = self.wvfs.read(filename)
12708
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
  2393
        return self._filter(self._encodefilterpats, filename, data)
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
  2394
49571
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  2395
    def wwrite(
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  2396
        self,
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  2397
        filename: bytes,
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  2398
        data: bytes,
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  2399
        flags: bytes,
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  2400
        backgroundclose=False,
51284
58d39c7865e5 usage: configure uncompressed chunk cache through resource configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51134
diff changeset
  2401
        **kwargs,
49571
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  2402
    ) -> int:
24843
21b33f0460e0 revert: apply normallookup on reverted file if size isn't changed (issue4583)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24825
diff changeset
  2403
        """write ``data`` into ``filename`` in the working directory
21b33f0460e0 revert: apply normallookup on reverted file if size isn't changed (issue4583)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24825
diff changeset
  2404
21b33f0460e0 revert: apply normallookup on reverted file if size isn't changed (issue4583)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24825
diff changeset
  2405
        This returns length of written (maybe decoded) data.
21b33f0460e0 revert: apply normallookup on reverted file if size isn't changed (issue4583)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24825
diff changeset
  2406
        """
12708
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
  2407
        data = self._filter(self._decodefilterpats, filename, data)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2408
        if b'l' in flags:
23854
f6070d3a9cb8 localrepo: remove all internal uses of localrepo.wopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23853
diff changeset
  2409
            self.wvfs.symlink(data, filename)
6877
1d38f3605b20 util: set_flags shouldn't know about repo flag formats
Matt Mackall <mpm@selenic.com>
parents: 6875
diff changeset
  2410
        else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2411
            self.wvfs.write(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2412
                filename, data, backgroundclose=backgroundclose, **kwargs
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2413
            )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2414
            if b'x' in flags:
18951
d13916a00b7e localrepo: use "vfs.setflags()" instead of "util.setflags()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18950
diff changeset
  2415
                self.wvfs.setflags(filename, False, True)
35726
45b678bf3a78 atomicupdate: add an experimental option to use atomictemp when updating
Boris Feld <boris.feld@octobus.net>
parents: 35725
diff changeset
  2416
            else:
45b678bf3a78 atomicupdate: add an experimental option to use atomictemp when updating
Boris Feld <boris.feld@octobus.net>
parents: 35725
diff changeset
  2417
                self.wvfs.setflags(filename, False, False)
24843
21b33f0460e0 revert: apply normallookup on reverted file if size isn't changed (issue4583)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24825
diff changeset
  2418
        return len(data)
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
  2419
49571
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  2420
    def wwritedata(self, filename: bytes, data: bytes) -> bytes:
12708
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
  2421
        return self._filter(self._decodefilterpats, filename, data)
1019
a9cca981c423 Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents: 1013
diff changeset
  2422
23379
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
  2423
    def currenttransaction(self):
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
  2424
        """return the current transaction or None if non exists"""
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
  2425
        if self._transref:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
  2426
            tr = self._transref()
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
  2427
        else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
  2428
            tr = None
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
  2429
8072
ecf7795479d5 transaction: support multiple, separate transactions
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 7948
diff changeset
  2430
        if tr and tr.running():
23379
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
  2431
            return tr
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
  2432
        return None
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
  2433
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
  2434
    def transaction(self, desc, report=None):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2435
        if self.ui.configbool(b'devel', b'all-warnings') or self.ui.configbool(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2436
            b'devel', b'check-locks'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2437
        ):
29705
41689e293994 develwarn: use the lock helper in local repo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29417
diff changeset
  2438
            if self._currentlock(self._lockref) is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2439
                raise error.ProgrammingError(b'transaction requires locking')
23379
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
  2440
        tr = self.currenttransaction()
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
  2441
        if tr is not None:
36819
aff5996f3043 transaction: add a name and a __repr__ implementation (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 36554
diff changeset
  2442
            return tr.nest(name=desc)
1806
a2c69737e65e Automatic nesting into running transactions in the same repository.
mason@suse.com
parents: 1802
diff changeset
  2443
5865
e7127f669edb transactions: don't show a backtrace when journal exists
Matt Mackall <mpm@selenic.com>
parents: 5814
diff changeset
  2444
        # abort here if the journal already exists
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2445
        if self.svfs.exists(b"journal"):
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  2446
            raise error.RepoError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2447
                _(b"abandoned transaction found"),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2448
                hint=_(b"run 'hg recover' to clean up transaction"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2449
            )
5865
e7127f669edb transactions: don't show a backtrace when journal exists
Matt Mackall <mpm@selenic.com>
parents: 5814
diff changeset
  2450
50082
a66926099c0f localrepo: enforce a clean dirstate when the transaction open
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50071
diff changeset
  2451
        # At that point your dirstate should be clean:
a66926099c0f localrepo: enforce a clean dirstate when the transaction open
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50071
diff changeset
  2452
        #
a66926099c0f localrepo: enforce a clean dirstate when the transaction open
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50071
diff changeset
  2453
        # - If you don't have the wlock, why would you still have a dirty
a66926099c0f localrepo: enforce a clean dirstate when the transaction open
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50071
diff changeset
  2454
        #   dirstate ?
a66926099c0f localrepo: enforce a clean dirstate when the transaction open
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50071
diff changeset
  2455
        #
a66926099c0f localrepo: enforce a clean dirstate when the transaction open
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50071
diff changeset
  2456
        # - If you hold the wlock, you should not be opening a transaction in
a66926099c0f localrepo: enforce a clean dirstate when the transaction open
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50071
diff changeset
  2457
        #   the middle of a `distate.changing_*` block. The transaction needs to
a66926099c0f localrepo: enforce a clean dirstate when the transaction open
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50071
diff changeset
  2458
        #   be open before that and wrap the change-context.
a66926099c0f localrepo: enforce a clean dirstate when the transaction open
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50071
diff changeset
  2459
        #
a66926099c0f localrepo: enforce a clean dirstate when the transaction open
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50071
diff changeset
  2460
        # - If you are not within a `dirstate.changing_*` context, why is our
a66926099c0f localrepo: enforce a clean dirstate when the transaction open
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50071
diff changeset
  2461
        #   dirstate dirty?
a66926099c0f localrepo: enforce a clean dirstate when the transaction open
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50071
diff changeset
  2462
        if self.dirstate._dirty:
a66926099c0f localrepo: enforce a clean dirstate when the transaction open
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50071
diff changeset
  2463
            m = "cannot open a transaction with a dirty dirstate"
a66926099c0f localrepo: enforce a clean dirstate when the transaction open
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50071
diff changeset
  2464
            raise error.ProgrammingError(m)
a66926099c0f localrepo: enforce a clean dirstate when the transaction open
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50071
diff changeset
  2465
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2466
        idbase = b"%.40f#%f" % (random.random(), time.time())
44060
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 44052
diff changeset
  2467
        ha = hex(hashutil.sha1(idbase).digest())
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2468
        txnid = b'TXN:' + ha
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2469
        self.hook(b'pretxnopen', throw=True, txnname=desc, txnid=txnid)
24281
e9ede9b4c2f8 hook: have a generic hook for transaction opening
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24234
diff changeset
  2470
16236
97efd26eb957 localrepo: refactor retrieving of journal/undo files paths
Idan Kamara <idankk86@gmail.com>
parents: 16208
diff changeset
  2471
        self._writejournal(desc)
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
  2472
        if report:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
  2473
            rp = report
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
  2474
        else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
  2475
            rp = self.ui.warn
50281
f34887316f1f undo-files: factor the vfs map in a repository property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50267
diff changeset
  2476
        vfsmap = self.vfs_map
24284
ff14b26fe5f4 hook: add a generic hook right before we commit a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24282
diff changeset
  2477
        # we must avoid cyclic reference between repo and transaction.
ff14b26fe5f4 hook: add a generic hook right before we commit a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24282
diff changeset
  2478
        reporef = weakref.ref(self)
31994
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2479
        # Code to track tag movement
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2480
        #
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2481
        # Since tags are all handled as file content, it is actually quite hard
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2482
        # to track these movement from a code perspective. So we fallback to a
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2483
        # tracking at the repository level. One could envision to track changes
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2484
        # to the '.hgtags' file through changegroup apply but that fails to
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2485
        # cope with case where transaction expose new heads without changegroup
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2486
        # being involved (eg: phase movement).
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2487
        #
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2488
        # For now, We gate the feature behind a flag since this likely comes
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2489
        # with performance impacts. The current code run more often than needed
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2490
        # and do not use caches as much as it could.  The current focus is on
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2491
        # the behavior of the feature so we disable it by default. The flag
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2492
        # will be removed when we are happy with the performance impact.
31996
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  2493
        #
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  2494
        # Once this feature is no longer experimental move the following
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  2495
        # documentation to the appropriate help section:
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  2496
        #
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  2497
        # The ``HG_TAG_MOVED`` variable will be set if the transaction touched
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  2498
        # tags (new or changed or deleted tags). In addition the details of
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  2499
        # these changes are made available in a file at:
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  2500
        #     ``REPOROOT/.hg/changes/tags.changes``.
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  2501
        # Make sure you check for HG_TAG_MOVED before reading that file as it
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  2502
        # might exist from a previous transaction even if no tag were touched
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  2503
        # in this one. Changes are recorded in a line base format::
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  2504
        #
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  2505
        #     <action> <hex-node> <tag-name>\n
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  2506
        #
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  2507
        # Actions are defined as follow:
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  2508
        #   "-R": tag is removed,
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  2509
        #   "+A": tag is added,
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  2510
        #   "-M": tag is moved (old value),
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  2511
        #   "+M": tag is moved (new value),
31994
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2512
        tracktags = lambda x: None
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2513
        # experimental config: experimental.hook-track-tags
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2514
        shouldtracktags = self.ui.configbool(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2515
            b'experimental', b'hook-track-tags'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2516
        )
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2517
        if desc != b'strip' and shouldtracktags:
31994
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2518
            oldheads = self.changelog.headrevs()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2519
31994
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2520
            def tracktags(tr2):
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2521
                repo = reporef()
46792
7e08fa9b3d13 typing: add assertions to localrepo.py to appease pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46572
diff changeset
  2522
                assert repo is not None  # help pytype
31994
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2523
                oldfnodes = tagsmod.fnoderevs(repo.ui, repo, oldheads)
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2524
                newheads = repo.changelog.headrevs()
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2525
                newfnodes = tagsmod.fnoderevs(repo.ui, repo, newheads)
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2526
                # notes: we compare lists here.
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2527
                # As we do it only once buiding set would not be cheaper
31995
fe9c4d614600 track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31994
diff changeset
  2528
                changes = tagsmod.difftags(repo.ui, repo, oldfnodes, newfnodes)
fe9c4d614600 track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31994
diff changeset
  2529
                if changes:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2530
                    tr2.hookargs[b'tag_moved'] = b'1'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2531
                    with repo.vfs(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2532
                        b'changes/tags.changes', b'w', atomictemp=True
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2533
                    ) as changesfile:
31996
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  2534
                        # note: we do not register the file to the transaction
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  2535
                        # because we needs it to still exist on the transaction
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  2536
                        # is close (for txnclose hooks)
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  2537
                        tagsmod.writediff(changesfile, changes)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2538
31994
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2539
        def validate(tr2):
24284
ff14b26fe5f4 hook: add a generic hook right before we commit a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24282
diff changeset
  2540
            """will run pre-closing hooks"""
31994
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2541
            # XXX the transaction API is a bit lacking here so we take a hacky
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2542
            # path for now
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2543
            #
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2544
            # We cannot add this as a "pending" hooks since the 'tr.hookargs'
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2545
            # dict is copied before these run. In addition we needs the data
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2546
            # available to in memory hooks too.
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2547
            #
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2548
            # Moreover, we also need to make sure this runs before txnclose
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2549
            # hooks and there is no "pending" mechanism that would execute
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2550
            # logic only if hooks are about to run.
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2551
            #
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2552
            # Fixing this limitation of the transaction is also needed to track
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2553
            # other families of changes (bookmarks, phases, obsolescence).
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2554
            #
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2555
            # This will have to be fixed before we remove the experimental
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2556
            # gating.
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  2557
            tracktags(tr2)
34709
c212947273a7 bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
  2558
            repo = reporef()
46792
7e08fa9b3d13 typing: add assertions to localrepo.py to appease pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46572
diff changeset
  2559
            assert repo is not None  # help pytype
42969
76608f9f27f6 singlehead: introduce special handling of closed heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
  2560
43734
88a306478556 singlehead: making config item a bool again
Georges Racinet <georges.racinet@octobus.net>
parents: 43710
diff changeset
  2561
            singleheadopt = (b'experimental', b'single-head-per-branch')
88a306478556 singlehead: making config item a bool again
Georges Racinet <georges.racinet@octobus.net>
parents: 43710
diff changeset
  2562
            singlehead = repo.ui.configbool(*singleheadopt)
42969
76608f9f27f6 singlehead: introduce special handling of closed heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
  2563
            if singlehead:
43734
88a306478556 singlehead: making config item a bool again
Georges Racinet <georges.racinet@octobus.net>
parents: 43710
diff changeset
  2564
                singleheadsub = repo.ui.configsuboptions(*singleheadopt)[1]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2565
                accountclosed = singleheadsub.get(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2566
                    b"account-closed-heads", False
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2567
                )
46096
4d5e2fd53707 singlehead: introduce option to restrict to public changes
Joerg Sonnenberger <joerg@bec.de>
parents: 46004
diff changeset
  2568
                if singleheadsub.get(b"public-changes-only", False):
4d5e2fd53707 singlehead: introduce option to restrict to public changes
Joerg Sonnenberger <joerg@bec.de>
parents: 46004
diff changeset
  2569
                    filtername = b"immutable"
4d5e2fd53707 singlehead: introduce option to restrict to public changes
Joerg Sonnenberger <joerg@bec.de>
parents: 46004
diff changeset
  2570
                else:
4d5e2fd53707 singlehead: introduce option to restrict to public changes
Joerg Sonnenberger <joerg@bec.de>
parents: 46004
diff changeset
  2571
                    filtername = b"visible"
4d5e2fd53707 singlehead: introduce option to restrict to public changes
Joerg Sonnenberger <joerg@bec.de>
parents: 46004
diff changeset
  2572
                scmutil.enforcesinglehead(
4d5e2fd53707 singlehead: introduce option to restrict to public changes
Joerg Sonnenberger <joerg@bec.de>
parents: 46004
diff changeset
  2573
                    repo, tr2, desc, accountclosed, filtername
4d5e2fd53707 singlehead: introduce option to restrict to public changes
Joerg Sonnenberger <joerg@bec.de>
parents: 46004
diff changeset
  2574
                )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2575
            if hook.hashook(repo.ui, b'pretxnclose-bookmark'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2576
                for name, (old, new) in sorted(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2577
                    tr.changes[b'bookmarks'].items()
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2578
                ):
34709
c212947273a7 bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
  2579
                    args = tr.hookargs.copy()
c212947273a7 bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
  2580
                    args.update(bookmarks.preparehookargs(name, old, new))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2581
                    repo.hook(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2582
                        b'pretxnclose-bookmark',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2583
                        throw=True,
51284
58d39c7865e5 usage: configure uncompressed chunk cache through resource configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51134
diff changeset
  2584
                        **pycompat.strkwargs(args),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2585
                    )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2586
            if hook.hashook(repo.ui, b'pretxnclose-phase'):
34711
f6d17075608f phase: add a dedicated pretxnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34710
diff changeset
  2587
                cl = repo.unfiltered().changelog
44548
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
  2588
                for revs, (old, new) in tr.changes[b'phases']:
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
  2589
                    for rev in revs:
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
  2590
                        args = tr.hookargs.copy()
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
  2591
                        node = hex(cl.node(rev))
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
  2592
                        args.update(phases.preparehookargs(node, old, new))
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
  2593
                        repo.hook(
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
  2594
                            b'pretxnclose-phase',
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
  2595
                            throw=True,
51284
58d39c7865e5 usage: configure uncompressed chunk cache through resource configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51134
diff changeset
  2596
                            **pycompat.strkwargs(args),
44548
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
  2597
                        )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2598
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2599
            repo.hook(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2600
                b'pretxnclose', throw=True, **pycompat.strkwargs(tr.hookargs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2601
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2602
26577
8f2ff40fe9c9 localrepo: execute appropriate actions for dirstate at releasing transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26499
diff changeset
  2603
        def releasefn(tr, success):
8f2ff40fe9c9 localrepo: execute appropriate actions for dirstate at releasing transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26499
diff changeset
  2604
            repo = reporef()
42669
36c692eb28d3 transaction: leave unfinished without crashing when not properly released
Martin von Zweigbergk <martinvonz@google.com>
parents: 42621
diff changeset
  2605
            if repo is None:
36c692eb28d3 transaction: leave unfinished without crashing when not properly released
Martin von Zweigbergk <martinvonz@google.com>
parents: 42621
diff changeset
  2606
                # If the repo has been GC'd (and this release function is being
36c692eb28d3 transaction: leave unfinished without crashing when not properly released
Martin von Zweigbergk <martinvonz@google.com>
parents: 42621
diff changeset
  2607
                # called from transaction.__del__), there's not much we can do,
36c692eb28d3 transaction: leave unfinished without crashing when not properly released
Martin von Zweigbergk <martinvonz@google.com>
parents: 42621
diff changeset
  2608
                # so just leave the unfinished transaction there and let the
36c692eb28d3 transaction: leave unfinished without crashing when not properly released
Martin von Zweigbergk <martinvonz@google.com>
parents: 42621
diff changeset
  2609
                # user run `hg recover`.
36c692eb28d3 transaction: leave unfinished without crashing when not properly released
Martin von Zweigbergk <martinvonz@google.com>
parents: 42621
diff changeset
  2610
                return
26577
8f2ff40fe9c9 localrepo: execute appropriate actions for dirstate at releasing transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26499
diff changeset
  2611
            if success:
26634
09bb1ee7e73e dirstate: make writing in-memory changes aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26631
diff changeset
  2612
                # this should be explicitly invoked here, because
09bb1ee7e73e dirstate: make writing in-memory changes aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26631
diff changeset
  2613
                # in-memory changes aren't written out at closing
09bb1ee7e73e dirstate: make writing in-memory changes aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26631
diff changeset
  2614
                # transaction, if tr.addfilegenerator (via
09bb1ee7e73e dirstate: make writing in-memory changes aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26631
diff changeset
  2615
                # dirstate.write or so) isn't invoked while
09bb1ee7e73e dirstate: make writing in-memory changes aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26631
diff changeset
  2616
                # transaction running
26748
5ba0a99ff27f dirstate: make dirstate.write() callers pass transaction object to it
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26741
diff changeset
  2617
                repo.dirstate.write(None)
26577
8f2ff40fe9c9 localrepo: execute appropriate actions for dirstate at releasing transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26499
diff changeset
  2618
            else:
8f2ff40fe9c9 localrepo: execute appropriate actions for dirstate at releasing transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26499
diff changeset
  2619
                # discard all changes (including ones already written
8f2ff40fe9c9 localrepo: execute appropriate actions for dirstate at releasing transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26499
diff changeset
  2620
                # out) in this transaction
26831
0a7610758c42 localrepo: discard objects in _filecache at transaction failure (issue4876)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26781
diff changeset
  2621
                repo.invalidate(clearfilecache=True)
0a7610758c42 localrepo: discard objects in _filecache at transaction failure (issue4876)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26781
diff changeset
  2622
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2623
        tr = transaction.transaction(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2624
            rp,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2625
            self.svfs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2626
            vfsmap,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2627
            b"journal",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2628
            b"undo",
50285
473103758373 undo-files: drop the old undo rename logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50284
diff changeset
  2629
            lambda: None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2630
            self.store.createmode,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2631
            validator=validate,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2632
            releasefn=releasefn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2633
            checkambigfiles=_cachedfiles,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2634
            name=desc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2635
        )
50284
a43f0562220c undo-files: have the transaction directly tracks and manages journal rename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50281
diff changeset
  2636
        for vfs_id, path in self._journalfiles():
a43f0562220c undo-files: have the transaction directly tracks and manages journal rename
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50281
diff changeset
  2637
            tr.add_journal(vfs_id, path)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2638
        tr.changes[b'origrepolen'] = len(self)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2639
        tr.changes[b'obsmarkers'] = set()
44548
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
  2640
        tr.changes[b'phases'] = []
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2641
        tr.changes[b'bookmarks'] = {}
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2642
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2643
        tr.hookargs[b'txnid'] = txnid
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2644
        tr.hookargs[b'txnname'] = desc
44835
09da5cf44772 hooks: provide access to transaction changes for internal hooks
Joerg Sonnenberger <joerg@bec.de>
parents: 44796
diff changeset
  2645
        tr.hookargs[b'changes'] = tr.changes
23511
acc73273b27e fncache: document the fact fncache is outdate at hook run time
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23510
diff changeset
  2646
        # note: writing the fncache only during finalize mean that the file is
acc73273b27e fncache: document the fact fncache is outdate at hook run time
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23510
diff changeset
  2647
        # outdated when running hooks. As fncache is used for streaming clone,
acc73273b27e fncache: document the fact fncache is outdate at hook run time
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23510
diff changeset
  2648
        # this is not expected to break anything that happen during the hooks.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2649
        tr.addfinalize(b'flush-fncache', self.store.write)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2650
24282
db8679812f84 hook: add a generic hook after transaction has been closed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24281
diff changeset
  2651
        def txnclosehook(tr2):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  2652
            """To be run if transaction is successful, will schedule a hook run"""
27907
e219dbfd0342 localrepo: don't reference transaction from hook closure (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27846
diff changeset
  2653
            # Don't reference tr2 in hook() so we don't hold a reference.
e219dbfd0342 localrepo: don't reference transaction from hook closure (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27846
diff changeset
  2654
            # This reduces memory consumption when there are multiple
e219dbfd0342 localrepo: don't reference transaction from hook closure (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27846
diff changeset
  2655
            # transactions per lock. This can likely go away if issue5045
e219dbfd0342 localrepo: don't reference transaction from hook closure (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27846
diff changeset
  2656
            # fixes the function accumulation.
e219dbfd0342 localrepo: don't reference transaction from hook closure (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27846
diff changeset
  2657
            hookargs = tr2.hookargs
e219dbfd0342 localrepo: don't reference transaction from hook closure (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27846
diff changeset
  2658
43778
888bd39ed555 lock: pass "success" boolean to _afterlock callbacks
Kyle Lippincott <spectral@google.com>
parents: 43765
diff changeset
  2659
            def hookfunc(unused_success):
34708
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  2660
                repo = reporef()
46792
7e08fa9b3d13 typing: add assertions to localrepo.py to appease pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46572
diff changeset
  2661
                assert repo is not None  # help pytype
7e08fa9b3d13 typing: add assertions to localrepo.py to appease pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46572
diff changeset
  2662
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2663
                if hook.hashook(repo.ui, b'txnclose-bookmark'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2664
                    bmchanges = sorted(tr.changes[b'bookmarks'].items())
34708
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  2665
                    for name, (old, new) in bmchanges:
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  2666
                        args = tr.hookargs.copy()
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  2667
                        args.update(bookmarks.preparehookargs(name, old, new))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2668
                        repo.hook(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2669
                            b'txnclose-bookmark',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2670
                            throw=False,
51284
58d39c7865e5 usage: configure uncompressed chunk cache through resource configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51134
diff changeset
  2671
                            **pycompat.strkwargs(args),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2672
                        )
34708
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  2673
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2674
                if hook.hashook(repo.ui, b'txnclose-phase'):
34710
cdf833d7de98 phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34709
diff changeset
  2675
                    cl = repo.unfiltered().changelog
44548
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
  2676
                    phasemv = sorted(
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
  2677
                        tr.changes[b'phases'], key=lambda r: r[0][0]
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
  2678
                    )
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
  2679
                    for revs, (old, new) in phasemv:
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
  2680
                        for rev in revs:
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
  2681
                            args = tr.hookargs.copy()
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
  2682
                            node = hex(cl.node(rev))
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
  2683
                            args.update(phases.preparehookargs(node, old, new))
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
  2684
                            repo.hook(
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
  2685
                                b'txnclose-phase',
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
  2686
                                throw=False,
51284
58d39c7865e5 usage: configure uncompressed chunk cache through resource configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51134
diff changeset
  2687
                                **pycompat.strkwargs(args),
44548
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
  2688
                            )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2689
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2690
                repo.hook(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2691
                    b'txnclose', throw=False, **pycompat.strkwargs(hookargs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2692
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2693
46792
7e08fa9b3d13 typing: add assertions to localrepo.py to appease pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46572
diff changeset
  2694
            repo = reporef()
7e08fa9b3d13 typing: add assertions to localrepo.py to appease pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46572
diff changeset
  2695
            assert repo is not None  # help pytype
7e08fa9b3d13 typing: add assertions to localrepo.py to appease pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46572
diff changeset
  2696
            repo._afterlock(hookfunc)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2697
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2698
        tr.addfinalize(b'txnclose-hook', txnclosehook)
35749
3a3b59bbe7ce localrepo: run cache-warming transaction callback before report callback
Martin von Zweigbergk <martinvonz@google.com>
parents: 35736
diff changeset
  2699
        # Include a leading "-" to make it happen before the transaction summary
3a3b59bbe7ce localrepo: run cache-warming transaction callback before report callback
Martin von Zweigbergk <martinvonz@google.com>
parents: 35736
diff changeset
  2700
        # reports registered via scmutil.registersummarycallback() whose names
3a3b59bbe7ce localrepo: run cache-warming transaction callback before report callback
Martin von Zweigbergk <martinvonz@google.com>
parents: 35736
diff changeset
  2701
        # are 00-txnreport etc. That way, the caches will be warm when the
3a3b59bbe7ce localrepo: run cache-warming transaction callback before report callback
Martin von Zweigbergk <martinvonz@google.com>
parents: 35736
diff changeset
  2702
        # callbacks run.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2703
        tr.addpostclose(b'-warm-cache', self._buildcacheupdater(tr))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2704
24792
7d0421de8de3 hooks: add a 'txnabort' hook
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24784
diff changeset
  2705
        def txnaborthook(tr2):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  2706
            """To be run if transaction is aborted"""
46792
7e08fa9b3d13 typing: add assertions to localrepo.py to appease pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46572
diff changeset
  2707
            repo = reporef()
7e08fa9b3d13 typing: add assertions to localrepo.py to appease pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46572
diff changeset
  2708
            assert repo is not None  # help pytype
7e08fa9b3d13 typing: add assertions to localrepo.py to appease pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46572
diff changeset
  2709
            repo.hook(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2710
                b'txnabort', throw=False, **pycompat.strkwargs(tr2.hookargs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2711
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2712
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2713
        tr.addabort(b'txnabort-hook', txnaborthook)
26251
5c0f5db65c6b localrepo: refresh filecache stats only if transaction finished successfully
Yuya Nishihara <yuya@tcha.org>
parents: 26250
diff changeset
  2714
        # avoid eager cache invalidation. in-memory data should be identical
5c0f5db65c6b localrepo: refresh filecache stats only if transaction finished successfully
Yuya Nishihara <yuya@tcha.org>
parents: 26250
diff changeset
  2715
        # to stored data if transaction has no error.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2716
        tr.addpostclose(b'refresh-filecachestats', self._refreshfilecachestats)
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  2717
        self._transref = weakref.ref(tr)
33541
b47fef6d2365 transaction-summary: display the summary for all transactions
Boris Feld <boris.feld@octobus.net>
parents: 33539
diff changeset
  2718
        scmutil.registersummarycallback(self, tr, desc)
50084
5b9c3ae807c8 localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50082
diff changeset
  2719
        # This only exist to deal with the need of rollback to have viable
5b9c3ae807c8 localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50082
diff changeset
  2720
        # parents at the end of the operation. So backup viable parents at the
5b9c3ae807c8 localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50082
diff changeset
  2721
        # time of this operation.
5b9c3ae807c8 localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50082
diff changeset
  2722
        #
5b9c3ae807c8 localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50082
diff changeset
  2723
        # We only do it when the `wlock` is taken, otherwise other might be
5b9c3ae807c8 localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50082
diff changeset
  2724
        # altering the dirstate under us.
5b9c3ae807c8 localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50082
diff changeset
  2725
        #
5b9c3ae807c8 localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50082
diff changeset
  2726
        # This is really not a great way to do this (first, because we cannot
5b9c3ae807c8 localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50082
diff changeset
  2727
        # always do it). There are more viable alternative that exists
5b9c3ae807c8 localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50082
diff changeset
  2728
        #
5b9c3ae807c8 localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50082
diff changeset
  2729
        # - backing only the working copy parent in a dedicated files and doing
5b9c3ae807c8 localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50082
diff changeset
  2730
        #   a clean "keep-update" to them on `hg rollback`.
5b9c3ae807c8 localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50082
diff changeset
  2731
        #
5b9c3ae807c8 localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50082
diff changeset
  2732
        # - slightly changing the behavior an applying a logic similar to "hg
5b9c3ae807c8 localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50082
diff changeset
  2733
        # strip" to pick a working copy destination on `hg rollback`
5b9c3ae807c8 localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50082
diff changeset
  2734
        if self.currentwlock() is not None:
5b9c3ae807c8 localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50082
diff changeset
  2735
            ds = self.dirstate
50267
f92afdf3cff9 transaction: remove the `branch` backup for transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50265
diff changeset
  2736
            if not self.vfs.exists(b'branch'):
50195
11e6eee4b063 transaction: use the standard transaction mechanism to backup branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50194
diff changeset
  2737
                # force a file to be written if None exist
50265
240a04cedd24 branch: pass current transaction when writing branch for transaction backup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50195
diff changeset
  2738
                ds.setbranch(b'default', None)
50084
5b9c3ae807c8 localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50082
diff changeset
  2739
5b9c3ae807c8 localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50082
diff changeset
  2740
            def backup_dirstate(tr):
5b9c3ae807c8 localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50082
diff changeset
  2741
                for f in ds.all_file_names():
5b9c3ae807c8 localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50082
diff changeset
  2742
                    # hardlink backup is okay because `dirstate` is always
5b9c3ae807c8 localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50082
diff changeset
  2743
                    # atomically written and possible data file are append only
5b9c3ae807c8 localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50082
diff changeset
  2744
                    # and resistant to trailing data.
5b9c3ae807c8 localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50082
diff changeset
  2745
                    tr.addbackup(f, hardlink=True, location=b'plain')
5b9c3ae807c8 localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50082
diff changeset
  2746
5b9c3ae807c8 localrepo: "blindly" do a dirstate backup at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50082
diff changeset
  2747
            tr.addvalidator(b'dirstate-backup', backup_dirstate)
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  2748
        return tr
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  2749
16236
97efd26eb957 localrepo: refactor retrieving of journal/undo files paths
Idan Kamara <idankk86@gmail.com>
parents: 16208
diff changeset
  2750
    def _journalfiles(self):
50085
ff12f42415f5 localrepo: stop doing special dirstate backup at transaction open
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50084
diff changeset
  2751
        return (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2752
            (self.svfs, b'journal'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2753
            (self.vfs, b'journal.desc'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2754
        )
16236
97efd26eb957 localrepo: refactor retrieving of journal/undo files paths
Idan Kamara <idankk86@gmail.com>
parents: 16208
diff changeset
  2755
97efd26eb957 localrepo: refactor retrieving of journal/undo files paths
Idan Kamara <idankk86@gmail.com>
parents: 16208
diff changeset
  2756
    def undofiles(self):
20975
37cdf1fca1b2 localrepo: make "undofiles()" return list of tuples "(vfs, relative filename)"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20969
diff changeset
  2757
        return [(vfs, undoname(x)) for vfs, x in self._journalfiles()]
16236
97efd26eb957 localrepo: refactor retrieving of journal/undo files paths
Idan Kamara <idankk86@gmail.com>
parents: 16208
diff changeset
  2758
32452
b647b923486f transaction: run _writejournal unfiltered
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32381
diff changeset
  2759
    @unfilteredmethod
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  2760
    def _writejournal(self, desc):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2761
        self.vfs.write(b"journal.desc", b"%d\n%s\n" % (len(self), desc))
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  2762
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
  2763
    def recover(self):
27846
63821023ea79 with: use context manager in localrepo recover
Bryan O'Sullivan <bryano@fb.com>
parents: 27698
diff changeset
  2764
        with self.lock():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2765
            if self.svfs.exists(b"journal"):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2766
                self.ui.status(_(b"rolling back interrupted transaction\n"))
50281
f34887316f1f undo-files: factor the vfs map in a repository property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50267
diff changeset
  2767
                vfsmap = self.vfs_map
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2768
                transaction.rollback(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2769
                    self.svfs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2770
                    vfsmap,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2771
                    b"journal",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2772
                    self.ui.warn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2773
                    checkambigfiles=_cachedfiles,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2774
                )
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  2775
                self.invalidate()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  2776
                return True
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  2777
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2778
                self.ui.warn(_(b"no interrupted transaction available\n"))
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  2779
                return False
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
  2780
15183
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15131
diff changeset
  2781
    def rollback(self, dryrun=False, force=False):
50071
d91fc026071c rollback: remove the dirstateguard usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50070
diff changeset
  2782
        wlock = lock = None
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  2783
        try:
1712
21dcf38e5d7d Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents: 1709
diff changeset
  2784
            wlock = self.wlock()
4438
3900f684a150 Fix hg import --exact bug that hangs hg on failure.
Eric Hopper <hopper@omnifarious.org>
parents: 4417
diff changeset
  2785
            lock = self.lock()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2786
            if self.svfs.exists(b"undo"):
50071
d91fc026071c rollback: remove the dirstateguard usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50070
diff changeset
  2787
                return self._rollback(dryrun, force)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  2788
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2789
                self.ui.warn(_(b"no rollback information available\n"))
11177
6a64813276ed commands: initial audit of exit codes
Matt Mackall <mpm@selenic.com>
parents: 11174
diff changeset
  2790
                return 1
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  2791
        finally:
50071
d91fc026071c rollback: remove the dirstateguard usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50070
diff changeset
  2792
            release(lock, wlock)
162
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 161
diff changeset
  2793
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2794
    @unfilteredmethod  # Until we get smarter cache management
50071
d91fc026071c rollback: remove the dirstateguard usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50070
diff changeset
  2795
    def _rollback(self, dryrun, force):
15130
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  2796
        ui = self.ui
50069
81870c92c293 rollback: detect "parentgone" case earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50059
diff changeset
  2797
81870c92c293 rollback: detect "parentgone" case earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50059
diff changeset
  2798
        parents = self.dirstate.parents()
15097
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
  2799
        try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2800
            args = self.vfs.read(b'undo.desc').splitlines()
15130
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  2801
            (oldlen, desc, detail) = (int(args[0]), args[1], None)
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  2802
            if len(args) >= 3:
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  2803
                detail = args[2]
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  2804
            oldtip = oldlen - 1
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  2805
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  2806
            if detail and ui.verbose:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2807
                msg = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2808
                    b'repository tip rolled back to revision %d'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2809
                    b' (undo %s: %s)\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2810
                ) % (oldtip, desc, detail)
15130
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  2811
            else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2812
                msg = _(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
  2813
                    b'repository tip rolled back to revision %d (undo %s)\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2814
                ) % (oldtip, desc)
50069
81870c92c293 rollback: detect "parentgone" case earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50059
diff changeset
  2815
            parentgone = any(self[p].rev() > oldtip for p in parents)
15097
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
  2816
        except IOError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2817
            msg = _(b'rolling back unknown transaction\n')
15183
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15131
diff changeset
  2818
            desc = None
50069
81870c92c293 rollback: detect "parentgone" case earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50059
diff changeset
  2819
            parentgone = True
15183
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15131
diff changeset
  2820
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2821
        if not force and self[b'.'] != self[b'tip'] and desc == b'commit':
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26577
diff changeset
  2822
            raise error.Abort(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2823
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2824
                    b'rollback of last commit while not checked out '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2825
                    b'may lose data'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2826
                ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2827
                hint=_(b'use -f to force'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2828
            )
15183
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15131
diff changeset
  2829
15130
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  2830
        ui.status(msg)
15097
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
  2831
        if dryrun:
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
  2832
            return 0
15131
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  2833
18310
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  2834
        self.destroying()
50281
f34887316f1f undo-files: factor the vfs map in a repository property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50267
diff changeset
  2835
        vfsmap = self.vfs_map
50070
c8f32aa80dca rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50069
diff changeset
  2836
        skip_journal_pattern = None
c8f32aa80dca rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50069
diff changeset
  2837
        if not parentgone:
c8f32aa80dca rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50069
diff changeset
  2838
            skip_journal_pattern = RE_SKIP_DIRSTATE_ROLLBACK
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2839
        transaction.rollback(
50070
c8f32aa80dca rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50069
diff changeset
  2840
            self.svfs,
c8f32aa80dca rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50069
diff changeset
  2841
            vfsmap,
c8f32aa80dca rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50069
diff changeset
  2842
            b'undo',
c8f32aa80dca rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50069
diff changeset
  2843
            ui.warn,
c8f32aa80dca rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50069
diff changeset
  2844
            checkambigfiles=_cachedfiles,
c8f32aa80dca rollback: explicitly skip dirstate rollback when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50069
diff changeset
  2845
            skip_journal_pattern=skip_journal_pattern,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2846
        )
15097
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
  2847
        self.invalidate()
50085
ff12f42415f5 localrepo: stop doing special dirstate backup at transaction open
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50084
diff changeset
  2848
        self.dirstate.invalidate()
15131
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  2849
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  2850
        if parentgone:
50085
ff12f42415f5 localrepo: stop doing special dirstate backup at transaction open
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50084
diff changeset
  2851
            # replace this with some explicit parent update in the future.
ff12f42415f5 localrepo: stop doing special dirstate backup at transaction open
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50084
diff changeset
  2852
            has_node = self.changelog.index.has_node
ff12f42415f5 localrepo: stop doing special dirstate backup at transaction open
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50084
diff changeset
  2853
            if not all(has_node(p) for p in self.dirstate._pl):
ff12f42415f5 localrepo: stop doing special dirstate backup at transaction open
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50084
diff changeset
  2854
                # There was no dirstate to backup initially, we need to drop
ff12f42415f5 localrepo: stop doing special dirstate backup at transaction open
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50084
diff changeset
  2855
                # the existing one.
ff12f42415f5 localrepo: stop doing special dirstate backup at transaction open
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50084
diff changeset
  2856
                with self.dirstate.changing_parents(self):
ff12f42415f5 localrepo: stop doing special dirstate backup at transaction open
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50084
diff changeset
  2857
                    self.dirstate.setparents(self.nullid)
ff12f42415f5 localrepo: stop doing special dirstate backup at transaction open
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50084
diff changeset
  2858
                    self.dirstate.clear()
ff12f42415f5 localrepo: stop doing special dirstate backup at transaction open
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50084
diff changeset
  2859
27167
3fe8cb40c9c5 commands: inline definition of localrepo.parents() and drop the method (API)
Augie Fackler <augie@google.com>
parents: 27166
diff changeset
  2860
            parents = tuple([p.rev() for p in self[None].parents()])
15131
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  2861
            if len(parents) > 1:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2862
                ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2863
                    _(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2864
                        b'working directory now based on '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2865
                        b'revisions %d and %d\n'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2866
                    )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2867
                    % parents
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2868
                )
15131
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  2869
            else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2870
                ui.status(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
  2871
                    _(b'working directory now based on revision %d\n') % parents
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2872
                )
45490
0ce6af73f481 mergestate: make some callers not pass pointless node argument
Martin von Zweigbergk <martinvonz@google.com>
parents: 45485
diff changeset
  2873
            mergestatemod.mergestate.clean(self)
24784
59406b8b1303 rollback: clear resolve state (issue4593)
Matt Mackall <mpm@selenic.com>
parents: 24750
diff changeset
  2874
17013
c8eda7bbdcab strip: incrementally update the branchheads cache after a strip
Joshua Redstone <joshua.redstone@fb.com>
parents: 17012
diff changeset
  2875
        # TODO: if we know which new heads may result from this rollback, pass
c8eda7bbdcab strip: incrementally update the branchheads cache after a strip
Joshua Redstone <joshua.redstone@fb.com>
parents: 17012
diff changeset
  2876
        # them to destroy(), which will prevent the branchhead cache from being
c8eda7bbdcab strip: incrementally update the branchheads cache after a strip
Joshua Redstone <joshua.redstone@fb.com>
parents: 17012
diff changeset
  2877
        # invalidated.
15604
b8d8599410da rollback: always call destroyed() (regression from 1.9)
Greg Ward <greg-hg@gerg.ca>
parents: 15381
diff changeset
  2878
        self.destroyed()
15097
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
  2879
        return 0
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
  2880
32332
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
  2881
    def _buildcacheupdater(self, newtransaction):
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
  2882
        """called during transaction to build the callback updating cache
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
  2883
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
  2884
        Lives on the repository to help extension who might want to augment
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
  2885
        this logic. For this purpose, the created transaction is passed to the
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
  2886
        method.
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
  2887
        """
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
  2888
        # we must avoid cyclic reference between repo and transaction.
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
  2889
        reporef = weakref.ref(self)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2890
32332
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
  2891
        def updater(tr):
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
  2892
            repo = reporef()
46792
7e08fa9b3d13 typing: add assertions to localrepo.py to appease pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46572
diff changeset
  2893
            assert repo is not None  # help pytype
32332
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
  2894
            repo.updatecaches(tr)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  2895
32332
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
  2896
        return updater
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
  2897
32263
604d65e2c0b2 caches: introduce a function to warm cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32262
diff changeset
  2898
    @unfilteredmethod
47297
1337bfaa88ca updatecaches: adds a `caches` parameters to `repo.updatecaches`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47296
diff changeset
  2899
    def updatecaches(self, tr=None, full=False, caches=None):
32264
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32263
diff changeset
  2900
        """warm appropriate caches
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32263
diff changeset
  2901
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32263
diff changeset
  2902
        If this function is called after a transaction closed. The transaction
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32263
diff changeset
  2903
        will be available in the 'tr' argument. This can be used to selectively
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32263
diff changeset
  2904
        update caches relevant to the changes in that transaction.
36952
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36819
diff changeset
  2905
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36819
diff changeset
  2906
        If 'full' is set, make sure all caches the function knows about have
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36819
diff changeset
  2907
        up-to-date data. Even the ones usually loaded more lazily.
47183
8be95673eb8a cache: avoid warming the fnodetags cache after clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
  2908
8be95673eb8a cache: avoid warming the fnodetags cache after clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
  2909
        The `full` argument can take a special "post-clone" value. In this case
8be95673eb8a cache: avoid warming the fnodetags cache after clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
  2910
        the cache warming is made after a clone and of the slower cache might
8be95673eb8a cache: avoid warming the fnodetags cache after clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
  2911
        be skipped, namely the `.fnodetags` one. This argument is 5.8 specific
8be95673eb8a cache: avoid warming the fnodetags cache after clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
  2912
        as we plan for a cleaner way to deal with this for 5.9.
32264
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32263
diff changeset
  2913
        """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2914
        if tr is not None and tr.hookargs.get(b'source') == b'strip':
32263
604d65e2c0b2 caches: introduce a function to warm cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32262
diff changeset
  2915
            # During strip, many caches are invalid but
604d65e2c0b2 caches: introduce a function to warm cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32262
diff changeset
  2916
            # later call to `destroyed` will refresh them.
604d65e2c0b2 caches: introduce a function to warm cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32262
diff changeset
  2917
            return
604d65e2c0b2 caches: introduce a function to warm cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32262
diff changeset
  2918
47296
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
  2919
        unfi = self.unfiltered()
32263
604d65e2c0b2 caches: introduce a function to warm cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32262
diff changeset
  2920
51134
498017baa34b cleanup: remove some code scheduled to be removed after 5.9
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51108
diff changeset
  2921
        if caches is None:
47300
8b2d09c7e5cd updatecaches: deprecate the `full` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47299
diff changeset
  2922
            caches = repository.CACHES_DEFAULT
47296
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
  2923
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
  2924
        if repository.CACHE_BRANCHMAP_SERVED in caches:
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
  2925
            if tr is None or tr.changes[b'origrepolen'] < len(self):
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
  2926
                # accessing the 'served' branchmap should refresh all the others,
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
  2927
                self.ui.debug(b'updating the branch cache\n')
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
  2928
                self.filtered(b'served').branchmap()
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
  2929
                self.filtered(b'served.hidden').branchmap()
48677
8e5effbf52d0 branchmap: stop writing cache for uncommitted data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48674
diff changeset
  2930
                # flush all possibly delayed write.
8e5effbf52d0 branchmap: stop writing cache for uncommitted data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48674
diff changeset
  2931
                self._branchcaches.write_delayed(self)
47296
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
  2932
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
  2933
        if repository.CACHE_CHANGELOG_CACHE in caches:
44445
336ec75ed1ac nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44442
diff changeset
  2934
            self.changelog.update_caches(transaction=tr)
47296
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
  2935
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
  2936
        if repository.CACHE_MANIFESTLOG_CACHE in caches:
44787
97ebdb192b00 nodemap: also warm manifest nodemap with other caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44733
diff changeset
  2937
            self.manifestlog.update_caches(transaction=tr)
50673
5d84b1385f7f treemanifest: make `updatecaches` update the nodemaps for all directories
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50666
diff changeset
  2938
            for entry in self.store.walk():
5d84b1385f7f treemanifest: make `updatecaches` update the nodemaps for all directories
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50666
diff changeset
  2939
                if not entry.is_revlog:
5d84b1385f7f treemanifest: make `updatecaches` update the nodemaps for all directories
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50666
diff changeset
  2940
                    continue
5d84b1385f7f treemanifest: make `updatecaches` update the nodemaps for all directories
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50666
diff changeset
  2941
                if not entry.is_manifestlog:
5d84b1385f7f treemanifest: make `updatecaches` update the nodemaps for all directories
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50666
diff changeset
  2942
                    continue
5d84b1385f7f treemanifest: make `updatecaches` update the nodemaps for all directories
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50666
diff changeset
  2943
                manifestrevlog = entry.get_revlog_instance(self).get_revlog()
5d84b1385f7f treemanifest: make `updatecaches` update the nodemaps for all directories
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50666
diff changeset
  2944
                if manifestrevlog is not None:
5d84b1385f7f treemanifest: make `updatecaches` update the nodemaps for all directories
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50666
diff changeset
  2945
                    manifestrevlog.update_caches(transaction=tr)
44445
336ec75ed1ac nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44442
diff changeset
  2946
47296
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
  2947
        if repository.CACHE_REV_BRANCH in caches:
41933
2eee280a1354 updatecaches: also warm revbranchcache for filtered revisions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41896
diff changeset
  2948
            rbc = unfi.revbranchcache()
2eee280a1354 updatecaches: also warm revbranchcache for filtered revisions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41896
diff changeset
  2949
            for r in unfi.changelog:
36952
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36819
diff changeset
  2950
                rbc.branchinfo(r)
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36819
diff changeset
  2951
            rbc.write()
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36819
diff changeset
  2952
47296
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
  2953
        if repository.CACHE_FULL_MANIFEST in caches:
38781
0a57945aaf7f manifest: persist the manifestfulltext cache
Martijn Pieters <mj@zopatista.com>
parents: 38760
diff changeset
  2954
            # ensure the working copy parents are in the manifestfulltextcache
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2955
            for ctx in self[b'.'].parents():
38781
0a57945aaf7f manifest: persist the manifestfulltext cache
Martijn Pieters <mj@zopatista.com>
parents: 38760
diff changeset
  2956
                ctx.manifest()  # accessing the manifest is enough
0a57945aaf7f manifest: persist the manifestfulltext cache
Martijn Pieters <mj@zopatista.com>
parents: 38760
diff changeset
  2957
47296
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
  2958
        if repository.CACHE_FILE_NODE_TAGS in caches:
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
  2959
            # accessing fnode cache warms the cache
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
  2960
            tagsmod.fnoderevs(self.ui, unfi, unfi.changelog.revs())
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
  2961
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
  2962
        if repository.CACHE_TAGS_DEFAULT in caches:
41934
481259af4bdf updatecaches: also warm the tags caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41933
diff changeset
  2963
            # accessing tags warm the cache
481259af4bdf updatecaches: also warm the tags caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41933
diff changeset
  2964
            self.tags()
47296
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
  2965
        if repository.CACHE_TAGS_SERVED in caches:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2966
            self.filtered(b'served').tags()
41934
481259af4bdf updatecaches: also warm the tags caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41933
diff changeset
  2967
47296
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
  2968
        if repository.CACHE_BRANCHMAP_ALL in caches:
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
  2969
            # The CACHE_BRANCHMAP_ALL updates lazily-loaded caches immediately,
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
  2970
            # so we're forcing a write to cause these caches to be warmed up
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
  2971
            # even if they haven't explicitly been requested yet (if they've
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
  2972
            # never been used by hg, they won't ever have been written, even if
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
  2973
            # they're a subset of another kind of cache that *has* been used).
42712
cdf0e9523de1 branchmap: explicitly warm+write all subsets of the branchmap caches
Kyle Lippincott <spectral@google.com>
parents: 42685
diff changeset
  2974
            for filt in repoview.filtertable.keys():
cdf0e9523de1 branchmap: explicitly warm+write all subsets of the branchmap caches
Kyle Lippincott <spectral@google.com>
parents: 42685
diff changeset
  2975
                filtered = self.filtered(filt)
cdf0e9523de1 branchmap: explicitly warm+write all subsets of the branchmap caches
Kyle Lippincott <spectral@google.com>
parents: 42685
diff changeset
  2976
                filtered.branchmap().write(filtered)
cdf0e9523de1 branchmap: explicitly warm+write all subsets of the branchmap caches
Kyle Lippincott <spectral@google.com>
parents: 42685
diff changeset
  2977
10547
bae9bb09166b strip: invalidate all caches after stripping (fixes issue1951)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10522
diff changeset
  2978
    def invalidatecaches(self):
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43421
diff changeset
  2979
        if '_tagscache' in vars(self):
18013
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
  2980
            # can't use delattr on proxy
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43421
diff changeset
  2981
            del self.__dict__['_tagscache']
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2982
41615
328ca3b9e545 branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents: 41529
diff changeset
  2983
        self._branchcaches.clear()
18105
312262ebc223 cache: group obscache and revsfiltercache invalidation in a single function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18101
diff changeset
  2984
        self.invalidatevolatilesets()
33302
36a415b5a4b2 localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33278
diff changeset
  2985
        self._sparsesignaturecache.clear()
18105
312262ebc223 cache: group obscache and revsfiltercache invalidation in a single function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18101
diff changeset
  2986
312262ebc223 cache: group obscache and revsfiltercache invalidation in a single function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18101
diff changeset
  2987
    def invalidatevolatilesets(self):
312262ebc223 cache: group obscache and revsfiltercache invalidation in a single function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18101
diff changeset
  2988
        self.filteredrevcache.clear()
17469
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17434
diff changeset
  2989
        obsolete.clearobscaches(self)
44104
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
  2990
        self._quick_access_changeid_invalidate()
1784
2e0a288ca93e revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1782
diff changeset
  2991
14930
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  2992
    def invalidatedirstate(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  2993
        """Invalidates the dirstate, causing the next call to dirstate
14930
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  2994
        to check if it was modified since the last time it was read,
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  2995
        rereading it if it has.
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  2996
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  2997
        This is different to dirstate.invalidate() that it doesn't always
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  2998
        rereads the dirstate. Use dirstate.invalidate() if you want to
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  2999
        explicitly read the dirstate again (i.e. restoring it to a previous
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  3000
        known good state)."""
50127
ec769cbc1fa2 dirstate: directly manage the dirstate property on localrepo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50085
diff changeset
  3001
        unfi = self.unfiltered()
ec769cbc1fa2 dirstate: directly manage the dirstate property on localrepo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50085
diff changeset
  3002
        if 'dirstate' in unfi.__dict__:
50301
9fc0d244a753 dirstate: fix a potential traceback when in `copy` and `rename`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50285
diff changeset
  3003
            assert not self.dirstate.is_changing_any
50127
ec769cbc1fa2 dirstate: directly manage the dirstate property on localrepo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50085
diff changeset
  3004
            del unfi.__dict__['dirstate']
14930
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  3005
26831
0a7610758c42 localrepo: discard objects in _filecache at transaction failure (issue4876)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26781
diff changeset
  3006
    def invalidate(self, clearfilecache=False):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  3007
        """Invalidates both store and non-store parts other than dirstate
29918
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29883
diff changeset
  3008
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29883
diff changeset
  3009
        If a transaction is running, invalidation of store is omitted,
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29883
diff changeset
  3010
        because discarding in-memory changes might cause inconsistency
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29883
diff changeset
  3011
        (e.g. incomplete fncache causes unintentional failure, but
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29883
diff changeset
  3012
        redundant one doesn't).
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  3013
        """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3014
        unfiltered = self.unfiltered()  # all file caches are stored unfiltered
31510
2244fb3eee49 localrepo: forcibly copy list of filecache keys
Augie Fackler <augie@google.com>
parents: 31509
diff changeset
  3015
        for k in list(self._filecache.keys()):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3016
            if (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3017
                k == b'changelog'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3018
                and self.currenttransaction()
51104
1c0f3994d733 changelog-delay: move "delayed" check to a more official API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51044
diff changeset
  3019
                and self.changelog.is_delaying
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3020
            ):
33706
01a1c4e66816 repo: skip invalidation of changelog if it has 'delayed' changes (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33703
diff changeset
  3021
                # The changelog object may store unwritten revisions. We don't
01a1c4e66816 repo: skip invalidation of changelog if it has 'delayed' changes (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33703
diff changeset
  3022
                # want to lose them.
01a1c4e66816 repo: skip invalidation of changelog if it has 'delayed' changes (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33703
diff changeset
  3023
                # TODO: Solve the problem instead of working around it.
01a1c4e66816 repo: skip invalidation of changelog if it has 'delayed' changes (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33703
diff changeset
  3024
                continue
14935
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
  3025
26831
0a7610758c42 localrepo: discard objects in _filecache at transaction failure (issue4876)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26781
diff changeset
  3026
            if clearfilecache:
0a7610758c42 localrepo: discard objects in _filecache at transaction failure (issue4876)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26781
diff changeset
  3027
                del self._filecache[k]
14935
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
  3028
            try:
50919
b3174be5e7f7 localrepo: purge filecache attribute using there unicode name
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50759
diff changeset
  3029
                # XXX ideally, the key would be a unicode string to match the
b3174be5e7f7 localrepo: purge filecache attribute using there unicode name
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50759
diff changeset
  3030
                # fact it refers to an attribut name. However changing this was
b3174be5e7f7 localrepo: purge filecache attribute using there unicode name
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50759
diff changeset
  3031
                # a bit a scope creep compared to the series cleaning up
b3174be5e7f7 localrepo: purge filecache attribute using there unicode name
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50759
diff changeset
  3032
                # del/set/getattr so we kept thing simple here.
b3174be5e7f7 localrepo: purge filecache attribute using there unicode name
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50759
diff changeset
  3033
                delattr(unfiltered, pycompat.sysstr(k))
14935
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
  3034
            except AttributeError:
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
  3035
                pass
10547
bae9bb09166b strip: invalidate all caches after stripping (fixes issue1951)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10522
diff changeset
  3036
        self.invalidatecaches()
29918
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29883
diff changeset
  3037
        if not self.currenttransaction():
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29883
diff changeset
  3038
            # TODO: Changing contents of store outside transaction
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29883
diff changeset
  3039
            # causes inconsistency. We should make in-memory store
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29883
diff changeset
  3040
            # changes detectable, and abort if changed.
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29883
diff changeset
  3041
            self.store.invalidatecaches()
10547
bae9bb09166b strip: invalidate all caches after stripping (fixes issue1951)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10522
diff changeset
  3042
20627
a42ea6d209e6 localrepo: add hook point to invalidate everything on each command-server run
Yuya Nishihara <yuya@tcha.org>
parents: 20567
diff changeset
  3043
    def invalidateall(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  3044
        """Fully invalidates both store and non-store parts, causing the
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  3045
        subsequent operation to reread any outside changes."""
20627
a42ea6d209e6 localrepo: add hook point to invalidate everything on each command-server run
Yuya Nishihara <yuya@tcha.org>
parents: 20567
diff changeset
  3046
        # extension should hook this to invalidate its caches
a42ea6d209e6 localrepo: add hook point to invalidate everything on each command-server run
Yuya Nishihara <yuya@tcha.org>
parents: 20567
diff changeset
  3047
        self.invalidate()
a42ea6d209e6 localrepo: add hook point to invalidate everything on each command-server run
Yuya Nishihara <yuya@tcha.org>
parents: 20567
diff changeset
  3048
        self.invalidatedirstate()
a42ea6d209e6 localrepo: add hook point to invalidate everything on each command-server run
Yuya Nishihara <yuya@tcha.org>
parents: 20567
diff changeset
  3049
29920
e35a83cedde1 localrepo: make _refreshfilecachestats unfiltered method to refresh correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29918
diff changeset
  3050
    @unfilteredmethod
26251
5c0f5db65c6b localrepo: refresh filecache stats only if transaction finished successfully
Yuya Nishihara <yuya@tcha.org>
parents: 26250
diff changeset
  3051
    def _refreshfilecachestats(self, tr):
26250
bc1f8a79b4e4 localrepo: move closure of lock release to class
Yuya Nishihara <yuya@tcha.org>
parents: 26155
diff changeset
  3052
        """Reload stats of cached files so that they are flagged as valid"""
bc1f8a79b4e4 localrepo: move closure of lock release to class
Yuya Nishihara <yuya@tcha.org>
parents: 26155
diff changeset
  3053
        for k, ce in self._filecache.items():
35839
9dad46c23185 localrepo: consistently use native str when __dict__ is involved
Augie Fackler <augie@google.com>
parents: 35785
diff changeset
  3054
            k = pycompat.sysstr(k)
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43421
diff changeset
  3055
            if k == 'dirstate' or k not in self.__dict__:
26250
bc1f8a79b4e4 localrepo: move closure of lock release to class
Yuya Nishihara <yuya@tcha.org>
parents: 26155
diff changeset
  3056
                continue
bc1f8a79b4e4 localrepo: move closure of lock release to class
Yuya Nishihara <yuya@tcha.org>
parents: 26155
diff changeset
  3057
            ce.refresh()
bc1f8a79b4e4 localrepo: move closure of lock release to class
Yuya Nishihara <yuya@tcha.org>
parents: 26155
diff changeset
  3058
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3059
    def _lock(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  3060
        self,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  3061
        vfs,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  3062
        lockname,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  3063
        wait,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  3064
        releasefn,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  3065
        acquirefn,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  3066
        desc,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3067
    ):
35208
1b758105b5c7 lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents: 35207
diff changeset
  3068
        timeout = 0
35209
9153871d50e0 lock: allow to configure when the lock messages are displayed
Boris Feld <boris.feld@octobus.net>
parents: 35208
diff changeset
  3069
        warntimeout = 0
35208
1b758105b5c7 lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents: 35207
diff changeset
  3070
        if wait:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3071
            timeout = self.ui.configint(b"ui", b"timeout")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3072
            warntimeout = self.ui.configint(b"ui", b"timeout.warn")
38038
8c828beb7543 lock: add internal config to not replace signal handlers while locking
Yuya Nishihara <yuya@tcha.org>
parents: 37810
diff changeset
  3073
        # internal config: ui.signal-safe-lock
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3074
        signalsafe = self.ui.configbool(b'ui', b'signal-safe-lock')
35208
1b758105b5c7 lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents: 35207
diff changeset
  3075
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3076
        l = lockmod.trylock(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3077
            self.ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3078
            vfs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3079
            lockname,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3080
            timeout,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3081
            warntimeout,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3082
            releasefn=releasefn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3083
            acquirefn=acquirefn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3084
            desc=desc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3085
            signalsafe=signalsafe,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3086
        )
1751
e9bf415a8ecb localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1747
diff changeset
  3087
        return l
e9bf415a8ecb localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1747
diff changeset
  3088
15587
809d5d30e377 localrepo: rename _postrelease to _afterlock
Matt Mackall <mpm@selenic.com>
parents: 15586
diff changeset
  3089
    def _afterlock(self, callback):
24821
57f1dbc99631 afterlock: add the callback to the top level lock (issue4608)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24799
diff changeset
  3090
        """add a callback to be run when the repository is fully unlocked
15583
926a06f7a353 lock: add mechanism to register post release callback
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15486
diff changeset
  3091
24821
57f1dbc99631 afterlock: add the callback to the top level lock (issue4608)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24799
diff changeset
  3092
        The callback will be executed when the outermost lock is released
57f1dbc99631 afterlock: add the callback to the top level lock (issue4608)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24799
diff changeset
  3093
        (with wlock being higher level than 'lock')."""
57f1dbc99631 afterlock: add the callback to the top level lock (issue4608)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24799
diff changeset
  3094
        for ref in (self._wlockref, self._lockref):
57f1dbc99631 afterlock: add the callback to the top level lock (issue4608)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24799
diff changeset
  3095
            l = ref and ref()
57f1dbc99631 afterlock: add the callback to the top level lock (issue4608)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24799
diff changeset
  3096
            if l and l.held:
57f1dbc99631 afterlock: add the callback to the top level lock (issue4608)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24799
diff changeset
  3097
                l.postrelease.append(callback)
57f1dbc99631 afterlock: add the callback to the top level lock (issue4608)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24799
diff changeset
  3098
                break
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3099
        else:  # no lock have been found.
43778
888bd39ed555 lock: pass "success" boolean to _afterlock callbacks
Kyle Lippincott <spectral@google.com>
parents: 43765
diff changeset
  3100
            callback(True)
15583
926a06f7a353 lock: add mechanism to register post release callback
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15486
diff changeset
  3101
4914
9a2a73ea6135 repo locks: use True/False
Matt Mackall <mpm@selenic.com>
parents: 4913
diff changeset
  3102
    def lock(self, wait=True):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  3103
        """Lock the repository store (.hg/store) and return a weak reference
9309
cfdcb7a465af localrepo: document the locking scheme a little better
Greg Ward <greg-hg@gerg.ca>
parents: 9152
diff changeset
  3104
        to the lock. Use this before modifying the store (e.g. committing or
24746
e0c810d0ab69 lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24745
diff changeset
  3105
        stripping). If you are opening a transaction, get a lock as well.)
e0c810d0ab69 lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24745
diff changeset
  3106
e0c810d0ab69 lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24745
diff changeset
  3107
        If both 'lock' and 'wlock' must be acquired, ensure you always acquires
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  3108
        'wlock' first to avoid a dead-lock hazard."""
29705
41689e293994 develwarn: use the lock helper in local repo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29417
diff changeset
  3109
        l = self._currentlock(self._lockref)
41689e293994 develwarn: use the lock helper in local repo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29417
diff changeset
  3110
        if l is not None:
8108
a26d33749bd8 made repo locks recursive and deprecate refcounting based lock releasing
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8072
diff changeset
  3111
            l.lock()
a26d33749bd8 made repo locks recursive and deprecate refcounting based lock releasing
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8072
diff changeset
  3112
            return l
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4916
diff changeset
  3113
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3114
        l = self._lock(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3115
            vfs=self.svfs,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3116
            lockname=b"lock",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3117
            wait=wait,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3118
            releasefn=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3119
            acquirefn=self.invalidate,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3120
            desc=_(b'repository %s') % self.origroot,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3121
        )
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4916
diff changeset
  3122
        self._lockref = weakref.ref(l)
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4916
diff changeset
  3123
        return l
1751
e9bf415a8ecb localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1747
diff changeset
  3124
4914
9a2a73ea6135 repo locks: use True/False
Matt Mackall <mpm@selenic.com>
parents: 4913
diff changeset
  3125
    def wlock(self, wait=True):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  3126
        """Lock the non-store parts of the repository (everything under
9309
cfdcb7a465af localrepo: document the locking scheme a little better
Greg Ward <greg-hg@gerg.ca>
parents: 9152
diff changeset
  3127
        .hg except .hg/store) and return a weak reference to the lock.
24746
e0c810d0ab69 lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24745
diff changeset
  3128
e0c810d0ab69 lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24745
diff changeset
  3129
        Use this before modifying files in .hg.
e0c810d0ab69 lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24745
diff changeset
  3130
e0c810d0ab69 lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24745
diff changeset
  3131
        If both 'lock' and 'wlock' must be acquired, ensure you always acquires
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  3132
        'wlock' first to avoid a dead-lock hazard."""
46793
86b47ec1960a typing: rewrite a conditional assignment to unconfuse pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46792
diff changeset
  3133
        l = self._wlockref() if self._wlockref else None
24744
bedefc611f25 wlock: only issue devel warning when actually acquiring the lock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24740
diff changeset
  3134
        if l is not None and l.held:
bedefc611f25 wlock: only issue devel warning when actually acquiring the lock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24740
diff changeset
  3135
            l.lock()
bedefc611f25 wlock: only issue devel warning when actually acquiring the lock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24740
diff changeset
  3136
            return l
bedefc611f25 wlock: only issue devel warning when actually acquiring the lock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24740
diff changeset
  3137
26781
1aee2ab0f902 spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents: 26767
diff changeset
  3138
        # We do not need to check for non-waiting lock acquisition.  Such
24750
aaf835407bf2 wlock: do not warn for non-wait locking
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24748
diff changeset
  3139
        # acquisition would not cause dead-lock as they would just fail.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3140
        if wait and (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3141
            self.ui.configbool(b'devel', b'all-warnings')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3142
            or self.ui.configbool(b'devel', b'check-locks')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3143
        ):
29705
41689e293994 develwarn: use the lock helper in local repo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29417
diff changeset
  3144
            if self._currentlock(self._lockref) is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3145
                self.ui.develwarn(b'"wlock" acquired after "lock"')
1531
2ba8bf7defda add localrepo.wlock for protecting the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1516
diff changeset
  3146
14930
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  3147
        def unlock():
50023
e1cff85484e2 dirstate: introduce a `is_changing_any` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50022
diff changeset
  3148
            if self.dirstate.is_changing_any:
49959
376395868b7b dirstate: warn about non-explicitly rolledback parent-change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49753
diff changeset
  3149
                msg = b"wlock release in the middle of a changing parents"
376395868b7b dirstate: warn about non-explicitly rolledback parent-change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49753
diff changeset
  3150
                self.ui.develwarn(msg)
22404
12bc7f06fc41 dirstate: add begin/endparentchange to dirstate
Durham Goode <durham@fb.com>
parents: 22362
diff changeset
  3151
                self.dirstate.invalidate()
12bc7f06fc41 dirstate: add begin/endparentchange to dirstate
Durham Goode <durham@fb.com>
parents: 22362
diff changeset
  3152
            else:
50057
cf8b9c80d67c dirstate: issue a developer warning on implicit write on wlock release
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
  3153
                if self.dirstate._dirty:
cf8b9c80d67c dirstate: issue a developer warning on implicit write on wlock release
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
  3154
                    msg = b"dirty dirstate on wlock release"
cf8b9c80d67c dirstate: issue a developer warning on implicit write on wlock release
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
  3155
                    self.ui.develwarn(msg)
26748
5ba0a99ff27f dirstate: make dirstate.write() callers pass transaction object to it
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26741
diff changeset
  3156
                self.dirstate.write(None)
22404
12bc7f06fc41 dirstate: add begin/endparentchange to dirstate
Durham Goode <durham@fb.com>
parents: 22362
diff changeset
  3157
50127
ec769cbc1fa2 dirstate: directly manage the dirstate property on localrepo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50085
diff changeset
  3158
            unfi = self.unfiltered()
ec769cbc1fa2 dirstate: directly manage the dirstate property on localrepo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50085
diff changeset
  3159
            if 'dirstate' in unfi.__dict__:
ec769cbc1fa2 dirstate: directly manage the dirstate property on localrepo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50085
diff changeset
  3160
                del unfi.__dict__['dirstate']
14930
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  3161
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3162
        l = self._lock(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3163
            self.vfs,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3164
            b"wlock",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3165
            wait,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3166
            unlock,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3167
            self.invalidatedirstate,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3168
            _(b'working directory of %s') % self.origroot,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3169
        )
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4916
diff changeset
  3170
        self._wlockref = weakref.ref(l)
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4916
diff changeset
  3171
        return l
1531
2ba8bf7defda add localrepo.wlock for protecting the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1516
diff changeset
  3172
26488
df2dc5141721 localrepo: add a way to get the current lock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26475
diff changeset
  3173
    def _currentlock(self, lockref):
df2dc5141721 localrepo: add a way to get the current lock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26475
diff changeset
  3174
        """Returns the lock if it's held, or None if it's not."""
df2dc5141721 localrepo: add a way to get the current lock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26475
diff changeset
  3175
        if lockref is None:
df2dc5141721 localrepo: add a way to get the current lock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26475
diff changeset
  3176
            return None
df2dc5141721 localrepo: add a way to get the current lock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26475
diff changeset
  3177
        l = lockref()
df2dc5141721 localrepo: add a way to get the current lock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26475
diff changeset
  3178
        if l is None or not l.held:
df2dc5141721 localrepo: add a way to get the current lock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26475
diff changeset
  3179
            return None
df2dc5141721 localrepo: add a way to get the current lock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26475
diff changeset
  3180
        return l
df2dc5141721 localrepo: add a way to get the current lock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26475
diff changeset
  3181
26489
2a3fc0272e3f localrepo: add a way to get the current wlock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26488
diff changeset
  3182
    def currentwlock(self):
2a3fc0272e3f localrepo: add a way to get the current wlock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26488
diff changeset
  3183
        """Returns the wlock if it's held, or None if it's not."""
2a3fc0272e3f localrepo: add a way to get the current wlock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26488
diff changeset
  3184
        return self._currentlock(self._wlockref)
2a3fc0272e3f localrepo: add a way to get the current wlock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26488
diff changeset
  3185
50323
6901916458bd localrepo: add a `currentlock` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50316
diff changeset
  3186
    def currentlock(self):
6901916458bd localrepo: add a `currentlock` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50316
diff changeset
  3187
        """Returns the lock if it's held, or None if it's not."""
6901916458bd localrepo: add a `currentlock` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50316
diff changeset
  3188
        return self._currentlock(self._lockref)
6901916458bd localrepo: add a `currentlock` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50316
diff changeset
  3189
43712
f965b1027fb0 commit: drop unused "vdirs" argument from repo.checkcommitpatterns()
Martin von Zweigbergk <martinvonz@google.com>
parents: 43711
diff changeset
  3190
    def checkcommitpatterns(self, wctx, match, status, fail):
30332
318a24b52eeb spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents: 30272
diff changeset
  3191
        """check for commit arguments that aren't committable"""
28814
1f65f291a5b7 localrepo: drop force check from checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28813
diff changeset
  3192
        if match.isexact() or match.prefix():
28813
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  3193
            matched = set(status.modified + status.added + status.removed)
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  3194
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  3195
            for f in match.files():
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  3196
                f = self.dirstate.normalize(f)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3197
                if f == b'.' or f in matched or f in wctx.substate:
28813
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  3198
                    continue
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  3199
                if f in status.deleted:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3200
                    fail(f, _(b'file not found!'))
43711
7f443cce2972 commit: rewrite check for `hg ci <path>` being a directory
Martin von Zweigbergk <martinvonz@google.com>
parents: 43661
diff changeset
  3201
                # Is it a directory that exists or used to exist?
7f443cce2972 commit: rewrite check for `hg ci <path>` being a directory
Martin von Zweigbergk <martinvonz@google.com>
parents: 43661
diff changeset
  3202
                if self.wvfs.isdir(f) or wctx.p1().hasdir(f):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3203
                    d = f + b'/'
28813
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  3204
                    for mf in matched:
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  3205
                        if mf.startswith(d):
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  3206
                            break
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  3207
                    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3208
                        fail(f, _(b"no match under directory!"))
28813
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  3209
                elif f not in self.dirstate:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3210
                    fail(f, _(b"file not tracked!"))
28813
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  3211
18016
2a393df0f5cc clfilter: rename `unfilteredmeth` to `unfilteredmethod`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18014
diff changeset
  3212
    @unfilteredmethod
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3213
    def commit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3214
        self,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3215
        text=b"",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3216
        user=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3217
        date=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3218
        match=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3219
        force=False,
44023
3216cabffd4a commit: change default `editor` parameter to None
Matt Harbison <matt_harbison@yahoo.com>
parents: 44014
diff changeset
  3220
        editor=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3221
        extra=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3222
    ):
8515
865e08a7d6b0 localrepo: update commit*() docstrings
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8503
diff changeset
  3223
        """Add a new revision to current repository.
865e08a7d6b0 localrepo: update commit*() docstrings
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8503
diff changeset
  3224
8706
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8705
diff changeset
  3225
        Revision information is gathered from the working directory,
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8705
diff changeset
  3226
        match can be used to filter the committed files. If editor is
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8705
diff changeset
  3227
        supplied, it is called to get a commit message.
8515
865e08a7d6b0 localrepo: update commit*() docstrings
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8503
diff changeset
  3228
        """
26322
2cd19782d2d4 commit: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26321
diff changeset
  3229
        if extra is None:
2cd19782d2d4 commit: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26321
diff changeset
  3230
            extra = {}
8709
b9e0ddb04c5c commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents: 8707
diff changeset
  3231
8715
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
  3232
        def fail(f, msg):
45846
96ca817ec192 errors: raise InputError when given non-existent paths etc
Martin von Zweigbergk <martinvonz@google.com>
parents: 45785
diff changeset
  3233
            raise error.InputError(b'%s: %s' % (f, msg))
8715
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
  3234
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
  3235
        if not match:
41676
0531dff73d0b match: delete unused root and cwd arguments from {always,never,exact}() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41675
diff changeset
  3236
            match = matchmod.always()
8715
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
  3237
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
  3238
        if not force:
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
  3239
            match.bad = fail
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
  3240
41363
b87a009d1b3b localrepo: use context manager for locks in commit()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41362
diff changeset
  3241
        # lock() for recent changelog (see issue4368)
b87a009d1b3b localrepo: use context manager for locks in commit()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41362
diff changeset
  3242
        with self.wlock(), self.lock():
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
  3243
            wctx = self[None]
10970
3213e8947975 localrepo.commit: use explicit variables, avoid creating new contexts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10969
diff changeset
  3244
            merge = len(wctx.parents()) > 1
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
  3245
32312
0d6b3572ad92 match: remove ispartial()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32292
diff changeset
  3246
            if not force and merge and not match.always():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3247
                raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3248
                    _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3249
                        b'cannot partially commit a merge '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3250
                        b'(do not specify files or patterns)'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3251
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3252
                )
6706
716a1296e182 localrepo: replace dirstate by workingfilectx in filecommit()
Patrick Mezard <pmezard@gmail.com>
parents: 6705
diff changeset
  3253
22928
5e5d297ccbd0 localrepo: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22910
diff changeset
  3254
            status = self.status(match=match, clean=force)
8706
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8705
diff changeset
  3255
            if force:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3256
                status.modified.extend(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3257
                    status.clean
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3258
                )  # mq may commit clean files
3621
7d3d603e7df9 localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3620
diff changeset
  3259
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
  3260
            # check subrepos
36009
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35896
diff changeset
  3261
            subs, commitsubs, newstate = subrepoutil.precommit(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3262
                self.ui, wctx, status, match, force=force
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3263
            )
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
  3264
8709
b9e0ddb04c5c commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents: 8707
diff changeset
  3265
            # make sure all explicit patterns are matched
28813
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  3266
            if not force:
43712
f965b1027fb0 commit: drop unused "vdirs" argument from repo.checkcommitpatterns()
Martin von Zweigbergk <martinvonz@google.com>
parents: 43711
diff changeset
  3267
                self.checkcommitpatterns(wctx, match, status, fail)
8709
b9e0ddb04c5c commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents: 8707
diff changeset
  3268
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3269
            cctx = context.workingcommitctx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3270
                self, status, text, user, date, extra
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3271
            )
18659
b946470efed9 localrepo: create context used for actual commit earlier
David Schleimer <dschleimer@fb.com>
parents: 18644
diff changeset
  3272
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44852
diff changeset
  3273
            ms = mergestatemod.mergestate.read(self)
44409
f935b680860d commit: error out on unresolved files even if commit would be empty
Martin von Zweigbergk <martinvonz@google.com>
parents: 44382
diff changeset
  3274
            mergeutil.checkunresolved(ms)
f935b680860d commit: error out on unresolved files even if commit would be empty
Martin von Zweigbergk <martinvonz@google.com>
parents: 44382
diff changeset
  3275
25840
25897d778738 commit: mark internal-only option
Matt Mackall <mpm@selenic.com>
parents: 25839
diff changeset
  3276
            # internal config: ui.allowemptycommit
45088
3e40abe0a170 commit: factor out empty commit check to `basectx.isempty()`
Manuel Jacob <me@manueljacob.de>
parents: 45084
diff changeset
  3277
            if cctx.isempty() and not self.ui.configbool(
3e40abe0a170 commit: factor out empty commit check to `basectx.isempty()`
Manuel Jacob <me@manueljacob.de>
parents: 45084
diff changeset
  3278
                b'ui', b'allowemptycommit'
3e40abe0a170 commit: factor out empty commit check to `basectx.isempty()`
Manuel Jacob <me@manueljacob.de>
parents: 45084
diff changeset
  3279
            ):
44442
6306baa7d19a commit: print debug message when clearing dirstate and wdir clean
Martin von Zweigbergk <martinvonz@google.com>
parents: 44437
diff changeset
  3280
                self.ui.debug(b'nothing to commit, clearing merge state\n')
44437
6a34e438461b commit: clear resolved mergestate even if working copy is clean
Martin von Zweigbergk <martinvonz@google.com>
parents: 44409
diff changeset
  3281
                ms.reset()
8404
a2bc39ade36b commit: move 'nothing changed' test into commit()
Matt Mackall <mpm@selenic.com>
parents: 8403
diff changeset
  3282
                return None
a2bc39ade36b commit: move 'nothing changed' test into commit()
Matt Mackall <mpm@selenic.com>
parents: 8403
diff changeset
  3283
18660
7e6946ed5756 localrepo: use workingctx for validation in commit
David Schleimer <dschleimer@fb.com>
parents: 18659
diff changeset
  3284
            if merge and cctx.deleted():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3285
                raise error.Abort(_(b"cannot commit merge with missing files"))
16536
63c817ea4a70 commit: abort on merge with missing files
Patrick Mezard <patrick@mezard.eu>
parents: 16456
diff changeset
  3286
8496
a21605de1509 commit: move editor outside transaction
Matt Mackall <mpm@selenic.com>
parents: 8481
diff changeset
  3287
            if editor:
8994
4a1187d3cb00 commit: report modified subrepos in commit editor
Matt Mackall <mpm@selenic.com>
parents: 8954
diff changeset
  3288
                cctx._text = editor(self, cctx, subs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3289
            edited = text != cctx._text
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
  3290
20765
f042d4b263f4 localrepo: save manually edited commit message as soon as possible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20332
diff changeset
  3291
            # Save commit message in case this transaction gets rolled back
f042d4b263f4 localrepo: save manually edited commit message as soon as possible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20332
diff changeset
  3292
            # (e.g. by a pretxncommit hook).  Leave the content alone on
f042d4b263f4 localrepo: save manually edited commit message as soon as possible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20332
diff changeset
  3293
            # the assumption that the user will use the same editor again.
49148
db3f8e5cc965 commit: don't use hard-coded `.hg/last-message.txt` path in error message
Martin von Zweigbergk <martinvonz@google.com>
parents: 48793
diff changeset
  3294
            msg_path = self.savecommitmessage(cctx._text)
20765
f042d4b263f4 localrepo: save manually edited commit message as soon as possible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20332
diff changeset
  3295
16073
b254f827b7a6 subrepo: rewrite handling of subrepo state at commit (issue2403)
Matt Mackall <mpm@selenic.com>
parents: 16030
diff changeset
  3296
            # commit subs and write new state
b254f827b7a6 subrepo: rewrite handling of subrepo state at commit (issue2403)
Matt Mackall <mpm@selenic.com>
parents: 16030
diff changeset
  3297
            if subs:
41688
ec7bba81ebf4 commit: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41676
diff changeset
  3298
                uipathfn = scmutil.getuipathfn(self)
16073
b254f827b7a6 subrepo: rewrite handling of subrepo state at commit (issue2403)
Matt Mackall <mpm@selenic.com>
parents: 16030
diff changeset
  3299
                for s in sorted(commitsubs):
11112
4a9bee613737 subrepo: print paths relative to upper repo root for push/pull/commit
Edouard Gomez <ed.gomez@free.fr>
parents: 11063
diff changeset
  3300
                    sub = wctx.sub(s)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3301
                    self.ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3302
                        _(b'committing subrepository %s\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3303
                        % uipathfn(subrepoutil.subrelpath(sub))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3304
                    )
11112
4a9bee613737 subrepo: print paths relative to upper repo root for push/pull/commit
Edouard Gomez <ed.gomez@free.fr>
parents: 11063
diff changeset
  3305
                    sr = sub.commit(cctx._text, user, date)
16073
b254f827b7a6 subrepo: rewrite handling of subrepo state at commit (issue2403)
Matt Mackall <mpm@selenic.com>
parents: 16030
diff changeset
  3306
                    newstate[s] = (newstate[s][0], sr)
36009
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35896
diff changeset
  3307
                subrepoutil.writestate(self, newstate)
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
  3308
10970
3213e8947975 localrepo.commit: use explicit variables, avoid creating new contexts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10969
diff changeset
  3309
            p1, p2 = self.dirstate.parents()
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
  3310
            hookp1, hookp2 = hex(p1), (p2 != self.nullid and hex(p2) or b'')
9935
48b81d9bca8d commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents: 9934
diff changeset
  3311
            try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3312
                self.hook(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3313
                    b"precommit", throw=True, parent1=hookp1, parent2=hookp2
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3314
                )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3315
                with self.transaction(b'commit'):
41362
57c462db87fd localrepo: use context manager for transaction in commit()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41361
diff changeset
  3316
                    ret = self.commitctx(cctx, True)
57c462db87fd localrepo: use context manager for transaction in commit()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41361
diff changeset
  3317
                    # update bookmarks, dirstate and mergestate
57c462db87fd localrepo: use context manager for transaction in commit()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41361
diff changeset
  3318
                    bookmarks.update(self, [p1, p2], ret)
57c462db87fd localrepo: use context manager for transaction in commit()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41361
diff changeset
  3319
                    cctx.markcommitted(ret)
57c462db87fd localrepo: use context manager for transaction in commit()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41361
diff changeset
  3320
                    ms.reset()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3321
            except:  # re-raises
9935
48b81d9bca8d commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents: 9934
diff changeset
  3322
                if edited:
48b81d9bca8d commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents: 9934
diff changeset
  3323
                    self.ui.write(
49148
db3f8e5cc965 commit: don't use hard-coded `.hg/last-message.txt` path in error message
Martin von Zweigbergk <martinvonz@google.com>
parents: 48793
diff changeset
  3324
                        _(b'note: commit message saved in %s\n') % msg_path
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3325
                    )
44733
c6d31e659a28 commit: tell user what to do with .hg/last-message.txt
Martin von Zweigbergk <martinvonz@google.com>
parents: 44687
diff changeset
  3326
                    self.ui.write(
c6d31e659a28 commit: tell user what to do with .hg/last-message.txt
Martin von Zweigbergk <martinvonz@google.com>
parents: 44687
diff changeset
  3327
                        _(
c6d31e659a28 commit: tell user what to do with .hg/last-message.txt
Martin von Zweigbergk <martinvonz@google.com>
parents: 44687
diff changeset
  3328
                            b"note: use 'hg commit --logfile "
49148
db3f8e5cc965 commit: don't use hard-coded `.hg/last-message.txt` path in error message
Martin von Zweigbergk <martinvonz@google.com>
parents: 48793
diff changeset
  3329
                            b"%s --edit' to reuse it\n"
44733
c6d31e659a28 commit: tell user what to do with .hg/last-message.txt
Martin von Zweigbergk <martinvonz@google.com>
parents: 44687
diff changeset
  3330
                        )
49148
db3f8e5cc965 commit: don't use hard-coded `.hg/last-message.txt` path in error message
Martin von Zweigbergk <martinvonz@google.com>
parents: 48793
diff changeset
  3331
                        % msg_path
44733
c6d31e659a28 commit: tell user what to do with .hg/last-message.txt
Martin von Zweigbergk <martinvonz@google.com>
parents: 44687
diff changeset
  3332
                    )
9935
48b81d9bca8d commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents: 9934
diff changeset
  3333
                raise
6710
0aa91f69a4c4 localrepo: extract _commitctx() from commit()
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  3334
43778
888bd39ed555 lock: pass "success" boolean to _afterlock callbacks
Kyle Lippincott <spectral@google.com>
parents: 43765
diff changeset
  3335
        def commithook(unused_success):
23129
eb315418224c hook: protect commit hooks against stripping of temporary commit (issue4422)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23126
diff changeset
  3336
            # hack for command that use a temporary commit (eg: histedit)
eb315418224c hook: protect commit hooks against stripping of temporary commit (issue4422)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23126
diff changeset
  3337
            # temporary commit got stripped before hook release
24992
7df090c9c9fe localrepo: use changelog.hasnode instead of self.__contains__
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24956
diff changeset
  3338
            if self.changelog.hasnode(ret):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3339
                self.hook(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3340
                    b"commit", node=hex(ret), parent1=hookp1, parent2=hookp2
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3341
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3342
16680
d0e419b0f7de tag: run commit hook when lock is released (issue3344)
Mads Kiilerich <mads@kiilerich.com>
parents: 16679
diff changeset
  3343
        self._afterlock(commithook)
10492
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10435
diff changeset
  3344
        return ret
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10435
diff changeset
  3345
18016
2a393df0f5cc clfilter: rename `unfilteredmeth` to `unfilteredmethod`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18014
diff changeset
  3346
    @unfilteredmethod
42620
d98ec36be808 convert: add a config option to help doing identity hg->hg conversion
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42546
diff changeset
  3347
    def commitctx(self, ctx, error=False, origctx=None):
45203
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45202
diff changeset
  3348
        return commit.commitctx(self, ctx, error=error, origctx=origctx)
660
2c83350784c3 Move commit hook after commit completes
Matt Mackall <mpm@selenic.com>
parents: 659
diff changeset
  3349
18016
2a393df0f5cc clfilter: rename `unfilteredmeth` to `unfilteredmethod`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18014
diff changeset
  3350
    @unfilteredmethod
18310
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  3351
    def destroying(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  3352
        """Inform the repository that nodes are about to be destroyed.
18310
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  3353
        Intended for use by strip and rollback, so there's a common
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  3354
        place for anything that has to be done before destroying history.
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  3355
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  3356
        This is mostly useful for saving state that is in memory and waiting
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  3357
        to be flushed when the current lock is released. Because a call to
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  3358
        destroyed is imminent, the repo will be invalidated causing those
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  3359
        changes to stay in memory (waiting for the next unlock), or vanish
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  3360
        completely.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  3361
        """
18312
7331ee72f99c localrepo: write the phasecache when destroying nodes
Idan Kamara <idankk86@gmail.com>
parents: 18311
diff changeset
  3362
        # When using the same lock to commit and strip, the phasecache is left
7331ee72f99c localrepo: write the phasecache when destroying nodes
Idan Kamara <idankk86@gmail.com>
parents: 18311
diff changeset
  3363
        # dirty after committing. Then when we strip, the repo is invalidated,
7331ee72f99c localrepo: write the phasecache when destroying nodes
Idan Kamara <idankk86@gmail.com>
parents: 18311
diff changeset
  3364
        # causing those changes to disappear.
43421
be384a2052aa py3: don't use bytes with vars() or __dict__
Martin von Zweigbergk <martinvonz@google.com>
parents: 43414
diff changeset
  3365
        if '_phasecache' in vars(self):
18312
7331ee72f99c localrepo: write the phasecache when destroying nodes
Idan Kamara <idankk86@gmail.com>
parents: 18311
diff changeset
  3366
            self._phasecache.write()
7331ee72f99c localrepo: write the phasecache when destroying nodes
Idan Kamara <idankk86@gmail.com>
parents: 18311
diff changeset
  3367
18310
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  3368
    @unfilteredmethod
18395
904b7109938e destroyed: drop complex branchcache rebuilt logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18394
diff changeset
  3369
    def destroyed(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  3370
        """Inform the repository that nodes have been destroyed.
9150
09a1ee498756 localrepo: add destroyed() method for strip/rollback to use (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9149
diff changeset
  3371
        Intended for use by strip and rollback, so there's a common
17013
c8eda7bbdcab strip: incrementally update the branchheads cache after a strip
Joshua Redstone <joshua.redstone@fb.com>
parents: 17012
diff changeset
  3372
        place for anything that has to be done after destroying history.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  3373
        """
32264
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32263
diff changeset
  3374
        # refresh all repository caches
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32263
diff changeset
  3375
        self.updatecaches()
18223
6d6d0248530b destroyed: filter unknown before computing branchcache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18222
diff changeset
  3376
9151
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
  3377
        # Ensure the persistent tag cache is updated.  Doing it now
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
  3378
        # means that the tag cache only has to worry about destroyed
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
  3379
        # heads immediately after a strip/rollback.  That in turn
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
  3380
        # guarantees that "cachetip == currenttip" (comparing both rev
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
  3381
        # and node) always means no nodes have been added or destroyed.
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
  3382
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
  3383
        # XXX this is suboptimal when qrefresh'ing: we strip the current
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
  3384
        # head, refresh the tag cache, then immediately add a new head.
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
  3385
        # But I think doing it this way is necessary for the "instant
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
  3386
        # tag cache retrieval" case to work.
18313
3e4a944c0d04 destroyed: keep the filecache in sync with __dict__ (issue3335) (issue3693) (issue3743)
Idan Kamara <idankk86@gmail.com>
parents: 18312
diff changeset
  3387
        self.invalidate()
17324
9f94358f9f93 localrepo: clear the filecache on _rollback() and destroyed()
Idan Kamara <idankk86@gmail.com>
parents: 17306
diff changeset
  3388
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3389
    def status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3390
        self,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3391
        node1=b'.',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3392
        node2=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3393
        match=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3394
        ignored=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3395
        clean=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3396
        unknown=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3397
        listsubrepos=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3398
    ):
21596
83bbfb23cb24 localrepo: replace status method with a shim
Sean Farley <sean.michael.farley@gmail.com>
parents: 21591
diff changeset
  3399
        '''a convenience method that calls node1.status(node2)'''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3400
        return self[node1].status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3401
            node2, match, ignored, clean, unknown, listsubrepos
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3402
        )
2661
5c10b7ed3411 status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2621
diff changeset
  3403
32814
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3404
    def addpostdsstatus(self, ps):
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3405
        """Add a callback to run within the wlock, at the point at which status
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3406
        fixups happen.
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3407
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3408
        On status completion, callback(wctx, status) will be called with the
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3409
        wlock held, unless the dirstate has changed from underneath or the wlock
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3410
        couldn't be grabbed.
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3411
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3412
        Callbacks should not capture and use a cached copy of the dirstate --
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3413
        it might change in the meanwhile. Instead, they should access the
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3414
        dirstate via wctx.repo().dirstate.
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3415
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3416
        This list is emptied out after each status run -- extensions should
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3417
        make sure it adds to this list each time dirstate.status is called.
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3418
        Extensions should also make sure they don't call this for statuses
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3419
        that don't involve the dirstate.
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3420
        """
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3421
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3422
        # The list is located here for uniqueness reasons -- it is actually
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3423
        # managed by the workingctx, but that isn't unique per-repo.
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3424
        self._postdsstatus.append(ps)
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3425
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3426
    def postdsstatus(self):
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3427
        """Used by workingctx to get the list of post-dirstate-status hooks."""
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3428
        return self._postdsstatus
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3429
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3430
    def clearpostdsstatus(self):
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3431
        """Used by workingctx to clear post-dirstate-status hooks."""
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3432
        del self._postdsstatus[:]
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  3433
8796
2bcef677a6c3 localrepo: remove 'closed' argument to heads(...) function
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 8731
diff changeset
  3434
    def heads(self, start=None):
30875
1791be8a95c5 localrepo: avoid unnecessary conversion from node to rev
Stanislau Hlebik <stash@fb.com>
parents: 30818
diff changeset
  3435
        if start is None:
30905
6037caa6a2f3 localrepo: cache self.changelog in local variable
Stanislau Hlebik <stash@fb.com>
parents: 30875
diff changeset
  3436
            cl = self.changelog
30906
72f25e17af9d localrepo: avoid unnecessary sorting
Stanislau Hlebik <stash@fb.com>
parents: 30905
diff changeset
  3437
            headrevs = reversed(cl.headrevs())
30905
6037caa6a2f3 localrepo: cache self.changelog in local variable
Stanislau Hlebik <stash@fb.com>
parents: 30875
diff changeset
  3438
            return [cl.node(rev) for rev in headrevs]
30875
1791be8a95c5 localrepo: avoid unnecessary conversion from node to rev
Stanislau Hlebik <stash@fb.com>
parents: 30818
diff changeset
  3439
1550
ccb9b62de892 add a -r/--rev option to heads to show only heads descendant from rev
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1532
diff changeset
  3440
        heads = self.changelog.heads(start)
ccb9b62de892 add a -r/--rev option to heads to show only heads descendant from rev
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1532
diff changeset
  3441
        # sort the output in rev descending order
13075
d73c3034deee coding style: fix gratuitous whitespace after Python keywords
Thomas Arendsen Hein <thomas@jtah.de>
parents: 13047
diff changeset
  3442
        return sorted(heads, key=self.changelog.rev, reverse=True)
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
  3443
8694
ca8d05e1f1d1 localrepo: set heads and branchheads to be closed=False by default
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 8680
diff changeset
  3444
    def branchheads(self, branch=None, start=None, closed=False):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  3445
        """return a (possibly filtered) list of heads for the given branch
9475
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
  3446
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
  3447
        Heads are returned in topological order, from newest to oldest.
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
  3448
        If branch is None, use the dirstate branch.
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
  3449
        If start is not None, return only heads reachable from start.
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
  3450
        If closed is True, return heads that are marked as closed as well.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  3451
        """
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
  3452
        if branch is None:
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
  3453
            branch = self[None].branch()
9675
ee913987e4b0 localrepo/branchcache: remove lbranchmap(), convert users to use utf-8 names
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9674
diff changeset
  3454
        branches = self.branchmap()
42004
0bd730fbcc2b branchcache: introduce hasbranch()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42001
diff changeset
  3455
        if not branches.hasbranch(branch):
4648
8e503fa54d2d Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents: 4635
diff changeset
  3456
            return []
7654
816b708f23af store all heads of a branch in the branch cache
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7644
diff changeset
  3457
        # the cache returns heads ordered lowest to highest
20189
1831993d0902 localrepo: refactor repo.branchheads() to use repo.branchmap().branchheads()
Brodie Rao <brodie@sf.io>
parents: 20187
diff changeset
  3458
        bheads = list(reversed(branches.branchheads(branch, closed=closed)))
4648
8e503fa54d2d Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents: 4635
diff changeset
  3459
        if start is not None:
7654
816b708f23af store all heads of a branch in the branch cache
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7644
diff changeset
  3460
            # filter out the heads that cannot be reached from startrev
9475
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
  3461
            fbheads = set(self.changelog.nodesbetween([start], bheads)[2])
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
  3462
            bheads = [h for h in bheads if h in fbheads]
7654
816b708f23af store all heads of a branch in the branch cache
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7644
diff changeset
  3463
        return bheads
4648
8e503fa54d2d Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents: 4635
diff changeset
  3464
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3465
    def branches(self, nodes):
1615
83238c1db6de Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1597
diff changeset
  3466
        if not nodes:
83238c1db6de Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1597
diff changeset
  3467
            nodes = [self.changelog.tip()]
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3468
        b = []
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3469
        for n in nodes:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3470
            t = n
14494
1ffeeb91c55d check-code: flag 0/1 used as constant Boolean expression
Martin Geisler <mg@lazybytes.net>
parents: 14482
diff changeset
  3471
            while True:
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3472
                p = self.changelog.parents(n)
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
  3473
                if p[1] != self.nullid or p[0] == self.nullid:
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3474
                    b.append((t, n, p[0], p[1]))
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3475
                    break
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3476
                n = p[0]
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3477
        return b
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3478
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3479
    def between(self, pairs):
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3480
        r = []
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3481
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3482
        for top, bottom in pairs:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3483
            n, l, i = top, [], 0
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3484
            f = 1
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3485
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
  3486
            while n != bottom and n != self.nullid:
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3487
                p = self.changelog.parents(n)[0]
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3488
                if i == f:
575
7f5ce4bbdd7b More whitespace cleanups
mpm@selenic.com
parents: 566
diff changeset
  3489
                    l.append(n)
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3490
                    f = f * 2
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3491
                n = p
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3492
                i += 1
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3493
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3494
            r.append(l)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3495
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3496
        return r
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  3497
20924
e10000369b47 push: pass a `pushoperation` object to localrepo.checkpush
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20884
diff changeset
  3498
    def checkpush(self, pushop):
13327
dc11e30b48a3 mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents: 13272
diff changeset
  3499
        """Extensions can override this function if additional checks have
dc11e30b48a3 mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents: 13272
diff changeset
  3500
        to be performed before pushing, or call it if they override push
dc11e30b48a3 mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents: 13272
diff changeset
  3501
        command.
dc11e30b48a3 mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents: 13272
diff changeset
  3502
        """
dc11e30b48a3 mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents: 13272
diff changeset
  3503
21043
6c383c871fdb localrepo: introduce "prepushoutgoinghooks" to extend outgoing check easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20987
diff changeset
  3504
    @unfilteredpropertycache
6c383c871fdb localrepo: introduce "prepushoutgoinghooks" to extend outgoing check easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20987
diff changeset
  3505
    def prepushoutgoinghooks(self):
28876
79b8f052ee51 localrepo: refactor prepushoutgoinghook to take a pushop
Mads Kiilerich <madski@unity3d.com>
parents: 28814
diff changeset
  3506
        """Return util.hooks consists of a pushop with repo, remote, outgoing
79b8f052ee51 localrepo: refactor prepushoutgoinghook to take a pushop
Mads Kiilerich <madski@unity3d.com>
parents: 28814
diff changeset
  3507
        methods, which are called before pushing changesets.
21043
6c383c871fdb localrepo: introduce "prepushoutgoinghooks" to extend outgoing check easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20987
diff changeset
  3508
        """
6c383c871fdb localrepo: introduce "prepushoutgoinghooks" to extend outgoing check easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20987
diff changeset
  3509
        return util.hooks()
6c383c871fdb localrepo: introduce "prepushoutgoinghooks" to extend outgoing check easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20987
diff changeset
  3510
11368
b9eb005c54ad pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents: 11303
diff changeset
  3511
    def pushkey(self, namespace, key, old, new):
23416
53a65929ef1f pushkey: gracefully handle prepushkey hook failure (issue4455)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23129
diff changeset
  3512
        try:
24824
0325c0da05df pushkey: use hook arguments from transaction when one exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24821
diff changeset
  3513
            tr = self.currenttransaction()
0325c0da05df pushkey: use hook arguments from transaction when one exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24821
diff changeset
  3514
            hookargs = {}
0325c0da05df pushkey: use hook arguments from transaction when one exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24821
diff changeset
  3515
            if tr is not None:
0325c0da05df pushkey: use hook arguments from transaction when one exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24821
diff changeset
  3516
                hookargs.update(tr.hookargs)
36400
7b86aa31b004 py3: fix handling of keyword arguments at more places
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36373
diff changeset
  3517
            hookargs = pycompat.strkwargs(hookargs)
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43421
diff changeset
  3518
            hookargs['namespace'] = namespace
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43421
diff changeset
  3519
            hookargs['key'] = key
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43421
diff changeset
  3520
            hookargs['old'] = old
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43421
diff changeset
  3521
            hookargs['new'] = new
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3522
            self.hook(b'prepushkey', throw=True, **hookargs)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25629
diff changeset
  3523
        except error.HookAbort as exc:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3524
            self.ui.write_err(_(b"pushkey-abort: %s\n") % exc)
23416
53a65929ef1f pushkey: gracefully handle prepushkey hook failure (issue4455)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23129
diff changeset
  3525
            if exc.hint:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3526
                self.ui.write_err(_(b"(%s)\n") % exc.hint)
23416
53a65929ef1f pushkey: gracefully handle prepushkey hook failure (issue4455)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23129
diff changeset
  3527
            return False
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3528
        self.ui.debug(b'pushing key for "%s:%s"\n' % (namespace, key))
14102
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
  3529
        ret = pushkey.push(self, namespace, key, old, new)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3530
43778
888bd39ed555 lock: pass "success" boolean to _afterlock callbacks
Kyle Lippincott <spectral@google.com>
parents: 43765
diff changeset
  3531
        def runhook(unused_success):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3532
            self.hook(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3533
                b'pushkey',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3534
                namespace=namespace,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3535
                key=key,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3536
                old=old,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3537
                new=new,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3538
                ret=ret,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3539
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3540
23648
915ac9403e13 pushkey: run hook after the lock release
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23630
diff changeset
  3541
        self._afterlock(runhook)
14102
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
  3542
        return ret
11368
b9eb005c54ad pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents: 11303
diff changeset
  3543
b9eb005c54ad pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents: 11303
diff changeset
  3544
    def listkeys(self, namespace):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3545
        self.hook(b'prelistkeys', throw=True, namespace=namespace)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3546
        self.ui.debug(b'listing keys for "%s"\n' % namespace)
14102
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
  3547
        values = pushkey.list(self, namespace)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3548
        self.hook(b'listkeys', namespace=namespace, values=values)
14102
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
  3549
        return values
11368
b9eb005c54ad pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents: 11303
diff changeset
  3550
14048
58e58406ed19 wireproto: add test for new optional arg missing on server
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14036
diff changeset
  3551
    def debugwireargs(self, one, two, three=None, four=None, five=None):
13720
9c4e04fe267e debug: add debugwireargs to test argument passing over the wire
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13716
diff changeset
  3552
        '''used to test argument passing over the wire'''
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3553
        return b"%s %s %s %s %s" % (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3554
            one,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3555
            two,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3556
            pycompat.bytestr(three),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3557
            pycompat.bytestr(four),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3558
            pycompat.bytestr(five),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3559
        )
11368
b9eb005c54ad pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents: 11303
diff changeset
  3560
14529
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
  3561
    def savecommitmessage(self, text):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3562
        fp = self.vfs(b'last-message.txt', b'wb')
14529
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
  3563
        try:
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
  3564
            fp.write(text)
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
  3565
        finally:
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
  3566
            fp.close()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3567
        return self.pathto(fp.name[len(self.root) + 1 :])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3568
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
  3569
    def register_wanted_sidedata(self, category):
47260
ccdd280d1d0d sidedata: use the "feature" to detect that sidedata are enabled
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47238
diff changeset
  3570
        if repository.REPO_FEATURE_SIDE_DATA not in self.features:
47075
5554aacd783f sidedata: gate sidedata functionality to revlogv2 in more places
Raphaël Gomès <rgomes@octobus.net>
parents: 47073
diff changeset
  3571
            # Only revlogv2 repos can want sidedata.
5554aacd783f sidedata: gate sidedata functionality to revlogv2 in more places
Raphaël Gomès <rgomes@octobus.net>
parents: 47073
diff changeset
  3572
            return
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
  3573
        self._wanted_sidedata.add(pycompat.bytestr(category))
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
  3574
47083
81eb7091c494 sidedata: add a way of replacing an existing sidedata computer
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
  3575
    def register_sidedata_computer(
81eb7091c494 sidedata: add a way of replacing an existing sidedata computer
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
  3576
        self, kind, category, keys, computer, flags, replace=False
81eb7091c494 sidedata: add a way of replacing an existing sidedata computer
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
  3577
    ):
47073
64cd1496bb70 revlog: replace the old `revlog_kind` approach with the new `target` one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47042
diff changeset
  3578
        if kind not in revlogconst.ALL_KINDS:
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
  3579
            msg = _(b"unexpected revlog kind '%s'.")
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
  3580
            raise error.ProgrammingError(msg % kind)
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
  3581
        category = pycompat.bytestr(category)
47083
81eb7091c494 sidedata: add a way of replacing an existing sidedata computer
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
  3582
        already_registered = category in self._sidedata_computers.get(kind, [])
81eb7091c494 sidedata: add a way of replacing an existing sidedata computer
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
  3583
        if already_registered and not replace:
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
  3584
            msg = _(
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
  3585
                b"cannot register a sidedata computer twice for category '%s'."
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
  3586
            )
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
  3587
            raise error.ProgrammingError(msg % category)
47083
81eb7091c494 sidedata: add a way of replacing an existing sidedata computer
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
  3588
        if replace and not already_registered:
81eb7091c494 sidedata: add a way of replacing an existing sidedata computer
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
  3589
            msg = _(
81eb7091c494 sidedata: add a way of replacing an existing sidedata computer
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
  3590
                b"cannot replace a sidedata computer that isn't registered "
81eb7091c494 sidedata: add a way of replacing an existing sidedata computer
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
  3591
                b"for category '%s'."
81eb7091c494 sidedata: add a way of replacing an existing sidedata computer
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
  3592
            )
81eb7091c494 sidedata: add a way of replacing an existing sidedata computer
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
  3593
            raise error.ProgrammingError(msg % category)
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
  3594
        self._sidedata_computers.setdefault(kind, {})
47078
223b47235d1c sidedata: enable sidedata computers to optionally rewrite flags
Raphaël Gomès <rgomes@octobus.net>
parents: 47075
diff changeset
  3595
        self._sidedata_computers[kind][category] = (keys, computer, flags)
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
  3596
14529
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
  3597
49571
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  3598
def undoname(fn: bytes) -> bytes:
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  3599
    base, name = os.path.split(fn)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3600
    assert name.startswith(b'journal')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3601
    return os.path.join(base, name.replace(b'journal', b'undo', 1))
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  3602
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3603
49571
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  3604
def instance(ui, path: bytes, create, intents=None, createopts=None):
49192
2ab79873786e auto-upgrade: introduce a way to auto-upgrade to/from share-safe
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49164
diff changeset
  3605
    # prevent cyclic import localrepo -> upgrade -> localrepo
2ab79873786e auto-upgrade: introduce a way to auto-upgrade to/from share-safe
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49164
diff changeset
  3606
    from . import upgrade
2ab79873786e auto-upgrade: introduce a way to auto-upgrade to/from share-safe
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49164
diff changeset
  3607
46907
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46902
diff changeset
  3608
    localpath = urlutil.urllocalpath(path)
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3609
    if create:
39591
76b58f240821 localrepo: use urllocalpath() for path to create repo too
Martin von Zweigbergk <martinvonz@google.com>
parents: 39590
diff changeset
  3610
        createrepository(ui, localpath, createopts=createopts)
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3611
49192
2ab79873786e auto-upgrade: introduce a way to auto-upgrade to/from share-safe
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49164
diff changeset
  3612
    def repo_maker():
2ab79873786e auto-upgrade: introduce a way to auto-upgrade to/from share-safe
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49164
diff changeset
  3613
        return makelocalrepository(ui, localpath, intents=intents)
2ab79873786e auto-upgrade: introduce a way to auto-upgrade to/from share-safe
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49164
diff changeset
  3614
2ab79873786e auto-upgrade: introduce a way to auto-upgrade to/from share-safe
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49164
diff changeset
  3615
    repo = repo_maker()
2ab79873786e auto-upgrade: introduce a way to auto-upgrade to/from share-safe
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49164
diff changeset
  3616
    repo = upgrade.may_auto_upgrade(repo, repo_maker)
2ab79873786e auto-upgrade: introduce a way to auto-upgrade to/from share-safe
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49164
diff changeset
  3617
    return repo
3223
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3164
diff changeset
  3618
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3619
49571
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  3620
def islocal(path: bytes) -> bool:
2740
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
  3621
    return True
28164
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  3622
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3623
39996
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3624
def defaultcreateopts(ui, createopts=None):
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3625
    """Populate the default creation options for a repository.
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3626
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3627
    A dictionary of explicitly requested creation options can be passed
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3628
    in. Missing keys will be populated.
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3629
    """
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3630
    createopts = dict(createopts or {})
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3631
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3632
    if b'backend' not in createopts:
39996
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3633
        # experimental config: storage.new-repo-backend
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3634
        createopts[b'backend'] = ui.config(b'storage', b'new-repo-backend')
39996
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3635
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3636
    return createopts
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3637
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3638
47441
e33c6dd346e7 localrepo: introduce a clone_requirements function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47440
diff changeset
  3639
def clone_requirements(ui, createopts, srcrepo):
e33c6dd346e7 localrepo: introduce a clone_requirements function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47440
diff changeset
  3640
    """clone the requirements of a local repo for a local clone
e33c6dd346e7 localrepo: introduce a clone_requirements function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47440
diff changeset
  3641
e33c6dd346e7 localrepo: introduce a clone_requirements function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47440
diff changeset
  3642
    The store requirements are unchanged while the working copy requirements
e33c6dd346e7 localrepo: introduce a clone_requirements function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47440
diff changeset
  3643
    depends on the configuration
e33c6dd346e7 localrepo: introduce a clone_requirements function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47440
diff changeset
  3644
    """
e33c6dd346e7 localrepo: introduce a clone_requirements function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47440
diff changeset
  3645
    target_requirements = set()
48667
fc80752dbb24 legacy-revlog: fix requirement computation when cloning legacy repo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48666
diff changeset
  3646
    if not srcrepo.requirements:
fc80752dbb24 legacy-revlog: fix requirement computation when cloning legacy repo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48666
diff changeset
  3647
        # this is a legacy revlog "v0" repository, we cannot do anything fancy
fc80752dbb24 legacy-revlog: fix requirement computation when cloning legacy repo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48666
diff changeset
  3648
        # with it.
fc80752dbb24 legacy-revlog: fix requirement computation when cloning legacy repo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48666
diff changeset
  3649
        return target_requirements
47441
e33c6dd346e7 localrepo: introduce a clone_requirements function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47440
diff changeset
  3650
    createopts = defaultcreateopts(ui, createopts=createopts)
e33c6dd346e7 localrepo: introduce a clone_requirements function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47440
diff changeset
  3651
    for r in newreporequirements(ui, createopts):
e33c6dd346e7 localrepo: introduce a clone_requirements function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47440
diff changeset
  3652
        if r in requirementsmod.WORKING_DIR_REQUIREMENTS:
e33c6dd346e7 localrepo: introduce a clone_requirements function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47440
diff changeset
  3653
            target_requirements.add(r)
e33c6dd346e7 localrepo: introduce a clone_requirements function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47440
diff changeset
  3654
e33c6dd346e7 localrepo: introduce a clone_requirements function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47440
diff changeset
  3655
    for r in srcrepo.requirements:
e33c6dd346e7 localrepo: introduce a clone_requirements function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47440
diff changeset
  3656
        if r not in requirementsmod.WORKING_DIR_REQUIREMENTS:
e33c6dd346e7 localrepo: introduce a clone_requirements function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47440
diff changeset
  3657
            target_requirements.add(r)
e33c6dd346e7 localrepo: introduce a clone_requirements function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47440
diff changeset
  3658
    return target_requirements
e33c6dd346e7 localrepo: introduce a clone_requirements function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47440
diff changeset
  3659
e33c6dd346e7 localrepo: introduce a clone_requirements function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47440
diff changeset
  3660
39996
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3661
def newreporequirements(ui, createopts):
28164
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  3662
    """Determine the set of requirements for a new local repository.
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  3663
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  3664
    Extensions can wrap this function to specify custom requirements for
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  3665
    new repositories.
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  3666
    """
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3667
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3668
    if b'backend' not in createopts:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3669
        raise error.ProgrammingError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3670
            b'backend key not present in createopts; '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3671
            b'was defaultcreateopts() called?'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3672
        )
39996
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3673
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3674
    if createopts[b'backend'] != b'revlogv1':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3675
        raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3676
            _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3677
                b'unable to determine repository requirements for '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3678
                b'storage backend: %s'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3679
            )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3680
            % createopts[b'backend']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3681
        )
39996
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3682
46626
ee91966aec0f requirements: add constant for revlog v1 requirement
Raphaël Gomès <rgomes@octobus.net>
parents: 46607
diff changeset
  3683
    requirements = {requirementsmod.REVLOGV1_REQUIREMENT}
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3684
    if ui.configbool(b'format', b'usestore'):
46637
ab58098bebed requirements: also add a store constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46636
diff changeset
  3685
        requirements.add(requirementsmod.STORE_REQUIREMENT)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3686
        if ui.configbool(b'format', b'usefncache'):
46638
b4c2a2af25e2 requirements: also add a fncache constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46637
diff changeset
  3687
            requirements.add(requirementsmod.FNCACHE_REQUIREMENT)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3688
            if ui.configbool(b'format', b'dotencode'):
46636
c3773636ddbb requirements: also add a dotencode constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46627
diff changeset
  3689
                requirements.add(requirementsmod.DOTENCODE_REQUIREMENT)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3690
44382
f0027a3dd7cb revlog-compression: update the config to be a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44363
diff changeset
  3691
    compengines = ui.configlist(b'format', b'revlog-compression')
f0027a3dd7cb revlog-compression: update the config to be a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44363
diff changeset
  3692
    for compengine in compengines:
f0027a3dd7cb revlog-compression: update the config to be a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44363
diff changeset
  3693
        if compengine in util.compengines:
46851
3aa78f2aea48 revlog-compression: fix computation of engine availability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46819
diff changeset
  3694
            engine = util.compengines[compengine]
3aa78f2aea48 revlog-compression: fix computation of engine availability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46819
diff changeset
  3695
            if engine.available() and engine.revlogheader():
3aa78f2aea48 revlog-compression: fix computation of engine availability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46819
diff changeset
  3696
                break
44382
f0027a3dd7cb revlog-compression: update the config to be a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44363
diff changeset
  3697
    else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3698
        raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3699
            _(
44382
f0027a3dd7cb revlog-compression: update the config to be a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44363
diff changeset
  3700
                b'compression engines %s defined by '
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3701
                b'format.revlog-compression not available'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3702
            )
44382
f0027a3dd7cb revlog-compression: update the config to be a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44363
diff changeset
  3703
            % b', '.join(b'"%s"' % e for e in compengines),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3704
            hint=_(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3705
                b'run "hg debuginstall" to list available '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3706
                b'compression engines'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3707
            ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3708
        )
30818
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30634
diff changeset
  3709
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30634
diff changeset
  3710
    # zlib is the historical default and doesn't need an explicit requirement.
44382
f0027a3dd7cb revlog-compression: update the config to be a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44363
diff changeset
  3711
    if compengine == b'zstd':
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3712
        requirements.add(b'revlog-compression-zstd')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3713
    elif compengine != b'zlib':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3714
        requirements.add(b'exp-compression-%s' % compengine)
30818
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30634
diff changeset
  3715
28164
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  3716
    if scmutil.gdinitconfig(ui):
46627
f4c325bf80fc requirements: also add a generaldelta constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46626
diff changeset
  3717
        requirements.add(requirementsmod.GENERALDELTA_REQUIREMENT)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3718
        if ui.configbool(b'format', b'sparse-revlog'):
45373
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
  3719
            requirements.add(requirementsmod.SPARSEREVLOG_REQUIREMENT)
43030
827cb4fe62a3 sidedata: introduce a new requirement to protect the feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43026
diff changeset
  3720
48674
f7086f6173f8 dirstate-v2: rename the configuration to enable the format
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48295
diff changeset
  3721
    # experimental config: format.use-dirstate-v2
47279
40b51c28b242 dirstate-v2: Update the expected output of some tests for new requirement
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
  3722
    # Keep this logic in sync with `has_dirstate_v2()` in `tests/hghave.py`
48674
f7086f6173f8 dirstate-v2: rename the configuration to enable the format
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48295
diff changeset
  3723
    if ui.configbool(b'format', b'use-dirstate-v2'):
48223
b4f83c9e7905 dirstate-v2: Add support when Rust is not enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48040
diff changeset
  3724
        requirements.add(requirementsmod.DIRSTATE_V2_REQUIREMENT)
47277
ed0d54b20c5b dirstate-v2: Add a new experimental `exp-dirstate-v2` repository requirement
Simon Sapin <simon.sapin@octobus.net>
parents: 47265
diff changeset
  3725
43137
81efc4a295e7 sidedatacopies: add a new requirement for storing copies into sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
  3726
    # experimental config: format.exp-use-copies-side-data-changeset
81efc4a295e7 sidedatacopies: add a new requirement for storing copies into sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
  3727
    if ui.configbool(b'format', b'exp-use-copies-side-data-changeset'):
47265
a07381751dc9 changelogv2: `copies-side-data` now implies `changelogv2`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47263
diff changeset
  3728
        requirements.add(requirementsmod.CHANGELOGV2_REQUIREMENT)
45373
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
  3729
        requirements.add(requirementsmod.COPIESSDC_REQUIREMENT)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3730
    if ui.configbool(b'experimental', b'treemanifest'):
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
  3731
        requirements.add(requirementsmod.TREEMANIFEST_REQUIREMENT)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3732
47263
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47260
diff changeset
  3733
    changelogv2 = ui.config(b'format', b'exp-use-changelog-v2')
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47260
diff changeset
  3734
    if changelogv2 == b'enable-unstable-format-and-corrupt-my-data':
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47260
diff changeset
  3735
        requirements.add(requirementsmod.CHANGELOGV2_REQUIREMENT)
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47260
diff changeset
  3736
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3737
    revlogv2 = ui.config(b'experimental', b'revlogv2')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3738
    if revlogv2 == b'enable-unstable-format-and-corrupt-my-data':
46705
fd55a9eb1507 revlogv2: allow upgrading to v2
Raphaël Gomès <rgomes@octobus.net>
parents: 46675
diff changeset
  3739
        requirements.discard(requirementsmod.REVLOGV1_REQUIREMENT)
45373
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
  3740
        requirements.add(requirementsmod.REVLOGV2_REQUIREMENT)
39298
7a9f15ed3b96 phases: add a repository requirement about internal phase
Boris Feld <boris.feld@octobus.net>
parents: 39111
diff changeset
  3741
    # experimental config: format.internal-phase
49452
74fb1842f8b9 phase: rename the requirement for internal-phase (BC)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49451
diff changeset
  3742
    if ui.configbool(b'format', b'use-internal-phase'):
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
  3743
        requirements.add(requirementsmod.INTERNAL_PHASE_REQUIREMENT)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3744
49451
0c70d888a484 phase: introduce a dedicated requirement for the `archived` phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49355
diff changeset
  3745
    # experimental config: format.exp-archived-phase
0c70d888a484 phase: introduce a dedicated requirement for the `archived` phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49355
diff changeset
  3746
    if ui.configbool(b'format', b'exp-archived-phase'):
0c70d888a484 phase: introduce a dedicated requirement for the `archived` phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49355
diff changeset
  3747
        requirements.add(requirementsmod.ARCHIVED_PHASE_REQUIREMENT)
0c70d888a484 phase: introduce a dedicated requirement for the `archived` phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49355
diff changeset
  3748
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3749
    if createopts.get(b'narrowfiles'):
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
  3750
        requirements.add(requirementsmod.NARROW_REQUIREMENT)
39551
261f1e8dc300 localrepo: add requirement when narrow files creation option present
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
  3751
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3752
    if createopts.get(b'lfs'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3753
        requirements.add(b'lfs')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3754
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3755
    if ui.configbool(b'format', b'bookmarks-in-store'):
48599
dfbfa802876b requirements: move "bookmark in store" requirements in the right module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48466
diff changeset
  3756
        requirements.add(requirementsmod.BOOKMARKS_IN_STORE_REQUIREMENT)
42325
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42300
diff changeset
  3757
50759
f0ae403bf704 configitems: use standard "dynamicdefault" approach in edge case
Raphaël Gomès <rgomes@octobus.net>
parents: 50699
diff changeset
  3758
    # The feature is disabled unless a fast implementation is available.
f0ae403bf704 configitems: use standard "dynamicdefault" approach in edge case
Raphaël Gomès <rgomes@octobus.net>
parents: 50699
diff changeset
  3759
    persistent_nodemap_default = policy.importrust('revlog') is not None
f0ae403bf704 configitems: use standard "dynamicdefault" approach in edge case
Raphaël Gomès <rgomes@octobus.net>
parents: 50699
diff changeset
  3760
    if ui.configbool(
f0ae403bf704 configitems: use standard "dynamicdefault" approach in edge case
Raphaël Gomès <rgomes@octobus.net>
parents: 50699
diff changeset
  3761
        b'format', b'use-persistent-nodemap', persistent_nodemap_default
f0ae403bf704 configitems: use standard "dynamicdefault" approach in edge case
Raphaël Gomès <rgomes@octobus.net>
parents: 50699
diff changeset
  3762
    ):
45373
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
  3763
        requirements.add(requirementsmod.NODEMAP_REQUIREMENT)
44791
b81486b609a3 nodemap: gate the feature behind a new requirement
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44788
diff changeset
  3764
45483
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
  3765
    # if share-safe is enabled, let's create the new repository with the new
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
  3766
    # requirement
46334
4b0192f592cf share: move share safe functionality out of experimental
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46333
diff changeset
  3767
    if ui.configbool(b'format', b'use-share-safe'):
45483
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
  3768
        requirements.add(requirementsmod.SHARESAFE_REQUIREMENT)
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
  3769
48466
bf2738e03e96 share: make it possible to control the working copy format variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48465
diff changeset
  3770
    # if we are creating a share-repo¹  we have to handle requirement
bf2738e03e96 share: make it possible to control the working copy format variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48465
diff changeset
  3771
    # differently.
bf2738e03e96 share: make it possible to control the working copy format variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48465
diff changeset
  3772
    #
bf2738e03e96 share: make it possible to control the working copy format variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48465
diff changeset
  3773
    # [1] (i.e. reusing the store from another repository, just having a
bf2738e03e96 share: make it possible to control the working copy format variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48465
diff changeset
  3774
    # working copy)
48465
7964a2dbde12 share: move the requirement initialisation code around
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48295
diff changeset
  3775
    if b'sharedrepo' in createopts:
48466
bf2738e03e96 share: make it possible to control the working copy format variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48465
diff changeset
  3776
        source_requirements = set(createopts[b'sharedrepo'].requirements)
bf2738e03e96 share: make it possible to control the working copy format variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48465
diff changeset
  3777
bf2738e03e96 share: make it possible to control the working copy format variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48465
diff changeset
  3778
        if requirementsmod.SHARESAFE_REQUIREMENT not in source_requirements:
bf2738e03e96 share: make it possible to control the working copy format variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48465
diff changeset
  3779
            # share to an old school repository, we have to copy the
bf2738e03e96 share: make it possible to control the working copy format variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48465
diff changeset
  3780
            # requirements and hope for the best.
bf2738e03e96 share: make it possible to control the working copy format variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48465
diff changeset
  3781
            requirements = source_requirements
bf2738e03e96 share: make it possible to control the working copy format variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48465
diff changeset
  3782
        else:
bf2738e03e96 share: make it possible to control the working copy format variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48465
diff changeset
  3783
            # We have control on the working copy only, so "copy" the non
bf2738e03e96 share: make it possible to control the working copy format variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48465
diff changeset
  3784
            # working copy part over, ignoring previous logic.
bf2738e03e96 share: make it possible to control the working copy format variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48465
diff changeset
  3785
            to_drop = set()
bf2738e03e96 share: make it possible to control the working copy format variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48465
diff changeset
  3786
            for req in requirements:
bf2738e03e96 share: make it possible to control the working copy format variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48465
diff changeset
  3787
                if req in requirementsmod.WORKING_DIR_REQUIREMENTS:
bf2738e03e96 share: make it possible to control the working copy format variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48465
diff changeset
  3788
                    continue
bf2738e03e96 share: make it possible to control the working copy format variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48465
diff changeset
  3789
                if req in source_requirements:
bf2738e03e96 share: make it possible to control the working copy format variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48465
diff changeset
  3790
                    continue
bf2738e03e96 share: make it possible to control the working copy format variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48465
diff changeset
  3791
                to_drop.add(req)
bf2738e03e96 share: make it possible to control the working copy format variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48465
diff changeset
  3792
            requirements -= to_drop
bf2738e03e96 share: make it possible to control the working copy format variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48465
diff changeset
  3793
            requirements |= source_requirements
bf2738e03e96 share: make it possible to control the working copy format variant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48465
diff changeset
  3794
48465
7964a2dbde12 share: move the requirement initialisation code around
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48295
diff changeset
  3795
        if createopts.get(b'sharedrelative'):
7964a2dbde12 share: move the requirement initialisation code around
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48295
diff changeset
  3796
            requirements.add(requirementsmod.RELATIVE_SHARED_REQUIREMENT)
7964a2dbde12 share: move the requirement initialisation code around
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48295
diff changeset
  3797
        else:
7964a2dbde12 share: move the requirement initialisation code around
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48295
diff changeset
  3798
            requirements.add(requirementsmod.SHARED_REQUIREMENT)
7964a2dbde12 share: move the requirement initialisation code around
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48295
diff changeset
  3799
48793
6e559391f96e tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48792
diff changeset
  3800
    if ui.configbool(b'format', b'use-dirstate-tracked-hint'):
6e559391f96e tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48792
diff changeset
  3801
        version = ui.configint(b'format', b'use-dirstate-tracked-hint.version')
49540
bc2ecf08ae04 localrepo: byteify the requirements.DIRSTATE_TRACKED_HINT_Vx warning message
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  3802
        msg = _(b"ignoring unknown tracked key version: %d\n")
bc2ecf08ae04 localrepo: byteify the requirements.DIRSTATE_TRACKED_HINT_Vx warning message
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  3803
        hint = _(
bc2ecf08ae04 localrepo: byteify the requirements.DIRSTATE_TRACKED_HINT_Vx warning message
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  3804
            b"see `hg help config.format.use-dirstate-tracked-hint-version"
bc2ecf08ae04 localrepo: byteify the requirements.DIRSTATE_TRACKED_HINT_Vx warning message
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  3805
        )
48771
79a967128055 dirstate-tracked-key: update the config value to match latest discussion
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48684
diff changeset
  3806
        if version != 1:
79a967128055 dirstate-tracked-key: update the config value to match latest discussion
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48684
diff changeset
  3807
            ui.warn(msg % version, hint=hint)
48684
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
  3808
        else:
48793
6e559391f96e tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48792
diff changeset
  3809
            requirements.add(requirementsmod.DIRSTATE_TRACKED_HINT_V1)
48684
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48681
diff changeset
  3810
28164
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  3811
    return requirements
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3812
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3813
45300
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
  3814
def checkrequirementscompat(ui, requirements):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  3815
    """Checks compatibility of repository requirements enabled and disabled.
45300
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
  3816
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
  3817
    Returns a set of requirements which needs to be dropped because dependend
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
  3818
    requirements are not enabled. Also warns users about it"""
45300
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
  3819
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
  3820
    dropped = set()
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
  3821
46637
ab58098bebed requirements: also add a store constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46636
diff changeset
  3822
    if requirementsmod.STORE_REQUIREMENT not in requirements:
48599
dfbfa802876b requirements: move "bookmark in store" requirements in the right module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48466
diff changeset
  3823
        if requirementsmod.BOOKMARKS_IN_STORE_REQUIREMENT in requirements:
45300
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
  3824
            ui.warn(
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
  3825
                _(
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
  3826
                    b'ignoring enabled \'format.bookmarks-in-store\' config '
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
  3827
                    b'beacuse it is incompatible with disabled '
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
  3828
                    b'\'format.usestore\' config\n'
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
  3829
                )
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
  3830
            )
48599
dfbfa802876b requirements: move "bookmark in store" requirements in the right module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48466
diff changeset
  3831
            dropped.add(requirementsmod.BOOKMARKS_IN_STORE_REQUIREMENT)
45300
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
  3832
45386
034d94f8761b requirements: introduce constants for `shared` and `relshared` requirements
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45373
diff changeset
  3833
        if (
034d94f8761b requirements: introduce constants for `shared` and `relshared` requirements
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45373
diff changeset
  3834
            requirementsmod.SHARED_REQUIREMENT in requirements
034d94f8761b requirements: introduce constants for `shared` and `relshared` requirements
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45373
diff changeset
  3835
            or requirementsmod.RELATIVE_SHARED_REQUIREMENT in requirements
034d94f8761b requirements: introduce constants for `shared` and `relshared` requirements
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45373
diff changeset
  3836
        ):
45301
dc283bc7e033 localrepo: abort creating a shared repo if the source does not have store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45300
diff changeset
  3837
            raise error.Abort(
dc283bc7e033 localrepo: abort creating a shared repo if the source does not have store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45300
diff changeset
  3838
                _(
dc283bc7e033 localrepo: abort creating a shared repo if the source does not have store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45300
diff changeset
  3839
                    b"cannot create shared repository as source was created"
dc283bc7e033 localrepo: abort creating a shared repo if the source does not have store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45300
diff changeset
  3840
                    b" with 'format.usestore' config disabled"
dc283bc7e033 localrepo: abort creating a shared repo if the source does not have store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45300
diff changeset
  3841
                )
dc283bc7e033 localrepo: abort creating a shared repo if the source does not have store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45300
diff changeset
  3842
            )
dc283bc7e033 localrepo: abort creating a shared repo if the source does not have store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45300
diff changeset
  3843
45483
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
  3844
        if requirementsmod.SHARESAFE_REQUIREMENT in requirements:
48666
4c1135d15700 requirements: do not warn about dropping share-safe, unless explicitly set
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48652
diff changeset
  3845
            if ui.hasconfig(b'format', b'use-share-safe'):
4c1135d15700 requirements: do not warn about dropping share-safe, unless explicitly set
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48652
diff changeset
  3846
                msg = _(
46334
4b0192f592cf share: move share safe functionality out of experimental
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46333
diff changeset
  3847
                    b"ignoring enabled 'format.use-share-safe' config because "
45483
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
  3848
                    b"it is incompatible with disabled 'format.usestore'"
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
  3849
                    b" config\n"
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
  3850
                )
48666
4c1135d15700 requirements: do not warn about dropping share-safe, unless explicitly set
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48652
diff changeset
  3851
                ui.warn(msg)
45483
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
  3852
            dropped.add(requirementsmod.SHARESAFE_REQUIREMENT)
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
  3853
45300
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
  3854
    return dropped
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
  3855
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
  3856
39549
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3857
def filterknowncreateopts(ui, createopts):
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3858
    """Filters a dict of repo creation options against options that are known.
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3859
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3860
    Receives a dict of repo creation options and returns a dict of those
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3861
    options that we don't know how to handle.
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3862
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3863
    This function is called as part of repository creation. If the
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3864
    returned dict contains any items, repository creation will not
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3865
    be allowed, as it means there was a request to create a repository
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3866
    with options not recognized by loaded code.
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3867
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3868
    Extensions can wrap this function to filter out creation options
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3869
    they know how to handle.
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3870
    """
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3871
    known = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3872
        b'backend',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3873
        b'lfs',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3874
        b'narrowfiles',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3875
        b'sharedrepo',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3876
        b'sharedrelative',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3877
        b'shareditems',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3878
        b'shallowfilestore',
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3879
    }
39551
261f1e8dc300 localrepo: add requirement when narrow files creation option present
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
  3880
261f1e8dc300 localrepo: add requirement when narrow files creation option present
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
  3881
    return {k: v for k, v in createopts.items() if k not in known}
39549
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3882
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3883
49571
8fa3f7c3a9ad typing: add basic type hints to localrepo.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49493
diff changeset
  3884
def createrepository(ui, path: bytes, createopts=None, requirements=None):
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3885
    """Create a new repository in a vfs.
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3886
39590
e471cb2852ea localrepo: move check for existing repo into createrepository()
Martin von Zweigbergk <martinvonz@google.com>
parents: 39580
diff changeset
  3887
    ``path`` path to the new repo's working directory.
39580
a64a965b3610 localrepo: fix a mixmatched arg name in createrepository() docstring
Martin von Zweigbergk <martinvonz@google.com>
parents: 39557
diff changeset
  3888
    ``createopts`` options for the new repository.
47440
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3889
    ``requirement`` predefined set of requirements.
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3890
                    (incompatible with ``createopts``)
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3891
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3892
    The following keys for ``createopts`` are recognized:
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3893
39996
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3894
    backend
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3895
       The storage backend to use.
40324
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 40296
diff changeset
  3896
    lfs
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 40296
diff changeset
  3897
       Repository will be created with ``lfs`` requirement. The lfs extension
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 40296
diff changeset
  3898
       will automatically be loaded when the repository is accessed.
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3899
    narrowfiles
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3900
       Set up repository to support narrow file storage.
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3901
    sharedrepo
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3902
       Repository object from which storage should be shared.
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3903
    sharedrelative
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3904
       Boolean indicating if the path to the shared repo should be
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3905
       stored as relative. By default, the pointer to the "parent" repo
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3906
       is stored as an absolute path.
39849
d3d4b4b5f725 localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39848
diff changeset
  3907
    shareditems
d3d4b4b5f725 localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39848
diff changeset
  3908
       Set of items to share to the new repository (in addition to storage).
40390
7e3b6c4f01a2 localrepo: support marking repos as having shallow file storage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40360
diff changeset
  3909
    shallowfilestore
7e3b6c4f01a2 localrepo: support marking repos as having shallow file storage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40360
diff changeset
  3910
       Indicates that storage for files should be shallow (not all ancestor
7e3b6c4f01a2 localrepo: support marking repos as having shallow file storage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40360
diff changeset
  3911
       revisions are known).
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3912
    """
47440
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3913
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3914
    if requirements is not None:
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3915
        if createopts is not None:
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3916
            msg = b'cannot specify both createopts and requirements'
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3917
            raise error.ProgrammingError(msg)
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3918
        createopts = {}
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3919
    else:
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3920
        createopts = defaultcreateopts(ui, createopts=createopts)
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3921
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3922
        unknownopts = filterknowncreateopts(ui, createopts)
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3923
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3924
        if not isinstance(unknownopts, dict):
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3925
            raise error.ProgrammingError(
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3926
                b'filterknowncreateopts() did not return a dict'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3927
            )
47440
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3928
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3929
        if unknownopts:
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3930
            raise error.Abort(
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3931
                _(
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3932
                    b'unable to create repository because of unknown '
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3933
                    b'creation option: %s'
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3934
                )
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3935
                % b', '.join(sorted(unknownopts)),
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3936
                hint=_(b'is a required extension not loaded?'),
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3937
            )
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3938
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3939
        requirements = newreporequirements(ui, createopts=createopts)
e43e68624dfb createrepository: allow to directly pass the target requirements
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47421
diff changeset
  3940
        requirements -= checkrequirementscompat(ui, requirements)
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3941
39590
e471cb2852ea localrepo: move check for existing repo into createrepository()
Martin von Zweigbergk <martinvonz@google.com>
parents: 39580
diff changeset
  3942
    wdirvfs = vfsmod.vfs(path, expandpath=True, realpath=True)
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3943
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3944
    hgvfs = vfsmod.vfs(wdirvfs.join(b'.hg'))
39590
e471cb2852ea localrepo: move check for existing repo into createrepository()
Martin von Zweigbergk <martinvonz@google.com>
parents: 39580
diff changeset
  3945
    if hgvfs.exists():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3946
        raise error.RepoError(_(b'repository %s already exists') % path)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3947
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3948
    if b'sharedrepo' in createopts:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3949
        sharedpath = createopts[b'sharedrepo'].sharedpath
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3950
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3951
        if createopts.get(b'sharedrelative'):
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3952
            try:
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3953
                sharedpath = os.path.relpath(sharedpath, hgvfs.base)
46888
218a26df7813 share: store relative share paths with '/' separators
Matt Harbison <matt_harbison@yahoo.com>
parents: 46851
diff changeset
  3954
                sharedpath = util.pconvert(sharedpath)
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3955
            except (IOError, ValueError) as e:
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3956
                # ValueError is raised on Windows if the drive letters differ
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3957
                # on each path.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3958
                raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3959
                    _(b'cannot calculate relative path'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3960
                    hint=stringutil.forcebytestr(e),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3961
                )
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3962
39847
b504ff813c4f localrepo: validate directories before creating any
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39846
diff changeset
  3963
    if not wdirvfs.exists():
b504ff813c4f localrepo: validate directories before creating any
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39846
diff changeset
  3964
        wdirvfs.makedirs()
b504ff813c4f localrepo: validate directories before creating any
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39846
diff changeset
  3965
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3966
    hgvfs.makedir(notindexed=True)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3967
    if b'sharedrepo' not in createopts:
40793
64cdfcc73706 cache: create `cache` directory at init time
Boris Feld <boris.feld@octobus.net>
parents: 40785
diff changeset
  3968
        hgvfs.mkdir(b'cache')
40794
d5622dfe4ba3 cache: create `wcache` directory at init time
Boris Feld <boris.feld@octobus.net>
parents: 40793
diff changeset
  3969
    hgvfs.mkdir(b'wcache')
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3970
46637
ab58098bebed requirements: also add a store constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46636
diff changeset
  3971
    has_store = requirementsmod.STORE_REQUIREMENT in requirements
ab58098bebed requirements: also add a store constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46636
diff changeset
  3972
    if has_store and b'sharedrepo' not in createopts:
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3973
        hgvfs.mkdir(b'store')
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3974
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3975
        # We create an invalid changelog outside the store so very old
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3976
        # Mercurial versions (which didn't know about the requirements
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3977
        # file) encounter an error on reading the changelog. This
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3978
        # effectively locks out old clients and prevents them from
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3979
        # mucking with a repo in an unknown format.
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3980
        #
46406
95054317e172 revlog: use a less probable revlog version for backwards compatibility
Raphaël Gomès <rgomes@octobus.net>
parents: 46372
diff changeset
  3981
        # The revlog header has version 65535, which won't be recognized by
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3982
        # such old clients.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3983
        hgvfs.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3984
            b'00changelog.i',
46406
95054317e172 revlog: use a less probable revlog version for backwards compatibility
Raphaël Gomès <rgomes@octobus.net>
parents: 46372
diff changeset
  3985
            b'\0\0\xFF\xFF dummy changelog to prevent using the old repo '
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3986
            b'layout',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  3987
        )
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3988
45483
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
  3989
    # Filter the requirements into working copy and store ones
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
  3990
    wcreq, storereq = scmutil.filterrequirements(requirements)
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
  3991
    # write working copy ones
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
  3992
    scmutil.writerequires(hgvfs, wcreq)
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
  3993
    # If there are store requirements and the current repository
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
  3994
    # is not a shared one, write stored requirements
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
  3995
    # For new shared repository, we don't need to write the store
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
  3996
    # requirements as they are already present in store requires
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
  3997
    if storereq and b'sharedrepo' not in createopts:
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
  3998
        storevfs = vfsmod.vfs(hgvfs.join(b'store'), cacheaudited=True)
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
  3999
        scmutil.writerequires(storevfs, storereq)
39606
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  4000
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  4001
    # Write out file telling readers where to find the shared store.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  4002
    if b'sharedrepo' in createopts:
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  4003
        hgvfs.write(b'sharedpath', sharedpath)
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  4004
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  4005
    if createopts.get(b'shareditems'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  4006
        shared = b'\n'.join(sorted(createopts[b'shareditems'])) + b'\n'
39849
d3d4b4b5f725 localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39848
diff changeset
  4007
        hgvfs.write(b'shared', shared)
d3d4b4b5f725 localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39848
diff changeset
  4008
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  4009
39606
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  4010
def poisonrepository(repo):
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  4011
    """Poison a repository instance so it can no longer be used."""
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  4012
    # Perform any cleanup on the instance.
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  4013
    repo.close()
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  4014
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  4015
    # Our strategy is to replace the type of the object with one that
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  4016
    # has all attribute lookups result in error.
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  4017
    #
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  4018
    # But we have to allow the close() method because some constructors
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  4019
    # of repos call close() on repo references.
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48935
diff changeset
  4020
    class poisonedrepository:
39606
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  4021
        def __getattribute__(self, item):
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43421
diff changeset
  4022
            if item == 'close':
39606
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  4023
                return object.__getattribute__(self, item)
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  4024
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  4025
            raise error.ProgrammingError(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
  4026
                b'repo instances should not be used after unshare'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
  4027
            )
39606
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  4028
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  4029
        def close(self):
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  4030
            pass
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  4031
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  4032
    # We may have a repoview, which intercepts __setattr__. So be sure
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  4033
    # we operate at the lowest level possible.
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43421
diff changeset
  4034
    object.__setattr__(repo, '__class__', poisonedrepository)