mercurial/localrepo.py
author Augie Fackler <augie@google.com>
Mon, 09 Sep 2019 17:26:17 -0400
changeset 42918 f059d6ffcdf0
parent 42905 3df3b139a43d
child 42969 76608f9f27f6
permissions -rw-r--r--
merge with stable
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
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
     2
#
4635
63b9d2deed48 Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4633
diff changeset
     3
# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
     4
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8210
diff changeset
     5
# 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
     6
# 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
     7
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
     8
from __future__ import absolute_import
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
     9
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    10
import errno
29341
0d83ad967bf8 cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents: 29237
diff changeset
    11
import hashlib
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    12
import os
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    13
import random
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
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    18
from .i18n import _
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    19
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
    20
    bin,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    21
    hex,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    22
    nullid,
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
    23
    nullrev,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    24
    short,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    25
)
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    26
from . import (
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    27
    bookmarks,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    28
    branchmap,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    29
    bundle2,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    30
    changegroup,
31111
95ec3ad62f62 color: initialize color for the localrepo ui
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31054
diff changeset
    31
    color,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    32
    context,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    33
    dirstate,
30492
77cd647b04ac localrepo: refer to dirstateguard by its new name
Augie Fackler <augie@google.com>
parents: 30377
diff changeset
    34
    dirstateguard,
34097
f7d41b85bbf6 changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents: 33803
diff changeset
    35
    discovery,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    36
    encoding,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    37
    error,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    38
    exchange,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    39
    extensions,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    40
    filelog,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    41
    hook,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    42
    lock as lockmod,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    43
    match as matchmod,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    44
    merge as mergemod,
30496
a90867a22daf localrepo: refer to checkunresolved by its new name
Augie Fackler <augie@google.com>
parents: 30492
diff changeset
    45
    mergeutil,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    46
    namespaces,
36471
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
    47
    narrowspec,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    48
    obsolete,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    49
    pathutil,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    50
    phases,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    51
    pushkey,
31508
590319c07259 localrepo: ensure transaction id is fully bytes on py3
Augie Fackler <augie@google.com>
parents: 31476
diff changeset
    52
    pycompat,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    53
    repoview,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    54
    revset,
31024
0b8356705de6 revset: split language services to revsetlang module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30989
diff changeset
    55
    revsetlang,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    56
    scmutil,
33373
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33336
diff changeset
    57
    sparse,
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
    58
    store as storemod,
36009
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35896
diff changeset
    59
    subrepoutil,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    60
    tags as tagsmod,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    61
    transaction,
31054
59e69ed81776 localrepo: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31025
diff changeset
    62
    txnutil,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    63
    util,
31231
0a38a313033e vfs: use 'vfs' module directly in 'mercurial.localrepo'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31209
diff changeset
    64
    vfs as vfsmod,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    65
)
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
    66
268662aac075 interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42712
diff changeset
    67
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
    68
    repository,
42814
2c4f656c8e9f interfaceutil: move to interfaces/
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42813
diff changeset
    69
    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
    70
)
268662aac075 interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42712
diff changeset
    71
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36952
diff changeset
    72
from .utils import (
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
    73
    procutil,
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36952
diff changeset
    74
    stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36952
diff changeset
    75
)
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    76
39506
b66ea3fc3a86 sparse-revlog: set max delta chain length to on thousand
Boris Feld <boris.feld@octobus.net>
parents: 39312
diff changeset
    77
from .revlogutils import (
b66ea3fc3a86 sparse-revlog: set max delta chain length to on thousand
Boris Feld <boris.feld@octobus.net>
parents: 39312
diff changeset
    78
    constants as revlogconst,
b66ea3fc3a86 sparse-revlog: set max delta chain length to on thousand
Boris Feld <boris.feld@octobus.net>
parents: 39312
diff changeset
    79
)
b66ea3fc3a86 sparse-revlog: set max delta chain length to on thousand
Boris Feld <boris.feld@octobus.net>
parents: 39312
diff changeset
    80
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    81
release = lockmod.release
28883
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28876
diff changeset
    82
urlerr = util.urlerr
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28876
diff changeset
    83
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
    84
33277
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
    85
# 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
    86
# - '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
    87
# - '' 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
    88
_cachedfiles = set()
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
    89
33176
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32895
diff changeset
    90
class _basefilecache(scmutil.filecache):
18014
a39fe76c4c65 clfilter: ensure that filecache on localrepo is unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18013
diff changeset
    91
    """All filecache usage on repo are done for logic that should be unfiltered
a39fe76c4c65 clfilter: ensure that filecache on localrepo is unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18013
diff changeset
    92
    """
a39fe76c4c65 clfilter: ensure that filecache on localrepo is unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18013
diff changeset
    93
    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
    94
        if repo is None:
36fbd72c2f39 scmutil: allow access to filecache descriptor on class
Martijn Pieters <mjpieters@fb.com>
parents: 29352
diff changeset
    95
            return self
40424
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40423
diff changeset
    96
        # 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
    97
        unfi = repo.unfiltered()
597bb5a6867f filecache: use try-except for faster __dict__ lookup
Yuya Nishihara <yuya@tcha.org>
parents: 40390
diff changeset
    98
        try:
597bb5a6867f filecache: use try-except for faster __dict__ lookup
Yuya Nishihara <yuya@tcha.org>
parents: 40390
diff changeset
    99
            return unfi.__dict__[self.sname]
597bb5a6867f filecache: use try-except for faster __dict__ lookup
Yuya Nishihara <yuya@tcha.org>
parents: 40390
diff changeset
   100
        except KeyError:
597bb5a6867f filecache: use try-except for faster __dict__ lookup
Yuya Nishihara <yuya@tcha.org>
parents: 40390
diff changeset
   101
            pass
597bb5a6867f filecache: use try-except for faster __dict__ lookup
Yuya Nishihara <yuya@tcha.org>
parents: 40390
diff changeset
   102
        return super(_basefilecache, self).__get__(unfi, type)
40424
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40423
diff changeset
   103
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40423
diff changeset
   104
    def set(self, repo, value):
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40423
diff changeset
   105
        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
   106
33176
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32895
diff changeset
   107
class repofilecache(_basefilecache):
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32895
diff changeset
   108
    """filecache for files in .hg but outside of .hg/store"""
33277
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
   109
    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
   110
        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
   111
        for path in paths:
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
   112
            _cachedfiles.add((path, 'plain'))
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
   113
33176
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32895
diff changeset
   114
    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
   115
        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
   116
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32895
diff changeset
   117
class storecache(_basefilecache):
16198
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16144
diff changeset
   118
    """filecache for files in the store"""
33277
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
   119
    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
   120
        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
   121
        for path in paths:
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
   122
            _cachedfiles.add((path, ''))
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
   123
16198
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16144
diff changeset
   124
    def join(self, obj, fname):
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16144
diff changeset
   125
        return obj.sjoin(fname)
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16144
diff changeset
   126
42323
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
   127
class mixedrepostorecache(_basefilecache):
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
   128
    """filecache for a mix files in .hg/store and outside"""
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
   129
    def __init__(self, *pathsandlocations):
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
   130
        # 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
   131
        # 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
   132
        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
   133
        _cachedfiles.update(pathsandlocations)
42323
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
   134
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
   135
    def join(self, obj, fnameandlocation):
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
   136
        fname, location = fnameandlocation
42421
d532292eff22 bookmarks: use correct store for "ambiguity check"
Martin von Zweigbergk <martinvonz@google.com>
parents: 42324
diff changeset
   137
        if location == 'plain':
42323
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
   138
            return obj.vfs.join(fname)
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
   139
        else:
42421
d532292eff22 bookmarks: use correct store for "ambiguity check"
Martin von Zweigbergk <martinvonz@google.com>
parents: 42324
diff changeset
   140
            if location != '':
42323
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
   141
                raise error.ProgrammingError('unexpected location: %s' %
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
   142
                                             location)
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
   143
            return obj.sjoin(fname)
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
   144
33382
b107a7660f4e localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33373
diff changeset
   145
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
   146
    """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
   147
b107a7660f4e localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33373
diff changeset
   148
    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
   149
    """
b107a7660f4e localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33373
diff changeset
   150
    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
   151
    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
   152
        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
   153
    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
   154
29104
b207653ada10 localrepo: remove a couple of local type aliases
Augie Fackler <augie@google.com>
parents: 29075
diff changeset
   155
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
   156
    """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
   157
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
   158
    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
   159
        unfi = repo.unfiltered()
9789670992d6 repoview: have unfilteredpropertycache using the underlying cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19515
diff changeset
   160
        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
   161
            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
   162
        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
   163
29104
b207653ada10 localrepo: remove a couple of local type aliases
Augie Fackler <augie@google.com>
parents: 29075
diff changeset
   164
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
   165
    """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
   166
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
   167
    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
   168
        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
   169
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
   170
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
   171
def hasunfilteredcache(repo, name):
18644
3e92772d5383 spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents: 18520
diff changeset
   172
    """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
   173
    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
   174
18016
2a393df0f5cc clfilter: rename `unfilteredmeth` to `unfilteredmethod`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18014
diff changeset
   175
def unfilteredmethod(orig):
17994
8899bf48116a clfilter: introduce an `unfilteredmethod` decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17993
diff changeset
   176
    """decorate method that always need to be run on unfiltered version"""
8899bf48116a clfilter: introduce an `unfilteredmethod` decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17993
diff changeset
   177
    def wrapper(repo, *args, **kwargs):
8899bf48116a clfilter: introduce an `unfilteredmethod` decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17993
diff changeset
   178
        return orig(repo.unfiltered(), *args, **kwargs)
8899bf48116a clfilter: introduce an `unfilteredmethod` decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17993
diff changeset
   179
    return wrapper
8899bf48116a clfilter: introduce an `unfilteredmethod` decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17993
diff changeset
   180
32291
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32267
diff changeset
   181
moderncaps = {'lookup', 'branchmap', 'pushkey', 'known', 'getbundle',
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32267
diff changeset
   182
              'unbundle'}
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32267
diff changeset
   183
legacycaps = moderncaps.union({'changegroupsubset'})
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   184
37810
856f381ad74b interfaceutil: module to stub out zope.interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37797
diff changeset
   185
@interfaceutil.implementer(repository.ipeercommandexecutor)
37630
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   186
class localcommandexecutor(object):
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   187
    def __init__(self, peer):
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   188
        self._peer = peer
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   189
        self._sent = False
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   190
        self._closed = False
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   191
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   192
    def __enter__(self):
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   193
        return self
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   194
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   195
    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
   196
        self.close()
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   197
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   198
    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
   199
        if self._sent:
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   200
            raise error.ProgrammingError('callcommand() cannot be used after '
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   201
                                         'sendcommands()')
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   202
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   203
        if self._closed:
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   204
            raise error.ProgrammingError('callcommand() cannot be used after '
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   205
                                         'close()')
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   206
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   207
        # 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
   208
        # 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
   209
        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
   210
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   211
        f = pycompat.futures.Future()
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   212
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   213
        try:
37670
719b8cb22936 localrepo: add some overlooked strkwargs love for py3
Augie Fackler <augie@google.com>
parents: 37669
diff changeset
   214
            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
   215
        except Exception:
37669
1cb54e6193a6 py3: paper over differences in future exception handling
Augie Fackler <augie@google.com>
parents: 37650
diff changeset
   216
            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
   217
        else:
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   218
            f.set_result(result)
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   219
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   220
        return f
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   221
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   222
    def sendcommands(self):
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   223
        self._sent = True
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   224
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   225
    def close(self):
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   226
        self._closed = True
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   227
37810
856f381ad74b interfaceutil: module to stub out zope.interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37797
diff changeset
   228
@interfaceutil.implementer(repository.ipeercommands)
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   229
class localpeer(repository.peer):
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   230
    '''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
   231
31412
ecc87acb4d10 localrepo: don't use mutable default argument value
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31373
diff changeset
   232
    def __init__(self, repo, caps=None):
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   233
        super(localpeer, self).__init__()
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   234
31412
ecc87acb4d10 localrepo: don't use mutable default argument value
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31373
diff changeset
   235
        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
   236
            caps = moderncaps.copy()
18382
f3b21beb9802 filtering: rename filters to their antonyms
Kevin Bullock <kbullock@ringworld.org>
parents: 18364
diff changeset
   237
        self._repo = repo.filtered('served')
37321
e826fe7a08c7 peer: make ui an attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37316
diff changeset
   238
        self.ui = repo.ui
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   239
        self._caps = repo._restrictcapabilities(caps)
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   240
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   241
    # Begin of _basepeer interface.
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   242
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   243
    def url(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   244
        return self._repo.url()
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   245
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   246
    def local(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   247
        return self._repo
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   248
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   249
    def peer(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   250
        return self
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   251
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   252
    def canpush(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   253
        return True
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   254
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   255
    def close(self):
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   256
        self._repo.close()
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   257
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   258
    # End of _basepeer interface.
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   259
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   260
    # Begin of _basewirecommands interface.
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   261
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   262
    def branchmap(self):
18279
679767c38cb5 clfilter: drop extra filtering in localpeer
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18278
diff changeset
   263
        return self._repo.branchmap()
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   264
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   265
    def capabilities(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   266
        return self._caps
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   267
37649
a168799687e5 wireproto: properly call clonebundles command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37646
diff changeset
   268
    def clonebundles(self):
a168799687e5 wireproto: properly call clonebundles command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37646
diff changeset
   269
        return self._repo.tryread('clonebundles.manifest')
a168799687e5 wireproto: properly call clonebundles command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37646
diff changeset
   270
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   271
    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
   272
        """Used to test argument passing over the wire"""
36554
06f59bdde626 py3: use pycompat.bytestr() to convert None to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36471
diff changeset
   273
        return "%s %s %s %s %s" % (one, two, pycompat.bytestr(three),
06f59bdde626 py3: use pycompat.bytestr() to convert None to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36471
diff changeset
   274
                                   pycompat.bytestr(four),
06f59bdde626 py3: use pycompat.bytestr() to convert None to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36471
diff changeset
   275
                                   pycompat.bytestr(five))
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   276
20953
8d853cad6b14 localpeer: propagate bundlecaps in getbundle call
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20933
diff changeset
   277
    def getbundle(self, source, heads=None, common=None, bundlecaps=None,
24639
c79b1e690110 localrepo.getbundle: drop unused 'format' argument
Martin von Zweigbergk <martinvonz@google.com>
parents: 24571
diff changeset
   278
                  **kwargs):
30187
3e86261bf110 exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29975
diff changeset
   279
        chunks = exchange.getbundlechunks(self._repo, source, heads=heads,
3e86261bf110 exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29975
diff changeset
   280
                                          common=common, bundlecaps=bundlecaps,
35785
ba15580e53d5 exchange: return bundle info from getbundlechunks() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35783
diff changeset
   281
                                          **kwargs)[1]
30187
3e86261bf110 exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29975
diff changeset
   282
        cb = util.chunkbuffer(chunks)
3e86261bf110 exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29975
diff changeset
   283
32149
9a9d54ae9963 localrepo: reuse exchange.bundle2requested()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32121
diff changeset
   284
        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
   285
            # 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
   286
            # 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
   287
            # 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
   288
            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
   289
        else:
3e86261bf110 exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29975
diff changeset
   290
            return changegroup.getunbundler('01', cb, None)
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   291
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   292
    def heads(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   293
        return self._repo.heads()
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   294
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   295
    def known(self, nodes):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   296
        return self._repo.known(nodes)
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   297
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   298
    def listkeys(self, namespace):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   299
        return self._repo.listkeys(namespace)
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   300
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   301
    def lookup(self, key):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   302
        return self._repo.lookup(key)
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   303
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   304
    def pushkey(self, namespace, key, old, new):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   305
        return self._repo.pushkey(namespace, key, old, new)
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   306
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   307
    def stream_out(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   308
        raise error.Abort(_('cannot perform stream clone against local '
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   309
                            'peer'))
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   310
37646
72e26319f3b8 wireproto: use command executor for unbundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37635
diff changeset
   311
    def unbundle(self, bundle, heads, url):
20969
7a679918ee2b localrepo: add unbundle support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20963
diff changeset
   312
        """apply a bundle on a repo
7a679918ee2b localrepo: add unbundle support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20963
diff changeset
   313
7a679918ee2b localrepo: add unbundle support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20963
diff changeset
   314
        This function handles the repo locking itself."""
7a679918ee2b localrepo: add unbundle support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20963
diff changeset
   315
        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
   316
            try:
37646
72e26319f3b8 wireproto: use command executor for unbundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37635
diff changeset
   317
                bundle = exchange.readbundle(self.ui, bundle, None)
72e26319f3b8 wireproto: use command executor for unbundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37635
diff changeset
   318
                ret = exchange.unbundle(self._repo, bundle, heads, 'push', url)
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
   319
                if util.safehasattr(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
   320
                    # 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
   321
                    # 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
   322
                    # 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
   323
                    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
   324
                    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
   325
                return ret
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25629
diff changeset
   326
            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
   327
                # 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
   328
                # 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
   329
                # 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
   330
                # 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
   331
                #
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
   332
                # 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
   333
                # issue4594
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
   334
                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
   335
                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
   336
                    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
   337
                    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
   338
                        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
   339
                    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
   340
                    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
   341
                    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
   342
                raise
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25629
diff changeset
   343
        except error.PushRaced as exc:
36422
04c319a07c7b py3: hunt down str(exception) instances and use util.forcebytestr
Augie Fackler <augie@google.com>
parents: 36400
diff changeset
   344
            raise error.ResponseError(_('push failed:'),
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36952
diff changeset
   345
                                      stringutil.forcebytestr(exc))
20969
7a679918ee2b localrepo: add unbundle support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20963
diff changeset
   346
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   347
    # End of _basewirecommands interface.
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   348
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   349
    # Begin of peer interface.
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   350
37630
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   351
    def commandexecutor(self):
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   352
        return localcommandexecutor(self)
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
   353
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   354
    # End of peer interface.
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   355
37810
856f381ad74b interfaceutil: module to stub out zope.interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37797
diff changeset
   356
@interfaceutil.implementer(repository.ipeerlegacycommands)
37635
cc8c06835097 wireproto: convert legacy commands to command executor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37633
diff changeset
   357
class locallegacypeer(localpeer):
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   358
    '''peer extension which implements legacy methods too; used for tests with
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   359
    restricted capabilities'''
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   360
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   361
    def __init__(self, repo):
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   362
        super(locallegacypeer, self).__init__(repo, caps=legacycaps)
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   363
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   364
    # Begin of baselegacywirecommands interface.
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   365
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   366
    def between(self, pairs):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   367
        return self._repo.between(pairs)
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   368
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   369
    def branches(self, nodes):
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   370
        return self._repo.branches(nodes)
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   371
37635
cc8c06835097 wireproto: convert legacy commands to command executor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37633
diff changeset
   372
    def changegroup(self, nodes, source):
cc8c06835097 wireproto: convert legacy commands to command executor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37633
diff changeset
   373
        outgoing = discovery.outgoing(self._repo, missingroots=nodes,
34100
1632999d4bed changegroup: replace changegroup with makechangegroup
Durham Goode <durham@fb.com>
parents: 34097
diff changeset
   374
                                      missingheads=self._repo.heads())
1632999d4bed changegroup: replace changegroup with makechangegroup
Durham Goode <durham@fb.com>
parents: 34097
diff changeset
   375
        return changegroup.makechangegroup(self._repo, outgoing, '01', source)
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   376
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   377
    def changegroupsubset(self, bases, heads, source):
34097
f7d41b85bbf6 changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents: 33803
diff changeset
   378
        outgoing = discovery.outgoing(self._repo, missingroots=bases,
f7d41b85bbf6 changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents: 33803
diff changeset
   379
                                      missingheads=heads)
f7d41b85bbf6 changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents: 33803
diff changeset
   380
        return changegroup.makechangegroup(self._repo, outgoing, '01', source)
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   381
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   382
    # End of baselegacywirecommands interface.
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
   383
32697
19b9fc40cc51 revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32660
diff changeset
   384
# Increment the sub-version when the revlog v2 format changes to lock out old
19b9fc40cc51 revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32660
diff changeset
   385
# clients.
41202
e7a2cc84dbc0 revlog: always enable generaldelta on version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41043
diff changeset
   386
REVLOGV2_REQUIREMENT = 'exp-revlogv2.1'
32697
19b9fc40cc51 revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32660
diff changeset
   387
38717
aa21a9ad46ea sparse-revlog: new requirement enabled with format.sparse-revlog
Paul Morelle <paul.morelle@octobus.net>
parents: 38239
diff changeset
   388
# A repository with the sparserevlog feature will have delta chains that
aa21a9ad46ea sparse-revlog: new requirement enabled with format.sparse-revlog
Paul Morelle <paul.morelle@octobus.net>
parents: 38239
diff changeset
   389
# can spread over a larger span. Sparse reading cuts these large spans into
aa21a9ad46ea sparse-revlog: new requirement enabled with format.sparse-revlog
Paul Morelle <paul.morelle@octobus.net>
parents: 38239
diff changeset
   390
# pieces, so that each piece isn't too big.
aa21a9ad46ea sparse-revlog: new requirement enabled with format.sparse-revlog
Paul Morelle <paul.morelle@octobus.net>
parents: 38239
diff changeset
   391
# Without the sparserevlog capability, reading from the repository could use
aa21a9ad46ea sparse-revlog: new requirement enabled with format.sparse-revlog
Paul Morelle <paul.morelle@octobus.net>
parents: 38239
diff changeset
   392
# huge amounts of memory, because the whole span would be read at once,
aa21a9ad46ea sparse-revlog: new requirement enabled with format.sparse-revlog
Paul Morelle <paul.morelle@octobus.net>
parents: 38239
diff changeset
   393
# including all the intermediate revisions that aren't pertinent for the chain.
aa21a9ad46ea sparse-revlog: new requirement enabled with format.sparse-revlog
Paul Morelle <paul.morelle@octobus.net>
parents: 38239
diff changeset
   394
# This is why once a repository has enabled sparse-read, it becomes required.
aa21a9ad46ea sparse-revlog: new requirement enabled with format.sparse-revlog
Paul Morelle <paul.morelle@octobus.net>
parents: 38239
diff changeset
   395
SPARSEREVLOG_REQUIREMENT = 'sparserevlog'
aa21a9ad46ea sparse-revlog: new requirement enabled with format.sparse-revlog
Paul Morelle <paul.morelle@octobus.net>
parents: 38239
diff changeset
   396
37135
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
   397
# 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
   398
# 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
   399
# 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
   400
#
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
   401
# 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
   402
# 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
   403
# 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
   404
featuresetupfuncs = set()
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
   405
39689
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
   406
def makelocalrepository(baseui, path, intents=None):
39687
bfeab472e3c0 localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39668
diff changeset
   407
    """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
   408
bfeab472e3c0 localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39668
diff changeset
   409
    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
   410
    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
   411
    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
   412
    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
   413
    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
   414
bfeab472e3c0 localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39668
diff changeset
   415
    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
   416
    interface.
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   417
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   418
    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
   419
    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
   420
    ``REPO_INTERFACES``.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   421
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   422
    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
   423
    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
   424
    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
   425
    repository.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   426
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   427
    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
   428
    as part of deriving a type.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   429
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   430
    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
   431
    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
   432
    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
   433
    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
   434
    ``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
   435
    not.
39687
bfeab472e3c0 localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39668
diff changeset
   436
    """
39689
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
   437
    ui = baseui.copy()
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
   438
    # Prevent copying repo configuration.
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
   439
    ui.copy = baseui.copy
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
   440
39688
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   441
    # 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
   442
    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
   443
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   444
    # Main VFS for .hg/ directory.
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   445
    hgpath = wdirvfs.join(b'.hg')
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   446
    hgvfs = vfsmod.vfs(hgpath, cacheaudited=True)
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   447
39691
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
   448
    # 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
   449
    # cases are errors.
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
   450
    if not hgvfs.isdir():
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
   451
        try:
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
   452
            hgvfs.stat()
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
   453
        except OSError as e:
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
   454
            if e.errno != errno.ENOENT:
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
   455
                raise
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
   456
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
   457
        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
   458
39692
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
   459
    # .hg/requires file contains a newline-delimited list of
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
   460
    # features/capabilities the opener (us) must have in order to use
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
   461
    # the repository. This file was introduced in Mercurial 0.9.2,
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
   462
    # which means very old repositories may not have one. We assume
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
   463
    # a missing file translates to no requirements.
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
   464
    try:
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
   465
        requirements = set(hgvfs.read(b'requires').splitlines())
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
   466
    except IOError as e:
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
   467
        if e.errno != errno.ENOENT:
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
   468
            raise
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
   469
        requirements = set()
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
   470
39690
e0c5017124b3 localrepo: load extensions in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39689
diff changeset
   471
    # 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
   472
    # 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
   473
    # process any new extensions that it may have pulled in.
40535
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   474
    if loadhgrc(ui, wdirvfs, hgvfs, requirements):
39852
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   475
        afterhgrcload(ui, wdirvfs, hgvfs, requirements)
39690
e0c5017124b3 localrepo: load extensions in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39689
diff changeset
   476
        extensions.loadall(ui)
40729
c93d046d4300 extensions: add "uipopulate" hook, called per instance, not per process
Yuya Nishihara <yuya@tcha.org>
parents: 40718
diff changeset
   477
        extensions.populateui(ui)
39690
e0c5017124b3 localrepo: load extensions in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39689
diff changeset
   478
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   479
    # 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
   480
    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
   481
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   482
    supportedrequirements = gathersupportedrequirements(ui)
39695
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   483
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   484
    # 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
   485
    ensurerequirementsrecognized(requirements, supportedrequirements)
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   486
39695
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   487
    # 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
   488
    ensurerequirementscompatible(ui, requirements)
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   489
39696
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
   490
    # 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
   491
    # 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
   492
    # 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
   493
    # 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
   494
    # 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
   495
    # in this hgrc.
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
   496
    #
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
   497
    # 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
   498
    # 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
   499
    # 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
   500
    # 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
   501
    # 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
   502
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   503
    # 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
   504
    # Now get on with doing that.
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   505
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
   506
    features = set()
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
   507
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   508
    # The "store" part of the repository holds versioned data. How it is
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   509
    # accessed is determined by various requirements. The ``shared`` or
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   510
    # ``relshared`` requirements indicate the store lives in the path contained
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   511
    # in the ``.hg/sharedpath`` file. This is an absolute path for
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   512
    # ``shared`` and relative to ``.hg/`` for ``relshared``.
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   513
    if b'shared' in requirements or b'relshared' in requirements:
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   514
        sharedpath = hgvfs.read(b'sharedpath').rstrip(b'\n')
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   515
        if b'relshared' in requirements:
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   516
            sharedpath = hgvfs.join(sharedpath)
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   517
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   518
        sharedvfs = vfsmod.vfs(sharedpath, realpath=True)
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   519
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   520
        if not sharedvfs.exists():
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   521
            raise error.RepoError(_(b'.hg/sharedpath points to nonexistent '
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   522
                                    b'directory %s') % sharedvfs.base)
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   523
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
   524
        features.add(repository.REPO_FEATURE_SHARED_STORAGE)
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
   525
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   526
        storebasepath = sharedvfs.base
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   527
        cachepath = sharedvfs.join(b'cache')
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   528
    else:
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   529
        storebasepath = hgvfs.base
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   530
        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
   531
    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
   532
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   533
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   534
    # 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
   535
    # 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
   536
    # of them.
39698
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
   537
    store = makestore(requirements, storebasepath,
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
   538
                      lambda base: vfsmod.vfs(base, cacheaudited=True))
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   539
    hgvfs.createmode = store.createmode
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   540
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   541
    storevfs = store.vfs
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
   542
    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
   543
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   544
    # 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
   545
    cachevfs = vfsmod.vfs(cachepath, cacheaudited=True)
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   546
    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
   547
    # 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
   548
    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
   549
    wcachevfs.createmode = store.createmode
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   550
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   551
    # 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
   552
    # 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
   553
    # 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
   554
    # 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
   555
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   556
    bases = []
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   557
    extrastate = {}
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   558
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   559
    for iface, fn in REPO_INTERFACES:
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   560
        # 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
   561
        # flexibility.
39994
6962ebc8f817 localrepo: capture repo interface factory functions as lambas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39959
diff changeset
   562
        typ = fn()(ui=ui,
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   563
                 intents=intents,
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   564
                 requirements=requirements,
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
   565
                 features=features,
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   566
                 wdirvfs=wdirvfs,
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   567
                 hgvfs=hgvfs,
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   568
                 store=store,
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   569
                 storevfs=storevfs,
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   570
                 storeoptions=storevfs.options,
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   571
                 cachevfs=cachevfs,
40795
e1c3a2e9df59 repo: add a `wcachevfs` to access the `.hg/wcache/` directory
Boris Feld <boris.feld@octobus.net>
parents: 40794
diff changeset
   572
                 wcachevfs=wcachevfs,
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   573
                 extensionmodulenames=extensionmodulenames,
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   574
                 extrastate=extrastate,
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   575
                 baseclasses=bases)
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   576
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   577
        if not isinstance(typ, type):
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   578
            raise error.ProgrammingError('unable to construct type for %s' %
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   579
                                         iface)
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   580
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   581
        bases.append(typ)
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   582
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   583
    # 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
   584
    # 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
   585
    # rich information about our constructed repo.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   586
    name = pycompat.sysstr(b'derivedrepo:%s<%s>' % (
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   587
        wdirvfs.base,
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   588
        b','.join(sorted(requirements))))
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   589
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   590
    cls = type(name, tuple(bases), {})
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   591
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   592
    return cls(
39689
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
   593
        baseui=baseui,
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
   594
        ui=ui,
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
   595
        origroot=path,
39688
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   596
        wdirvfs=wdirvfs,
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   597
        hgvfs=hgvfs,
39692
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
   598
        requirements=requirements,
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   599
        supportedrequirements=supportedrequirements,
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   600
        sharedpath=storebasepath,
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   601
        store=store,
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   602
        cachevfs=cachevfs,
40795
e1c3a2e9df59 repo: add a `wcachevfs` to access the `.hg/wcache/` directory
Boris Feld <boris.feld@octobus.net>
parents: 40794
diff changeset
   603
        wcachevfs=wcachevfs,
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
   604
        features=features,
39688
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   605
        intents=intents)
39687
bfeab472e3c0 localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39668
diff changeset
   606
40535
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   607
def loadhgrc(ui, wdirvfs, hgvfs, requirements):
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   608
    """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
   609
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   610
    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
   611
    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
   612
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   613
    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
   614
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   615
    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
   616
    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
   617
    configs from alternate files or sources.
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   618
    """
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   619
    try:
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   620
        ui.readconfig(hgvfs.join(b'hgrc'), root=wdirvfs.base)
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   621
        return True
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   622
    except IOError:
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   623
        return False
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
   624
39852
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   625
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
   626
    """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
   627
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   628
    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
   629
    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
   630
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   631
    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
   632
    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
   633
    """
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   634
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   635
    # 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
   636
    # requirement is present.
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   637
    autoextensions = {
39854
823a580448d7 largefiles: automatically load largefiles extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39852
diff changeset
   638
        b'largefiles': [b'largefiles'],
39852
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   639
        b'lfs': [b'lfs'],
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   640
    }
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   641
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   642
    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
   643
        if requirement not in requirements:
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   644
            continue
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   645
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   646
        for name in names:
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   647
            if not ui.hasconfig(b'extensions', name):
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   648
                ui.setconfig(b'extensions', name, b'', source='autoload')
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
   649
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   650
def gathersupportedrequirements(ui):
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   651
    """Determine the complete set of recognized requirements."""
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   652
    # 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
   653
    supported = set(localrepository._basesupported)
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   654
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   655
    # 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
   656
    # relevant to this ui instance.
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   657
    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
   658
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   659
    for fn in featuresetupfuncs:
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   660
        if fn.__module__ in modules:
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   661
            fn(ui, supported)
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   662
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   663
    # Add derived requirements from registered compression engines.
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   664
    for name in util.compengines:
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   665
        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
   666
        if engine.available() and engine.revlogheader():
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   667
            supported.add(b'exp-compression-%s' % name)
42136
10a6725dca6e compression: introduce an official `zstd-revlog` requirement
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42135
diff changeset
   668
            if engine.name() == 'zstd':
10a6725dca6e compression: introduce an official `zstd-revlog` requirement
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42135
diff changeset
   669
                supported.add(b'revlog-compression-zstd')
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   670
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   671
    return supported
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   672
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   673
def ensurerequirementsrecognized(requirements, supported):
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   674
    """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
   675
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   676
    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
   677
    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
   678
    recognize.
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   679
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   680
    Returns a set of supported requirements.
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   681
    """
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   682
    missing = set()
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   683
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   684
    for requirement in requirements:
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   685
        if requirement in supported:
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   686
            continue
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   687
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   688
        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
   689
            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
   690
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   691
        missing.add(requirement)
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   692
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   693
    if missing:
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   694
        raise error.RequirementError(
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   695
            _(b'repository requires features unknown to this Mercurial: %s') %
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   696
            b' '.join(sorted(missing)),
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   697
            hint=_(b'see https://mercurial-scm.org/wiki/MissingRequirement '
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   698
                   b'for more information'))
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   699
39695
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   700
def ensurerequirementscompatible(ui, requirements):
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   701
    """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
   702
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   703
    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
   704
    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
   705
    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
   706
    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
   707
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   708
    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
   709
    checking.
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   710
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   711
    ``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
   712
    """
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   713
    if b'exp-sparse' in requirements and not sparse.enabled:
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   714
        raise error.RepoError(_(b'repository is using sparse feature but '
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   715
                                b'sparse is not enabled; enable the '
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   716
                                b'"sparse" extensions to access'))
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
   717
39698
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
   718
def makestore(requirements, path, vfstype):
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
   719
    """Construct a storage object for a repository."""
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
   720
    if b'store' in requirements:
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
   721
        if b'fncache' in requirements:
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
   722
            return storemod.fncachestore(path, vfstype,
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
   723
                                         b'dotencode' in requirements)
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
   724
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
   725
        return storemod.encodedstore(path, vfstype)
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
   726
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
   727
    return storemod.basicstore(path, vfstype)
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
   728
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
   729
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
   730
    """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
   731
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   732
    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
   733
    """
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   734
    options = {}
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   735
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   736
    if b'treemanifest' in requirements:
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   737
        options[b'treemanifest'] = True
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   738
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   739
    # experimental config: format.manifestcachesize
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   740
    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
   741
    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
   742
        options[b'manifestcachesize'] = manifestcachesize
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   743
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   744
    # 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
   745
    # 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
   746
    # 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
   747
    # 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
   748
    # meaningful on such old repos.
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   749
    if b'revlogv1' in requirements or REVLOGV2_REQUIREMENT in requirements:
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
   750
        options.update(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
   751
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   752
    return options
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   753
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
   754
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
   755
    """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
   756
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   757
    options = {}
40267
9d5ddf55415b revlog: allow flag processors to be applied via store options
Matt Harbison <matt_harbison@yahoo.com>
parents: 40086
diff changeset
   758
    options[b'flagprocessors'] = {}
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   759
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   760
    if b'revlogv1' in requirements:
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   761
        options[b'revlogv1'] = True
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   762
    if REVLOGV2_REQUIREMENT in requirements:
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   763
        options[b'revlogv2'] = True
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   764
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   765
    if b'generaldelta' in requirements:
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   766
        options[b'generaldelta'] = True
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   767
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   768
    # experimental config: format.chunkcachesize
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   769
    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
   770
    if chunkcachesize is not None:
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   771
        options[b'chunkcachesize'] = chunkcachesize
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   772
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   773
    deltabothparents = ui.configbool(b'storage',
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   774
                                     b'revlog.optimize-delta-parent-choice')
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   775
    options[b'deltabothparents'] = deltabothparents
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   776
41819
688fc33e105d storage: introduce a `revlog.reuse-external-delta` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41818
diff changeset
   777
    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
   778
    lazydeltabase = False
688fc33e105d storage: introduce a `revlog.reuse-external-delta` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41818
diff changeset
   779
    if lazydelta:
688fc33e105d storage: introduce a `revlog.reuse-external-delta` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41818
diff changeset
   780
        lazydeltabase = ui.configbool(b'storage',
688fc33e105d storage: introduce a `revlog.reuse-external-delta` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41818
diff changeset
   781
                                      b'revlog.reuse-external-delta-parent')
41818
f6eff9e4de80 storage: introduce a `revlog.reuse-external-delta-parent` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41774
diff changeset
   782
    if lazydeltabase is None:
f6eff9e4de80 storage: introduce a `revlog.reuse-external-delta-parent` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41774
diff changeset
   783
        lazydeltabase = not scmutil.gddeltaconfig(ui)
41819
688fc33e105d storage: introduce a `revlog.reuse-external-delta` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41818
diff changeset
   784
    options[b'lazydelta'] = lazydelta
41818
f6eff9e4de80 storage: introduce a `revlog.reuse-external-delta-parent` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41774
diff changeset
   785
    options[b'lazydeltabase'] = lazydeltabase
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   786
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   787
    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
   788
    if 0 <= chainspan:
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   789
        options[b'maxdeltachainspan'] = chainspan
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   790
41296
d82dd55024e7 mmap: backed out changeset 875d2af8cb4e
Boris Feld <boris.feld@octobus.net>
parents: 41236
diff changeset
   791
    mmapindexthreshold = ui.configbytes(b'experimental',
d82dd55024e7 mmap: backed out changeset 875d2af8cb4e
Boris Feld <boris.feld@octobus.net>
parents: 41236
diff changeset
   792
                                        b'mmapindexthreshold')
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   793
    if mmapindexthreshold is not None:
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   794
        options[b'mmapindexthreshold'] = mmapindexthreshold
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   795
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   796
    withsparseread = ui.configbool(b'experimental', b'sparse-read')
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   797
    srdensitythres = float(ui.config(b'experimental',
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   798
                                     b'sparse-read.density-threshold'))
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   799
    srmingapsize = ui.configbytes(b'experimental',
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   800
                                  b'sparse-read.min-gap-size')
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   801
    options[b'with-sparse-read'] = withsparseread
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   802
    options[b'sparse-read-density-threshold'] = srdensitythres
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   803
    options[b'sparse-read-min-gap-size'] = srmingapsize
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   804
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   805
    sparserevlog = SPARSEREVLOG_REQUIREMENT in requirements
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   806
    options[b'sparse-revlog'] = sparserevlog
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   807
    if sparserevlog:
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   808
        options[b'generaldelta'] = True
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   809
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   810
    maxchainlen = None
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   811
    if sparserevlog:
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   812
        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
   813
    # experimental config: format.maxchainlen
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   814
    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
   815
    if maxchainlen is not None:
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   816
        options[b'maxchainlen'] = maxchainlen
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   817
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   818
    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
   819
        # 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
   820
        # 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
   821
        #
10a6725dca6e compression: introduce an official `zstd-revlog` requirement
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42135
diff changeset
   822
        # 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
   823
        prefix = r.startswith
10a6725dca6e compression: introduce an official `zstd-revlog` requirement
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42135
diff changeset
   824
        if prefix('revlog-compression-') or prefix('exp-compression-'):
10a6725dca6e compression: introduce an official `zstd-revlog` requirement
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42135
diff changeset
   825
            options[b'compengine'] = r.split('-', 2)[2]
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   826
42043
1fac9b931d46 compression: introduce a `storage.revlog.zlib.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42004
diff changeset
   827
    options[b'zlib.level'] = ui.configint(b'storage', b'revlog.zlib.level')
1fac9b931d46 compression: introduce a `storage.revlog.zlib.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42004
diff changeset
   828
    if options[b'zlib.level'] is not None:
1fac9b931d46 compression: introduce a `storage.revlog.zlib.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42004
diff changeset
   829
        if not (0 <= options[b'zlib.level'] <= 9):
1fac9b931d46 compression: introduce a `storage.revlog.zlib.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42004
diff changeset
   830
            msg = _('invalid value for `storage.revlog.zlib.level` config: %d')
1fac9b931d46 compression: introduce a `storage.revlog.zlib.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42004
diff changeset
   831
            raise error.Abort(msg % options[b'zlib.level'])
42044
bb271ec2fbfb compression: introduce a `storage.revlog.zstd.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42043
diff changeset
   832
    options[b'zstd.level'] = ui.configint(b'storage', b'revlog.zstd.level')
bb271ec2fbfb compression: introduce a `storage.revlog.zstd.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42043
diff changeset
   833
    if options[b'zstd.level'] is not None:
bb271ec2fbfb compression: introduce a `storage.revlog.zstd.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42043
diff changeset
   834
        if not (0 <= options[b'zstd.level'] <= 22):
bb271ec2fbfb compression: introduce a `storage.revlog.zstd.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42043
diff changeset
   835
            msg = _('invalid value for `storage.revlog.zstd.level` config: %d')
bb271ec2fbfb compression: introduce a `storage.revlog.zstd.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42043
diff changeset
   836
            raise error.Abort(msg % options[b'zstd.level'])
42043
1fac9b931d46 compression: introduce a `storage.revlog.zlib.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42004
diff changeset
   837
39770
7aa440222323 localrepo: enable ellipsis flag on revlogs when repo is narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39765
diff changeset
   838
    if repository.NARROW_REQUIREMENT in requirements:
7aa440222323 localrepo: enable ellipsis flag on revlogs when repo is narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39765
diff changeset
   839
        options[b'enableellipsis'] = True
7aa440222323 localrepo: enable ellipsis flag on revlogs when repo is narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39765
diff changeset
   840
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   841
    return options
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
   842
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   843
def makemain(**kwargs):
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   844
    """Produce a type conforming to ``ilocalrepositorymain``."""
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   845
    return localrepository
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   846
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   847
@interfaceutil.implementer(repository.ilocalrepositoryfilestorage)
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   848
class revlogfilestorage(object):
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   849
    """File storage when using revlogs."""
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   850
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   851
    def file(self, path):
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   852
        if path[0] == b'/':
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   853
            path = path[1:]
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   854
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   855
        return filelog.filelog(self.svfs, path)
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   856
39765
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
   857
@interfaceutil.implementer(repository.ilocalrepositoryfilestorage)
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
   858
class revlognarrowfilestorage(object):
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
   859
    """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
   860
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
   861
    def file(self, path):
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
   862
        if path[0] == b'/':
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
   863
            path = path[1:]
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
   864
41230
d2d716cc0700 narrow: extract repo property for store narrowmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 41229
diff changeset
   865
        return filelog.narrowfilelog(self.svfs, path, self._storenarrowmatch)
39765
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
   866
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
   867
def makefilestorage(requirements, features, **kwargs):
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   868
    """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
   869
    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
   870
    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
   871
39765
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
   872
    if repository.NARROW_REQUIREMENT in requirements:
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
   873
        return revlognarrowfilestorage
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
   874
    else:
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
   875
        return revlogfilestorage
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   876
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   877
# 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
   878
# 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
   879
# 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
   880
# 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
   881
# functions can be wrapped.
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   882
REPO_INTERFACES = [
39994
6962ebc8f817 localrepo: capture repo interface factory functions as lambas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39959
diff changeset
   883
    (repository.ilocalrepositorymain, lambda: makemain),
6962ebc8f817 localrepo: capture repo interface factory functions as lambas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39959
diff changeset
   884
    (repository.ilocalrepositoryfilestorage, lambda: makefilestorage),
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   885
]
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   886
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   887
@interfaceutil.implementer(repository.ilocalrepositorymain)
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   888
class localrepository(object):
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   889
    """Main class for representing local repositories.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   890
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   891
    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
   892
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   893
    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
   894
    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
   895
    ``hg.repository()``, ``localrepo.instance()``, or
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   896
    ``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
   897
    ``instance()`` adds support for creating new repositories.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   898
    ``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
   899
    ``reposetup()``. Generally speaking, ``hg.repository()`` should be
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   900
    used.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
   901
    """
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   902
36373
0147a4730420 cleanup: say goodbye to manifestv2 format
Augie Fackler <augie@google.com>
parents: 36178
diff changeset
   903
    # obsolete experimental requirements:
0147a4730420 cleanup: say goodbye to manifestv2 format
Augie Fackler <augie@google.com>
parents: 36178
diff changeset
   904
    #  - manifestv2: An experimental new manifest format that allowed
0147a4730420 cleanup: say goodbye to manifestv2 format
Augie Fackler <augie@google.com>
parents: 36178
diff changeset
   905
    #    for stem compression of long paths. Experiment ended up not
0147a4730420 cleanup: say goodbye to manifestv2 format
Augie Fackler <augie@google.com>
parents: 36178
diff changeset
   906
    #    being successful (repository sizes went up due to worse delta
0147a4730420 cleanup: say goodbye to manifestv2 format
Augie Fackler <augie@google.com>
parents: 36178
diff changeset
   907
    #    chains), and the code was deleted in 4.6.
32314
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32312
diff changeset
   908
    supportedformats = {
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32312
diff changeset
   909
        'revlogv1',
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32312
diff changeset
   910
        'generaldelta',
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32312
diff changeset
   911
        'treemanifest',
32697
19b9fc40cc51 revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32660
diff changeset
   912
        REVLOGV2_REQUIREMENT,
38717
aa21a9ad46ea sparse-revlog: new requirement enabled with format.sparse-revlog
Paul Morelle <paul.morelle@octobus.net>
parents: 38239
diff changeset
   913
        SPARSEREVLOG_REQUIREMENT,
42325
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42300
diff changeset
   914
        bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT,
32314
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32312
diff changeset
   915
    }
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32312
diff changeset
   916
    _basesupported = supportedformats | {
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32312
diff changeset
   917
        'store',
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32312
diff changeset
   918
        'fncache',
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32312
diff changeset
   919
        'shared',
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32312
diff changeset
   920
        'relshared',
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32312
diff changeset
   921
        'dotencode',
33556
22371eabb3b1 sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33541
diff changeset
   922
        'exp-sparse',
39298
7a9f15ed3b96 phases: add a repository requirement about internal phase
Boris Feld <boris.feld@octobus.net>
parents: 39111
diff changeset
   923
        'internal-phase'
32314
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32312
diff changeset
   924
    }
17137
b090601a80d1 localrepo: make requirements and openerreqs mutable by subclasses
Bryan O'Sullivan <bryano@fb.com>
parents: 17075
diff changeset
   925
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   926
    # 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
   927
    # 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
   928
    _wlockfreeprefix = {
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   929
        # 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
   930
        # 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
   931
        # 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
   932
        # now.
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   933
        'hgrc',
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   934
        'requires',
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   935
        # 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
   936
        # should investigate this in depth at some point
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   937
        'cache/',
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   938
        # XXX shouldn't be dirstate covered by the wlock?
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   939
        'dirstate',
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   940
        # 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
   941
        # 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
   942
        # the remainig bit and drop this line
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   943
        'bisect.state',
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   944
    }
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   945
39692
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
   946
    def __init__(self, baseui, ui, origroot, wdirvfs, hgvfs, requirements,
40795
e1c3a2e9df59 repo: add a `wcachevfs` to access the `.hg/wcache/` directory
Boris Feld <boris.feld@octobus.net>
parents: 40794
diff changeset
   947
                 supportedrequirements, sharedpath, store, cachevfs, wcachevfs,
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
   948
                 features, intents=None):
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
   949
        """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
   950
39688
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   951
        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
   952
        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
   953
        object.
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   954
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   955
        Arguments:
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   956
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   957
        baseui
39689
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
   958
           ``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
   959
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
   960
        ui
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
   961
           ``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
   962
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   963
        origroot
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   964
           ``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
   965
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   966
        wdirvfs
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   967
           ``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
   968
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   969
        hgvfs
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   970
           ``vfs.vfs`` rooted at .hg/
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   971
39692
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
   972
        requirements
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
   973
           ``set`` of bytestrings representing repository opening requirements.
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
   974
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   975
        supportedrequirements
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
   976
           ``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
   977
           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
   978
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   979
        sharedpath
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   980
           ``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
   981
           ``.hg/`` directory somewhere.
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   982
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   983
        store
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   984
           ``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
   985
           versioned storage.
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   986
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   987
        cachevfs
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   988
           ``vfs.vfs`` used for cache files.
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
   989
40795
e1c3a2e9df59 repo: add a `wcachevfs` to access the `.hg/wcache/` directory
Boris Feld <boris.feld@octobus.net>
parents: 40794
diff changeset
   990
        wcachevfs
e1c3a2e9df59 repo: add a `wcachevfs` to access the `.hg/wcache/` directory
Boris Feld <boris.feld@octobus.net>
parents: 40794
diff changeset
   991
           ``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
   992
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
   993
        features
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
   994
           ``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
   995
           instance.
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
   996
39688
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   997
        intents
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
   998
           ``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
   999
           for.
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  1000
        """
39688
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1001
        self.baseui = baseui
39689
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
  1002
        self.ui = ui
39688
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1003
        self.origroot = origroot
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1004
        # vfs rooted at working directory.
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1005
        self.wvfs = wdirvfs
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1006
        self.root = wdirvfs.base
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1007
        # 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
  1008
        self.vfs = hgvfs
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1009
        self.path = hgvfs.base
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
  1010
        self.requirements = requirements
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
  1011
        self.supported = supportedrequirements
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
  1012
        self.sharedpath = sharedpath
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
  1013
        self.store = store
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
  1014
        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
  1015
        self.wcachevfs = wcachevfs
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
  1016
        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
  1017
32730
b8ff7d0ff361 localrepo: move filtername to __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32729
diff changeset
  1018
        self.filtername = None
39688
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
  1019
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1020
        if (self.ui.configbool('devel', 'all-warnings') or
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1021
            self.ui.configbool('devel', 'check-locks')):
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1022
            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
  1023
        # 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
  1024
        # 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
  1025
        # 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
  1026
        self._phasedefaults = []
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
  1027
31111
95ec3ad62f62 color: initialize color for the localrepo ui
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31054
diff changeset
  1028
        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
  1029
6840
80e51429cb9a introduce store classes
Adrian Buehlmann <adrian@cadifra.com>
parents: 6839
diff changeset
  1030
        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
  1031
        self.svfs = self.store.vfs
6840
80e51429cb9a introduce store classes
Adrian Buehlmann <adrian@cadifra.com>
parents: 6839
diff changeset
  1032
        self.sjoin = self.store.join
33437
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1033
        if (self.ui.configbool('devel', 'all-warnings') or
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1034
            self.ui.configbool('devel', 'check-locks')):
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1035
            if util.safehasattr(self.svfs, 'vfs'): # this is filtervfs
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1036
                self.svfs.vfs.audit = self._getsvfsward(self.svfs.vfs.audit)
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1037
            else: # standard vfs
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1038
                self.svfs.audit = self._getsvfsward(self.svfs.audit)
3850
a4457828ca1a move code around
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3803
diff changeset
  1039
26155
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
  1040
        self._dirstatevalidatewarned = False
9146
5614a628d173 localrepo: rename in-memory tag cache instance attributes (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9145
diff changeset
  1041
41615
328ca3b9e545 branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents: 41529
diff changeset
  1042
        self._branchcaches = branchmap.BranchMapCache()
24373
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
  1043
        self._revbranchcache = None
37137
db90a5793103 localrepo: make filterpats private (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37135
diff changeset
  1044
        self._filterpats = {}
5966
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
  1045
        self._datafilters = {}
4916
5c5d23d93447 Use a weakref for recursive transactions
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
  1046
        self._transref = self._lockref = self._wlockref = None
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
  1047
14929
4bf9493e7b07 localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents: 14905
diff changeset
  1048
        # 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
  1049
        # (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
  1050
        #
4bf9493e7b07 localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents: 14905
diff changeset
  1051
        # 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
  1052
        self._filecache = {}
4bf9493e7b07 localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents: 14905
diff changeset
  1053
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
  1054
        # 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
  1055
        # 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
  1056
        # - 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
  1057
        # - 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
  1058
        # - 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
  1059
        # - 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
  1060
        # - 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
  1061
        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
  1062
32814
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  1063
        # 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
  1064
        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
  1065
23558
3198aac7a95d namespaces: add bookmarks to the names data structure
Sean Farley <sean.michael.farley@gmail.com>
parents: 23546
diff changeset
  1066
        # generic mapping between names and nodes
23561
3c2419e07df5 namespaces: remove weakref; always pass in repo
Ryan McElroy <rmcelroy@fb.com>
parents: 23558
diff changeset
  1067
        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
  1068
33302
36a415b5a4b2 localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33278
diff changeset
  1069
        # Key to signature value.
36a415b5a4b2 localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33278
diff changeset
  1070
        self._sparsesignaturecache = {}
36a415b5a4b2 localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33278
diff changeset
  1071
        # Signature to cached matcher instance.
36a415b5a4b2 localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33278
diff changeset
  1072
        self._sparsematchercache = {}
36a415b5a4b2 localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33278
diff changeset
  1073
42231
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
  1074
        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
  1075
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1076
    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
  1077
        """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
  1078
        rref = weakref.ref(self)
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1079
        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
  1080
            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
  1081
            repo = rref()
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1082
            if (repo is None
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1083
                or not util.safehasattr(repo, '_wlockref')
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1084
                or not util.safehasattr(repo, '_lockref')):
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1085
                return
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1086
            if mode in (None, 'r', 'rb'):
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1087
                return
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1088
            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
  1089
                # truncate name relative to the repository (.hg)
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1090
                path = path[len(repo.path) + 1:]
33538
54b36d3ff7f6 cachevfs: add a devel warning for cache access though 'vfs'
Boris Feld <boris.feld@octobus.net>
parents: 33533
diff changeset
  1091
            if path.startswith('cache/'):
54b36d3ff7f6 cachevfs: add a devel warning for cache access though 'vfs'
Boris Feld <boris.feld@octobus.net>
parents: 33533
diff changeset
  1092
                msg = 'accessing cache with vfs instead of cachevfs: "%s"'
40754
34f15db81cf0 vfs: extract the audit path logic into a submethod
Boris Feld <boris.feld@octobus.net>
parents: 40751
diff changeset
  1093
                repo.ui.develwarn(msg % path, stacklevel=3, config="cache-vfs")
40751
41b6245c3fc4 vfs: treat 'undo.' file the same as 'journal.' file
Boris Feld <boris.feld@octobus.net>
parents: 40745
diff changeset
  1094
            if path.startswith('journal.') or path.startswith('undo.'):
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1095
                # journal is covered by 'lock'
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1096
                if repo._currentlock(repo._lockref) is None:
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1097
                    repo.ui.develwarn('write with no lock: "%s"' % path,
40754
34f15db81cf0 vfs: extract the audit path logic into a submethod
Boris Feld <boris.feld@octobus.net>
parents: 40751
diff changeset
  1098
                                      stacklevel=3, config='check-locks')
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1099
            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
  1100
                # 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
  1101
                #
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1102
                # 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
  1103
                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
  1104
                    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
  1105
                        return
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1106
                repo.ui.develwarn('write with no wlock: "%s"' % path,
40754
34f15db81cf0 vfs: extract the audit path logic into a submethod
Boris Feld <boris.feld@octobus.net>
parents: 40751
diff changeset
  1107
                                  stacklevel=3, config='check-locks')
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1108
            return ret
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1109
        return checkvfs
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
  1110
33437
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1111
    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
  1112
        """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
  1113
        rref = weakref.ref(self)
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1114
        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
  1115
            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
  1116
            repo = rref()
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1117
            if repo is None or not util.safehasattr(repo, '_lockref'):
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1118
                return
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1119
            if mode in (None, 'r', 'rb'):
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1120
                return
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1121
            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
  1122
                # truncate name relative to the repository (.hg)
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1123
                path = path[len(repo.sharedpath) + 1:]
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1124
            if repo._currentlock(repo._lockref) is None:
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1125
                repo.ui.develwarn('write with no lock: "%s"' % path,
40754
34f15db81cf0 vfs: extract the audit path logic into a submethod
Boris Feld <boris.feld@octobus.net>
parents: 40751
diff changeset
  1126
                                  stacklevel=4)
33437
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1127
            return ret
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1128
        return checksvfs
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
  1129
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
  1130
    def close(self):
24378
9347c15d8136 revbranchcache: write cache even during read operations
Durham Goode <durham@fb.com>
parents: 24373
diff changeset
  1131
        self._writecaches()
9347c15d8136 revbranchcache: write cache even during read operations
Durham Goode <durham@fb.com>
parents: 24373
diff changeset
  1132
9347c15d8136 revbranchcache: write cache even during read operations
Durham Goode <durham@fb.com>
parents: 24373
diff changeset
  1133
    def _writecaches(self):
9347c15d8136 revbranchcache: write cache even during read operations
Durham Goode <durham@fb.com>
parents: 24373
diff changeset
  1134
        if self._revbranchcache:
9347c15d8136 revbranchcache: write cache even during read operations
Durham Goode <durham@fb.com>
parents: 24373
diff changeset
  1135
            self._revbranchcache.write()
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
  1136
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
  1137
    def _restrictcapabilities(self, caps):
33499
0407a51b9d8c codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents: 33454
diff changeset
  1138
        if self.ui.configbool('experimental', 'bundle2-advertise'):
20955
12f161f08d74 bundle2: allow pulling changegroups using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20954
diff changeset
  1139
            caps = set(caps)
35783
c97639ad6874 bundle2: specify what capabilities will be used for
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35749
diff changeset
  1140
            capsblob = bundle2.encodecaps(bundle2.getrepocaps(self,
c97639ad6874 bundle2: specify what capabilities will be used for
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35749
diff changeset
  1141
                                                              role='client'))
28883
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28876
diff changeset
  1142
            caps.add('bundle2=' + urlreq.quote(capsblob))
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
  1143
        return caps
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
  1144
12295
3388ab21d768 localrepo: factor out requirement application and write
Sune Foldager <cryo@cyanite.org>
parents: 12176
diff changeset
  1145
    def _writerequirements(self):
24934
5abd0a76bc8f requires: move requires file writing func from localrepo to scmutil
Drew Gottlieb <drgott@google.com>
parents: 24918
diff changeset
  1146
        scmutil.writerequires(self.vfs, self.requirements)
12295
3388ab21d768 localrepo: factor out requirement application and write
Sune Foldager <cryo@cyanite.org>
parents: 12176
diff changeset
  1147
39312
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
  1148
    # 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
  1149
    # 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
  1150
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
  1151
    @property
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
  1152
    def auditor(self):
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
  1153
        # 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
  1154
        # 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
  1155
        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
  1156
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
  1157
    @property
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
  1158
    def nofsauditor(self):
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
  1159
        # 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
  1160
        # files in subrepos.
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
  1161
        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
  1162
                                    realfs=False, cached=True)
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
  1163
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1164
    def _checknested(self, path):
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1165
        """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
  1166
        if not path.startswith(self.root):
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1167
            return False
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1168
        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
  1169
        normsubpath = util.pconvert(subpath)
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1170
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1171
        # 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
  1172
        # 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
  1173
        #
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1174
        #   $ 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
  1175
        #
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1176
        # 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
  1177
        # parent revision.
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1178
        #
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1179
        # 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
  1180
        # 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
  1181
        # 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
  1182
        # 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
  1183
        # panics when it sees sub/.hg/.
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1184
        #
12174
7bccd04292a2 localrepo: check nested repos against working directory
Martin Geisler <mg@lazybytes.net>
parents: 12166
diff changeset
  1185
        # 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
  1186
        # 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
  1187
        # the filesystem *now*.
7bccd04292a2 localrepo: check nested repos against working directory
Martin Geisler <mg@lazybytes.net>
parents: 12166
diff changeset
  1188
        ctx = self[None]
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1189
        parts = util.splitpath(subpath)
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1190
        while parts:
15722
417127af3996 windows: use normalized path to check repository nesting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15604
diff changeset
  1191
            prefix = '/'.join(parts)
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1192
            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
  1193
                if prefix == normsubpath:
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1194
                    return True
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1195
                else:
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1196
                    sub = ctx.sub(prefix)
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1197
                    return sub.checknested(subpath[len(prefix) + 1:])
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1198
            else:
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1199
                parts.pop()
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1200
        return False
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1201
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
  1202
    def peer(self):
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
  1203
        return localpeer(self) # not cached to avoid reference cycle
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
  1204
17993
1a6f8820eb71 clfilter: introduce an "unfiltered" method on localrepo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17922
diff changeset
  1205
    def unfiltered(self):
1a6f8820eb71 clfilter: introduce an "unfiltered" method on localrepo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17922
diff changeset
  1206
        """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
  1207
18644
3e92772d5383 spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents: 18520
diff changeset
  1208
        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
  1209
        return self
1a6f8820eb71 clfilter: introduce an "unfiltered" method on localrepo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17922
diff changeset
  1210
35492
3ad582b2895c repoview: add visibilityexceptions as an optional argument to repo.filtered()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35309
diff changeset
  1211
    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
  1212
        """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
  1213
e0357a46c39d repoview: improve documentation for `repo.filtered` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42079
diff changeset
  1214
        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
  1215
        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
  1216
e0357a46c39d repoview: improve documentation for `repo.filtered` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42079
diff changeset
  1217
        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
  1218
        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
  1219
        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
  1220
e0357a46c39d repoview: improve documentation for `repo.filtered` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42079
diff changeset
  1221
        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
  1222
        """
42231
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
  1223
        if self._extrafilterid is not None and '%' not in name:
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
  1224
            name = name + '%'  + self._extrafilterid
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
  1225
35248
c752fbe228fb repoview: extract a factory function of proxy class
Yuya Nishihara <yuya@tcha.org>
parents: 35247
diff changeset
  1226
        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
  1227
        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
  1228
42421
d532292eff22 bookmarks: use correct store for "ambiguity check"
Martin von Zweigbergk <martinvonz@google.com>
parents: 42324
diff changeset
  1229
    @mixedrepostorecache(('bookmarks', 'plain'), ('bookmarks.current', 'plain'),
42422
381d8fa53f34 merge with stable
Martin von Zweigbergk <martinvonz@google.com>
parents: 42406 42421
diff changeset
  1230
                         ('bookmarks', ''), ('00changelog.i', ''))
13355
cce2e7b77e36 bookmarks: move property methods into localrepo
Matt Mackall <mpm@selenic.com>
parents: 13341
diff changeset
  1231
    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
  1232
        # 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
  1233
        # 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
  1234
        # condition here.
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1235
        #
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1236
        # 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
  1237
        # 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
  1238
        # 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
  1239
        # 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
  1240
        #
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1241
        # 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
  1242
        #
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1243
        # 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
  1244
        # 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
  1245
        # 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
  1246
        # 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
  1247
        # 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
  1248
        # "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
  1249
        # "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
  1250
        # 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
  1251
        # 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
  1252
        #
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1253
        # 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
  1254
        # 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
  1255
        # 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
  1256
        # 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
  1257
        # 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
  1258
        # 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
  1259
        # 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
  1260
        # (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
  1261
        # 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
  1262
        #
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1263
        # 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
  1264
        # 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
  1265
        # 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
  1266
        # 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
  1267
        #
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1268
        # 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
  1269
        #
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1270
        # 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
  1271
        # 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
  1272
        # 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
  1273
        # 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
  1274
        # 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
  1275
        #
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
  1276
        # 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
  1277
        # 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
  1278
        #  * 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
  1279
        #  * 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
  1280
        self._refreshchangelog()
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17857
diff changeset
  1281
        return bookmarks.bmstore(self)
13355
cce2e7b77e36 bookmarks: move property methods into localrepo
Matt Mackall <mpm@selenic.com>
parents: 13341
diff changeset
  1282
42510
3472a3f9d785 localrepo: introduce a `_refreshchangelog` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42421
diff changeset
  1283
    def _refreshchangelog(self):
3472a3f9d785 localrepo: introduce a `_refreshchangelog` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42421
diff changeset
  1284
        """make sure the in memory changelog match the on-disk one"""
3472a3f9d785 localrepo: introduce a `_refreshchangelog` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42421
diff changeset
  1285
        if ('changelog' in vars(self) and self.currenttransaction() is None):
3472a3f9d785 localrepo: introduce a `_refreshchangelog` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42421
diff changeset
  1286
            del self.changelog
3472a3f9d785 localrepo: introduce a `_refreshchangelog` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42421
diff changeset
  1287
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27522
diff changeset
  1288
    @property
24947
a02d293a1079 bookmarks: rename bookmarkcurrent to activebookmark (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24946
diff changeset
  1289
    def _activebookmark(self):
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27522
diff changeset
  1290
        return self._bookmarks.active
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
  1291
35309
d13526333835 phases: drop the list with phase of each rev, always comput phase sets
Joerg Sonnenberger <joerg@bec.de>
parents: 35308
diff changeset
  1292
    # _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
  1293
    # _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
  1294
    # can't be easily expressed in filecache mechanism.
c15d8f84343e localrepo: recreate phasecache if changelog was modified (issue4855)
Yuya Nishihara <yuya@tcha.org>
parents: 25878
diff changeset
  1295
    @storecache('phaseroots', '00changelog.i')
16657
b6081c2c4647 phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents: 16646
diff changeset
  1296
    def _phasecache(self):
b6081c2c4647 phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents: 16646
diff changeset
  1297
        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
  1298
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents: 17013
diff changeset
  1299
    @storecache('obsstore')
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents: 17013
diff changeset
  1300
    def obsstore(self):
32729
c8177792fef6 obsolete: move obsstore creation logic from localrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32697
diff changeset
  1301
        return obsolete.makestore(self.ui, self)
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents: 17013
diff changeset
  1302
16198
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16144
diff changeset
  1303
    @storecache('00changelog.i')
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8244
diff changeset
  1304
    def changelog(self):
42905
3df3b139a43d localrepo: push manifestlog and changelog construction code into store
Augie Fackler <augie@google.com>
parents: 42814
diff changeset
  1305
        return self.store.changelog(txnutil.mayhavepending(self.root))
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8244
diff changeset
  1306
30219
3c8811efdddc manifest: make manifestlog a storecache
Durham Goode <durham@fb.com>
parents: 30218
diff changeset
  1307
    @storecache('00manifest.i')
29825
426d931e5db2 manifest: introduce manifestlog and manifestctx classes
Durham Goode <durham@fb.com>
parents: 29709
diff changeset
  1308
    def manifestlog(self):
42905
3df3b139a43d localrepo: push manifestlog and changelog construction code into store
Augie Fackler <augie@google.com>
parents: 42814
diff changeset
  1309
        return self.store.manifestlog(self, self._storenarrowmatch)
29825
426d931e5db2 manifest: introduce manifestlog and manifestctx classes
Durham Goode <durham@fb.com>
parents: 29709
diff changeset
  1310
18014
a39fe76c4c65 clfilter: ensure that filecache on localrepo is unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18013
diff changeset
  1311
    @repofilecache('dirstate')
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8244
diff changeset
  1312
    def dirstate(self):
38128
1cba497491be narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents: 37848
diff changeset
  1313
        return self._makedirstate()
1cba497491be narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents: 37848
diff changeset
  1314
1cba497491be narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents: 37848
diff changeset
  1315
    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
  1316
        """Extension point for wrapping the dirstate per-repo."""
33373
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33336
diff changeset
  1317
        sparsematchfn = lambda: sparse.matcher(self)
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33336
diff changeset
  1318
26155
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
  1319
        return dirstate.dirstate(self.vfs, self.ui, self.root,
33373
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33336
diff changeset
  1320
                                 self._dirstatevalidate, sparsematchfn)
13032
e41e2b79883d dirstate: warn on invalid parents rather than aborting
Matt Mackall <mpm@selenic.com>
parents: 13001
diff changeset
  1321
26155
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
  1322
    def _dirstatevalidate(self, node):
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
  1323
        try:
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
  1324
            self.changelog.rev(node)
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
  1325
            return node
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
  1326
        except error.LookupError:
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
  1327
            if not self._dirstatevalidatewarned:
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
  1328
                self._dirstatevalidatewarned = True
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
  1329
                self.ui.warn(_("warning: ignoring unknown"
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
  1330
                               " working parent %s!\n") % short(node))
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
  1331
            return nullid
2155
ff255b41b4aa support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2150
diff changeset
  1332
38872
576eef1ab43d narrow: move .hg/narrowspec to .hg/store/narrowspec (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 38869
diff changeset
  1333
    @storecache(narrowspec.FILENAME)
36471
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1334
    def narrowpats(self):
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1335
        """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
  1336
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1337
        A tuple of (includes, excludes).
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1338
        """
39758
543f26ece6cf narrow: remove hack to read narowspec from shared .hg directory
Martin von Zweigbergk <martinvonz@google.com>
parents: 39700
diff changeset
  1339
        return narrowspec.load(self)
36471
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1340
38872
576eef1ab43d narrow: move .hg/narrowspec to .hg/store/narrowspec (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 38869
diff changeset
  1341
    @storecache(narrowspec.FILENAME)
41230
d2d716cc0700 narrow: extract repo property for store narrowmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 41229
diff changeset
  1342
    def _storenarrowmatch(self):
d2d716cc0700 narrow: extract repo property for store narrowmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 41229
diff changeset
  1343
        if repository.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
  1344
            return matchmod.always()
41230
d2d716cc0700 narrow: extract repo property for store narrowmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 41229
diff changeset
  1345
        include, exclude = self.narrowpats
d2d716cc0700 narrow: extract repo property for store narrowmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 41229
diff changeset
  1346
        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
  1347
d2d716cc0700 narrow: extract repo property for store narrowmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 41229
diff changeset
  1348
    @storecache(narrowspec.FILENAME)
36471
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1349
    def _narrowmatch(self):
38835
a232e6744ba3 narrow: move requirement constant from changegroup to repository
Martin von Zweigbergk <martinvonz@google.com>
parents: 38783
diff changeset
  1350
        if repository.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
  1351
            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
  1352
        narrowspec.checkworkingcopynarrowspec(self)
36471
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1353
        include, exclude = self.narrowpats
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1354
        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
  1355
40086
41fcdfe3bfeb narrow: allow repo.narrowmatch(match) to include exact matches from "match"
Martin von Zweigbergk <martinvonz@google.com>
parents: 40082
diff changeset
  1356
    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
  1357
        """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
  1358
4fd0fac48922 localrepo: allow narrowmatch() to accept matcher to intersect with
Martin von Zweigbergk <martinvonz@google.com>
parents: 40064
diff changeset
  1359
        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
  1360
        matcher.
40086
41fcdfe3bfeb narrow: allow repo.narrowmatch(match) to include exact matches from "match"
Martin von Zweigbergk <martinvonz@google.com>
parents: 40082
diff changeset
  1361
41fcdfe3bfeb narrow: allow repo.narrowmatch(match) to include exact matches from "match"
Martin von Zweigbergk <martinvonz@google.com>
parents: 40082
diff changeset
  1362
        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
  1363
        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
  1364
        """
4fd0fac48922 localrepo: allow narrowmatch() to accept matcher to intersect with
Martin von Zweigbergk <martinvonz@google.com>
parents: 40064
diff changeset
  1365
        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
  1366
            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
  1367
                # 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
  1368
                # 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
  1369
                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
  1370
                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
  1371
                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
  1372
            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
  1373
        return self._narrowmatch
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1374
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1375
    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
  1376
        narrowspec.save(self, newincludes, newexcludes)
36471
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1377
        self.invalidate(clearfilecache=True)
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
  1378
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
  1379
    def __getitem__(self, changeid):
32660
a722c8e17363 localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 32481
diff changeset
  1380
        if changeid is None:
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
  1381
            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
  1382
        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
  1383
            return changeid
23630
b9af235810cc localrepo.__getitem__: add slicing support
Eric Sumner <ericsumner@fb.com>
parents: 23561
diff changeset
  1384
        if isinstance(changeid, slice):
32660
a722c8e17363 localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 32481
diff changeset
  1385
            # wdirrev isn't contiguous so the slice shouldn't include it
39957
e1e3d1b498d3 context: reduce dependence of changectx constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 39854
diff changeset
  1386
            return [self[i]
38783
e7aa113b14f7 global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38781
diff changeset
  1387
                    for i in pycompat.xrange(*changeid.indices(len(self)))
23630
b9af235810cc localrepo.__getitem__: add slicing support
Eric Sumner <ericsumner@fb.com>
parents: 23561
diff changeset
  1388
                    if i not in self.changelog.filteredrevs]
32660
a722c8e17363 localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 32481
diff changeset
  1389
        try:
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1390
            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
  1391
                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
  1392
                rev = changeid
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1393
            elif changeid == 'null':
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1394
                node = nullid
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1395
                rev = nullrev
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1396
            elif changeid == 'tip':
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1397
                node = self.changelog.tip()
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1398
                rev = self.changelog.rev(node)
39959
43d3b09b3e5a repo: move unfiltered-repo optimization to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 39958
diff changeset
  1399
            elif changeid == '.':
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1400
                # 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
  1401
                # 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
  1402
                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
  1403
                rev = self.unfiltered().changelog.rev(node)
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1404
            elif len(changeid) == 20:
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1405
                try:
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1406
                    node = changeid
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1407
                    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
  1408
                except error.FilteredLookupError:
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1409
                    changeid = hex(changeid) # for the error message
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1410
                    raise
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1411
                except LookupError:
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1412
                    # 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
  1413
                    #
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1414
                    # 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
  1415
                    # exception for filtered changeset access
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1416
                    if (self.local()
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1417
                        and changeid in self.unfiltered().dirstate.parents()):
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1418
                        msg = _("working directory has unknown parent '%s'!")
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1419
                        raise error.Abort(msg % short(changeid))
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1420
                    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
  1421
                    raise
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1422
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1423
            elif len(changeid) == 40:
40063
f84d7ed3bb35 repo: remove the last few "pass" statements in localrepo.__getitem__
Martin von Zweigbergk <martinvonz@google.com>
parents: 40056
diff changeset
  1424
                node = bin(changeid)
f84d7ed3bb35 repo: remove the last few "pass" statements in localrepo.__getitem__
Martin von Zweigbergk <martinvonz@google.com>
parents: 40056
diff changeset
  1425
                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
  1426
            else:
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1427
                raise error.ProgrammingError(
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1428
                        "unsupported changeid '%s' of type %s" %
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1429
                        (changeid, type(changeid)))
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1430
40064
5c3585a58845 repo: create changectx in a single place in localrepo.__getitem__
Martin von Zweigbergk <martinvonz@google.com>
parents: 40063
diff changeset
  1431
            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
  1432
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1433
        except (error.FilteredIndexError, error.FilteredLookupError):
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1434
            raise error.FilteredRepoLookupError(_("filtered revision '%s'")
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
  1435
                                                % pycompat.bytestr(changeid))
40063
f84d7ed3bb35 repo: remove the last few "pass" statements in localrepo.__getitem__
Martin von Zweigbergk <martinvonz@google.com>
parents: 40056
diff changeset
  1436
        except (IndexError, LookupError):
40353
a2ebdca4d10e localrepo: ensure we properly %-format int in exception throw
Augie Fackler <augie@google.com>
parents: 40324
diff changeset
  1437
            raise error.RepoLookupError(
a2ebdca4d10e localrepo: ensure we properly %-format int in exception throw
Augie Fackler <augie@google.com>
parents: 40324
diff changeset
  1438
                _("unknown revision '%s'") % pycompat.bytestr(changeid))
32660
a722c8e17363 localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 32481
diff changeset
  1439
        except error.WdirUnsupported:
a722c8e17363 localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 32481
diff changeset
  1440
            return context.workingctx(self)
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
  1441
9924
ea3acaae25bb localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9820
diff changeset
  1442
    def __contains__(self, changeid):
32481
a87dabb053d0 localrepo: document that __contains__() may raise LookupError
Yuya Nishihara <yuya@tcha.org>
parents: 32452
diff changeset
  1443
        """True if the given changeid exists
a87dabb053d0 localrepo: document that __contains__() may raise LookupError
Yuya Nishihara <yuya@tcha.org>
parents: 32452
diff changeset
  1444
38841
df0873ab5c14 revlog: use specialized exception for ambiguous prefix lookup
Martin von Zweigbergk <martinvonz@google.com>
parents: 38835
diff changeset
  1445
        error.AmbiguousPrefixLookupError is raised if an ambiguous node
df0873ab5c14 revlog: use specialized exception for ambiguous prefix lookup
Martin von Zweigbergk <martinvonz@google.com>
parents: 38835
diff changeset
  1446
        specified.
32481
a87dabb053d0 localrepo: document that __contains__() may raise LookupError
Yuya Nishihara <yuya@tcha.org>
parents: 32452
diff changeset
  1447
        """
9924
ea3acaae25bb localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9820
diff changeset
  1448
        try:
24320
b9f7f3eeb99c localrepo: extend "changeid in repo" to return True for workingctx revision
Yuya Nishihara <yuya@tcha.org>
parents: 24306
diff changeset
  1449
            self[changeid]
b9f7f3eeb99c localrepo: extend "changeid in repo" to return True for workingctx revision
Yuya Nishihara <yuya@tcha.org>
parents: 24306
diff changeset
  1450
            return True
37797
43221a57e22f context: translate FilteredIndex/LookupError at repo[changeid] (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37717
diff changeset
  1451
        except error.RepoLookupError:
9924
ea3acaae25bb localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9820
diff changeset
  1452
            return False
ea3acaae25bb localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9820
diff changeset
  1453
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
  1454
    def __nonzero__(self):
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
  1455
        return True
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
  1456
31476
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31466
diff changeset
  1457
    __bool__ = __nonzero__
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31466
diff changeset
  1458
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
  1459
    def __len__(self):
35736
29f57ce416ed localrepo: micro-optimize __len__() to bypass repoview
Yuya Nishihara <yuya@tcha.org>
parents: 35726
diff changeset
  1460
        # 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
  1461
        unfi = self.unfiltered()
29f57ce416ed localrepo: micro-optimize __len__() to bypass repoview
Yuya Nishihara <yuya@tcha.org>
parents: 35726
diff changeset
  1462
        return len(unfi.changelog)
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
  1463
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
  1464
    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
  1465
        return iter(self.changelog)
2155
ff255b41b4aa support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2150
diff changeset
  1466
15403
e27561eb4a76 localrepo: add revs helper method
Matt Mackall <mpm@selenic.com>
parents: 15381
diff changeset
  1467
    def revs(self, expr, *args):
27071
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
  1468
        '''Find revisions matching a revset.
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
  1469
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
  1470
        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
  1471
        %-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
  1472
29417
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29373
diff changeset
  1473
        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
  1474
        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
  1475
        ``repo.anyrevs([expr], user=True)``.
29417
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29373
diff changeset
  1476
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29373
diff changeset
  1477
        Returns a revset.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
  1478
        that contains integer revisions.
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
  1479
        '''
41222
8aca89a694d4 revset: introduce an API that avoids `formatspec` input serialization
Boris Feld <boris.feld@octobus.net>
parents: 41202
diff changeset
  1480
        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
  1481
        return revset.makematcher(tree)(self)
15403
e27561eb4a76 localrepo: add revs helper method
Matt Mackall <mpm@selenic.com>
parents: 15381
diff changeset
  1482
14902
96a72cbc6c29 localrepo: add set method to iterate over a given revset
Matt Mackall <mpm@selenic.com>
parents: 14870
diff changeset
  1483
    def set(self, expr, *args):
27071
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
  1484
        '''Find revisions matching a revset and emit changectx instances.
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
  1485
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
  1486
        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
  1487
        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
  1488
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29373
diff changeset
  1489
        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
  1490
        user aliases, consider calling ``scmutil.revrange()``.
14902
96a72cbc6c29 localrepo: add set method to iterate over a given revset
Matt Mackall <mpm@selenic.com>
parents: 14870
diff changeset
  1491
        '''
15403
e27561eb4a76 localrepo: add revs helper method
Matt Mackall <mpm@selenic.com>
parents: 15381
diff changeset
  1492
        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
  1493
            yield self[r]
96a72cbc6c29 localrepo: add set method to iterate over a given revset
Matt Mackall <mpm@selenic.com>
parents: 14870
diff changeset
  1494
33336
4672db164c98 revset: make repo.anyrevs accept customized alias override (API)
Jun Wu <quark@fb.com>
parents: 33302
diff changeset
  1495
    def anyrevs(self, specs, user=False, localalias=None):
31025
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31024
diff changeset
  1496
        '''Find revisions matching one of the given revsets.
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31024
diff changeset
  1497
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31024
diff changeset
  1498
        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
  1499
        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
  1500
        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
  1501
        ``{name: definitionstring}``.
31025
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31024
diff changeset
  1502
        '''
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31024
diff changeset
  1503
        if user:
37674
f83cb91b052e revset: pass in lookup function instead of repo (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37670
diff changeset
  1504
            m = revset.matchany(self.ui, specs,
f83cb91b052e revset: pass in lookup function instead of repo (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37670
diff changeset
  1505
                                lookup=revset.lookupfn(self),
33336
4672db164c98 revset: make repo.anyrevs accept customized alias override (API)
Jun Wu <quark@fb.com>
parents: 33302
diff changeset
  1506
                                localalias=localalias)
31025
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31024
diff changeset
  1507
        else:
33336
4672db164c98 revset: make repo.anyrevs accept customized alias override (API)
Jun Wu <quark@fb.com>
parents: 33302
diff changeset
  1508
            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
  1509
        return m(self)
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31024
diff changeset
  1510
2673
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2661
diff changeset
  1511
    def url(self):
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2661
diff changeset
  1512
        return 'file:' + self.root
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2661
diff changeset
  1513
1718
c1996b84d4f5 make hook code nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1717
diff changeset
  1514
    def hook(self, name, throw=False, **args):
21866
a2ca9dcb4b77 localrepo: document localrepo.hook()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21702
diff changeset
  1515
        """Call a hook, passing this repo instance.
a2ca9dcb4b77 localrepo: document localrepo.hook()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21702
diff changeset
  1516
a2ca9dcb4b77 localrepo: document localrepo.hook()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21702
diff changeset
  1517
        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
  1518
        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
  1519
        replacing code that is expected to call a hook.
a2ca9dcb4b77 localrepo: document localrepo.hook()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21702
diff changeset
  1520
        """
4622
fff50306e6dd hooks: separate hook code into a separate module
Matt Mackall <mpm@selenic.com>
parents: 4619
diff changeset
  1521
        return hook.hook(self.ui, self, name, throw, **args)
487
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
  1522
18013
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
  1523
    @filteredpropertycache
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  1524
    def _tagscache(self):
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
  1525
        '''Returns a tagscache object that contains various tags related
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
  1526
        caches.'''
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  1527
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  1528
        # 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
  1529
        # function (this one) and the rest simply fetch things from it.
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  1530
        class tagscache(object):
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  1531
            def __init__(self):
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  1532
                # 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
  1533
                # 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
  1534
                # '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
  1535
                # 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
  1536
                # 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
  1537
                self.tags = self.tagtypes = None
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  1538
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  1539
                self.nodetagscache = self.tagslist = None
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  1540
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  1541
        cache = tagscache()
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  1542
        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
  1543
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  1544
        return cache
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  1545
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
  1546
    def tags(self):
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
  1547
        '''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
  1548
        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
  1549
        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
  1550
            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
  1551
        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
  1552
            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
  1553
        rev = self.changelog.rev
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
  1554
        for k, v in tags.iteritems():
16371
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
  1555
            try:
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
  1556
                # 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
  1557
                rev(v)
16371
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
  1558
                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
  1559
            except (error.LookupError, ValueError):
16371
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
  1560
                pass
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
  1561
        return t
4210
caff92047e87 Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents: 4178
diff changeset
  1562
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
  1563
    def _findtags(self):
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
  1564
        '''Do the hard work of finding tags.  Return a pair of dicts
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
  1565
        (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
  1566
        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
  1567
        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
  1568
        should be aware that the returned dicts will be retained for the
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
  1569
        duration of the localrepo object.'''
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
  1570
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
  1571
        # 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
  1572
        # 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
  1573
        # 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
  1574
        # 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
  1575
        # quo fine?
4210
caff92047e87 Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents: 4178
diff changeset
  1576
659
3662e3d6b690 Whitespace cleanup
Matt Mackall <mpm@selenic.com>
parents: 658
diff changeset
  1577
31709
c34c170b25f3 tags: only return 'alltags' in 'findglobaltags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31706
diff changeset
  1578
        # 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
  1579
        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
  1580
        # map tag name to tag type
c34c170b25f3 tags: only return 'alltags' in 'findglobaltags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31706
diff changeset
  1581
        tagtypes = dict((tag, '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
  1582
10651
5f091fc1bab7 style: use consistent variable names (*mod) with imports which would shadow
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10547
diff changeset
  1583
        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
  1584
9152
4017291c4c48 tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents: 9151
diff changeset
  1585
        # 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
  1586
        # 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
  1587
        # 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
  1588
        # local encoding.
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
  1589
        tags = {}
9147
234a230cc33b localrepo: improve readability of _findtags(), readtags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9146
diff changeset
  1590
        for (name, (node, hist)) in alltags.iteritems():
234a230cc33b localrepo: improve readability of _findtags(), readtags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9146
diff changeset
  1591
            if node != nullid:
16371
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
  1592
                tags[encoding.tolocal(name)] = node
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
  1593
        tags['tip'] = self.changelog.tip()
9152
4017291c4c48 tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents: 9151
diff changeset
  1594
        tagtypes = dict([(encoding.tolocal(name), value)
4017291c4c48 tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents: 9151
diff changeset
  1595
                         for (name, value) in tagtypes.iteritems()])
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
  1596
        return (tags, tagtypes)
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
  1597
5657
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
  1598
    def tagtype(self, tagname):
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
  1599
        '''
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
  1600
        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
  1601
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
  1602
        '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
  1603
        '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
  1604
        None     : tag does not exist
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
  1605
        '''
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
  1606
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  1607
        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
  1608
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
  1609
    def tagslist(self):
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
  1610
        '''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
  1611
        if not self._tagscache.tagslist:
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  1612
            l = []
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  1613
            for t, n in self.tags().iteritems():
22201
269688a398c4 cleanup: fix some list comprehension redefinitions of existing vars
Mads Kiilerich <madski@unity3d.com>
parents: 22080
diff changeset
  1614
                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
  1615
            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
  1616
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  1617
        return self._tagscache.tagslist
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
  1618
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
  1619
    def nodetags(self, node):
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
  1620
        '''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
  1621
        if not self._tagscache.nodetagscache:
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  1622
            nodetagscache = {}
16371
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
  1623
            for t, n in self._tagscache.tags.iteritems():
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  1624
                nodetagscache.setdefault(n, []).append(t)
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  1625
            for tags in nodetagscache.itervalues():
11047
c7dbd6c4877a tags: return tags in sorted order
Eric Eisner <ede@mit.edu>
parents: 10970
diff changeset
  1626
                tags.sort()
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  1627
            self._tagscache.nodetagscache = nodetagscache
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  1628
        return self._tagscache.nodetagscache.get(node, [])
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
  1629
13384
caa561759538 context: add method to return all bookmarks pointing to a node
David Soria Parra <dsp@php.net>
parents: 13365
diff changeset
  1630
    def nodebookmarks(self, node):
27166
263db31329a6 localrepo: document nodebookmarks
Augie Fackler <augie@google.com>
parents: 27165
diff changeset
  1631
        """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
  1632
        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
  1633
12066
d01e28657429 localrepo: introduce method for explicit branch cache update
Georg Brandl <georg@python.org>
parents: 12035
diff changeset
  1634
    def branchmap(self):
20245
4edd179fefb8 help: branch names primarily denote the tipmost unclosed branch head
Mads Kiilerich <madski@unity3d.com>
parents: 20226
diff changeset
  1635
        '''returns a dictionary {branch: [branchheads]} with branchheads
4edd179fefb8 help: branch names primarily denote the tipmost unclosed branch head
Mads Kiilerich <madski@unity3d.com>
parents: 20226
diff changeset
  1636
        ordered by increasing revision number'''
41615
328ca3b9e545 branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents: 41529
diff changeset
  1637
        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
  1638
24373
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
  1639
    @unfilteredmethod
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
  1640
    def revbranchcache(self):
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
  1641
        if not self._revbranchcache:
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
  1642
            self._revbranchcache = branchmap.revbranchcache(self.unfiltered())
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
  1643
        return self._revbranchcache
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
  1644
23775
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  1645
    def branchtip(self, branch, ignoremissing=False):
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  1646
        '''return the tip node for a given branch
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  1647
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  1648
        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
  1649
        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
  1650
        (e.g. namespace).
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  1651
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  1652
        '''
20187
4d6d5ef88538 localrepo: refactor repo.branchtip() to use repo.branchmap().branchtip()
Brodie Rao <brodie@sf.io>
parents: 20184
diff changeset
  1653
        try:
4d6d5ef88538 localrepo: refactor repo.branchtip() to use repo.branchmap().branchtip()
Brodie Rao <brodie@sf.io>
parents: 20184
diff changeset
  1654
            return self.branchmap().branchtip(branch)
4d6d5ef88538 localrepo: refactor repo.branchtip() to use repo.branchmap().branchtip()
Brodie Rao <brodie@sf.io>
parents: 20184
diff changeset
  1655
        except KeyError:
23775
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  1656
            if not ignoremissing:
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  1657
                raise error.RepoLookupError(_("unknown branch '%s'") % branch)
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  1658
            else:
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  1659
                pass
16719
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16716
diff changeset
  1660
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
  1661
    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
  1662
        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
  1663
        if node is None:
fcd7a91dec23 localrepo: don't allow lookup of working directory revision
Martin von Zweigbergk <martinvonz@google.com>
parents: 42062
diff changeset
  1664
            raise error.RepoLookupError(_("unknown revision '%s'") % key)
fcd7a91dec23 localrepo: don't allow lookup of working directory revision
Martin von Zweigbergk <martinvonz@google.com>
parents: 42062
diff changeset
  1665
        return node
67
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
  1666
37351
fdd22bf6398f localrepo: drop "remote" argument from lookupbranch() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37321
diff changeset
  1667
    def lookupbranch(self, key):
42004
0bd730fbcc2b branchcache: introduce hasbranch()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42001
diff changeset
  1668
        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
  1669
            return key
ca739acf1a98 commands: add more robust support for 'hg log -b' (issue2078)
Steve Losh <steve@stevelosh.com>
parents: 10926
diff changeset
  1670
37352
92171562c7f3 localrepo: use revsymbol in lookupbranch() too
Martin von Zweigbergk <martinvonz@google.com>
parents: 37351
diff changeset
  1671
        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
  1672
13723
e615765fdcc7 wireproto: add known([id]) function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13720
diff changeset
  1673
    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
  1674
        cl = self.changelog
b64b6fdc5c9b discovery: properly filter changeset in 'peer.known' (issue4982)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27291
diff changeset
  1675
        nm = cl.nodemap
b64b6fdc5c9b discovery: properly filter changeset in 'peer.known' (issue4982)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27291
diff changeset
  1676
        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
  1677
        result = []
816209eaf963 phases: make secret changeset undiscoverable in all case
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15888
diff changeset
  1678
        for n in nodes:
816209eaf963 phases: make secret changeset undiscoverable in all case
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15888
diff changeset
  1679
            r = nm.get(n)
27319
b64b6fdc5c9b discovery: properly filter changeset in 'peer.known' (issue4982)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27291
diff changeset
  1680
            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
  1681
            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
  1682
        return result
13723
e615765fdcc7 wireproto: add known([id]) function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13720
diff changeset
  1683
926
b765e970c9ff Add a local() method to repository classes
mpm@selenic.com
parents: 923
diff changeset
  1684
    def local(self):
14603
68a43fdd7d80 localrepo: local() returns self
Matt Mackall <mpm@selenic.com>
parents: 14549
diff changeset
  1685
        return self
926
b765e970c9ff Add a local() method to repository classes
mpm@selenic.com
parents: 923
diff changeset
  1686
25623
0bee97fa1fa8 publishing: add helper method to localrepo
Matt Mackall <mpm@selenic.com>
parents: 25290
diff changeset
  1687
    def publishing(self):
25625
ce9e231265c1 publishing: unconditionally trust publishing flag
Matt Mackall <mpm@selenic.com>
parents: 25624
diff changeset
  1688
        # 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
  1689
        # so that we don't finalize changes shared between users via ssh or nfs
33499
0407a51b9d8c codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents: 33454
diff changeset
  1690
        return self.ui.configbool('phases', 'publish', untrusted=True)
25623
0bee97fa1fa8 publishing: add helper method to localrepo
Matt Mackall <mpm@selenic.com>
parents: 25290
diff changeset
  1691
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
  1692
    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
  1693
        # 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
  1694
        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
  1695
            return False
25624
f0745da75056 publishing: use new helper method
Matt Mackall <mpm@selenic.com>
parents: 25623
diff changeset
  1696
        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
  1697
            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
  1698
        # if publishing we can't copy if there is filtered content
a959f7167077 clone: do not turn hidden changeset public on publishing clone (issue3935)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20314
diff changeset
  1699
        return not self.filtered('visible').changelog.filteredrevs
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
  1700
23666
965788d9ae09 localrepo: introduce shared method to check if a repository is shared
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23648
diff changeset
  1701
    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
  1702
        '''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
  1703
        if self.sharedpath != self.path:
965788d9ae09 localrepo: introduce shared method to check if a repository is shared
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23648
diff changeset
  1704
            return 'store'
965788d9ae09 localrepo: introduce shared method to check if a repository is shared
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23648
diff changeset
  1705
        return None
965788d9ae09 localrepo: introduce shared method to check if a repository is shared
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23648
diff changeset
  1706
22362
c9b32c6a2944 localrepo: make it possible to pass multiple path elements to join and wjoin
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 22342
diff changeset
  1707
    def wjoin(self, f, *insidef):
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
  1708
        return self.vfs.reljoin(self.root, f, *insidef)
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
  1709
16551
ebf6d38c9063 localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents: 16536
diff changeset
  1710
    def setparents(self, p1, p2=nullid):
32350
9742f937c971 localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32332
diff changeset
  1711
        with self.dirstate.parentchange():
9742f937c971 localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32332
diff changeset
  1712
            copies = self.dirstate.setparents(p1, p2)
9742f937c971 localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32332
diff changeset
  1713
            pctx = self[p1]
9742f937c971 localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32332
diff changeset
  1714
            if copies:
9742f937c971 localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32332
diff changeset
  1715
                # Adjust copy records, the dirstate cannot do it, it
9742f937c971 localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32332
diff changeset
  1716
                # requires access to parents manifests. Preserve them
9742f937c971 localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32332
diff changeset
  1717
                # only for entries added to first parent.
9742f937c971 localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32332
diff changeset
  1718
                for f in copies:
9742f937c971 localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32332
diff changeset
  1719
                    if f not in pctx and copies[f] in pctx:
9742f937c971 localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32332
diff changeset
  1720
                        self.dirstate.copy(copies[f], f)
9742f937c971 localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32332
diff changeset
  1721
            if p2 == nullid:
9742f937c971 localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32332
diff changeset
  1722
                for f, s in sorted(self.dirstate.copies().items()):
9742f937c971 localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32332
diff changeset
  1723
                    if f not in pctx and s not in pctx:
9742f937c971 localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32332
diff changeset
  1724
                        self.dirstate.copy(None, f)
16551
ebf6d38c9063 localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents: 16536
diff changeset
  1725
37172
daef13da66fe context: avoid using a context object as a changeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37137
diff changeset
  1726
    def filectx(self, path, changeid=None, fileid=None, changectx=None):
40718
5bcf264bb1a0 localrepo: correct docstring of filectx()
Yuya Nishihara <yuya@tcha.org>
parents: 40535
diff changeset
  1727
        """changeid must be a changeset revision, if specified.
2564
55e592041076 Add context helper functions to localrepo
Matt Mackall <mpm@selenic.com>
parents: 2491
diff changeset
  1728
           fileid can be a file revision or node."""
37172
daef13da66fe context: avoid using a context object as a changeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37137
diff changeset
  1729
        return context.filectx(self, path, changeid, fileid,
daef13da66fe context: avoid using a context object as a changeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37137
diff changeset
  1730
                               changectx=changectx)
2564
55e592041076 Add context helper functions to localrepo
Matt Mackall <mpm@selenic.com>
parents: 2491
diff changeset
  1731
627
b6c42714d900 Add locate command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 624
diff changeset
  1732
    def getcwd(self):
870
a82eae840447 Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents: 839
diff changeset
  1733
        return self.dirstate.getcwd()
627
b6c42714d900 Add locate command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 624
diff changeset
  1734
4525
78b6add1f966 Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4516
diff changeset
  1735
    def pathto(self, f, cwd=None):
78b6add1f966 Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4516
diff changeset
  1736
        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
  1737
11698
9df481f8036d localrepo: refactor filter computation
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11669
diff changeset
  1738
    def _loadfilter(self, filter):
37137
db90a5793103 localrepo: make filterpats private (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37135
diff changeset
  1739
        if filter not in self._filterpats:
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
  1740
            l = []
4004
c83c35f2f4e2 unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents: 4003
diff changeset
  1741
            for pat, cmd in self.ui.configitems(filter):
7226
b71a52f101dc Make it possible to disable filtering for a pattern.
Mads Kiilerich <mads@kiilerich.com>
parents: 7208
diff changeset
  1742
                if cmd == '!':
b71a52f101dc Make it possible to disable filtering for a pattern.
Mads Kiilerich <mads@kiilerich.com>
parents: 7208
diff changeset
  1743
                    continue
10651
5f091fc1bab7 style: use consistent variable names (*mod) with imports which would shadow
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10547
diff changeset
  1744
                mf = matchmod.match(self.root, '', [pat])
5966
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
  1745
                fn = None
6066
f3a8b5360100 Strip filter name from command before passing to filter function.
Jesse Glick <jesse.glick@sun.com>
parents: 6065
diff changeset
  1746
                params = cmd
5966
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
  1747
                for name, filterfn in self._datafilters.iteritems():
6210
942287cb1f57 Removed trailing spaces from everything except test output
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6201
diff changeset
  1748
                    if cmd.startswith(name):
5966
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
  1749
                        fn = filterfn
6066
f3a8b5360100 Strip filter name from command before passing to filter function.
Jesse Glick <jesse.glick@sun.com>
parents: 6065
diff changeset
  1750
                        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
  1751
                        break
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
  1752
                if not fn:
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
  1753
                    fn = lambda s, c, **kwargs: procutil.filter(s, c)
5967
f8ad3b76e923 Provide better context for custom Python encode/decode filters.
Jesse Glick <jesse.glick@sun.com>
parents: 5966
diff changeset
  1754
                # Wrap old filters not supporting keyword arguments
36178
646002338365 py3: introduce and use pycompat.getargspec
Augie Fackler <augie@google.com>
parents: 36009
diff changeset
  1755
                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
  1756
                    oldfn = fn
f8ad3b76e923 Provide better context for custom Python encode/decode filters.
Jesse Glick <jesse.glick@sun.com>
parents: 5966
diff changeset
  1757
                    fn = lambda s, c, **kwargs: oldfn(s, c)
6066
f3a8b5360100 Strip filter name from command before passing to filter function.
Jesse Glick <jesse.glick@sun.com>
parents: 6065
diff changeset
  1758
                l.append((mf, fn, params))
37137
db90a5793103 localrepo: make filterpats private (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37135
diff changeset
  1759
            self._filterpats[filter] = l
db90a5793103 localrepo: make filterpats private (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37135
diff changeset
  1760
        return self._filterpats[filter]
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
  1761
12707
2216ab103ea8 localrepo: load filter patterns outside of _filter
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12706
diff changeset
  1762
    def _filter(self, filterpats, filename, data):
2216ab103ea8 localrepo: load filter patterns outside of _filter
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12706
diff changeset
  1763
        for mf, fn, cmd in filterpats:
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
  1764
            if mf(filename):
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9437
diff changeset
  1765
                self.ui.debug("filtering %s through %s\n" % (filename, cmd))
5967
f8ad3b76e923 Provide better context for custom Python encode/decode filters.
Jesse Glick <jesse.glick@sun.com>
parents: 5966
diff changeset
  1766
                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
  1767
                break
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
  1768
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
  1769
        return data
1019
a9cca981c423 Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents: 1013
diff changeset
  1770
18013
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
  1771
    @unfilteredpropertycache
12708
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
  1772
    def _encodefilterpats(self):
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
  1773
        return self._loadfilter('encode')
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
  1774
18013
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
  1775
    @unfilteredpropertycache
12708
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
  1776
    def _decodefilterpats(self):
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
  1777
        return self._loadfilter('decode')
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
  1778
5966
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
  1779
    def adddatafilter(self, name, filter):
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
  1780
        self._datafilters[name] = filter
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
  1781
4004
c83c35f2f4e2 unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents: 4003
diff changeset
  1782
    def wread(self, filename):
31428
9b361478b03a localrepo: use self.wvfs.islink directly
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31418
diff changeset
  1783
        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
  1784
            data = self.wvfs.readlink(filename)
4004
c83c35f2f4e2 unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents: 4003
diff changeset
  1785
        else:
23854
f6070d3a9cb8 localrepo: remove all internal uses of localrepo.wopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23853
diff changeset
  1786
            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
  1787
        return self._filter(self._encodefilterpats, filename, data)
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
  1788
35725
2a7e777c9eed write: add the possibility to pass keyword argument from batchget to vfs
Boris Feld <boris.feld@octobus.net>
parents: 35708
diff changeset
  1789
    def wwrite(self, filename, data, flags, backgroundclose=False, **kwargs):
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
  1790
        """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
  1791
21b33f0460e0 revert: apply normallookup on reverted file if size isn't changed (issue4583)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24825
diff changeset
  1792
        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
  1793
        """
12708
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
  1794
        data = self._filter(self._decodefilterpats, filename, data)
6877
1d38f3605b20 util: set_flags shouldn't know about repo flag formats
Matt Mackall <mpm@selenic.com>
parents: 6875
diff changeset
  1795
        if 'l' in flags:
23854
f6070d3a9cb8 localrepo: remove all internal uses of localrepo.wopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23853
diff changeset
  1796
            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
  1797
        else:
35725
2a7e777c9eed write: add the possibility to pass keyword argument from batchget to vfs
Boris Feld <boris.feld@octobus.net>
parents: 35708
diff changeset
  1798
            self.wvfs.write(filename, data, backgroundclose=backgroundclose,
2a7e777c9eed write: add the possibility to pass keyword argument from batchget to vfs
Boris Feld <boris.feld@octobus.net>
parents: 35708
diff changeset
  1799
                            **kwargs)
6877
1d38f3605b20 util: set_flags shouldn't know about repo flag formats
Matt Mackall <mpm@selenic.com>
parents: 6875
diff changeset
  1800
            if 'x' in flags:
18951
d13916a00b7e localrepo: use "vfs.setflags()" instead of "util.setflags()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18950
diff changeset
  1801
                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
  1802
            else:
45b678bf3a78 atomicupdate: add an experimental option to use atomictemp when updating
Boris Feld <boris.feld@octobus.net>
parents: 35725
diff changeset
  1803
                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
  1804
        return len(data)
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
  1805
4005
656e06eebda7 replace filehandle version of wwrite with wwritedata
Matt Mackall <mpm@selenic.com>
parents: 4004
diff changeset
  1806
    def wwritedata(self, filename, data):
12708
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
  1807
        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
  1808
23379
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
  1809
    def currenttransaction(self):
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
  1810
        """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
  1811
        if self._transref:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
  1812
            tr = self._transref()
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
  1813
        else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
  1814
            tr = None
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
  1815
8072
ecf7795479d5 transaction: support multiple, separate transactions
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 7948
diff changeset
  1816
        if tr and tr.running():
23379
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
  1817
            return tr
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
  1818
        return None
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
  1819
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
  1820
    def transaction(self, desc, report=None):
25290
8f88f768e24c devel: rename 'all' to 'all-warnings' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25274
diff changeset
  1821
        if (self.ui.configbool('devel', 'all-warnings')
24388
026f8af88e49 devel: also warn about transaction started without a lock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24386
diff changeset
  1822
                or self.ui.configbool('devel', 'check-locks')):
29705
41689e293994 develwarn: use the lock helper in local repo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29417
diff changeset
  1823
            if self._currentlock(self._lockref) is None:
30574
f8c9a7d2bbbf localrepo: use ProgrammingError
Jun Wu <quark@fb.com>
parents: 30571
diff changeset
  1824
                raise error.ProgrammingError('transaction requires locking')
23379
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
  1825
        tr = self.currenttransaction()
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
  1826
        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
  1827
            return tr.nest(name=desc)
1806
a2c69737e65e Automatic nesting into running transactions in the same repository.
mason@suse.com
parents: 1802
diff changeset
  1828
5865
e7127f669edb transactions: don't show a backtrace when journal exists
Matt Mackall <mpm@selenic.com>
parents: 5814
diff changeset
  1829
        # abort here if the journal already exists
18947
9b82f93e3a7a localrepo: use "vfs.exists()" instead of "os.path.exists()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18946
diff changeset
  1830
        if self.svfs.exists("journal"):
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  1831
            raise error.RepoError(
21274
3b4c75690206 journal: set Abort hint when failing due to an abandoned transaction
Johan Bjork <jbjoerk@gmail.com>
parents: 21237
diff changeset
  1832
                _("abandoned transaction found"),
3b4c75690206 journal: set Abort hint when failing due to an abandoned transaction
Johan Bjork <jbjoerk@gmail.com>
parents: 21237
diff changeset
  1833
                hint=_("run 'hg recover' to clean up transaction"))
5865
e7127f669edb transactions: don't show a backtrace when journal exists
Matt Mackall <mpm@selenic.com>
parents: 5814
diff changeset
  1834
25267
69c5cab0b893 transaction: separate calculating TXNID from creating transaction object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25219
diff changeset
  1835
        idbase = "%.40f#%f" % (random.random(), time.time())
31523
f42ec07db6a9 localrepo: use node.hex instead of awkward .encode('latin1')
Augie Fackler <augie@google.com>
parents: 31510
diff changeset
  1836
        ha = hex(hashlib.sha1(idbase).digest())
31508
590319c07259 localrepo: ensure transaction id is fully bytes on py3
Augie Fackler <augie@google.com>
parents: 31476
diff changeset
  1837
        txnid = 'TXN:' + ha
25268
a973b050621d localrepo: pass hook argument txnid to pretxnopen hooks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25267
diff changeset
  1838
        self.hook('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
  1839
16236
97efd26eb957 localrepo: refactor retrieving of journal/undo files paths
Idan Kamara <idankk86@gmail.com>
parents: 16208
diff changeset
  1840
        self._writejournal(desc)
18952
8086b530e2ac localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18951
diff changeset
  1841
        renames = [(vfs, x, undoname(x)) for vfs, x in self._journalfiles()]
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
  1842
        if report:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
  1843
            rp = report
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
  1844
        else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
  1845
            rp = self.ui.warn
40056
324b4b10351e revlog: rewrite censoring logic
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40027
diff changeset
  1846
        vfsmap = {'plain': self.vfs, 'store': self.svfs} # root of .hg/
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
  1847
        # 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
  1848
        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
  1849
        # 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
  1850
        #
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  1851
        # 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
  1852
        # 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
  1853
        # 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
  1854
        # 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
  1855
        # 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
  1856
        # 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
  1857
        #
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  1858
        # 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
  1859
        # 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
  1860
        # 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
  1861
        # 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
  1862
        # 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
  1863
        #
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  1864
        # 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
  1865
        # 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
  1866
        #
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  1867
        # 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
  1868
        # 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
  1869
        # 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
  1870
        #     ``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
  1871
        # 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
  1872
        # 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
  1873
        # 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
  1874
        #
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  1875
        #     <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
  1876
        #
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  1877
        # 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
  1878
        #   "-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
  1879
        #   "+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
  1880
        #   "-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
  1881
        #   "+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
  1882
        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
  1883
        # experimental config: experimental.hook-track-tags
33499
0407a51b9d8c codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents: 33454
diff changeset
  1884
        shouldtracktags = self.ui.configbool('experimental', 'hook-track-tags')
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
  1885
        if desc != 'strip' and shouldtracktags:
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  1886
            oldheads = self.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
  1887
            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
  1888
                repo = reporef()
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  1889
                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
  1890
                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
  1891
                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
  1892
                # 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
  1893
                # 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
  1894
                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
  1895
                if changes:
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
  1896
                    tr2.hookargs['tag_moved'] = '1'
31996
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  1897
                    with repo.vfs('changes/tags.changes', 'w',
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  1898
                                  atomictemp=True) as changesfile:
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  1899
                        # 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
  1900
                        # 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
  1901
                        # 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
  1902
                        tagsmod.writediff(changesfile, changes)
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
  1903
        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
  1904
            """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
  1905
            # 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
  1906
            # 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
  1907
            #
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  1908
            # 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
  1909
            # 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
  1910
            # 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
  1911
            #
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  1912
            # 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
  1913
            # 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
  1914
            # 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
  1915
            #
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  1916
            # 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
  1917
            # 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
  1918
            #
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  1919
            # 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
  1920
            # 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
  1921
            tracktags(tr2)
34709
c212947273a7 bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
  1922
            repo = reporef()
35185
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35163
diff changeset
  1923
            if repo.ui.configbool('experimental', 'single-head-per-branch'):
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35163
diff changeset
  1924
                scmutil.enforcesinglehead(repo, tr2, desc)
34709
c212947273a7 bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
  1925
            if hook.hashook(repo.ui, 'pretxnclose-bookmark'):
c212947273a7 bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
  1926
                for name, (old, new) in sorted(tr.changes['bookmarks'].items()):
c212947273a7 bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
  1927
                    args = tr.hookargs.copy()
c212947273a7 bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
  1928
                    args.update(bookmarks.preparehookargs(name, old, new))
c212947273a7 bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
  1929
                    repo.hook('pretxnclose-bookmark', throw=True,
c212947273a7 bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
  1930
                              **pycompat.strkwargs(args))
34711
f6d17075608f phase: add a dedicated pretxnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34710
diff changeset
  1931
            if hook.hashook(repo.ui, 'pretxnclose-phase'):
f6d17075608f phase: add a dedicated pretxnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34710
diff changeset
  1932
                cl = repo.unfiltered().changelog
f6d17075608f phase: add a dedicated pretxnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34710
diff changeset
  1933
                for rev, (old, new) in tr.changes['phases'].items():
f6d17075608f phase: add a dedicated pretxnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34710
diff changeset
  1934
                    args = tr.hookargs.copy()
f6d17075608f phase: add a dedicated pretxnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34710
diff changeset
  1935
                    node = hex(cl.node(rev))
f6d17075608f phase: add a dedicated pretxnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34710
diff changeset
  1936
                    args.update(phases.preparehookargs(node, old, new))
41896
94faa2e84094 transaction: include txnname in the hookargs dictionary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41856
diff changeset
  1937
                    repo.hook('pretxnclose-phase', throw=True,
34711
f6d17075608f phase: add a dedicated pretxnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34710
diff changeset
  1938
                              **pycompat.strkwargs(args))
34709
c212947273a7 bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
  1939
c212947273a7 bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
  1940
            repo.hook('pretxnclose', throw=True,
41896
94faa2e84094 transaction: include txnname in the hookargs dictionary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41856
diff changeset
  1941
                      **pycompat.strkwargs(tr.hookargs))
26577
8f2ff40fe9c9 localrepo: execute appropriate actions for dirstate at releasing transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26499
diff changeset
  1942
        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
  1943
            repo = reporef()
42669
36c692eb28d3 transaction: leave unfinished without crashing when not properly released
Martin von Zweigbergk <martinvonz@google.com>
parents: 42621
diff changeset
  1944
            if repo is None:
36c692eb28d3 transaction: leave unfinished without crashing when not properly released
Martin von Zweigbergk <martinvonz@google.com>
parents: 42621
diff changeset
  1945
                # 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
  1946
                # 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
  1947
                # 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
  1948
                # user run `hg recover`.
36c692eb28d3 transaction: leave unfinished without crashing when not properly released
Martin von Zweigbergk <martinvonz@google.com>
parents: 42621
diff changeset
  1949
                return
26577
8f2ff40fe9c9 localrepo: execute appropriate actions for dirstate at releasing transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26499
diff changeset
  1950
            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
  1951
                # 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
  1952
                # 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
  1953
                # 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
  1954
                # 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
  1955
                # 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
  1956
                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
  1957
            else:
8f2ff40fe9c9 localrepo: execute appropriate actions for dirstate at releasing transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26499
diff changeset
  1958
                # 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
  1959
                # out) in this transaction
38869
ad24b581e4d9 narrow: call narrowspec.{save,restore,clear}backup directly
Martin von Zweigbergk <martinvonz@google.com>
parents: 38841
diff changeset
  1960
                narrowspec.restorebackup(self, 'journal.narrowspec')
41228
3b35ebdb9f8c narrow: include working copy narrowspec in transaction journal
Martin von Zweigbergk <martinvonz@google.com>
parents: 41226
diff changeset
  1961
                narrowspec.restorewcbackup(self, 'journal.narrowspec.dirstate')
33440
ec306bc6915b dirstate: update backup functions to take full backup filename
Adam Simpkins <simpkins@fb.com>
parents: 33437
diff changeset
  1962
                repo.dirstate.restorebackup(None, 'journal.dirstate')
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
  1963
26831
0a7610758c42 localrepo: discard objects in _filecache at transaction failure (issue4876)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26781
diff changeset
  1964
                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
  1965
25667
a69bb29b9638 localrepo: kill off sopener (API)
Siddharth Agarwal <sid0@fb.com>
parents: 25660
diff changeset
  1966
        tr = transaction.transaction(rp, self.svfs, vfsmap,
20087
cf3b8285af00 transaction: take journal file path relative to vfs to use file API via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20082
diff changeset
  1967
                                     "journal",
23903
426607be9c69 transaction: pass the name of the "undo" journal to the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23902
diff changeset
  1968
                                     "undo",
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  1969
                                     aftertrans(renames),
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
  1970
                                     self.store.createmode,
26577
8f2ff40fe9c9 localrepo: execute appropriate actions for dirstate at releasing transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26499
diff changeset
  1971
                                     validator=validate,
33278
87bca10a06ed transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33277
diff changeset
  1972
                                     releasefn=releasefn,
36819
aff5996f3043 transaction: add a name and a __repr__ implementation (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 36554
diff changeset
  1973
                                     checkambigfiles=_cachedfiles,
aff5996f3043 transaction: add a name and a __repr__ implementation (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 36554
diff changeset
  1974
                                     name=desc)
39301
5763216ba311 transaction: remember original len(repo) instead of tracking added revs (API)
Yuya Nishihara <yuya@tcha.org>
parents: 39298
diff changeset
  1975
        tr.changes['origrepolen'] = len(self)
33251
a5cb2e4460de transaction: track new obsmarkers in the 'changes' mapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33247
diff changeset
  1976
        tr.changes['obsmarkers'] = set()
33451
e44d54260c32 phases: track phase movements in 'advanceboundary'
Boris Feld <boris.feld@octobus.net>
parents: 33440
diff changeset
  1977
        tr.changes['phases'] = {}
33516
f9e6e43c7987 bookmark: track bookmark changes at the transaction level
Boris Feld <boris.feld@octobus.net>
parents: 33499
diff changeset
  1978
        tr.changes['bookmarks'] = {}
24740
d283517b260b transaction: introduce a transaction ID, to be available to all hooks
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24739
diff changeset
  1979
25267
69c5cab0b893 transaction: separate calculating TXNID from creating transaction object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25219
diff changeset
  1980
        tr.hookargs['txnid'] = txnid
41896
94faa2e84094 transaction: include txnname in the hookargs dictionary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41856
diff changeset
  1981
        tr.hookargs['txnname'] = desc
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
  1982
        # 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
  1983
        # 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
  1984
        # this is not expected to break anything that happen during the hooks.
acc73273b27e fncache: document the fact fncache is outdate at hook run time
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23510
diff changeset
  1985
        tr.addfinalize('flush-fncache', self.store.write)
24282
db8679812f84 hook: add a generic hook after transaction has been closed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24281
diff changeset
  1986
        def txnclosehook(tr2):
db8679812f84 hook: add a generic hook after transaction has been closed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24281
diff changeset
  1987
            """To be run if transaction is successful, will schedule a hook run
db8679812f84 hook: add a generic hook after transaction has been closed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24281
diff changeset
  1988
            """
27907
e219dbfd0342 localrepo: don't reference transaction from hook closure (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27846
diff changeset
  1989
            # 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
  1990
            # 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
  1991
            # 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
  1992
            # fixes the function accumulation.
e219dbfd0342 localrepo: don't reference transaction from hook closure (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27846
diff changeset
  1993
            hookargs = tr2.hookargs
e219dbfd0342 localrepo: don't reference transaction from hook closure (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27846
diff changeset
  1994
34708
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  1995
            def hookfunc():
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  1996
                repo = reporef()
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  1997
                if hook.hashook(repo.ui, 'txnclose-bookmark'):
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  1998
                    bmchanges = sorted(tr.changes['bookmarks'].items())
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  1999
                    for name, (old, new) in bmchanges:
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  2000
                        args = tr.hookargs.copy()
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  2001
                        args.update(bookmarks.preparehookargs(name, old, new))
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  2002
                        repo.hook('txnclose-bookmark', throw=False,
41896
94faa2e84094 transaction: include txnname in the hookargs dictionary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41856
diff changeset
  2003
                                  **pycompat.strkwargs(args))
34708
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  2004
34710
cdf833d7de98 phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34709
diff changeset
  2005
                if hook.hashook(repo.ui, 'txnclose-phase'):
cdf833d7de98 phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34709
diff changeset
  2006
                    cl = repo.unfiltered().changelog
cdf833d7de98 phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34709
diff changeset
  2007
                    phasemv = sorted(tr.changes['phases'].items())
cdf833d7de98 phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34709
diff changeset
  2008
                    for rev, (old, new) in phasemv:
cdf833d7de98 phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34709
diff changeset
  2009
                        args = tr.hookargs.copy()
cdf833d7de98 phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34709
diff changeset
  2010
                        node = hex(cl.node(rev))
cdf833d7de98 phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34709
diff changeset
  2011
                        args.update(phases.preparehookargs(node, old, new))
41896
94faa2e84094 transaction: include txnname in the hookargs dictionary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41856
diff changeset
  2012
                        repo.hook('txnclose-phase', throw=False,
34710
cdf833d7de98 phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34709
diff changeset
  2013
                                  **pycompat.strkwargs(args))
cdf833d7de98 phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34709
diff changeset
  2014
41896
94faa2e84094 transaction: include txnname in the hookargs dictionary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41856
diff changeset
  2015
                repo.hook('txnclose', throw=False,
34708
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  2016
                          **pycompat.strkwargs(hookargs))
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  2017
            reporef()._afterlock(hookfunc)
24282
db8679812f84 hook: add a generic hook after transaction has been closed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24281
diff changeset
  2018
        tr.addfinalize('txnclose-hook', txnclosehook)
35749
3a3b59bbe7ce localrepo: run cache-warming transaction callback before report callback
Martin von Zweigbergk <martinvonz@google.com>
parents: 35736
diff changeset
  2019
        # 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
  2020
        # 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
  2021
        # 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
  2022
        # callbacks run.
3a3b59bbe7ce localrepo: run cache-warming transaction callback before report callback
Martin von Zweigbergk <martinvonz@google.com>
parents: 35736
diff changeset
  2023
        tr.addpostclose('-warm-cache', self._buildcacheupdater(tr))
24792
7d0421de8de3 hooks: add a 'txnabort' hook
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24784
diff changeset
  2024
        def txnaborthook(tr2):
7d0421de8de3 hooks: add a 'txnabort' hook
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24784
diff changeset
  2025
            """To be run if transaction is aborted
7d0421de8de3 hooks: add a 'txnabort' hook
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24784
diff changeset
  2026
            """
41896
94faa2e84094 transaction: include txnname in the hookargs dictionary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41856
diff changeset
  2027
            reporef().hook('txnabort', throw=False,
35840
b43b314cc46a localrepo: pass transaction kwargs as strings, not bytes
Augie Fackler <augie@google.com>
parents: 35839
diff changeset
  2028
                           **pycompat.strkwargs(tr2.hookargs))
24792
7d0421de8de3 hooks: add a 'txnabort' hook
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24784
diff changeset
  2029
        tr.addabort('txnabort-hook', txnaborthook)
26251
5c0f5db65c6b localrepo: refresh filecache stats only if transaction finished successfully
Yuya Nishihara <yuya@tcha.org>
parents: 26250
diff changeset
  2030
        # 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
  2031
        # to stored data if transaction has no error.
5c0f5db65c6b localrepo: refresh filecache stats only if transaction finished successfully
Yuya Nishihara <yuya@tcha.org>
parents: 26250
diff changeset
  2032
        tr.addpostclose('refresh-filecachestats', self._refreshfilecachestats)
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  2033
        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
  2034
        scmutil.registersummarycallback(self, tr, desc)
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  2035
        return tr
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  2036
16236
97efd26eb957 localrepo: refactor retrieving of journal/undo files paths
Idan Kamara <idankk86@gmail.com>
parents: 16208
diff changeset
  2037
    def _journalfiles(self):
18952
8086b530e2ac localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18951
diff changeset
  2038
        return ((self.svfs, 'journal'),
41226
0f2b8d51bfdf narrow: include journal.narrowspec in transaction journal
Martin von Zweigbergk <martinvonz@google.com>
parents: 41222
diff changeset
  2039
                (self.svfs, 'journal.narrowspec'),
41228
3b35ebdb9f8c narrow: include working copy narrowspec in transaction journal
Martin von Zweigbergk <martinvonz@google.com>
parents: 41226
diff changeset
  2040
                (self.vfs, 'journal.narrowspec.dirstate'),
18952
8086b530e2ac localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18951
diff changeset
  2041
                (self.vfs, 'journal.dirstate'),
8086b530e2ac localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18951
diff changeset
  2042
                (self.vfs, 'journal.branch'),
8086b530e2ac localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18951
diff changeset
  2043
                (self.vfs, 'journal.desc'),
42325
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42300
diff changeset
  2044
                (bookmarks.bookmarksvfs(self), 'journal.bookmarks'),
18952
8086b530e2ac localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18951
diff changeset
  2045
                (self.svfs, 'journal.phaseroots'))
16236
97efd26eb957 localrepo: refactor retrieving of journal/undo files paths
Idan Kamara <idankk86@gmail.com>
parents: 16208
diff changeset
  2046
97efd26eb957 localrepo: refactor retrieving of journal/undo files paths
Idan Kamara <idankk86@gmail.com>
parents: 16208
diff changeset
  2047
    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
  2048
        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
  2049
32452
b647b923486f transaction: run _writejournal unfiltered
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32381
diff changeset
  2050
    @unfilteredmethod
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  2051
    def _writejournal(self, desc):
33440
ec306bc6915b dirstate: update backup functions to take full backup filename
Adam Simpkins <simpkins@fb.com>
parents: 33437
diff changeset
  2052
        self.dirstate.savebackup(None, 'journal.dirstate')
41228
3b35ebdb9f8c narrow: include working copy narrowspec in transaction journal
Martin von Zweigbergk <martinvonz@google.com>
parents: 41226
diff changeset
  2053
        narrowspec.savewcbackup(self, 'journal.narrowspec.dirstate')
38869
ad24b581e4d9 narrow: call narrowspec.{save,restore,clear}backup directly
Martin von Zweigbergk <martinvonz@google.com>
parents: 38841
diff changeset
  2054
        narrowspec.savebackup(self, 'journal.narrowspec')
23852
99e125626352 localrepo: remove all internal uses of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23775
diff changeset
  2055
        self.vfs.write("journal.branch",
14168
135e244776f0 prevent transient leaks of file handle by using new helper functions
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 14162
diff changeset
  2056
                          encoding.fromlocal(self.dirstate.branch()))
23852
99e125626352 localrepo: remove all internal uses of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23775
diff changeset
  2057
        self.vfs.write("journal.desc",
14168
135e244776f0 prevent transient leaks of file handle by using new helper functions
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 14162
diff changeset
  2058
                          "%d\n%s\n" % (len(self), desc))
42325
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42300
diff changeset
  2059
        bookmarksvfs = bookmarks.bookmarksvfs(self)
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42300
diff changeset
  2060
        bookmarksvfs.write("journal.bookmarks",
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42300
diff changeset
  2061
                           bookmarksvfs.tryread("bookmarks"))
23853
0cc663e44258 localrepo: remove all internal uses of localrepo.sopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23852
diff changeset
  2062
        self.svfs.write("journal.phaseroots",
0cc663e44258 localrepo: remove all internal uses of localrepo.sopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23852
diff changeset
  2063
                           self.svfs.tryread("phaseroots"))
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  2064
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
  2065
    def recover(self):
27846
63821023ea79 with: use context manager in localrepo recover
Bryan O'Sullivan <bryano@fb.com>
parents: 27698
diff changeset
  2066
        with self.lock():
18947
9b82f93e3a7a localrepo: use "vfs.exists()" instead of "os.path.exists()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18946
diff changeset
  2067
            if self.svfs.exists("journal"):
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  2068
                self.ui.status(_("rolling back interrupted transaction\n"))
23853
0cc663e44258 localrepo: remove all internal uses of localrepo.sopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23852
diff changeset
  2069
                vfsmap = {'': self.svfs,
23852
99e125626352 localrepo: remove all internal uses of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23775
diff changeset
  2070
                          'plain': self.vfs,}
23853
0cc663e44258 localrepo: remove all internal uses of localrepo.sopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23852
diff changeset
  2071
                transaction.rollback(self.svfs, vfsmap, "journal",
33278
87bca10a06ed transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33277
diff changeset
  2072
                                     self.ui.warn,
87bca10a06ed transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33277
diff changeset
  2073
                                     checkambigfiles=_cachedfiles)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  2074
                self.invalidate()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  2075
                return True
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  2076
            else:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  2077
                self.ui.warn(_("no interrupted transaction available\n"))
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  2078
                return False
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
  2079
15183
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15131
diff changeset
  2080
    def rollback(self, dryrun=False, force=False):
26631
e077ce385609 localrepo: restore dirstate to one before rollbacking if not parent-gone
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26587
diff changeset
  2081
        wlock = lock = dsguard = None
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  2082
        try:
1712
21dcf38e5d7d Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents: 1709
diff changeset
  2083
            wlock = self.wlock()
4438
3900f684a150 Fix hg import --exact bug that hangs hg on failure.
Eric Hopper <hopper@omnifarious.org>
parents: 4417
diff changeset
  2084
            lock = self.lock()
18947
9b82f93e3a7a localrepo: use "vfs.exists()" instead of "os.path.exists()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18946
diff changeset
  2085
            if self.svfs.exists("undo"):
30492
77cd647b04ac localrepo: refer to dirstateguard by its new name
Augie Fackler <augie@google.com>
parents: 30377
diff changeset
  2086
                dsguard = dirstateguard.dirstateguard(self, 'rollback')
26631
e077ce385609 localrepo: restore dirstate to one before rollbacking if not parent-gone
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26587
diff changeset
  2087
e077ce385609 localrepo: restore dirstate to one before rollbacking if not parent-gone
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26587
diff changeset
  2088
                return self._rollback(dryrun, force, dsguard)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  2089
            else:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  2090
                self.ui.warn(_("no rollback information available\n"))
11177
6a64813276ed commands: initial audit of exit codes
Matt Mackall <mpm@selenic.com>
parents: 11174
diff changeset
  2091
                return 1
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  2092
        finally:
26631
e077ce385609 localrepo: restore dirstate to one before rollbacking if not parent-gone
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26587
diff changeset
  2093
            release(dsguard, lock, wlock)
162
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 161
diff changeset
  2094
18016
2a393df0f5cc clfilter: rename `unfilteredmeth` to `unfilteredmethod`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18014
diff changeset
  2095
    @unfilteredmethod # Until we get smarter cache management
26631
e077ce385609 localrepo: restore dirstate to one before rollbacking if not parent-gone
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26587
diff changeset
  2096
    def _rollback(self, dryrun, force, dsguard):
15130
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  2097
        ui = self.ui
15097
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
  2098
        try:
23852
99e125626352 localrepo: remove all internal uses of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23775
diff changeset
  2099
            args = self.vfs.read('undo.desc').splitlines()
15130
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  2100
            (oldlen, desc, detail) = (int(args[0]), args[1], None)
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  2101
            if len(args) >= 3:
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  2102
                detail = args[2]
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  2103
            oldtip = oldlen - 1
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  2104
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  2105
            if detail and ui.verbose:
32895
05c213cd8ab8 py3: use '%d' instead of '%s' for integers
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32871
diff changeset
  2106
                msg = (_('repository tip rolled back to revision %d'
15130
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  2107
                         ' (undo %s: %s)\n')
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  2108
                       % (oldtip, desc, detail))
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  2109
            else:
32895
05c213cd8ab8 py3: use '%d' instead of '%s' for integers
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32871
diff changeset
  2110
                msg = (_('repository tip rolled back to revision %d'
15130
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  2111
                         ' (undo %s)\n')
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  2112
                       % (oldtip, desc))
15097
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
  2113
        except IOError:
15130
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  2114
            msg = _('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
  2115
            desc = None
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15131
diff changeset
  2116
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15131
diff changeset
  2117
        if not force and self['.'] != self['tip'] and desc == 'commit':
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26577
diff changeset
  2118
            raise error.Abort(
15183
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15131
diff changeset
  2119
                _('rollback of last commit while not checked out '
15187
0292f88d3b86 rollback: use a hint for force
Matt Mackall <mpm@selenic.com>
parents: 15183
diff changeset
  2120
                  'may lose data'), hint=_('use -f to force'))
15183
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15131
diff changeset
  2121
15130
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  2122
        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
  2123
        if dryrun:
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
  2124
            return 0
15131
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  2125
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  2126
        parents = self.dirstate.parents()
18310
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  2127
        self.destroying()
23902
bfa52f4ecf54 rollback: have an empty entry for the vfsmap in rollback
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23854
diff changeset
  2128
        vfsmap = {'plain': self.vfs, '': self.svfs}
33278
87bca10a06ed transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33277
diff changeset
  2129
        transaction.rollback(self.svfs, vfsmap, 'undo', ui.warn,
87bca10a06ed transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33277
diff changeset
  2130
                             checkambigfiles=_cachedfiles)
42325
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42300
diff changeset
  2131
        bookmarksvfs = bookmarks.bookmarksvfs(self)
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42300
diff changeset
  2132
        if bookmarksvfs.exists('undo.bookmarks'):
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42300
diff changeset
  2133
            bookmarksvfs.rename('undo.bookmarks', 'bookmarks', checkambig=True)
18947
9b82f93e3a7a localrepo: use "vfs.exists()" instead of "os.path.exists()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18946
diff changeset
  2134
        if self.svfs.exists('undo.phaseroots'):
29352
37c7f9fb7040 localrepo: make restoring from backup at rollback avoid ambiguity of file stat
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29341
diff changeset
  2135
            self.svfs.rename('undo.phaseroots', 'phaseroots', checkambig=True)
15097
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
  2136
        self.invalidate()
15131
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  2137
41372
390ef056081b localrepo: slightly simplify check for removed parents in _rollback()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41365
diff changeset
  2138
        parentgone = any(p not in self.changelog.nodemap for p in parents)
15131
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  2139
        if parentgone:
26631
e077ce385609 localrepo: restore dirstate to one before rollbacking if not parent-gone
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26587
diff changeset
  2140
            # prevent dirstateguard from overwriting already restored one
e077ce385609 localrepo: restore dirstate to one before rollbacking if not parent-gone
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26587
diff changeset
  2141
            dsguard.close()
e077ce385609 localrepo: restore dirstate to one before rollbacking if not parent-gone
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26587
diff changeset
  2142
38869
ad24b581e4d9 narrow: call narrowspec.{save,restore,clear}backup directly
Martin von Zweigbergk <martinvonz@google.com>
parents: 38841
diff changeset
  2143
            narrowspec.restorebackup(self, 'undo.narrowspec')
41228
3b35ebdb9f8c narrow: include working copy narrowspec in transaction journal
Martin von Zweigbergk <martinvonz@google.com>
parents: 41226
diff changeset
  2144
            narrowspec.restorewcbackup(self, 'undo.narrowspec.dirstate')
33440
ec306bc6915b dirstate: update backup functions to take full backup filename
Adam Simpkins <simpkins@fb.com>
parents: 33437
diff changeset
  2145
            self.dirstate.restorebackup(None, 'undo.dirstate')
15131
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  2146
            try:
23852
99e125626352 localrepo: remove all internal uses of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23775
diff changeset
  2147
                branch = self.vfs.read('undo.branch')
17360
935831597e16 rollback: write dirstate branch with correct encoding
Sune Foldager <cryo@cyanite.org>
parents: 17324
diff changeset
  2148
                self.dirstate.setbranch(encoding.tolocal(branch))
15131
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  2149
            except IOError:
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  2150
                ui.warn(_('named branch could not be reset: '
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  2151
                          'current branch is still \'%s\'\n')
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  2152
                        % self.dirstate.branch())
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  2153
27167
3fe8cb40c9c5 commands: inline definition of localrepo.parents() and drop the method (API)
Augie Fackler <augie@google.com>
parents: 27166
diff changeset
  2154
            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
  2155
            if len(parents) > 1:
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  2156
                ui.status(_('working directory now based on '
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  2157
                            'revisions %d and %d\n') % parents)
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  2158
            else:
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  2159
                ui.status(_('working directory now based on '
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  2160
                            'revision %d\n') % parents)
26989
a65ea44f163e localrepo: switch to mergestate.clean()
Siddharth Agarwal <sid0@fb.com>
parents: 26907
diff changeset
  2161
            mergemod.mergestate.clean(self, self['.'].node())
24784
59406b8b1303 rollback: clear resolve state (issue4593)
Matt Mackall <mpm@selenic.com>
parents: 24750
diff changeset
  2162
17013
c8eda7bbdcab strip: incrementally update the branchheads cache after a strip
Joshua Redstone <joshua.redstone@fb.com>
parents: 17012
diff changeset
  2163
        # 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
  2164
        # 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
  2165
        # invalidated.
15604
b8d8599410da rollback: always call destroyed() (regression from 1.9)
Greg Ward <greg-hg@gerg.ca>
parents: 15381
diff changeset
  2166
        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
  2167
        return 0
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
  2168
32332
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
  2169
    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
  2170
        """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
  2171
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
  2172
        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
  2173
        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
  2174
        method.
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
  2175
        """
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
  2176
        # 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
  2177
        reporef = weakref.ref(self)
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
  2178
        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
  2179
            repo = reporef()
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
  2180
            repo.updatecaches(tr)
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
  2181
        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
  2182
32263
604d65e2c0b2 caches: introduce a function to warm cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32262
diff changeset
  2183
    @unfilteredmethod
36952
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36819
diff changeset
  2184
    def updatecaches(self, tr=None, full=False):
32264
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32263
diff changeset
  2185
        """warm appropriate caches
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32263
diff changeset
  2186
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32263
diff changeset
  2187
        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
  2188
        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
  2189
        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
  2190
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36819
diff changeset
  2191
        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
  2192
        up-to-date data. Even the ones usually loaded more lazily.
32264
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32263
diff changeset
  2193
        """
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32263
diff changeset
  2194
        if tr is not None and tr.hookargs.get('source') == 'strip':
32263
604d65e2c0b2 caches: introduce a function to warm cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32262
diff changeset
  2195
            # 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
  2196
            # 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
  2197
            return
604d65e2c0b2 caches: introduce a function to warm cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32262
diff changeset
  2198
39301
5763216ba311 transaction: remember original len(repo) instead of tracking added revs (API)
Yuya Nishihara <yuya@tcha.org>
parents: 39298
diff changeset
  2199
        if tr is None or tr.changes['origrepolen'] < len(self):
41615
328ca3b9e545 branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents: 41529
diff changeset
  2200
            # accessing the 'ser ved' branchmap should refresh all the others,
32267
c2380b448265 caches: move the 'updating the branch cache' message in 'updatecaches'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32266
diff changeset
  2201
            self.ui.debug('updating the branch cache\n')
41615
328ca3b9e545 branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents: 41529
diff changeset
  2202
            self.filtered('served').branchmap()
42127
70b71421fd33 repoview: keep the branchmap cache for the `served.hidden` view warm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42105
diff changeset
  2203
            self.filtered('served.hidden').branchmap()
32263
604d65e2c0b2 caches: introduce a function to warm cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32262
diff changeset
  2204
36952
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36819
diff changeset
  2205
        if full:
41933
2eee280a1354 updatecaches: also warm revbranchcache for filtered revisions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41896
diff changeset
  2206
            unfi = self.unfiltered()
2eee280a1354 updatecaches: also warm revbranchcache for filtered revisions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41896
diff changeset
  2207
            rbc = unfi.revbranchcache()
2eee280a1354 updatecaches: also warm revbranchcache for filtered revisions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41896
diff changeset
  2208
            for r in unfi.changelog:
36952
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36819
diff changeset
  2209
                rbc.branchinfo(r)
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36819
diff changeset
  2210
            rbc.write()
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36819
diff changeset
  2211
38781
0a57945aaf7f manifest: persist the manifestfulltext cache
Martijn Pieters <mj@zopatista.com>
parents: 38760
diff changeset
  2212
            # ensure the working copy parents are in the manifestfulltextcache
0a57945aaf7f manifest: persist the manifestfulltext cache
Martijn Pieters <mj@zopatista.com>
parents: 38760
diff changeset
  2213
            for ctx in self['.'].parents():
0a57945aaf7f manifest: persist the manifestfulltext cache
Martijn Pieters <mj@zopatista.com>
parents: 38760
diff changeset
  2214
                ctx.manifest()  # accessing the manifest is enough
0a57945aaf7f manifest: persist the manifestfulltext cache
Martijn Pieters <mj@zopatista.com>
parents: 38760
diff changeset
  2215
42238
32338e27bb9d updatecaches: also warm hgtagsfnodescache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42231
diff changeset
  2216
            # accessing fnode cache warms the cache
32338e27bb9d updatecaches: also warm hgtagsfnodescache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42231
diff changeset
  2217
            tagsmod.fnoderevs(self.ui, unfi, unfi.changelog.revs())
41934
481259af4bdf updatecaches: also warm the tags caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41933
diff changeset
  2218
            # accessing tags warm the cache
481259af4bdf updatecaches: also warm the tags caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41933
diff changeset
  2219
            self.tags()
481259af4bdf updatecaches: also warm the tags caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41933
diff changeset
  2220
            self.filtered('served').tags()
481259af4bdf updatecaches: also warm the tags caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41933
diff changeset
  2221
42712
cdf0e9523de1 branchmap: explicitly warm+write all subsets of the branchmap caches
Kyle Lippincott <spectral@google.com>
parents: 42685
diff changeset
  2222
            # The `full` arg is documented as updating even the lazily-loaded
cdf0e9523de1 branchmap: explicitly warm+write all subsets of the branchmap caches
Kyle Lippincott <spectral@google.com>
parents: 42685
diff changeset
  2223
            # caches immediately, so we're forcing a write to cause these caches
cdf0e9523de1 branchmap: explicitly warm+write all subsets of the branchmap caches
Kyle Lippincott <spectral@google.com>
parents: 42685
diff changeset
  2224
            # to be warmed up even if they haven't explicitly been requested
cdf0e9523de1 branchmap: explicitly warm+write all subsets of the branchmap caches
Kyle Lippincott <spectral@google.com>
parents: 42685
diff changeset
  2225
            # yet (if they've never been used by hg, they won't ever have been
cdf0e9523de1 branchmap: explicitly warm+write all subsets of the branchmap caches
Kyle Lippincott <spectral@google.com>
parents: 42685
diff changeset
  2226
            # written, even if they're a subset of another kind of cache that
cdf0e9523de1 branchmap: explicitly warm+write all subsets of the branchmap caches
Kyle Lippincott <spectral@google.com>
parents: 42685
diff changeset
  2227
            # *has* been used).
cdf0e9523de1 branchmap: explicitly warm+write all subsets of the branchmap caches
Kyle Lippincott <spectral@google.com>
parents: 42685
diff changeset
  2228
            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
  2229
                filtered = self.filtered(filt)
cdf0e9523de1 branchmap: explicitly warm+write all subsets of the branchmap caches
Kyle Lippincott <spectral@google.com>
parents: 42685
diff changeset
  2230
                filtered.branchmap().write(filtered)
cdf0e9523de1 branchmap: explicitly warm+write all subsets of the branchmap caches
Kyle Lippincott <spectral@google.com>
parents: 42685
diff changeset
  2231
10547
bae9bb09166b strip: invalidate all caches after stripping (fixes issue1951)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10522
diff changeset
  2232
    def invalidatecaches(self):
15988
827e0126738d localrepo: delete _phaserev when invalidating caches
Idan Kamara <idankk86@gmail.com>
parents: 15987
diff changeset
  2233
40360
dee73a97e132 py3: invalidate repository cache with system-string keys
Yuya Nishihara <yuya@tcha.org>
parents: 40353
diff changeset
  2234
        if r'_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
  2235
            # can't use delattr on proxy
40360
dee73a97e132 py3: invalidate repository cache with system-string keys
Yuya Nishihara <yuya@tcha.org>
parents: 40353
diff changeset
  2236
            del self.__dict__[r'_tagscache']
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  2237
41615
328ca3b9e545 branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents: 41529
diff changeset
  2238
        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
  2239
        self.invalidatevolatilesets()
33302
36a415b5a4b2 localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33278
diff changeset
  2240
        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
  2241
312262ebc223 cache: group obscache and revsfiltercache invalidation in a single function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18101
diff changeset
  2242
    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
  2243
        self.filteredrevcache.clear()
17469
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17434
diff changeset
  2244
        obsolete.clearobscaches(self)
1784
2e0a288ca93e revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1782
diff changeset
  2245
14930
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  2246
    def invalidatedirstate(self):
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  2247
        '''Invalidates the dirstate, causing the next call to dirstate
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  2248
        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
  2249
        rereading it if it has.
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  2250
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  2251
        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
  2252
        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
  2253
        explicitly read the dirstate again (i.e. restoring it to a previous
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  2254
        known good state).'''
40296
e787d97e90ad py3: fix test-dirstate-race.t
Mark Thomas <mbthomas@fb.com>
parents: 40267
diff changeset
  2255
        if hasunfilteredcache(self, r'dirstate'):
16200
9d4a2942a732 dirstate: add filecache support
Idan Kamara <idankk86@gmail.com>
parents: 16198
diff changeset
  2256
            for k in self.dirstate._filecache:
9d4a2942a732 dirstate: add filecache support
Idan Kamara <idankk86@gmail.com>
parents: 16198
diff changeset
  2257
                try:
9d4a2942a732 dirstate: add filecache support
Idan Kamara <idankk86@gmail.com>
parents: 16198
diff changeset
  2258
                    delattr(self.dirstate, k)
9d4a2942a732 dirstate: add filecache support
Idan Kamara <idankk86@gmail.com>
parents: 16198
diff changeset
  2259
                except AttributeError:
9d4a2942a732 dirstate: add filecache support
Idan Kamara <idankk86@gmail.com>
parents: 16198
diff changeset
  2260
                    pass
40296
e787d97e90ad py3: fix test-dirstate-race.t
Mark Thomas <mbthomas@fb.com>
parents: 40267
diff changeset
  2261
            delattr(self.unfiltered(), r'dirstate')
14930
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  2262
26831
0a7610758c42 localrepo: discard objects in _filecache at transaction failure (issue4876)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26781
diff changeset
  2263
    def invalidate(self, clearfilecache=False):
29918
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29883
diff changeset
  2264
        '''Invalidates both store and non-store parts other than dirstate
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29883
diff changeset
  2265
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29883
diff changeset
  2266
        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
  2267
        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
  2268
        (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
  2269
        redundant one doesn't).
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29883
diff changeset
  2270
        '''
18644
3e92772d5383 spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents: 18520
diff changeset
  2271
        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
  2272
        for k in list(self._filecache.keys()):
14935
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
  2273
            # dirstate is invalidated separately in invalidatedirstate()
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
  2274
            if k == 'dirstate':
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
  2275
                continue
33706
01a1c4e66816 repo: skip invalidation of changelog if it has 'delayed' changes (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33703
diff changeset
  2276
            if (k == 'changelog' and
01a1c4e66816 repo: skip invalidation of changelog if it has 'delayed' changes (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33703
diff changeset
  2277
                self.currenttransaction() and
01a1c4e66816 repo: skip invalidation of changelog if it has 'delayed' changes (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33703
diff changeset
  2278
                self.changelog._delayed):
01a1c4e66816 repo: skip invalidation of changelog if it has 'delayed' changes (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33703
diff changeset
  2279
                # 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
  2280
                # 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
  2281
                # 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
  2282
                continue
14935
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
  2283
26831
0a7610758c42 localrepo: discard objects in _filecache at transaction failure (issue4876)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26781
diff changeset
  2284
            if clearfilecache:
0a7610758c42 localrepo: discard objects in _filecache at transaction failure (issue4876)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26781
diff changeset
  2285
                del self._filecache[k]
14935
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
  2286
            try:
17997
6089956e9880 clfilter: ensure cache invalidation is done on the main unfiltered repo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17996
diff changeset
  2287
                delattr(unfiltered, k)
14935
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
  2288
            except AttributeError:
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
  2289
                pass
10547
bae9bb09166b strip: invalidate all caches after stripping (fixes issue1951)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10522
diff changeset
  2290
        self.invalidatecaches()
29918
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29883
diff changeset
  2291
        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
  2292
            # 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
  2293
            # 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
  2294
            # 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
  2295
            self.store.invalidatecaches()
10547
bae9bb09166b strip: invalidate all caches after stripping (fixes issue1951)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10522
diff changeset
  2296
20627
a42ea6d209e6 localrepo: add hook point to invalidate everything on each command-server run
Yuya Nishihara <yuya@tcha.org>
parents: 20567
diff changeset
  2297
    def invalidateall(self):
a42ea6d209e6 localrepo: add hook point to invalidate everything on each command-server run
Yuya Nishihara <yuya@tcha.org>
parents: 20567
diff changeset
  2298
        '''Fully invalidates both store and non-store parts, causing the
a42ea6d209e6 localrepo: add hook point to invalidate everything on each command-server run
Yuya Nishihara <yuya@tcha.org>
parents: 20567
diff changeset
  2299
        subsequent operation to reread any outside changes.'''
a42ea6d209e6 localrepo: add hook point to invalidate everything on each command-server run
Yuya Nishihara <yuya@tcha.org>
parents: 20567
diff changeset
  2300
        # 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
  2301
        self.invalidate()
a42ea6d209e6 localrepo: add hook point to invalidate everything on each command-server run
Yuya Nishihara <yuya@tcha.org>
parents: 20567
diff changeset
  2302
        self.invalidatedirstate()
a42ea6d209e6 localrepo: add hook point to invalidate everything on each command-server run
Yuya Nishihara <yuya@tcha.org>
parents: 20567
diff changeset
  2303
29920
e35a83cedde1 localrepo: make _refreshfilecachestats unfiltered method to refresh correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29918
diff changeset
  2304
    @unfilteredmethod
26251
5c0f5db65c6b localrepo: refresh filecache stats only if transaction finished successfully
Yuya Nishihara <yuya@tcha.org>
parents: 26250
diff changeset
  2305
    def _refreshfilecachestats(self, tr):
26250
bc1f8a79b4e4 localrepo: move closure of lock release to class
Yuya Nishihara <yuya@tcha.org>
parents: 26155
diff changeset
  2306
        """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
  2307
        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
  2308
            k = pycompat.sysstr(k)
9dad46c23185 localrepo: consistently use native str when __dict__ is involved
Augie Fackler <augie@google.com>
parents: 35785
diff changeset
  2309
            if k == r'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
  2310
                continue
bc1f8a79b4e4 localrepo: move closure of lock release to class
Yuya Nishihara <yuya@tcha.org>
parents: 26155
diff changeset
  2311
            ce.refresh()
bc1f8a79b4e4 localrepo: move closure of lock release to class
Yuya Nishihara <yuya@tcha.org>
parents: 26155
diff changeset
  2312
26439
b50f5beadf3e localrepo: allow creating inherited locks
Siddharth Agarwal <sid0@fb.com>
parents: 26409
diff changeset
  2313
    def _lock(self, vfs, lockname, wait, releasefn, acquirefn, desc,
26499
e72b62b154b0 localrepo: prevent wlock from being inherited when a transaction is running
Siddharth Agarwal <sid0@fb.com>
parents: 26489
diff changeset
  2314
              inheritchecker=None, parentenvvar=None):
26439
b50f5beadf3e localrepo: allow creating inherited locks
Siddharth Agarwal <sid0@fb.com>
parents: 26409
diff changeset
  2315
        parentlock = None
26472
406a654b41cb localrepo: add a note about parentenvvar
Siddharth Agarwal <sid0@fb.com>
parents: 26449
diff changeset
  2316
        # the contents of parentenvvar are used by the underlying lock to
406a654b41cb localrepo: add a note about parentenvvar
Siddharth Agarwal <sid0@fb.com>
parents: 26449
diff changeset
  2317
        # determine whether it can be inherited
26439
b50f5beadf3e localrepo: allow creating inherited locks
Siddharth Agarwal <sid0@fb.com>
parents: 26409
diff changeset
  2318
        if parentenvvar is not None:
30634
ad15646dc61c py3: replace os.environ with encoding.environ (part 1 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30574
diff changeset
  2319
            parentlock = encoding.environ.get(parentenvvar)
35208
1b758105b5c7 lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents: 35207
diff changeset
  2320
1b758105b5c7 lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents: 35207
diff changeset
  2321
        timeout = 0
35209
9153871d50e0 lock: allow to configure when the lock messages are displayed
Boris Feld <boris.feld@octobus.net>
parents: 35208
diff changeset
  2322
        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
  2323
        if wait:
1b758105b5c7 lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents: 35207
diff changeset
  2324
            timeout = self.ui.configint("ui", "timeout")
35209
9153871d50e0 lock: allow to configure when the lock messages are displayed
Boris Feld <boris.feld@octobus.net>
parents: 35208
diff changeset
  2325
            warntimeout = self.ui.configint("ui", "timeout.warn")
38038
8c828beb7543 lock: add internal config to not replace signal handlers while locking
Yuya Nishihara <yuya@tcha.org>
parents: 37810
diff changeset
  2326
        # internal config: ui.signal-safe-lock
8c828beb7543 lock: add internal config to not replace signal handlers while locking
Yuya Nishihara <yuya@tcha.org>
parents: 37810
diff changeset
  2327
        signalsafe = self.ui.configbool('ui', '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
  2328
35209
9153871d50e0 lock: allow to configure when the lock messages are displayed
Boris Feld <boris.feld@octobus.net>
parents: 35208
diff changeset
  2329
        l = lockmod.trylock(self.ui, vfs, lockname, timeout, warntimeout,
35208
1b758105b5c7 lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents: 35207
diff changeset
  2330
                            releasefn=releasefn,
1b758105b5c7 lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents: 35207
diff changeset
  2331
                            acquirefn=acquirefn, desc=desc,
1b758105b5c7 lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents: 35207
diff changeset
  2332
                            inheritchecker=inheritchecker,
38038
8c828beb7543 lock: add internal config to not replace signal handlers while locking
Yuya Nishihara <yuya@tcha.org>
parents: 37810
diff changeset
  2333
                            parentlock=parentlock,
8c828beb7543 lock: add internal config to not replace signal handlers while locking
Yuya Nishihara <yuya@tcha.org>
parents: 37810
diff changeset
  2334
                            signalsafe=signalsafe)
1751
e9bf415a8ecb localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1747
diff changeset
  2335
        return l
e9bf415a8ecb localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1747
diff changeset
  2336
15587
809d5d30e377 localrepo: rename _postrelease to _afterlock
Matt Mackall <mpm@selenic.com>
parents: 15586
diff changeset
  2337
    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
  2338
        """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
  2339
24821
57f1dbc99631 afterlock: add the callback to the top level lock (issue4608)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24799
diff changeset
  2340
        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
  2341
        (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
  2342
        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
  2343
            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
  2344
            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
  2345
                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
  2346
                break
57f1dbc99631 afterlock: add the callback to the top level lock (issue4608)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24799
diff changeset
  2347
        else: # no lock have been found.
16680
d0e419b0f7de tag: run commit hook when lock is released (issue3344)
Mads Kiilerich <mads@kiilerich.com>
parents: 16679
diff changeset
  2348
            callback()
15583
926a06f7a353 lock: add mechanism to register post release callback
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15486
diff changeset
  2349
4914
9a2a73ea6135 repo locks: use True/False
Matt Mackall <mpm@selenic.com>
parents: 4913
diff changeset
  2350
    def lock(self, wait=True):
9309
cfdcb7a465af localrepo: document the locking scheme a little better
Greg Ward <greg-hg@gerg.ca>
parents: 9152
diff changeset
  2351
        '''Lock the repository store (.hg/store) and return a weak reference
cfdcb7a465af localrepo: document the locking scheme a little better
Greg Ward <greg-hg@gerg.ca>
parents: 9152
diff changeset
  2352
        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
  2353
        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
  2354
e0c810d0ab69 lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24745
diff changeset
  2355
        If both 'lock' and 'wlock' must be acquired, ensure you always acquires
e0c810d0ab69 lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24745
diff changeset
  2356
        '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
  2357
        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
  2358
        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
  2359
            l.lock()
a26d33749bd8 made repo locks recursive and deprecate refcounting based lock releasing
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8072
diff changeset
  2360
            return l
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4916
diff changeset
  2361
41856
90eddb679521 localrepo: explicit `_lock` arguments in `lock`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41819
diff changeset
  2362
        l = self._lock(vfs=self.svfs,
90eddb679521 localrepo: explicit `_lock` arguments in `lock`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41819
diff changeset
  2363
                       lockname="lock",
90eddb679521 localrepo: explicit `_lock` arguments in `lock`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41819
diff changeset
  2364
                       wait=wait,
90eddb679521 localrepo: explicit `_lock` arguments in `lock`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41819
diff changeset
  2365
                       releasefn=None,
90eddb679521 localrepo: explicit `_lock` arguments in `lock`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41819
diff changeset
  2366
                       acquirefn=self.invalidate,
90eddb679521 localrepo: explicit `_lock` arguments in `lock`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41819
diff changeset
  2367
                       desc=_('repository %s') % self.origroot)
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4916
diff changeset
  2368
        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
  2369
        return l
1751
e9bf415a8ecb localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1747
diff changeset
  2370
26499
e72b62b154b0 localrepo: prevent wlock from being inherited when a transaction is running
Siddharth Agarwal <sid0@fb.com>
parents: 26489
diff changeset
  2371
    def _wlockchecktransaction(self):
e72b62b154b0 localrepo: prevent wlock from being inherited when a transaction is running
Siddharth Agarwal <sid0@fb.com>
parents: 26489
diff changeset
  2372
        if self.currenttransaction() is not None:
e72b62b154b0 localrepo: prevent wlock from being inherited when a transaction is running
Siddharth Agarwal <sid0@fb.com>
parents: 26489
diff changeset
  2373
            raise error.LockInheritanceContractViolation(
e72b62b154b0 localrepo: prevent wlock from being inherited when a transaction is running
Siddharth Agarwal <sid0@fb.com>
parents: 26489
diff changeset
  2374
                'wlock cannot be inherited in the middle of a transaction')
e72b62b154b0 localrepo: prevent wlock from being inherited when a transaction is running
Siddharth Agarwal <sid0@fb.com>
parents: 26489
diff changeset
  2375
4914
9a2a73ea6135 repo locks: use True/False
Matt Mackall <mpm@selenic.com>
parents: 4913
diff changeset
  2376
    def wlock(self, wait=True):
9309
cfdcb7a465af localrepo: document the locking scheme a little better
Greg Ward <greg-hg@gerg.ca>
parents: 9152
diff changeset
  2377
        '''Lock the non-store parts of the repository (everything under
cfdcb7a465af localrepo: document the locking scheme a little better
Greg Ward <greg-hg@gerg.ca>
parents: 9152
diff changeset
  2378
        .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
  2379
e0c810d0ab69 lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24745
diff changeset
  2380
        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
  2381
e0c810d0ab69 lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24745
diff changeset
  2382
        If both 'lock' and 'wlock' must be acquired, ensure you always acquires
e0c810d0ab69 lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24745
diff changeset
  2383
        'wlock' first to avoid a dead-lock hazard.'''
24744
bedefc611f25 wlock: only issue devel warning when actually acquiring the lock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24740
diff changeset
  2384
        l = self._wlockref and self._wlockref()
bedefc611f25 wlock: only issue devel warning when actually acquiring the lock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24740
diff changeset
  2385
        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
  2386
            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
  2387
            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
  2388
26781
1aee2ab0f902 spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents: 26767
diff changeset
  2389
        # 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
  2390
        # acquisition would not cause dead-lock as they would just fail.
25290
8f88f768e24c devel: rename 'all' to 'all-warnings' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25274
diff changeset
  2391
        if wait and (self.ui.configbool('devel', 'all-warnings')
24750
aaf835407bf2 wlock: do not warn for non-wait locking
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24748
diff changeset
  2392
                     or self.ui.configbool('devel', 'check-locks')):
29705
41689e293994 develwarn: use the lock helper in local repo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29417
diff changeset
  2393
            if self._currentlock(self._lockref) is not None:
25629
52e5f68d8363 devel-warn: move the develwarn function as a method of the ui object
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25625
diff changeset
  2394
                self.ui.develwarn('"wlock" acquired after "lock"')
1531
2ba8bf7defda add localrepo.wlock for protecting the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1516
diff changeset
  2395
14930
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  2396
        def unlock():
22404
12bc7f06fc41 dirstate: add begin/endparentchange to dirstate
Durham Goode <durham@fb.com>
parents: 22362
diff changeset
  2397
            if self.dirstate.pendingparentchange():
12bc7f06fc41 dirstate: add begin/endparentchange to dirstate
Durham Goode <durham@fb.com>
parents: 22362
diff changeset
  2398
                self.dirstate.invalidate()
12bc7f06fc41 dirstate: add begin/endparentchange to dirstate
Durham Goode <durham@fb.com>
parents: 22362
diff changeset
  2399
            else:
26748
5ba0a99ff27f dirstate: make dirstate.write() callers pass transaction object to it
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26741
diff changeset
  2400
                self.dirstate.write(None)
22404
12bc7f06fc41 dirstate: add begin/endparentchange to dirstate
Durham Goode <durham@fb.com>
parents: 22362
diff changeset
  2401
18318
948f495fb230 localrepo: drop unnecessary check on wlock unlock
Idan Kamara <idankk86@gmail.com>
parents: 18314
diff changeset
  2402
            self._filecache['dirstate'].refresh()
14930
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  2403
20091
abfe6a8e619b lock: take both vfs and lock file path relative to vfs to access via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20088
diff changeset
  2404
        l = self._lock(self.vfs, "wlock", wait, unlock,
14930
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  2405
                       self.invalidatedirstate, _('working directory of %s') %
26499
e72b62b154b0 localrepo: prevent wlock from being inherited when a transaction is running
Siddharth Agarwal <sid0@fb.com>
parents: 26489
diff changeset
  2406
                       self.origroot,
e72b62b154b0 localrepo: prevent wlock from being inherited when a transaction is running
Siddharth Agarwal <sid0@fb.com>
parents: 26489
diff changeset
  2407
                       inheritchecker=self._wlockchecktransaction,
e72b62b154b0 localrepo: prevent wlock from being inherited when a transaction is running
Siddharth Agarwal <sid0@fb.com>
parents: 26489
diff changeset
  2408
                       parentenvvar='HG_WLOCK_LOCKER')
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4916
diff changeset
  2409
        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
  2410
        return l
1531
2ba8bf7defda add localrepo.wlock for protecting the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1516
diff changeset
  2411
26488
df2dc5141721 localrepo: add a way to get the current lock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26475
diff changeset
  2412
    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
  2413
        """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
  2414
        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
  2415
            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
  2416
        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
  2417
        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
  2418
            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
  2419
        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
  2420
26489
2a3fc0272e3f localrepo: add a way to get the current wlock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26488
diff changeset
  2421
    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
  2422
        """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
  2423
        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
  2424
42141
0e41f40b01cc copies: add config option for writing copy metadata to file and/or changset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42136
diff changeset
  2425
    def _filecommit(self, fctx, manifest1, manifest2, linkrev, tr, changelist,
0e41f40b01cc copies: add config option for writing copy metadata to file and/or changset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42136
diff changeset
  2426
                    includecopymeta):
3292
764688cf51e5 merge: remember rename copies and parents properly on commit
Matt Mackall <mpm@selenic.com>
parents: 3241
diff changeset
  2427
        """
3294
a2d93b186a0e commit: unify file-level commit code
Matt Mackall <mpm@selenic.com>
parents: 3293
diff changeset
  2428
        commit an individual file as part of a larger transaction
a2d93b186a0e commit: unify file-level commit code
Matt Mackall <mpm@selenic.com>
parents: 3293
diff changeset
  2429
        """
3292
764688cf51e5 merge: remember rename copies and parents properly on commit
Matt Mackall <mpm@selenic.com>
parents: 3241
diff changeset
  2430
8244
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
  2431
        fname = fctx.path()
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
  2432
        fparent1 = manifest1.get(fname, nullid)
22492
d5261db0011f commit: catch changed exec bit on files from p1 (issue4382)
Matt Mackall <mpm@selenic.com>
parents: 21866
diff changeset
  2433
        fparent2 = manifest2.get(fname, nullid)
24394
03163826b4e6 localrepo: reuse commit of parent filectx entries without rehashing
Mads Kiilerich <madski@unity3d.com>
parents: 24388
diff changeset
  2434
        if isinstance(fctx, context.filectx):
03163826b4e6 localrepo: reuse commit of parent filectx entries without rehashing
Mads Kiilerich <madski@unity3d.com>
parents: 24388
diff changeset
  2435
            node = fctx.filenode()
03163826b4e6 localrepo: reuse commit of parent filectx entries without rehashing
Mads Kiilerich <madski@unity3d.com>
parents: 24388
diff changeset
  2436
            if node in [fparent1, fparent2]:
03163826b4e6 localrepo: reuse commit of parent filectx entries without rehashing
Mads Kiilerich <madski@unity3d.com>
parents: 24388
diff changeset
  2437
                self.ui.debug('reusing %s filelog entry\n' % fname)
42339
c0e1ea0c4cee convert: don't include file in "files" list if it's added in p2
Martin von Zweigbergk <martinvonz@google.com>
parents: 42325
diff changeset
  2438
                if ((fparent1 != nullid and
c0e1ea0c4cee convert: don't include file in "files" list if it's added in p2
Martin von Zweigbergk <martinvonz@google.com>
parents: 42325
diff changeset
  2439
                     manifest1.flags(fname) != fctx.flags()) or
c0e1ea0c4cee convert: don't include file in "files" list if it's added in p2
Martin von Zweigbergk <martinvonz@google.com>
parents: 42325
diff changeset
  2440
                    (fparent2 != nullid and
c0e1ea0c4cee convert: don't include file in "files" list if it's added in p2
Martin von Zweigbergk <martinvonz@google.com>
parents: 42325
diff changeset
  2441
                     manifest2.flags(fname) != fctx.flags())):
29181
dae38633eba8 localrepo: prevent executable-bit only changes from being lost on amend
Mateusz Kwapich <mitrandir@fb.com>
parents: 28883
diff changeset
  2442
                    changelist.append(fname)
24394
03163826b4e6 localrepo: reuse commit of parent filectx entries without rehashing
Mads Kiilerich <madski@unity3d.com>
parents: 24388
diff changeset
  2443
                return node
1716
ef8cd889a78b Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents: 1713
diff changeset
  2444
24394
03163826b4e6 localrepo: reuse commit of parent filectx entries without rehashing
Mads Kiilerich <madski@unity3d.com>
parents: 24388
diff changeset
  2445
        flog = self.file(fname)
3292
764688cf51e5 merge: remember rename copies and parents properly on commit
Matt Mackall <mpm@selenic.com>
parents: 3241
diff changeset
  2446
        meta = {}
41774
2e2076c8c25f commit: migrate to new method for getting copy info
Martin von Zweigbergk <martinvonz@google.com>
parents: 41688
diff changeset
  2447
        cfname = fctx.copysource()
2e2076c8c25f commit: migrate to new method for getting copy info
Martin von Zweigbergk <martinvonz@google.com>
parents: 41688
diff changeset
  2448
        if cfname and cfname != fname:
4058
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
  2449
            # Mark the new revision of this file as a copy of another
4516
96d8a56d4ef9 Removed trailing whitespace and tabs from python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4510
diff changeset
  2450
            # file.  This copy data will effectively act as a parent
96d8a56d4ef9 Removed trailing whitespace and tabs from python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4510
diff changeset
  2451
            # of this new revision.  If this is a merge, the first
4058
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
  2452
            # parent will be the nullid (meaning "look up the copy data")
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
  2453
            # and the second one will be the other parent.  For example:
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
  2454
            #
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
  2455
            # 0 --- 1 --- 3   rev1 changes file foo
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
  2456
            #   \       /     rev2 renames foo to bar and changes it
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
  2457
            #    \- 2 -/      rev3 should have bar with all changes and
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
  2458
            #                      should record that bar descends from
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
  2459
            #                      bar in rev2 and foo in rev1
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
  2460
            #
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
  2461
            # this allows this merge to succeed:
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
  2462
            #
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
  2463
            # 0 --- 1 --- 3   rev4 reverts the content change from rev2
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
  2464
            #   \       /     merging rev3 and rev4 should use bar@rev2
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
  2465
            #    \- 2 --- 4        as the merge base
e7282dede8cd filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3923
diff changeset
  2466
            #
6874
8dc21876261e commit: simplify file copy logic
Matt Mackall <mpm@selenic.com>
parents: 6680
diff changeset
  2467
42062
8de1b5a009ee localrepo: rename crev in _filecommit() to cnode, since it's a node
Martin von Zweigbergk <martinvonz@google.com>
parents: 42046
diff changeset
  2468
            cnode = manifest1.get(cfname)
8244
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
  2469
            newfparent = fparent2
6874
8dc21876261e commit: simplify file copy logic
Matt Mackall <mpm@selenic.com>
parents: 6680
diff changeset
  2470
8dc21876261e commit: simplify file copy logic
Matt Mackall <mpm@selenic.com>
parents: 6680
diff changeset
  2471
            if manifest2: # branch merge
42062
8de1b5a009ee localrepo: rename crev in _filecommit() to cnode, since it's a node
Martin von Zweigbergk <martinvonz@google.com>
parents: 42046
diff changeset
  2472
                if fparent2 == nullid or cnode is None: # copied on remote side
8244
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
  2473
                    if cfname in manifest2:
42062
8de1b5a009ee localrepo: rename crev in _filecommit() to cnode, since it's a node
Martin von Zweigbergk <martinvonz@google.com>
parents: 42046
diff changeset
  2474
                        cnode = manifest2[cfname]
8244
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
  2475
                        newfparent = fparent1
6874
8dc21876261e commit: simplify file copy logic
Matt Mackall <mpm@selenic.com>
parents: 6680
diff changeset
  2476
23929
a43fdf33a6be commit: remove reverse search for copy source when not in parent (issue4476)
Ryan McElroy <rmcelroy@fb.com>
parents: 23917
diff changeset
  2477
            # Here, we used to search backwards through history to try to find
a43fdf33a6be commit: remove reverse search for copy source when not in parent (issue4476)
Ryan McElroy <rmcelroy@fb.com>
parents: 23917
diff changeset
  2478
            # where the file copy came from if the source of a copy was not in
24180
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24114
diff changeset
  2479
            # the parent directory. However, this doesn't actually make sense to
23929
a43fdf33a6be commit: remove reverse search for copy source when not in parent (issue4476)
Ryan McElroy <rmcelroy@fb.com>
parents: 23917
diff changeset
  2480
            # do (what does a copy from something not in your working copy even
a43fdf33a6be commit: remove reverse search for copy source when not in parent (issue4476)
Ryan McElroy <rmcelroy@fb.com>
parents: 23917
diff changeset
  2481
            # mean?) and it causes bugs (eg, issue4476). Instead, we will warn
a43fdf33a6be commit: remove reverse search for copy source when not in parent (issue4476)
Ryan McElroy <rmcelroy@fb.com>
parents: 23917
diff changeset
  2482
            # the user that copy information was dropped, so if they didn't
a43fdf33a6be commit: remove reverse search for copy source when not in parent (issue4476)
Ryan McElroy <rmcelroy@fb.com>
parents: 23917
diff changeset
  2483
            # expect this outcome it can be fixed, but this is the correct
a43fdf33a6be commit: remove reverse search for copy source when not in parent (issue4476)
Ryan McElroy <rmcelroy@fb.com>
parents: 23917
diff changeset
  2484
            # behavior in this circumstance.
6875
0d714a48ab53 add a fix for issue 1175
Matt Mackall <mpm@selenic.com>
parents: 6874
diff changeset
  2485
42062
8de1b5a009ee localrepo: rename crev in _filecommit() to cnode, since it's a node
Martin von Zweigbergk <martinvonz@google.com>
parents: 42046
diff changeset
  2486
            if cnode:
8de1b5a009ee localrepo: rename crev in _filecommit() to cnode, since it's a node
Martin von Zweigbergk <martinvonz@google.com>
parents: 42046
diff changeset
  2487
                self.ui.debug(" %s: copy %s:%s\n" % (fname, cfname, hex(cnode)))
42141
0e41f40b01cc copies: add config option for writing copy metadata to file and/or changset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42136
diff changeset
  2488
                if includecopymeta:
0e41f40b01cc copies: add config option for writing copy metadata to file and/or changset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42136
diff changeset
  2489
                    meta["copy"] = cfname
0e41f40b01cc copies: add config option for writing copy metadata to file and/or changset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42136
diff changeset
  2490
                    meta["copyrev"] = hex(cnode)
13000
417f3c27983b commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents: 12899
diff changeset
  2491
                fparent1, fparent2 = nullid, newfparent
417f3c27983b commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents: 12899
diff changeset
  2492
            else:
417f3c27983b commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents: 12899
diff changeset
  2493
                self.ui.warn(_("warning: can't find ancestor for '%s' "
417f3c27983b commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents: 12899
diff changeset
  2494
                               "copied from '%s'!\n") % (fname, cfname))
417f3c27983b commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents: 12899
diff changeset
  2495
20556
db0740a487ab localrepo: commit: avoid calling expensive ancestor function when p1 is nullrev
Mads Kiilerich <madski@unity3d.com>
parents: 20469
diff changeset
  2496
        elif fparent1 == nullid:
db0740a487ab localrepo: commit: avoid calling expensive ancestor function when p1 is nullrev
Mads Kiilerich <madski@unity3d.com>
parents: 20469
diff changeset
  2497
            fparent1, fparent2 = fparent2, nullid
8244
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
  2498
        elif fparent2 != nullid:
1716
ef8cd889a78b Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents: 1713
diff changeset
  2499
            # is one parent an ancestor of the other?
21106
53433d8f1faa localrepo: use commonancestorsheads for checking linear heritage in file commit
Mads Kiilerich <madski@unity3d.com>
parents: 21071
diff changeset
  2500
            fparentancestors = flog.commonancestorsheads(fparent1, fparent2)
20987
298c9f346dde commit: use revlog.commonancestors instead of .ancestor
Mads Kiilerich <madski@unity3d.com>
parents: 20975
diff changeset
  2501
            if fparent1 in fparentancestors:
8244
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
  2502
                fparent1, fparent2 = fparent2, nullid
20987
298c9f346dde commit: use revlog.commonancestors instead of .ancestor
Mads Kiilerich <madski@unity3d.com>
parents: 20975
diff changeset
  2503
            elif fparent2 in fparentancestors:
8244
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
  2504
                fparent2 = nullid
1716
ef8cd889a78b Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents: 1713
diff changeset
  2505
8401
ca7dc47eecc6 filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents: 8400
diff changeset
  2506
        # is the file changed?
24394
03163826b4e6 localrepo: reuse commit of parent filectx entries without rehashing
Mads Kiilerich <madski@unity3d.com>
parents: 24388
diff changeset
  2507
        text = fctx.data()
8401
ca7dc47eecc6 filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents: 8400
diff changeset
  2508
        if fparent2 != nullid or flog.cmp(fparent1, text) or meta:
ca7dc47eecc6 filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents: 8400
diff changeset
  2509
            changelist.append(fname)
ca7dc47eecc6 filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents: 8400
diff changeset
  2510
            return flog.add(text, meta, tr, linkrev, fparent1, fparent2)
ca7dc47eecc6 filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents: 8400
diff changeset
  2511
        # are just the flags changed during merge?
22492
d5261db0011f commit: catch changed exec bit on files from p1 (issue4382)
Matt Mackall <mpm@selenic.com>
parents: 21866
diff changeset
  2512
        elif fname in manifest1 and manifest1.flags(fname) != fctx.flags():
8401
ca7dc47eecc6 filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents: 8400
diff changeset
  2513
            changelist.append(fname)
ca7dc47eecc6 filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents: 8400
diff changeset
  2514
ca7dc47eecc6 filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents: 8400
diff changeset
  2515
        return fparent1
1716
ef8cd889a78b Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents: 1713
diff changeset
  2516
28813
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  2517
    def checkcommitpatterns(self, wctx, vdirs, match, status, fail):
30332
318a24b52eeb spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents: 30272
diff changeset
  2518
        """check for commit arguments that aren't committable"""
28814
1f65f291a5b7 localrepo: drop force check from checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28813
diff changeset
  2519
        if match.isexact() or match.prefix():
28813
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  2520
            matched = set(status.modified + status.added + status.removed)
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  2521
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  2522
            for f in match.files():
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  2523
                f = self.dirstate.normalize(f)
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  2524
                if f == '.' or f in matched or f in wctx.substate:
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  2525
                    continue
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  2526
                if f in status.deleted:
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  2527
                    fail(f, _('file not found!'))
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  2528
                if f in vdirs: # visited directory
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  2529
                    d = f + '/'
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  2530
                    for mf in matched:
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  2531
                        if mf.startswith(d):
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  2532
                            break
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  2533
                    else:
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  2534
                        fail(f, _("no match under directory!"))
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  2535
                elif f not in self.dirstate:
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  2536
                    fail(f, _("file not tracked!"))
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  2537
18016
2a393df0f5cc clfilter: rename `unfilteredmeth` to `unfilteredmethod`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18014
diff changeset
  2538
    @unfilteredmethod
8706
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8705
diff changeset
  2539
    def commit(self, text="", user=None, date=None, match=None, force=False,
26322
2cd19782d2d4 commit: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26321
diff changeset
  2540
               editor=False, extra=None):
8515
865e08a7d6b0 localrepo: update commit*() docstrings
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8503
diff changeset
  2541
        """Add a new revision to current repository.
865e08a7d6b0 localrepo: update commit*() docstrings
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8503
diff changeset
  2542
8706
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8705
diff changeset
  2543
        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
  2544
        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
  2545
        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
  2546
        """
26322
2cd19782d2d4 commit: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26321
diff changeset
  2547
        if extra is None:
2cd19782d2d4 commit: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26321
diff changeset
  2548
            extra = {}
8709
b9e0ddb04c5c commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents: 8707
diff changeset
  2549
8715
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
  2550
        def fail(f, msg):
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26577
diff changeset
  2551
            raise error.Abort('%s: %s' % (f, msg))
8715
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
  2552
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
  2553
        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
  2554
            match = matchmod.always()
8715
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
  2555
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
  2556
        if not force:
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
  2557
            vdirs = []
19138
e579687cb5d8 localrepo.commit: hook into match.explicitdir
Siddharth Agarwal <sid0@fb.com>
parents: 19097
diff changeset
  2558
            match.explicitdir = vdirs.append
8715
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
  2559
            match.bad = fail
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
  2560
41363
b87a009d1b3b localrepo: use context manager for locks in commit()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41362
diff changeset
  2561
        # 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
  2562
        with self.wlock(), self.lock():
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
  2563
            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
  2564
            merge = len(wctx.parents()) > 1
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
  2565
32312
0d6b3572ad92 match: remove ispartial()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32292
diff changeset
  2566
            if not force and merge and not match.always():
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26577
diff changeset
  2567
                raise error.Abort(_('cannot partially commit a merge '
8397
613ac2856535 remove deprecated rawcommit
Matt Mackall <mpm@selenic.com>
parents: 8395
diff changeset
  2568
                                   '(do not specify files or patterns)'))
6706
716a1296e182 localrepo: replace dirstate by workingfilectx in filecommit()
Patrick Mezard <pmezard@gmail.com>
parents: 6705
diff changeset
  2569
22928
5e5d297ccbd0 localrepo: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22910
diff changeset
  2570
            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
  2571
            if force:
22928
5e5d297ccbd0 localrepo: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22910
diff changeset
  2572
                status.modified.extend(status.clean) # mq may commit clean files
3621
7d3d603e7df9 localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3620
diff changeset
  2573
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
  2574
            # check subrepos
36009
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35896
diff changeset
  2575
            subs, commitsubs, newstate = subrepoutil.precommit(
35025
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34881
diff changeset
  2576
                self.ui, wctx, status, match, force=force)
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
  2577
8709
b9e0ddb04c5c commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents: 8707
diff changeset
  2578
            # make sure all explicit patterns are matched
28813
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  2579
            if not force:
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  2580
                self.checkcommitpatterns(wctx, vdirs, match, status, fail)
8709
b9e0ddb04c5c commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents: 8707
diff changeset
  2581
23710
745e3b485632 context: add workingcommitctx for exact context to be committed
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23667
diff changeset
  2582
            cctx = context.workingcommitctx(self, status,
745e3b485632 context: add workingcommitctx for exact context to be committed
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23667
diff changeset
  2583
                                            text, user, date, extra)
18659
b946470efed9 localrepo: create context used for actual commit earlier
David Schleimer <dschleimer@fb.com>
parents: 18644
diff changeset
  2584
25840
25897d778738 commit: mark internal-only option
Matt Mackall <mpm@selenic.com>
parents: 25839
diff changeset
  2585
            # internal config: ui.allowemptycommit
25021
9a74b9919581 commit: no longer allow empty commit with the 'force' argument (API)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25018
diff changeset
  2586
            allowemptycommit = (wctx.branch() != wctx.p1().branch()
25018
93e015a3d1ea commit: add ui.allowemptycommit config option
Durham Goode <durham@fb.com>
parents: 25017
diff changeset
  2587
                                or extra.get('close') or merge or cctx.files()
93e015a3d1ea commit: add ui.allowemptycommit config option
Durham Goode <durham@fb.com>
parents: 25017
diff changeset
  2588
                                or self.ui.configbool('ui', 'allowemptycommit'))
25017
4e857213d2d1 commit: move empty commit condition to a new line
Durham Goode <durham@fb.com>
parents: 24992
diff changeset
  2589
            if not allowemptycommit:
8404
a2bc39ade36b commit: move 'nothing changed' test into commit()
Matt Mackall <mpm@selenic.com>
parents: 8403
diff changeset
  2590
                return None
a2bc39ade36b commit: move 'nothing changed' test into commit()
Matt Mackall <mpm@selenic.com>
parents: 8403
diff changeset
  2591
18660
7e6946ed5756 localrepo: use workingctx for validation in commit
David Schleimer <dschleimer@fb.com>
parents: 18659
diff changeset
  2592
            if merge and cctx.deleted():
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26577
diff changeset
  2593
                raise error.Abort(_("cannot commit merge with missing files"))
16536
63c817ea4a70 commit: abort on merge with missing files
Patrick Mezard <patrick@mezard.eu>
parents: 16456
diff changeset
  2594
26996
bf3eec62212f localrepo.commit: switch to mergestate.read()
Siddharth Agarwal <sid0@fb.com>
parents: 26989
diff changeset
  2595
            ms = mergemod.mergestate.read(self)
30496
a90867a22daf localrepo: refer to checkunresolved by its new name
Augie Fackler <augie@google.com>
parents: 30492
diff changeset
  2596
            mergeutil.checkunresolved(ms)
8496
a21605de1509 commit: move editor outside transaction
Matt Mackall <mpm@selenic.com>
parents: 8481
diff changeset
  2597
a21605de1509 commit: move editor outside transaction
Matt Mackall <mpm@selenic.com>
parents: 8481
diff changeset
  2598
            if editor:
8994
4a1187d3cb00 commit: report modified subrepos in commit editor
Matt Mackall <mpm@selenic.com>
parents: 8954
diff changeset
  2599
                cctx._text = editor(self, cctx, subs)
9935
48b81d9bca8d commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents: 9934
diff changeset
  2600
            edited = (text != cctx._text)
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
  2601
20765
f042d4b263f4 localrepo: save manually edited commit message as soon as possible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20332
diff changeset
  2602
            # 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
  2603
            # (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
  2604
            # the assumption that the user will use the same editor again.
f042d4b263f4 localrepo: save manually edited commit message as soon as possible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20332
diff changeset
  2605
            msgfn = self.savecommitmessage(cctx._text)
f042d4b263f4 localrepo: save manually edited commit message as soon as possible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20332
diff changeset
  2606
16073
b254f827b7a6 subrepo: rewrite handling of subrepo state at commit (issue2403)
Matt Mackall <mpm@selenic.com>
parents: 16030
diff changeset
  2607
            # 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
  2608
            if subs:
41688
ec7bba81ebf4 commit: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41676
diff changeset
  2609
                uipathfn = scmutil.getuipathfn(self)
16073
b254f827b7a6 subrepo: rewrite handling of subrepo state at commit (issue2403)
Matt Mackall <mpm@selenic.com>
parents: 16030
diff changeset
  2610
                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
  2611
                    sub = wctx.sub(s)
4a9bee613737 subrepo: print paths relative to upper repo root for push/pull/commit
Edouard Gomez <ed.gomez@free.fr>
parents: 11063
diff changeset
  2612
                    self.ui.status(_('committing subrepository %s\n') %
41688
ec7bba81ebf4 commit: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41676
diff changeset
  2613
                                   uipathfn(subrepoutil.subrelpath(sub)))
11112
4a9bee613737 subrepo: print paths relative to upper repo root for push/pull/commit
Edouard Gomez <ed.gomez@free.fr>
parents: 11063
diff changeset
  2614
                    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
  2615
                    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
  2616
                subrepoutil.writestate(self, newstate)
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
  2617
10970
3213e8947975 localrepo.commit: use explicit variables, avoid creating new contexts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10969
diff changeset
  2618
            p1, p2 = self.dirstate.parents()
3213e8947975 localrepo.commit: use explicit variables, avoid creating new contexts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10969
diff changeset
  2619
            hookp1, hookp2 = hex(p1), (p2 != nullid and hex(p2) or '')
9935
48b81d9bca8d commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents: 9934
diff changeset
  2620
            try:
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
  2621
                self.hook("precommit", throw=True, parent1=hookp1,
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
  2622
                          parent2=hookp2)
41362
57c462db87fd localrepo: use context manager for transaction in commit()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41361
diff changeset
  2623
                with self.transaction('commit'):
57c462db87fd localrepo: use context manager for transaction in commit()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41361
diff changeset
  2624
                    ret = self.commitctx(cctx, True)
57c462db87fd localrepo: use context manager for transaction in commit()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41361
diff changeset
  2625
                    # update bookmarks, dirstate and mergestate
57c462db87fd localrepo: use context manager for transaction in commit()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41361
diff changeset
  2626
                    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
  2627
                    cctx.markcommitted(ret)
57c462db87fd localrepo: use context manager for transaction in commit()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41361
diff changeset
  2628
                    ms.reset()
16705
c2d9ef43ff6c check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents: 16699
diff changeset
  2629
            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
  2630
                if edited:
48b81d9bca8d commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents: 9934
diff changeset
  2631
                    self.ui.write(
48b81d9bca8d commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents: 9934
diff changeset
  2632
                        _('note: commit message saved in %s\n') % msgfn)
48b81d9bca8d commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents: 9934
diff changeset
  2633
                raise
6710
0aa91f69a4c4 localrepo: extract _commitctx() from commit()
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2634
42240
39b63f9d7464 localrepo: don't use defaults arguments that will never be overridden
Martin von Zweigbergk <martinvonz@google.com>
parents: 42238
diff changeset
  2635
        def commithook():
23129
eb315418224c hook: protect commit hooks against stripping of temporary commit (issue4422)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23126
diff changeset
  2636
            # 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
  2637
            # 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
  2638
            if self.changelog.hasnode(ret):
42240
39b63f9d7464 localrepo: don't use defaults arguments that will never be overridden
Martin von Zweigbergk <martinvonz@google.com>
parents: 42238
diff changeset
  2639
                self.hook("commit", node=hex(ret), parent1=hookp1,
39b63f9d7464 localrepo: don't use defaults arguments that will never be overridden
Martin von Zweigbergk <martinvonz@google.com>
parents: 42238
diff changeset
  2640
                          parent2=hookp2)
16680
d0e419b0f7de tag: run commit hook when lock is released (issue3344)
Mads Kiilerich <mads@kiilerich.com>
parents: 16679
diff changeset
  2641
        self._afterlock(commithook)
10492
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10435
diff changeset
  2642
        return ret
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10435
diff changeset
  2643
18016
2a393df0f5cc clfilter: rename `unfilteredmeth` to `unfilteredmethod`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18014
diff changeset
  2644
    @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
  2645
    def commitctx(self, ctx, error=False, origctx=None):
7077
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7072
diff changeset
  2646
        """Add a new revision to current repository.
8410
1d11d985c179 commit: combine _commitctx and commitctx, drop unused force argument
Matt Mackall <mpm@selenic.com>
parents: 8407
diff changeset
  2647
        Revision information is passed via the context argument.
39111
46da52f4b820 commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents: 39109
diff changeset
  2648
46da52f4b820 commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents: 39109
diff changeset
  2649
        ctx.files() should list all files involved in this commit, i.e.
46da52f4b820 commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents: 39109
diff changeset
  2650
        modified/added/removed files. On merge, it may be wider than the
46da52f4b820 commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents: 39109
diff changeset
  2651
        ctx.files() to be committed, since any file nodes derived directly
46da52f4b820 commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents: 39109
diff changeset
  2652
        from p1 or p2 are excluded from the committed ctx.files().
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
  2653
d98ec36be808 convert: add a config option to help doing identity hg->hg conversion
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42546
diff changeset
  2654
        origctx is for convert to work around the problem that bug
d98ec36be808 convert: add a config option to help doing identity hg->hg conversion
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42546
diff changeset
  2655
        fixes to the files list in changesets change hashes. For
d98ec36be808 convert: add a config option to help doing identity hg->hg conversion
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42546
diff changeset
  2656
        convert to be the identity, it can pass an origctx and this
d98ec36be808 convert: add a config option to help doing identity hg->hg conversion
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42546
diff changeset
  2657
        function will use the same files list when it makes sense to
d98ec36be808 convert: add a config option to help doing identity hg->hg conversion
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42546
diff changeset
  2658
        do so.
7077
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7072
diff changeset
  2659
        """
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6712
diff changeset
  2660
8414
2348ce25849b commitctx: use contexts more fully
Matt Mackall <mpm@selenic.com>
parents: 8412
diff changeset
  2661
        p1, p2 = ctx.p1(), ctx.p2()
8412
2bf4f380f6ab commitctx: eliminate some variables
Matt Mackall <mpm@selenic.com>
parents: 8411
diff changeset
  2662
        user = ctx.user()
990
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
  2663
42141
0e41f40b01cc copies: add config option for writing copy metadata to file and/or changset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42136
diff changeset
  2664
        writecopiesto = self.ui.config('experimental', 'copies.write-to')
0e41f40b01cc copies: add config option for writing copy metadata to file and/or changset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42136
diff changeset
  2665
        writefilecopymeta = writecopiesto != 'changeset-only'
42406
f385ba70e4af changelog: optionally store added and removed files in changeset extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 42349
diff changeset
  2666
        writechangesetcopy = (writecopiesto in
f385ba70e4af changelog: optionally store added and removed files in changeset extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 42349
diff changeset
  2667
                              ('changeset-only', 'compatibility'))
42141
0e41f40b01cc copies: add config option for writing copy metadata to file and/or changset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42136
diff changeset
  2668
        p1copies, p2copies = None, None
42406
f385ba70e4af changelog: optionally store added and removed files in changeset extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 42349
diff changeset
  2669
        if writechangesetcopy:
42141
0e41f40b01cc copies: add config option for writing copy metadata to file and/or changset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42136
diff changeset
  2670
            p1copies = ctx.p1copies()
0e41f40b01cc copies: add config option for writing copy metadata to file and/or changset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42136
diff changeset
  2671
            p2copies = ctx.p2copies()
42406
f385ba70e4af changelog: optionally store added and removed files in changeset extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 42349
diff changeset
  2672
        filesadded, filesremoved = None, None
41364
0132221c25cd localrepo: use context manager for lock and transaction in commitctx()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41363
diff changeset
  2673
        with self.lock(), self.transaction("commit") as tr:
4970
30d4d8985dd8 transactions: avoid late tear-down (issue641)
Matt Mackall <mpm@selenic.com>
parents: 4917
diff changeset
  2674
            trp = weakref.proxy(tr)
151
1f6c61a60586 Bail on attempts to do an empty commit
mpm@selenic.com
parents: 149
diff changeset
  2675
30566
46d2c8b23c33 localrepo: make it possible to reuse manifest when commiting context
Mateusz Kwapich <mitrandir@fb.com>
parents: 30496
diff changeset
  2676
            if ctx.manifestnode():
46d2c8b23c33 localrepo: make it possible to reuse manifest when commiting context
Mateusz Kwapich <mitrandir@fb.com>
parents: 30496
diff changeset
  2677
                # reuse an existing manifest revision
39109
a915db9a5e77 commit: add debug message regarding manifest reuse
Yuya Nishihara <yuya@tcha.org>
parents: 38986
diff changeset
  2678
                self.ui.debug('reusing known manifest\n')
30566
46d2c8b23c33 localrepo: make it possible to reuse manifest when commiting context
Mateusz Kwapich <mitrandir@fb.com>
parents: 30496
diff changeset
  2679
                mn = ctx.manifestnode()
46d2c8b23c33 localrepo: make it possible to reuse manifest when commiting context
Mateusz Kwapich <mitrandir@fb.com>
parents: 30496
diff changeset
  2680
                files = ctx.files()
42406
f385ba70e4af changelog: optionally store added and removed files in changeset extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 42349
diff changeset
  2681
                if writechangesetcopy:
f385ba70e4af changelog: optionally store added and removed files in changeset extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 42349
diff changeset
  2682
                    filesadded = ctx.filesadded()
f385ba70e4af changelog: optionally store added and removed files in changeset extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 42349
diff changeset
  2683
                    filesremoved = ctx.filesremoved()
30566
46d2c8b23c33 localrepo: make it possible to reuse manifest when commiting context
Mateusz Kwapich <mitrandir@fb.com>
parents: 30496
diff changeset
  2684
            elif ctx.files():
30345
fa54f7ade491 manifest: remove manifest.add and add memmfctx.write
Durham Goode <durham@fb.com>
parents: 30332
diff changeset
  2685
                m1ctx = p1.manifestctx()
fa54f7ade491 manifest: remove manifest.add and add memmfctx.write
Durham Goode <durham@fb.com>
parents: 30332
diff changeset
  2686
                m2ctx = p2.manifestctx()
fa54f7ade491 manifest: remove manifest.add and add memmfctx.write
Durham Goode <durham@fb.com>
parents: 30332
diff changeset
  2687
                mctx = m1ctx.copy()
fa54f7ade491 manifest: remove manifest.add and add memmfctx.write
Durham Goode <durham@fb.com>
parents: 30332
diff changeset
  2688
fa54f7ade491 manifest: remove manifest.add and add memmfctx.write
Durham Goode <durham@fb.com>
parents: 30332
diff changeset
  2689
                m = mctx.read()
fa54f7ade491 manifest: remove manifest.add and add memmfctx.write
Durham Goode <durham@fb.com>
parents: 30332
diff changeset
  2690
                m1 = m1ctx.read()
fa54f7ade491 manifest: remove manifest.add and add memmfctx.write
Durham Goode <durham@fb.com>
parents: 30332
diff changeset
  2691
                m2 = m2ctx.read()
14162
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2692
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2693
                # check in files
22910
4f2a5c7cdf78 commit: update file nodeid and flags in the same place
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22909
diff changeset
  2694
                added = []
14162
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2695
                changed = []
22907
a337f4b9b99d commit: reduce scope of 'removed' variable
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22852
diff changeset
  2696
                removed = list(ctx.removed())
14162
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2697
                linkrev = len(self)
23749
a387b0390082 localrepo: show headline notes in commitctx before showing filenames
Mads Kiilerich <madski@unity3d.com>
parents: 23714
diff changeset
  2698
                self.ui.note(_("committing files:\n"))
41688
ec7bba81ebf4 commit: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41676
diff changeset
  2699
                uipathfn = scmutil.getuipathfn(self)
14162
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2700
                for f in sorted(ctx.modified() + ctx.added()):
41688
ec7bba81ebf4 commit: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41676
diff changeset
  2701
                    self.ui.note(uipathfn(f) + "\n")
14162
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2702
                    try:
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2703
                        fctx = ctx[f]
22296
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 22201
diff changeset
  2704
                        if fctx is None:
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 22201
diff changeset
  2705
                            removed.append(f)
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 22201
diff changeset
  2706
                        else:
22910
4f2a5c7cdf78 commit: update file nodeid and flags in the same place
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22909
diff changeset
  2707
                            added.append(f)
4f2a5c7cdf78 commit: update file nodeid and flags in the same place
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22909
diff changeset
  2708
                            m[f] = self._filecommit(fctx, m1, m2, linkrev,
42141
0e41f40b01cc copies: add config option for writing copy metadata to file and/or changset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42136
diff changeset
  2709
                                                    trp, changed,
0e41f40b01cc copies: add config option for writing copy metadata to file and/or changset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42136
diff changeset
  2710
                                                    writefilecopymeta)
22942
03602f76deee manifest: rename ambiguously-named set to setflag
Augie Fackler <raf@durin42.com>
parents: 22928
diff changeset
  2711
                            m.setflag(f, fctx.flags())
41365
876494fd967d cleanup: delete lots of unused local variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 41364
diff changeset
  2712
                    except OSError:
41688
ec7bba81ebf4 commit: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41676
diff changeset
  2713
                        self.ui.warn(_("trouble committing %s!\n") %
ec7bba81ebf4 commit: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41676
diff changeset
  2714
                                     uipathfn(f))
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  2715
                        raise
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25629
diff changeset
  2716
                    except IOError as inst:
14162
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2717
                        errcode = getattr(inst, 'errno', errno.ENOENT)
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2718
                        if error or errcode and errcode != errno.ENOENT:
41688
ec7bba81ebf4 commit: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41676
diff changeset
  2719
                            self.ui.warn(_("trouble committing %s!\n") %
ec7bba81ebf4 commit: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41676
diff changeset
  2720
                                         uipathfn(f))
22296
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 22201
diff changeset
  2721
                        raise
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
  2722
14162
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2723
                # update manifest
42347
6310180662f5 commit: move sorting of added and removed files list to lower level
Martin von Zweigbergk <martinvonz@google.com>
parents: 42339
diff changeset
  2724
                removed = [f for f in removed if f in m1 or f in m2]
6310180662f5 commit: move sorting of added and removed files list to lower level
Martin von Zweigbergk <martinvonz@google.com>
parents: 42339
diff changeset
  2725
                drop = sorted([f for f in removed if f in m])
14162
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2726
                for f in drop:
22909
4545c5b53013 commit: use separate variable for p1 manifest and new manifest
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22908
diff changeset
  2727
                    del m[f]
42621
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2728
                if p2.rev() != nullrev:
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2729
                    @util.cachefunc
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2730
                    def mas():
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2731
                        p1n = p1.node()
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2732
                        p2n = p2.node()
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2733
                        cahs = self.changelog.commonancestorsheads(p1n, p2n)
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2734
                        if not cahs:
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2735
                            cahs = [nullrev]
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2736
                        return [self[r].manifest() for r in cahs]
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2737
                    def deletionfromparent(f):
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2738
                        # When a file is removed relative to p1 in a merge, this
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2739
                        # function determines whether the absence is due to a
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2740
                        # deletion from a parent, or whether the merge commit
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2741
                        # itself deletes the file. We decide this by doing a
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2742
                        # simplified three way merge of the manifest entry for
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2743
                        # the file. There are two ways we decide the merge
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2744
                        # itself didn't delete a file:
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2745
                        # - neither parent (nor the merge) contain the file
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2746
                        # - exactly one parent contains the file, and that
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2747
                        #   parent has the same filelog entry as the merge
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2748
                        #   ancestor (or all of them if there two). In other
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2749
                        #   words, that parent left the file unchanged while the
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2750
                        #   other one deleted it.
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2751
                        # One way to think about this is that deleting a file is
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2752
                        # similar to emptying it, so the list of changed files
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2753
                        # should be similar either way. The computation
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2754
                        # described above is not done directly in _filecommit
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2755
                        # when creating the list of changed files, however
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2756
                        # it does something very similar by comparing filelog
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2757
                        # nodes.
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2758
                        if f in m1:
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2759
                            return (f not in m2
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2760
                                    and all(f in ma and ma.find(f) == m1.find(f)
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2761
                                            for ma in mas()))
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2762
                        elif f in m2:
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2763
                            return all(f in ma and ma.find(f) == m2.find(f)
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2764
                                       for ma in mas())
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2765
                        else:
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2766
                            return True
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2767
                    removed = [f for f in removed if not deletionfromparent(f)]
99ebde4fec99 commit: improve the files field of changelog for merges
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42620
diff changeset
  2768
14162
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2769
                files = changed + removed
39111
46da52f4b820 commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents: 39109
diff changeset
  2770
                md = None
46da52f4b820 commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents: 39109
diff changeset
  2771
                if not files:
46da52f4b820 commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents: 39109
diff changeset
  2772
                    # if no "files" actually changed in terms of the changelog,
46da52f4b820 commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents: 39109
diff changeset
  2773
                    # try hard to detect unmodified manifest entry so that the
46da52f4b820 commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents: 39109
diff changeset
  2774
                    # exact same commit can be reproduced later on convert.
46da52f4b820 commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents: 39109
diff changeset
  2775
                    md = m1.diff(m, scmutil.matchfiles(self, ctx.files()))
46da52f4b820 commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents: 39109
diff changeset
  2776
                if not files and md:
46da52f4b820 commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents: 39109
diff changeset
  2777
                    self.ui.debug('not reusing manifest (no file change in '
46da52f4b820 commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents: 39109
diff changeset
  2778
                                  'changelog, but manifest differs)\n')
46da52f4b820 commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents: 39109
diff changeset
  2779
                if files or md:
46da52f4b820 commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents: 39109
diff changeset
  2780
                    self.ui.note(_("committing manifest\n"))
39668
24870f1be088 narrow: when writing treemanifests, skip inspecting directories outside narrow
spectral <spectral@google.com>
parents: 39606
diff changeset
  2781
                    # we're using narrowmatch here since it's already applied at
24870f1be088 narrow: when writing treemanifests, skip inspecting directories outside narrow
spectral <spectral@google.com>
parents: 39606
diff changeset
  2782
                    # other stages (such as dirstate.walk), so we're already
24870f1be088 narrow: when writing treemanifests, skip inspecting directories outside narrow
spectral <spectral@google.com>
parents: 39606
diff changeset
  2783
                    # ignoring things outside of narrowspec in most cases. The
24870f1be088 narrow: when writing treemanifests, skip inspecting directories outside narrow
spectral <spectral@google.com>
parents: 39606
diff changeset
  2784
                    # one case where we might have files outside the narrowspec
24870f1be088 narrow: when writing treemanifests, skip inspecting directories outside narrow
spectral <spectral@google.com>
parents: 39606
diff changeset
  2785
                    # at this point is merges, and we already error out in the
24870f1be088 narrow: when writing treemanifests, skip inspecting directories outside narrow
spectral <spectral@google.com>
parents: 39606
diff changeset
  2786
                    # case where the merge has files outside of the narrowspec,
24870f1be088 narrow: when writing treemanifests, skip inspecting directories outside narrow
spectral <spectral@google.com>
parents: 39606
diff changeset
  2787
                    # so this is safe.
39111
46da52f4b820 commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents: 39109
diff changeset
  2788
                    mn = mctx.write(trp, linkrev,
46da52f4b820 commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents: 39109
diff changeset
  2789
                                    p1.manifestnode(), p2.manifestnode(),
39668
24870f1be088 narrow: when writing treemanifests, skip inspecting directories outside narrow
spectral <spectral@google.com>
parents: 39606
diff changeset
  2790
                                    added, drop, match=self.narrowmatch())
42406
f385ba70e4af changelog: optionally store added and removed files in changeset extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 42349
diff changeset
  2791
f385ba70e4af changelog: optionally store added and removed files in changeset extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 42349
diff changeset
  2792
                    if writechangesetcopy:
f385ba70e4af changelog: optionally store added and removed files in changeset extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 42349
diff changeset
  2793
                        filesadded = [f for f in changed
f385ba70e4af changelog: optionally store added and removed files in changeset extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 42349
diff changeset
  2794
                                      if not (f in m1 or f in m2)]
f385ba70e4af changelog: optionally store added and removed files in changeset extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 42349
diff changeset
  2795
                        filesremoved = removed
39111
46da52f4b820 commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents: 39109
diff changeset
  2796
                else:
42286
8988e640a8ac commit: fix a typo ("form p1" -> "from p1")
Martin von Zweigbergk <martinvonz@google.com>
parents: 42240
diff changeset
  2797
                    self.ui.debug('reusing manifest from p1 (listed files '
39111
46da52f4b820 commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents: 39109
diff changeset
  2798
                                  'actually unchanged)\n')
46da52f4b820 commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents: 39109
diff changeset
  2799
                    mn = p1.manifestnode()
14162
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2800
            else:
39109
a915db9a5e77 commit: add debug message regarding manifest reuse
Yuya Nishihara <yuya@tcha.org>
parents: 38986
diff changeset
  2801
                self.ui.debug('reusing manifest from p1 (no file change)\n')
14162
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2802
                mn = p1.manifestnode()
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2803
                files = []
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
  2804
42300
278dcb24e535 copies: write empty entries in changeset when also writing to filelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 42286
diff changeset
  2805
            if writecopiesto == 'changeset-only':
278dcb24e535 copies: write empty entries in changeset when also writing to filelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 42286
diff changeset
  2806
                # If writing only to changeset extras, use None to indicate that
278dcb24e535 copies: write empty entries in changeset when also writing to filelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 42286
diff changeset
  2807
                # no entry should be written. If writing to both, write an empty
278dcb24e535 copies: write empty entries in changeset when also writing to filelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 42286
diff changeset
  2808
                # entry to prevent the reader from falling back to reading
278dcb24e535 copies: write empty entries in changeset when also writing to filelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 42286
diff changeset
  2809
                # filelogs.
278dcb24e535 copies: write empty entries in changeset when also writing to filelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 42286
diff changeset
  2810
                p1copies = p1copies or None
278dcb24e535 copies: write empty entries in changeset when also writing to filelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 42286
diff changeset
  2811
                p2copies = p2copies or None
42406
f385ba70e4af changelog: optionally store added and removed files in changeset extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 42349
diff changeset
  2812
                filesadded = filesadded or None
f385ba70e4af changelog: optionally store added and removed files in changeset extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 42349
diff changeset
  2813
                filesremoved = filesremoved or None
42300
278dcb24e535 copies: write empty entries in changeset when also writing to filelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 42286
diff changeset
  2814
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
  2815
            if origctx and origctx.manifestnode() == mn:
d98ec36be808 convert: add a config option to help doing identity hg->hg conversion
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42546
diff changeset
  2816
                files = origctx.files()
d98ec36be808 convert: add a config option to help doing identity hg->hg conversion
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42546
diff changeset
  2817
8499
fb9b83df45f3 commit: move description trimming into changelog
Matt Mackall <mpm@selenic.com>
parents: 8498
diff changeset
  2818
            # update changelog
23749
a387b0390082 localrepo: show headline notes in commitctx before showing filenames
Mads Kiilerich <madski@unity3d.com>
parents: 23714
diff changeset
  2819
            self.ui.note(_("committing changelog\n"))
23203
3872d563e01a changelog: handle writepending in the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23129
diff changeset
  2820
            self.changelog.delayupdate(tr)
14162
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2821
            n = self.changelog.add(mn, files, ctx.description(),
8499
fb9b83df45f3 commit: move description trimming into changelog
Matt Mackall <mpm@selenic.com>
parents: 8498
diff changeset
  2822
                                   trp, p1.node(), p2.node(),
42141
0e41f40b01cc copies: add config option for writing copy metadata to file and/or changset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42136
diff changeset
  2823
                                   user, ctx.date(), ctx.extra().copy(),
42406
f385ba70e4af changelog: optionally store added and removed files in changeset extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 42349
diff changeset
  2824
                                   p1copies, p2copies, filesadded, filesremoved)
10492
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10435
diff changeset
  2825
            xp1, xp2 = p1.hex(), p2 and p2.hex() or ''
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  2826
            self.hook('pretxncommit', throw=True, node=hex(n), parent1=xp1,
26751
520defbc0335 hook: centralize passing HG_PENDING to external hook process
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26748
diff changeset
  2827
                      parent2=xp2)
15706
ebaefd8c6028 Add a phases.new-commit option to control minimal phase of new commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15659
diff changeset
  2828
            # set the new commit is proper phase
36009
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35896
diff changeset
  2829
            targetphase = subrepoutil.newcommitphase(self.ui, ctx)
15706
ebaefd8c6028 Add a phases.new-commit option to control minimal phase of new commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15659
diff changeset
  2830
            if targetphase:
ebaefd8c6028 Add a phases.new-commit option to control minimal phase of new commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15659
diff changeset
  2831
                # retract boundary do not alter parent changeset.
ebaefd8c6028 Add a phases.new-commit option to control minimal phase of new commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15659
diff changeset
  2832
                # if a parent have higher the resulting phase will
ebaefd8c6028 Add a phases.new-commit option to control minimal phase of new commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15659
diff changeset
  2833
                # be compliant anyway
ebaefd8c6028 Add a phases.new-commit option to control minimal phase of new commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15659
diff changeset
  2834
                #
ebaefd8c6028 Add a phases.new-commit option to control minimal phase of new commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15659
diff changeset
  2835
                # if minimal phase was 0 we don't need to retract anything
33454
3c20d7ef42e1 localrepo: use the 'registernew' function to set the phase of new commit
Boris Feld <boris.feld@octobus.net>
parents: 33451
diff changeset
  2836
                phases.registernew(self, tr, targetphase, [n])
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  2837
            return n
660
2c83350784c3 Move commit hook after commit completes
Matt Mackall <mpm@selenic.com>
parents: 659
diff changeset
  2838
18016
2a393df0f5cc clfilter: rename `unfilteredmeth` to `unfilteredmethod`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18014
diff changeset
  2839
    @unfilteredmethod
18310
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  2840
    def destroying(self):
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  2841
        '''Inform the repository that nodes are about to be destroyed.
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  2842
        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
  2843
        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
  2844
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  2845
        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
  2846
        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
  2847
        destroyed is imminent, the repo will be invalidated causing those
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  2848
        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
  2849
        completely.
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  2850
        '''
18312
7331ee72f99c localrepo: write the phasecache when destroying nodes
Idan Kamara <idankk86@gmail.com>
parents: 18311
diff changeset
  2851
        # 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
  2852
        # 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
  2853
        # causing those changes to disappear.
7331ee72f99c localrepo: write the phasecache when destroying nodes
Idan Kamara <idankk86@gmail.com>
parents: 18311
diff changeset
  2854
        if '_phasecache' in vars(self):
7331ee72f99c localrepo: write the phasecache when destroying nodes
Idan Kamara <idankk86@gmail.com>
parents: 18311
diff changeset
  2855
            self._phasecache.write()
7331ee72f99c localrepo: write the phasecache when destroying nodes
Idan Kamara <idankk86@gmail.com>
parents: 18311
diff changeset
  2856
18310
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  2857
    @unfilteredmethod
18395
904b7109938e destroyed: drop complex branchcache rebuilt logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18394
diff changeset
  2858
    def destroyed(self):
9150
09a1ee498756 localrepo: add destroyed() method for strip/rollback to use (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9149
diff changeset
  2859
        '''Inform the repository that nodes have been destroyed.
09a1ee498756 localrepo: add destroyed() method for strip/rollback to use (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9149
diff changeset
  2860
        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
  2861
        place for anything that has to be done after destroying history.
c8eda7bbdcab strip: incrementally update the branchheads cache after a strip
Joshua Redstone <joshua.redstone@fb.com>
parents: 17012
diff changeset
  2862
        '''
18221
082d6929fd4d localrepo: filter unknown nodes from the phasecache on destroyed
Idan Kamara <idankk86@gmail.com>
parents: 18219
diff changeset
  2863
        # When one tries to:
082d6929fd4d localrepo: filter unknown nodes from the phasecache on destroyed
Idan Kamara <idankk86@gmail.com>
parents: 18219
diff changeset
  2864
        # 1) destroy nodes thus calling this method (e.g. strip)
082d6929fd4d localrepo: filter unknown nodes from the phasecache on destroyed
Idan Kamara <idankk86@gmail.com>
parents: 18219
diff changeset
  2865
        # 2) use phasecache somewhere (e.g. commit)
082d6929fd4d localrepo: filter unknown nodes from the phasecache on destroyed
Idan Kamara <idankk86@gmail.com>
parents: 18219
diff changeset
  2866
        #
082d6929fd4d localrepo: filter unknown nodes from the phasecache on destroyed
Idan Kamara <idankk86@gmail.com>
parents: 18219
diff changeset
  2867
        # then 2) will fail because the phasecache contains nodes that were
082d6929fd4d localrepo: filter unknown nodes from the phasecache on destroyed
Idan Kamara <idankk86@gmail.com>
parents: 18219
diff changeset
  2868
        # removed. We can either remove phasecache from the filecache,
082d6929fd4d localrepo: filter unknown nodes from the phasecache on destroyed
Idan Kamara <idankk86@gmail.com>
parents: 18219
diff changeset
  2869
        # causing it to reload next time it is accessed, or simply filter
082d6929fd4d localrepo: filter unknown nodes from the phasecache on destroyed
Idan Kamara <idankk86@gmail.com>
parents: 18219
diff changeset
  2870
        # the removed nodes now and write the updated cache.
18757
1c8e0d6ac3b0 localrepo: always write the filtered phasecache when nodes are destroyed (issue3827)
Idan Kamara <idankk86@gmail.com>
parents: 18739
diff changeset
  2871
        self._phasecache.filterunknown(self)
1c8e0d6ac3b0 localrepo: always write the filtered phasecache when nodes are destroyed (issue3827)
Idan Kamara <idankk86@gmail.com>
parents: 18739
diff changeset
  2872
        self._phasecache.write()
18221
082d6929fd4d localrepo: filter unknown nodes from the phasecache on destroyed
Idan Kamara <idankk86@gmail.com>
parents: 18219
diff changeset
  2873
32264
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32263
diff changeset
  2874
        # 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
  2875
        self.updatecaches()
18223
6d6d0248530b destroyed: filter unknown before computing branchcache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18222
diff changeset
  2876
9151
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
  2877
        # 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
  2878
        # 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
  2879
        # 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
  2880
        # guarantees that "cachetip == currenttip" (comparing both rev
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
  2881
        # 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
  2882
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
  2883
        # 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
  2884
        # 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
  2885
        # 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
  2886
        # 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
  2887
        self.invalidate()
17324
9f94358f9f93 localrepo: clear the filecache on _rollback() and destroyed()
Idan Kamara <idankk86@gmail.com>
parents: 17306
diff changeset
  2888
6769
97c12b1ed1e0 status: use contexts
Matt Mackall <mpm@selenic.com>
parents: 6764
diff changeset
  2889
    def status(self, node1='.', node2=None, match=None,
12166
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
  2890
               ignored=False, clean=False, unknown=False,
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
  2891
               listsubrepos=False):
21596
83bbfb23cb24 localrepo: replace status method with a shim
Sean Farley <sean.michael.farley@gmail.com>
parents: 21591
diff changeset
  2892
        '''a convenience method that calls node1.status(node2)'''
83bbfb23cb24 localrepo: replace status method with a shim
Sean Farley <sean.michael.farley@gmail.com>
parents: 21591
diff changeset
  2893
        return self[node1].status(node2, match, ignored, clean, unknown,
83bbfb23cb24 localrepo: replace status method with a shim
Sean Farley <sean.michael.farley@gmail.com>
parents: 21591
diff changeset
  2894
                                  listsubrepos)
2661
5c10b7ed3411 status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2621
diff changeset
  2895
32814
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  2896
    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
  2897
        """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
  2898
        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
  2899
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  2900
        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
  2901
        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
  2902
        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
  2903
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  2904
        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
  2905
        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
  2906
        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
  2907
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  2908
        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
  2909
        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
  2910
        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
  2911
        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
  2912
        """
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  2913
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  2914
        # 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
  2915
        # 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
  2916
        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
  2917
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  2918
    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
  2919
        """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
  2920
        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
  2921
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
  2922
    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
  2923
        """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
  2924
        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
  2925
8796
2bcef677a6c3 localrepo: remove 'closed' argument to heads(...) function
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 8731
diff changeset
  2926
    def heads(self, start=None):
30875
1791be8a95c5 localrepo: avoid unnecessary conversion from node to rev
Stanislau Hlebik <stash@fb.com>
parents: 30818
diff changeset
  2927
        if start is None:
30905
6037caa6a2f3 localrepo: cache self.changelog in local variable
Stanislau Hlebik <stash@fb.com>
parents: 30875
diff changeset
  2928
            cl = self.changelog
30906
72f25e17af9d localrepo: avoid unnecessary sorting
Stanislau Hlebik <stash@fb.com>
parents: 30905
diff changeset
  2929
            headrevs = reversed(cl.headrevs())
30905
6037caa6a2f3 localrepo: cache self.changelog in local variable
Stanislau Hlebik <stash@fb.com>
parents: 30875
diff changeset
  2930
            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
  2931
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
  2932
        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
  2933
        # 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
  2934
        return sorted(heads, key=self.changelog.rev, reverse=True)
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
  2935
8694
ca8d05e1f1d1 localrepo: set heads and branchheads to be closed=False by default
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 8680
diff changeset
  2936
    def branchheads(self, branch=None, start=None, closed=False):
9475
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
  2937
        '''return a (possibly filtered) list of heads for the given branch
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
  2938
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
  2939
        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
  2940
        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
  2941
        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
  2942
        If closed is True, return heads that are marked as closed as well.
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
  2943
        '''
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
  2944
        if branch is None:
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
  2945
            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
  2946
        branches = self.branchmap()
42004
0bd730fbcc2b branchcache: introduce hasbranch()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42001
diff changeset
  2947
        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
  2948
            return []
7654
816b708f23af store all heads of a branch in the branch cache
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7644
diff changeset
  2949
        # 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
  2950
        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
  2951
        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
  2952
            # 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
  2953
            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
  2954
            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
  2955
        return bheads
4648
8e503fa54d2d Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents: 4635
diff changeset
  2956
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2957
    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
  2958
        if not nodes:
83238c1db6de Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1597
diff changeset
  2959
            nodes = [self.changelog.tip()]
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2960
        b = []
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2961
        for n in nodes:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2962
            t = n
14494
1ffeeb91c55d check-code: flag 0/1 used as constant Boolean expression
Martin Geisler <mg@lazybytes.net>
parents: 14482
diff changeset
  2963
            while True:
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2964
                p = self.changelog.parents(n)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2965
                if p[1] != nullid or p[0] == nullid:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2966
                    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
  2967
                    break
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2968
                n = p[0]
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2969
        return b
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2970
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2971
    def between(self, pairs):
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2972
        r = []
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2973
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2974
        for top, bottom in pairs:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2975
            n, l, i = top, [], 0
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2976
            f = 1
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2977
7708
a32847fa0df0 wire protocol: avoid infinite loop (issue1483)
Matt Mackall <mpm@selenic.com>
parents: 7564
diff changeset
  2978
            while n != bottom and n != nullid:
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2979
                p = self.changelog.parents(n)[0]
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2980
                if i == f:
575
7f5ce4bbdd7b More whitespace cleanups
mpm@selenic.com
parents: 566
diff changeset
  2981
                    l.append(n)
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2982
                    f = f * 2
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2983
                n = p
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2984
                i += 1
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2985
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2986
            r.append(l)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2987
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2988
        return r
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2989
20924
e10000369b47 push: pass a `pushoperation` object to localrepo.checkpush
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20884
diff changeset
  2990
    def checkpush(self, pushop):
13327
dc11e30b48a3 mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents: 13272
diff changeset
  2991
        """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
  2992
        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
  2993
        command.
dc11e30b48a3 mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents: 13272
diff changeset
  2994
        """
dc11e30b48a3 mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents: 13272
diff changeset
  2995
21043
6c383c871fdb localrepo: introduce "prepushoutgoinghooks" to extend outgoing check easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20987
diff changeset
  2996
    @unfilteredpropertycache
6c383c871fdb localrepo: introduce "prepushoutgoinghooks" to extend outgoing check easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20987
diff changeset
  2997
    def prepushoutgoinghooks(self):
28876
79b8f052ee51 localrepo: refactor prepushoutgoinghook to take a pushop
Mads Kiilerich <madski@unity3d.com>
parents: 28814
diff changeset
  2998
        """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
  2999
        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
  3000
        """
6c383c871fdb localrepo: introduce "prepushoutgoinghooks" to extend outgoing check easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20987
diff changeset
  3001
        return util.hooks()
6c383c871fdb localrepo: introduce "prepushoutgoinghooks" to extend outgoing check easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20987
diff changeset
  3002
11368
b9eb005c54ad pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents: 11303
diff changeset
  3003
    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
  3004
        try:
24824
0325c0da05df pushkey: use hook arguments from transaction when one exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24821
diff changeset
  3005
            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
  3006
            hookargs = {}
0325c0da05df pushkey: use hook arguments from transaction when one exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24821
diff changeset
  3007
            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
  3008
                hookargs.update(tr.hookargs)
36400
7b86aa31b004 py3: fix handling of keyword arguments at more places
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36373
diff changeset
  3009
            hookargs = pycompat.strkwargs(hookargs)
7b86aa31b004 py3: fix handling of keyword arguments at more places
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36373
diff changeset
  3010
            hookargs[r'namespace'] = namespace
7b86aa31b004 py3: fix handling of keyword arguments at more places
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36373
diff changeset
  3011
            hookargs[r'key'] = key
7b86aa31b004 py3: fix handling of keyword arguments at more places
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36373
diff changeset
  3012
            hookargs[r'old'] = old
7b86aa31b004 py3: fix handling of keyword arguments at more places
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36373
diff changeset
  3013
            hookargs[r'new'] = new
24824
0325c0da05df pushkey: use hook arguments from transaction when one exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24821
diff changeset
  3014
            self.hook('prepushkey', throw=True, **hookargs)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25629
diff changeset
  3015
        except error.HookAbort as exc:
23416
53a65929ef1f pushkey: gracefully handle prepushkey hook failure (issue4455)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23129
diff changeset
  3016
            self.ui.write_err(_("pushkey-abort: %s\n") % exc)
53a65929ef1f pushkey: gracefully handle prepushkey hook failure (issue4455)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23129
diff changeset
  3017
            if exc.hint:
53a65929ef1f pushkey: gracefully handle prepushkey hook failure (issue4455)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23129
diff changeset
  3018
                self.ui.write_err(_("(%s)\n") % exc.hint)
53a65929ef1f pushkey: gracefully handle prepushkey hook failure (issue4455)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23129
diff changeset
  3019
            return False
17293
d3f84ccc5495 pushkey: add more verbose debug output regarding pushkey
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17252
diff changeset
  3020
        self.ui.debug('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
  3021
        ret = pushkey.push(self, namespace, key, old, new)
23648
915ac9403e13 pushkey: run hook after the lock release
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23630
diff changeset
  3022
        def runhook():
915ac9403e13 pushkey: run hook after the lock release
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23630
diff changeset
  3023
            self.hook('pushkey', namespace=namespace, key=key, old=old, new=new,
915ac9403e13 pushkey: run hook after the lock release
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23630
diff changeset
  3024
                      ret=ret)
915ac9403e13 pushkey: run hook after the lock release
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23630
diff changeset
  3025
        self._afterlock(runhook)
14102
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
  3026
        return ret
11368
b9eb005c54ad pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents: 11303
diff changeset
  3027
b9eb005c54ad pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents: 11303
diff changeset
  3028
    def listkeys(self, namespace):
14102
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
  3029
        self.hook('prelistkeys', throw=True, namespace=namespace)
17293
d3f84ccc5495 pushkey: add more verbose debug output regarding pushkey
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17252
diff changeset
  3030
        self.ui.debug('listing keys for "%s"\n' % namespace)
14102
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
  3031
        values = pushkey.list(self, namespace)
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
  3032
        self.hook('listkeys', namespace=namespace, values=values)
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
  3033
        return values
11368
b9eb005c54ad pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents: 11303
diff changeset
  3034
14048
58e58406ed19 wireproto: add test for new optional arg missing on server
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14036
diff changeset
  3035
    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
  3036
        '''used to test argument passing over the wire'''
36554
06f59bdde626 py3: use pycompat.bytestr() to convert None to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36471
diff changeset
  3037
        return "%s %s %s %s %s" % (one, two, pycompat.bytestr(three),
06f59bdde626 py3: use pycompat.bytestr() to convert None to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36471
diff changeset
  3038
                                   pycompat.bytestr(four),
06f59bdde626 py3: use pycompat.bytestr() to convert None to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36471
diff changeset
  3039
                                   pycompat.bytestr(five))
11368
b9eb005c54ad pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents: 11303
diff changeset
  3040
14529
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
  3041
    def savecommitmessage(self, text):
23852
99e125626352 localrepo: remove all internal uses of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23775
diff changeset
  3042
        fp = self.vfs('last-message.txt', 'wb')
14529
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
  3043
        try:
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
  3044
            fp.write(text)
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
  3045
        finally:
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
  3046
            fp.close()
18054
b35e3364f94a check-code: there must also be whitespace between ')' and operator
Mads Kiilerich <madski@unity3d.com>
parents: 18044
diff changeset
  3047
        return self.pathto(fp.name[len(self.root) + 1:])
14529
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
  3048
1806
a2c69737e65e Automatic nesting into running transactions in the same repository.
mason@suse.com
parents: 1802
diff changeset
  3049
# used to avoid circular references so destructors work
3790
f183c18568df localrepo: change aftertrans to be independant of the store path
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3773
diff changeset
  3050
def aftertrans(files):
f183c18568df localrepo: change aftertrans to be independant of the store path
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3773
diff changeset
  3051
    renamefiles = [tuple(t) for t in files]
1806
a2c69737e65e Automatic nesting into running transactions in the same repository.
mason@suse.com
parents: 1802
diff changeset
  3052
    def a():
18952
8086b530e2ac localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18951
diff changeset
  3053
        for vfs, src, dest in renamefiles:
31550
66c3ae6d886c localrepo: use tryunlink
Ryan McElroy <rmcelroy@fb.com>
parents: 31536
diff changeset
  3054
            # if src and dest refer to a same file, vfs.rename is a no-op,
66c3ae6d886c localrepo: use tryunlink
Ryan McElroy <rmcelroy@fb.com>
parents: 31536
diff changeset
  3055
            # leaving both src and dest on disk. delete dest to make sure
66c3ae6d886c localrepo: use tryunlink
Ryan McElroy <rmcelroy@fb.com>
parents: 31536
diff changeset
  3056
            # the rename couldn't be such a no-op.
66c3ae6d886c localrepo: use tryunlink
Ryan McElroy <rmcelroy@fb.com>
parents: 31536
diff changeset
  3057
            vfs.tryunlink(dest)
31209
dd2364f5180a localrepo: handle rename with hardlinks properly
Jun Wu <quark@fb.com>
parents: 31148
diff changeset
  3058
            try:
18952
8086b530e2ac localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18951
diff changeset
  3059
                vfs.rename(src, dest)
16441
9dd10a574af2 localrepo: do not complain about missing journal files
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 16426
diff changeset
  3060
            except OSError: # journal file does not yet exist
9dd10a574af2 localrepo: do not complain about missing journal files
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 16426
diff changeset
  3061
                pass
1806
a2c69737e65e Automatic nesting into running transactions in the same repository.
mason@suse.com
parents: 1802
diff changeset
  3062
    return a
a2c69737e65e Automatic nesting into running transactions in the same repository.
mason@suse.com
parents: 1802
diff changeset
  3063
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  3064
def undoname(fn):
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  3065
    base, name = os.path.split(fn)
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  3066
    assert name.startswith('journal')
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  3067
    return os.path.join(base, name.replace('journal', 'undo', 1))
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  3068
39549
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3069
def instance(ui, path, create, intents=None, createopts=None):
39591
76b58f240821 localrepo: use urllocalpath() for path to create repo too
Martin von Zweigbergk <martinvonz@google.com>
parents: 39590
diff changeset
  3070
    localpath = util.urllocalpath(path)
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3071
    if create:
39591
76b58f240821 localrepo: use urllocalpath() for path to create repo too
Martin von Zweigbergk <martinvonz@google.com>
parents: 39590
diff changeset
  3072
        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
  3073
39687
bfeab472e3c0 localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39668
diff changeset
  3074
    return makelocalrepository(ui, localpath, intents=intents)
3223
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3164
diff changeset
  3075
2740
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
  3076
def islocal(path):
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
  3077
    return True
28164
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  3078
39996
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3079
def defaultcreateopts(ui, createopts=None):
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3080
    """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
  3081
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3082
    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
  3083
    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
  3084
    """
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3085
    createopts = dict(createopts or {})
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3086
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3087
    if 'backend' not in createopts:
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3088
        # experimental config: storage.new-repo-backend
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3089
        createopts['backend'] = ui.config('storage', 'new-repo-backend')
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3090
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3091
    return createopts
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3092
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3093
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
  3094
    """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
  3095
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  3096
    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
  3097
    new repositories.
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  3098
    """
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3099
    # If the repo is being created from a shared repository, we copy
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3100
    # its requirements.
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3101
    if 'sharedrepo' in createopts:
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3102
        requirements = set(createopts['sharedrepo'].requirements)
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3103
        if createopts.get('sharedrelative'):
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3104
            requirements.add('relshared')
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3105
        else:
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3106
            requirements.add('shared')
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3107
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3108
        return requirements
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3109
39996
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3110
    if 'backend' not in createopts:
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3111
        raise error.ProgrammingError('backend key not present in createopts; '
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3112
                                     'was defaultcreateopts() called?')
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3113
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3114
    if createopts['backend'] != 'revlogv1':
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3115
        raise error.Abort(_('unable to determine repository requirements for '
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3116
                            'storage backend: %s') % createopts['backend'])
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3117
32291
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32267
diff changeset
  3118
    requirements = {'revlogv1'}
33247
4d5d493ea54a configitems: register the 'format.usestore' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33245
diff changeset
  3119
    if ui.configbool('format', 'usestore'):
28164
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  3120
        requirements.add('store')
33245
28e8983d9ed7 configitems: register the 'format.usefncache' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33237
diff changeset
  3121
        if ui.configbool('format', 'usefncache'):
28164
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  3122
            requirements.add('fncache')
33237
7043e67cc9b2 configitems: register the 'format.dotencode' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33235
diff changeset
  3123
            if ui.configbool('format', 'dotencode'):
28164
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  3124
                requirements.add('dotencode')
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  3125
42046
4ee906aa7b60 compression: introduce an official `format.revlog-compression` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42044
diff changeset
  3126
    compengine = ui.config('format', 'revlog-compression')
30818
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30634
diff changeset
  3127
    if compengine not in util.compengines:
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30634
diff changeset
  3128
        raise error.Abort(_('compression engine %s defined by '
42046
4ee906aa7b60 compression: introduce an official `format.revlog-compression` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42044
diff changeset
  3129
                            'format.revlog-compression not available') %
30818
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30634
diff changeset
  3130
                          compengine,
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30634
diff changeset
  3131
                          hint=_('run "hg debuginstall" to list available '
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30634
diff changeset
  3132
                                 'compression engines'))
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30634
diff changeset
  3133
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30634
diff changeset
  3134
    # zlib is the historical default and doesn't need an explicit requirement.
42136
10a6725dca6e compression: introduce an official `zstd-revlog` requirement
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42135
diff changeset
  3135
    elif compengine == 'zstd':
10a6725dca6e compression: introduce an official `zstd-revlog` requirement
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42135
diff changeset
  3136
        requirements.add('revlog-compression-zstd')
10a6725dca6e compression: introduce an official `zstd-revlog` requirement
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42135
diff changeset
  3137
    elif compengine != 'zlib':
30818
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30634
diff changeset
  3138
        requirements.add('exp-compression-%s' % compengine)
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30634
diff changeset
  3139
28164
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  3140
    if scmutil.gdinitconfig(ui):
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  3141
        requirements.add('generaldelta')
40884
a714eee1ac28 sparse-revlog: disable sparse-revlog if config disable general-delta
Boris Feld <boris.feld@octobus.net>
parents: 40795
diff changeset
  3142
        if ui.configbool('format', 'sparse-revlog'):
a714eee1ac28 sparse-revlog: disable sparse-revlog if config disable general-delta
Boris Feld <boris.feld@octobus.net>
parents: 40795
diff changeset
  3143
            requirements.add(SPARSEREVLOG_REQUIREMENT)
33499
0407a51b9d8c codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents: 33454
diff changeset
  3144
    if ui.configbool('experimental', 'treemanifest'):
28164
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  3145
        requirements.add('treemanifest')
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  3146
32697
19b9fc40cc51 revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32660
diff changeset
  3147
    revlogv2 = ui.config('experimental', 'revlogv2')
19b9fc40cc51 revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32660
diff changeset
  3148
    if revlogv2 == 'enable-unstable-format-and-corrupt-my-data':
19b9fc40cc51 revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32660
diff changeset
  3149
        requirements.remove('revlogv1')
19b9fc40cc51 revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32660
diff changeset
  3150
        # generaldelta is implied by revlogv2.
19b9fc40cc51 revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32660
diff changeset
  3151
        requirements.discard('generaldelta')
19b9fc40cc51 revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32660
diff changeset
  3152
        requirements.add(REVLOGV2_REQUIREMENT)
39298
7a9f15ed3b96 phases: add a repository requirement about internal phase
Boris Feld <boris.feld@octobus.net>
parents: 39111
diff changeset
  3153
    # experimental config: format.internal-phase
39546
41aa5dced975 localrepo: pass ui to newreporequirements() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39506
diff changeset
  3154
    if ui.configbool('format', 'internal-phase'):
39298
7a9f15ed3b96 phases: add a repository requirement about internal phase
Boris Feld <boris.feld@octobus.net>
parents: 39111
diff changeset
  3155
        requirements.add('internal-phase')
32697
19b9fc40cc51 revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32660
diff changeset
  3156
39551
261f1e8dc300 localrepo: add requirement when narrow files creation option present
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
  3157
    if createopts.get('narrowfiles'):
261f1e8dc300 localrepo: add requirement when narrow files creation option present
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
  3158
        requirements.add(repository.NARROW_REQUIREMENT)
261f1e8dc300 localrepo: add requirement when narrow files creation option present
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
  3159
40324
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 40296
diff changeset
  3160
    if createopts.get('lfs'):
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 40296
diff changeset
  3161
        requirements.add('lfs')
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 40296
diff changeset
  3162
42325
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42300
diff changeset
  3163
    if ui.configbool('format', 'bookmarks-in-store'):
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42300
diff changeset
  3164
        requirements.add(bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT)
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42300
diff changeset
  3165
28164
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  3166
    return requirements
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3167
39549
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3168
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
  3169
    """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
  3170
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3171
    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
  3172
    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
  3173
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3174
    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
  3175
    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
  3176
    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
  3177
    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
  3178
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3179
    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
  3180
    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
  3181
    """
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3182
    known = {
39996
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3183
        'backend',
40324
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 40296
diff changeset
  3184
        'lfs',
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3185
        'narrowfiles',
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3186
        'sharedrepo',
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3187
        'sharedrelative',
39849
d3d4b4b5f725 localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39848
diff changeset
  3188
        'shareditems',
40390
7e3b6c4f01a2 localrepo: support marking repos as having shallow file storage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40360
diff changeset
  3189
        'shallowfilestore',
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3190
    }
39551
261f1e8dc300 localrepo: add requirement when narrow files creation option present
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
  3191
261f1e8dc300 localrepo: add requirement when narrow files creation option present
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
  3192
    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
  3193
39590
e471cb2852ea localrepo: move check for existing repo into createrepository()
Martin von Zweigbergk <martinvonz@google.com>
parents: 39580
diff changeset
  3194
def createrepository(ui, path, createopts=None):
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3195
    """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
  3196
39590
e471cb2852ea localrepo: move check for existing repo into createrepository()
Martin von Zweigbergk <martinvonz@google.com>
parents: 39580
diff changeset
  3197
    ``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
  3198
    ``createopts`` options for the new repository.
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3199
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3200
    The following keys for ``createopts`` are recognized:
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3201
39996
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3202
    backend
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3203
       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
  3204
    lfs
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 40296
diff changeset
  3205
       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
  3206
       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
  3207
    narrowfiles
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3208
       Set up repository to support narrow file storage.
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3209
    sharedrepo
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3210
       Repository object from which storage should be shared.
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3211
    sharedrelative
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3212
       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
  3213
       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
  3214
       is stored as an absolute path.
39849
d3d4b4b5f725 localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39848
diff changeset
  3215
    shareditems
d3d4b4b5f725 localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39848
diff changeset
  3216
       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
  3217
    shallowfilestore
7e3b6c4f01a2 localrepo: support marking repos as having shallow file storage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40360
diff changeset
  3218
       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
  3219
       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
  3220
    """
39996
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
  3221
    createopts = defaultcreateopts(ui, createopts=createopts)
39549
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3222
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3223
    unknownopts = 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
  3224
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3225
    if not isinstance(unknownopts, dict):
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3226
        raise error.ProgrammingError('filterknowncreateopts() did not return '
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3227
                                     'a dict')
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3228
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3229
    if unknownopts:
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3230
        raise error.Abort(_('unable to create repository because of unknown '
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3231
                            'creation option: %s') %
39846
d3e761f9ac0a localrepo: add missing join()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39770
diff changeset
  3232
                          ', '.join(sorted(unknownopts)),
39549
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3233
                          hint=_('is a required extension not loaded?'))
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3234
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
  3235
    requirements = newreporequirements(ui, createopts=createopts)
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3236
39590
e471cb2852ea localrepo: move check for existing repo into createrepository()
Martin von Zweigbergk <martinvonz@google.com>
parents: 39580
diff changeset
  3237
    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
  3238
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3239
    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
  3240
    if hgvfs.exists():
e471cb2852ea localrepo: move check for existing repo into createrepository()
Martin von Zweigbergk <martinvonz@google.com>
parents: 39580
diff changeset
  3241
        raise error.RepoError(_('repository %s already exists') % path)
e471cb2852ea localrepo: move check for existing repo into createrepository()
Martin von Zweigbergk <martinvonz@google.com>
parents: 39580
diff changeset
  3242
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3243
    if 'sharedrepo' in createopts:
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3244
        sharedpath = createopts['sharedrepo'].sharedpath
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3245
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3246
        if createopts.get('sharedrelative'):
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3247
            try:
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3248
                sharedpath = os.path.relpath(sharedpath, hgvfs.base)
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3249
            except (IOError, ValueError) as e:
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3250
                # 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
  3251
                # on each path.
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3252
                raise error.Abort(_('cannot calculate relative path'),
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3253
                                  hint=stringutil.forcebytestr(e))
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3254
39847
b504ff813c4f localrepo: validate directories before creating any
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39846
diff changeset
  3255
    if not wdirvfs.exists():
b504ff813c4f localrepo: validate directories before creating any
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39846
diff changeset
  3256
        wdirvfs.makedirs()
b504ff813c4f localrepo: validate directories before creating any
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39846
diff changeset
  3257
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3258
    hgvfs.makedir(notindexed=True)
40793
64cdfcc73706 cache: create `cache` directory at init time
Boris Feld <boris.feld@octobus.net>
parents: 40785
diff changeset
  3259
    if 'sharedrepo' not in createopts:
64cdfcc73706 cache: create `cache` directory at init time
Boris Feld <boris.feld@octobus.net>
parents: 40785
diff changeset
  3260
        hgvfs.mkdir(b'cache')
40794
d5622dfe4ba3 cache: create `wcache` directory at init time
Boris Feld <boris.feld@octobus.net>
parents: 40793
diff changeset
  3261
    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
  3262
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3263
    if b'store' in requirements and '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
  3264
        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
  3265
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3266
        # 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
  3267
        # 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
  3268
        # 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
  3269
        # 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
  3270
        # 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
  3271
        #
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3272
        # The revlog header has version 2, which won't be recognized by
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3273
        # such old clients.
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3274
        hgvfs.append(b'00changelog.i',
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3275
                     b'\0\0\0\2 dummy changelog to prevent using the old repo '
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3276
                     b'layout')
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3277
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
  3278
    scmutil.writerequires(hgvfs, requirements)
39606
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  3279
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3280
    # Write out file telling readers where to find the shared store.
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3281
    if 'sharedrepo' in createopts:
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3282
        hgvfs.write(b'sharedpath', sharedpath)
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
  3283
39849
d3d4b4b5f725 localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39848
diff changeset
  3284
    if createopts.get('shareditems'):
d3d4b4b5f725 localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39848
diff changeset
  3285
        shared = b'\n'.join(sorted(createopts['shareditems'])) + b'\n'
d3d4b4b5f725 localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39848
diff changeset
  3286
        hgvfs.write(b'shared', shared)
d3d4b4b5f725 localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39848
diff changeset
  3287
39606
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  3288
def poisonrepository(repo):
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  3289
    """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
  3290
    # 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
  3291
    repo.close()
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  3292
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  3293
    # 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
  3294
    # 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
  3295
    #
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  3296
    # 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
  3297
    # of repos call close() on repo references.
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  3298
    class poisonedrepository(object):
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  3299
        def __getattribute__(self, item):
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  3300
            if item == r'close':
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  3301
                return object.__getattribute__(self, item)
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  3302
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  3303
            raise error.ProgrammingError('repo instances should not be used '
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  3304
                                         'after unshare')
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  3305
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  3306
        def close(self):
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  3307
            pass
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  3308
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  3309
    # 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
  3310
    # we operate at the lowest level possible.
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
  3311
    object.__setattr__(repo, r'__class__', poisonedrepository)