mercurial/localrepo.py
author Gregory Szorc <gregory.szorc@gmail.com>
Wed, 21 Mar 2018 19:48:36 -0700
changeset 37183 0dfb5672f015
parent 37176 bb47dc2f71a0
child 37315 0a1fb171dc1d
permissions -rw-r--r--
repository: define interface for local repositories Per discussions on the mailing list and at the 4.4 and 4.6 sprints, we want to start defining interfaces for local repository primitives so that we a) have a better idea of what the formal interface for various types is b) can more easily introduce alternate implementations of various components (e.g. in Rust). We have previously implemented interfaces that declare the peer and wire protocol APIs using the abc module. This commit introduces a monolithic interface for the localrepository class. It uses zope.interface - not abc - for defining and declaring the interface. The newly defined "completelocalrepository" interface is objectively horrible. It is based on what is actually in localrepository and doesn't represent a reasonable interface definition IMO. There's lots of... unwanted garbage in the interface. In other words, it reflects the horrible state of the localrepository "god object." But this is fine: a goal of this commit is to get the interface defined so that we have an interface. Future commits can refactor the interface into sub-interfaces, remove unwanted public attributes, etc. I attempted to define reasonable docstrings for the various interface members. But there are so many of them and I didn't know what some are used for. So I was lazy in a number of places and didn't write docstrings or detailed usage docs. Also, the members of the interface are defined in the order they are declared in localrepo.py. This revealed that the grouping of things in localrepo.py is... odd. The localrepository class now declares that it implements our newly defined interface. Unlike abc, zope.interface doesn't check interface conformance at type creation time (abc uses __metaclass__ magic to validate interface conformance when a type is created - usually at module import time). It does provide some functions for validating class and object conformance with declared interfaces. We add these checks to test-check-interfaces.py. We /could/ validate at run-time. But we hold off for now. (I'm a bit scared of doing that because of the various ways extensions monkeypatch repo instances.) After this commit, test-check-interfaces.py will fail if the set of public attributes on the localrepository class or instances change without corresponding updates to the interface. This is by design. Differential Revision: https://phab.mercurial-scm.org/D2933
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
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    14
import time
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    15
import weakref
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    16
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    17
from .i18n import _
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    18
from .node import (
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    19
    hex,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    20
    nullid,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    21
    short,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    22
)
37183
0dfb5672f015 repository: define interface for local repositories
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37176
diff changeset
    23
from .thirdparty.zope import (
0dfb5672f015 repository: define interface for local repositories
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37176
diff changeset
    24
    interface as zi,
0dfb5672f015 repository: define interface for local repositories
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37176
diff changeset
    25
)
27522
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,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    31
    changelog,
31128
95ec3ad62f62 color: initialize color for the localrepo ui
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31074
diff changeset
    32
    color,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    33
    context,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    34
    dirstate,
30501
77cd647b04ac localrepo: refer to dirstateguard by its new name
Augie Fackler <augie@google.com>
parents: 30387
diff changeset
    35
    dirstateguard,
34112
f7d41b85bbf6 changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents: 33824
diff changeset
    36
    discovery,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    37
    encoding,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    38
    error,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    39
    exchange,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    40
    extensions,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    41
    filelog,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    42
    hook,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    43
    lock as lockmod,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    44
    manifest,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    45
    match as matchmod,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    46
    merge as mergemod,
30505
a90867a22daf localrepo: refer to checkunresolved by its new name
Augie Fackler <augie@google.com>
parents: 30501
diff changeset
    47
    mergeutil,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    48
    namespaces,
36501
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
    49
    narrowspec,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    50
    obsolete,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    51
    pathutil,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    52
    peer,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    53
    phases,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    54
    pushkey,
31515
590319c07259 localrepo: ensure transaction id is fully bytes on py3
Augie Fackler <augie@google.com>
parents: 31483
diff changeset
    55
    pycompat,
33824
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
    56
    repository,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    57
    repoview,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    58
    revset,
31044
0b8356705de6 revset: split language services to revsetlang module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 31009
diff changeset
    59
    revsetlang,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    60
    scmutil,
33373
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33336
diff changeset
    61
    sparse,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    62
    store,
36047
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35936
diff changeset
    63
    subrepoutil,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    64
    tags as tagsmod,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    65
    transaction,
31074
59e69ed81776 localrepo: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31045
diff changeset
    66
    txnutil,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    67
    util,
31241
0a38a313033e vfs: use 'vfs' module directly in 'mercurial.localrepo'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31219
diff changeset
    68
    vfs as vfsmod,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    69
)
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36958
diff changeset
    70
from .utils import (
37123
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37087
diff changeset
    71
    procutil,
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36958
diff changeset
    72
    stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36958
diff changeset
    73
)
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    74
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
    75
release = lockmod.release
28883
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28876
diff changeset
    76
urlerr = util.urlerr
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28876
diff changeset
    77
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
    78
33277
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
    79
# 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
    80
# - '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
    81
# - '' 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
    82
_cachedfiles = set()
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
    83
33178
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32913
diff changeset
    84
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
    85
    """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
    86
    """
a39fe76c4c65 clfilter: ensure that filecache on localrepo is unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18013
diff changeset
    87
    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
    88
        if repo is None:
36fbd72c2f39 scmutil: allow access to filecache descriptor on class
Martijn Pieters <mjpieters@fb.com>
parents: 29352
diff changeset
    89
            return self
33178
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32913
diff changeset
    90
        return super(_basefilecache, self).__get__(repo.unfiltered(), type)
18014
a39fe76c4c65 clfilter: ensure that filecache on localrepo is unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18013
diff changeset
    91
    def __set__(self, repo, value):
33178
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32913
diff changeset
    92
        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
    93
    def __delete__(self, repo):
33178
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32913
diff changeset
    94
        return super(_basefilecache, self).__delete__(repo.unfiltered())
18014
a39fe76c4c65 clfilter: ensure that filecache on localrepo is unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18013
diff changeset
    95
33178
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32913
diff changeset
    96
class repofilecache(_basefilecache):
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32913
diff changeset
    97
    """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
    98
    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
    99
        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
   100
        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
   101
            _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
   102
33178
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32913
diff changeset
   103
    def join(self, obj, fname):
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32913
diff changeset
   104
        return obj.vfs.join(fname)
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32913
diff changeset
   105
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32913
diff changeset
   106
class storecache(_basefilecache):
16198
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16144
diff changeset
   107
    """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
   108
    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
   109
        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
   110
        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
   111
            _cachedfiles.add((path, ''))
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
   112
16198
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16144
diff changeset
   113
    def join(self, obj, fname):
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16144
diff changeset
   114
        return obj.sjoin(fname)
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16144
diff changeset
   115
33382
b107a7660f4e localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33373
diff changeset
   116
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
   117
    """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
   118
b107a7660f4e localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33373
diff changeset
   119
    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
   120
    """
b107a7660f4e localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33373
diff changeset
   121
    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
   122
    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
   123
        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
   124
    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
   125
29104
b207653ada10 localrepo: remove a couple of local type aliases
Augie Fackler <augie@google.com>
parents: 29075
diff changeset
   126
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
   127
    """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
   128
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
   129
    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
   130
        unfi = repo.unfiltered()
9789670992d6 repoview: have unfilteredpropertycache using the underlying cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19515
diff changeset
   131
        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
   132
            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
   133
        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
   134
29104
b207653ada10 localrepo: remove a couple of local type aliases
Augie Fackler <augie@google.com>
parents: 29075
diff changeset
   135
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
   136
    """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
   137
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
   138
    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
   139
        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
   140
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
   141
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
   142
def hasunfilteredcache(repo, name):
18644
3e92772d5383 spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents: 18520
diff changeset
   143
    """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
   144
    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
   145
18016
2a393df0f5cc clfilter: rename `unfilteredmeth` to `unfilteredmethod`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18014
diff changeset
   146
def unfilteredmethod(orig):
17994
8899bf48116a clfilter: introduce an `unfilteredmethod` decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17993
diff changeset
   147
    """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
   148
    def wrapper(repo, *args, **kwargs):
8899bf48116a clfilter: introduce an `unfilteredmethod` decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17993
diff changeset
   149
        return orig(repo.unfiltered(), *args, **kwargs)
8899bf48116a clfilter: introduce an `unfilteredmethod` decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17993
diff changeset
   150
    return wrapper
8899bf48116a clfilter: introduce an `unfilteredmethod` decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17993
diff changeset
   151
32331
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32307
diff changeset
   152
moderncaps = {'lookup', 'branchmap', 'pushkey', 'known', 'getbundle',
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32307
diff changeset
   153
              'unbundle'}
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32307
diff changeset
   154
legacycaps = moderncaps.union({'changegroupsubset'})
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   155
33824
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   156
class localpeer(repository.peer):
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   157
    '''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
   158
31421
ecc87acb4d10 localrepo: don't use mutable default argument value
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31382
diff changeset
   159
    def __init__(self, repo, caps=None):
33824
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   160
        super(localpeer, self).__init__()
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   161
31421
ecc87acb4d10 localrepo: don't use mutable default argument value
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31382
diff changeset
   162
        if caps is None:
ecc87acb4d10 localrepo: don't use mutable default argument value
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31382
diff changeset
   163
            caps = moderncaps.copy()
18382
f3b21beb9802 filtering: rename filters to their antonyms
Kevin Bullock <kbullock@ringworld.org>
parents: 18364
diff changeset
   164
        self._repo = repo.filtered('served')
33824
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   165
        self._ui = repo.ui
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   166
        self._caps = repo._restrictcapabilities(caps)
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   167
33824
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   168
    # Begin of _basepeer interface.
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   169
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   170
    @util.propertycache
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   171
    def ui(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   172
        return self._ui
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   173
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   174
    def url(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   175
        return self._repo.url()
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   176
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   177
    def local(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   178
        return self._repo
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   179
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   180
    def peer(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   181
        return self
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   182
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   183
    def canpush(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   184
        return True
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   185
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   186
    def close(self):
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   187
        self._repo.close()
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   188
33824
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   189
    # End of _basepeer interface.
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   190
33824
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   191
    # Begin of _basewirecommands interface.
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   193
    def branchmap(self):
18279
679767c38cb5 clfilter: drop extra filtering in localpeer
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18278
diff changeset
   194
        return self._repo.branchmap()
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   195
33824
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   196
    def capabilities(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   197
        return self._caps
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   198
33824
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   199
    def debugwireargs(self, one, two, three=None, four=None, five=None):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   200
        """Used to test argument passing over the wire"""
36583
06f59bdde626 py3: use pycompat.bytestr() to convert None to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36501
diff changeset
   201
        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: 36501
diff changeset
   202
                                   pycompat.bytestr(four),
06f59bdde626 py3: use pycompat.bytestr() to convert None to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36501
diff changeset
   203
                                   pycompat.bytestr(five))
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   204
20953
8d853cad6b14 localpeer: propagate bundlecaps in getbundle call
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20933
diff changeset
   205
    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
   206
                  **kwargs):
30187
3e86261bf110 exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29979
diff changeset
   207
        chunks = exchange.getbundlechunks(self._repo, source, heads=heads,
3e86261bf110 exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29979
diff changeset
   208
                                          common=common, bundlecaps=bundlecaps,
35785
ba15580e53d5 exchange: return bundle info from getbundlechunks() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35783
diff changeset
   209
                                          **kwargs)[1]
30187
3e86261bf110 exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29979
diff changeset
   210
        cb = util.chunkbuffer(chunks)
3e86261bf110 exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29979
diff changeset
   211
32198
9a9d54ae9963 localrepo: reuse exchange.bundle2requested()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32175
diff changeset
   212
        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
   213
            # 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
   214
            # 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
   215
            # from it in local peer.
30187
3e86261bf110 exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29979
diff changeset
   216
            return bundle2.getunbundler(self.ui, cb)
3e86261bf110 exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29979
diff changeset
   217
        else:
3e86261bf110 exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29979
diff changeset
   218
            return changegroup.getunbundler('01', cb, None)
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   219
33824
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   220
    def heads(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   221
        return self._repo.heads()
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   222
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   223
    def known(self, nodes):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   224
        return self._repo.known(nodes)
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   225
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   226
    def listkeys(self, namespace):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   227
        return self._repo.listkeys(namespace)
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   228
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   229
    def lookup(self, key):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   230
        return self._repo.lookup(key)
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   231
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   232
    def pushkey(self, namespace, key, old, new):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   233
        return self._repo.pushkey(namespace, key, old, new)
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   234
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   235
    def stream_out(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   236
        raise error.Abort(_('cannot perform stream clone against local '
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   237
                            'peer'))
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   238
20969
7a679918ee2b localrepo: add unbundle support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20963
diff changeset
   239
    def unbundle(self, cg, heads, url):
7a679918ee2b localrepo: add unbundle support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20963
diff changeset
   240
        """apply a bundle on a repo
7a679918ee2b localrepo: add unbundle support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20963
diff changeset
   241
7a679918ee2b localrepo: add unbundle support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20963
diff changeset
   242
        This function handles the repo locking itself."""
7a679918ee2b localrepo: add unbundle support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20963
diff changeset
   243
        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
   244
            try:
9fbf0a2a72a1 bundle2: add on more layer of exception catching in localrepo.unbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24792
diff changeset
   245
                cg = exchange.readbundle(self.ui, cg, None)
9fbf0a2a72a1 bundle2: add on more layer of exception catching in localrepo.unbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24792
diff changeset
   246
                ret = exchange.unbundle(self._repo, cg, heads, 'push', url)
9fbf0a2a72a1 bundle2: add on more layer of exception catching in localrepo.unbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24792
diff changeset
   247
                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
   248
                    # 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
   249
                    # 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
   250
                    # 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
   251
                    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
   252
                    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
   253
                return ret
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25629
diff changeset
   254
            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
   255
                # 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
   256
                # 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
   257
                # 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
   258
                # 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
   259
                #
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
   260
                # 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
   261
                # issue4594
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
   262
                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
   263
                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
   264
                    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
   265
                    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
   266
                        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
   267
                    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
   268
                    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
   269
                    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
   270
                raise
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25629
diff changeset
   271
        except error.PushRaced as exc:
36452
04c319a07c7b py3: hunt down str(exception) instances and use util.forcebytestr
Augie Fackler <augie@google.com>
parents: 36430
diff changeset
   272
            raise error.ResponseError(_('push failed:'),
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36958
diff changeset
   273
                                      stringutil.forcebytestr(exc))
20969
7a679918ee2b localrepo: add unbundle support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20963
diff changeset
   274
33824
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   275
    # End of _basewirecommands interface.
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   276
33824
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   277
    # Begin of peer interface.
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   278
33824
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   279
    def iterbatch(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   280
        return peer.localiterbatcher(self)
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   281
33824
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   282
    # End of peer interface.
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   283
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   284
class locallegacypeer(repository.legacypeer, localpeer):
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   285
    '''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
   286
    restricted capabilities'''
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   287
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   288
    def __init__(self, repo):
33824
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   289
        super(locallegacypeer, self).__init__(repo, caps=legacycaps)
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   290
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   291
    # Begin of baselegacywirecommands interface.
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   292
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   293
    def between(self, pairs):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   294
        return self._repo.between(pairs)
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   295
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   296
    def branches(self, nodes):
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   297
        return self._repo.branches(nodes)
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   298
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   299
    def changegroup(self, basenodes, source):
34115
1632999d4bed changegroup: replace changegroup with makechangegroup
Durham Goode <durham@fb.com>
parents: 34112
diff changeset
   300
        outgoing = discovery.outgoing(self._repo, missingroots=basenodes,
1632999d4bed changegroup: replace changegroup with makechangegroup
Durham Goode <durham@fb.com>
parents: 34112
diff changeset
   301
                                      missingheads=self._repo.heads())
1632999d4bed changegroup: replace changegroup with makechangegroup
Durham Goode <durham@fb.com>
parents: 34112
diff changeset
   302
        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
   303
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   304
    def changegroupsubset(self, bases, heads, source):
34112
f7d41b85bbf6 changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents: 33824
diff changeset
   305
        outgoing = discovery.outgoing(self._repo, missingroots=bases,
f7d41b85bbf6 changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents: 33824
diff changeset
   306
                                      missingheads=heads)
f7d41b85bbf6 changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents: 33824
diff changeset
   307
        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
   308
33824
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   309
    # End of baselegacywirecommands interface.
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33763
diff changeset
   310
32717
19b9fc40cc51 revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32680
diff changeset
   311
# 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: 32680
diff changeset
   312
# clients.
19b9fc40cc51 revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32680
diff changeset
   313
REVLOGV2_REQUIREMENT = 'exp-revlogv2.0'
19b9fc40cc51 revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32680
diff changeset
   314
37138
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37123
diff changeset
   315
# 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: 37123
diff changeset
   316
# 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: 37123
diff changeset
   317
# functions defined in loaded extensions are called.
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37123
diff changeset
   318
#
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37123
diff changeset
   319
# 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: 37123
diff changeset
   320
# 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: 37123
diff changeset
   321
# 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: 37123
diff changeset
   322
featuresetupfuncs = set()
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37123
diff changeset
   323
37183
0dfb5672f015 repository: define interface for local repositories
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37176
diff changeset
   324
@zi.implementer(repository.completelocalrepository)
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   325
class localrepository(object):
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   326
36404
0147a4730420 cleanup: say goodbye to manifestv2 format
Augie Fackler <augie@google.com>
parents: 36216
diff changeset
   327
    # obsolete experimental requirements:
0147a4730420 cleanup: say goodbye to manifestv2 format
Augie Fackler <augie@google.com>
parents: 36216
diff changeset
   328
    #  - manifestv2: An experimental new manifest format that allowed
0147a4730420 cleanup: say goodbye to manifestv2 format
Augie Fackler <augie@google.com>
parents: 36216
diff changeset
   329
    #    for stem compression of long paths. Experiment ended up not
0147a4730420 cleanup: say goodbye to manifestv2 format
Augie Fackler <augie@google.com>
parents: 36216
diff changeset
   330
    #    being successful (repository sizes went up due to worse delta
0147a4730420 cleanup: say goodbye to manifestv2 format
Augie Fackler <augie@google.com>
parents: 36216
diff changeset
   331
    #    chains), and the code was deleted in 4.6.
32354
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32352
diff changeset
   332
    supportedformats = {
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32352
diff changeset
   333
        'revlogv1',
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32352
diff changeset
   334
        'generaldelta',
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32352
diff changeset
   335
        'treemanifest',
32717
19b9fc40cc51 revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32680
diff changeset
   336
        REVLOGV2_REQUIREMENT,
32354
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32352
diff changeset
   337
    }
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32352
diff changeset
   338
    _basesupported = supportedformats | {
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32352
diff changeset
   339
        'store',
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32352
diff changeset
   340
        'fncache',
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32352
diff changeset
   341
        'shared',
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32352
diff changeset
   342
        'relshared',
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32352
diff changeset
   343
        'dotencode',
33556
22371eabb3b1 sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33541
diff changeset
   344
        'exp-sparse',
32354
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32352
diff changeset
   345
    }
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32352
diff changeset
   346
    openerreqs = {
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32352
diff changeset
   347
        'revlogv1',
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32352
diff changeset
   348
        'generaldelta',
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32352
diff changeset
   349
        'treemanifest',
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32352
diff changeset
   350
    }
17137
b090601a80d1 localrepo: make requirements and openerreqs mutable by subclasses
Bryan O'Sullivan <bryano@fb.com>
parents: 17075
diff changeset
   351
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   352
    # 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
   353
    # 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
   354
    _wlockfreeprefix = {
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   355
        # 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
   356
        # 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
   357
        # 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
   358
        # now.
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   359
        'hgrc',
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   360
        'requires',
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   361
        # 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
   362
        # 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
   363
        'cache/',
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   364
        # 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
   365
        'dirstate',
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   366
        # 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
   367
        # 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
   368
        # 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
   369
        'bisect.state',
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   370
    }
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   371
30576
91db2aa0edfe localrepository: remove None as default value of path argument in __init__()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30571
diff changeset
   372
    def __init__(self, baseui, path, create=False):
24918
2eac3ae0d088 localrepo: eliminate local requirements var in init
Drew Gottlieb <drgott@google.com>
parents: 24917
diff changeset
   373
        self.requirements = set()
32750
b8ff7d0ff361 localrepo: move filtername to __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32749
diff changeset
   374
        self.filtername = None
31542
48b9c9ca09b7 localrepo: improve vfs documentation
Ryan McElroy <rmcelroy@fb.com>
parents: 31529
diff changeset
   375
        # wvfs: rooted at the repository root, used to access the working copy
31241
0a38a313033e vfs: use 'vfs' module directly in 'mercurial.localrepo'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31219
diff changeset
   376
        self.wvfs = vfsmod.vfs(path, expandpath=True, realpath=True)
31542
48b9c9ca09b7 localrepo: improve vfs documentation
Ryan McElroy <rmcelroy@fb.com>
parents: 31529
diff changeset
   377
        # vfs: rooted at .hg, used to access repo files outside of .hg/store
31154
afcc4b4a0826 localrepo: add some comment about role of various vfs object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31148
diff changeset
   378
        self.vfs = None
31542
48b9c9ca09b7 localrepo: improve vfs documentation
Ryan McElroy <rmcelroy@fb.com>
parents: 31529
diff changeset
   379
        # svfs: usually rooted at .hg/store, used to access repository history
48b9c9ca09b7 localrepo: improve vfs documentation
Ryan McElroy <rmcelroy@fb.com>
parents: 31529
diff changeset
   380
        # If this is a shared repository, this vfs may point to another
48b9c9ca09b7 localrepo: improve vfs documentation
Ryan McElroy <rmcelroy@fb.com>
parents: 31529
diff changeset
   381
        # repository's .hg/store directory.
31154
afcc4b4a0826 localrepo: add some comment about role of various vfs object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31148
diff changeset
   382
        self.svfs = None
17157
87e8440964a0 localrepo: use path expansion API via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17156
diff changeset
   383
        self.root = self.wvfs.base
17158
60338880d265 localrepo: use "self.wvfs.join()" instead of "os.path.join()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17157
diff changeset
   384
        self.path = self.wvfs.join(".hg")
3850
a4457828ca1a move code around
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3803
diff changeset
   385
        self.origroot = path
35143
ff80efc8f3e4 localrepo: update comments around path auditors
Augie Fackler <augie@google.com>
parents: 35142
diff changeset
   386
        # This is only used by context.workingctx.match in order to
ff80efc8f3e4 localrepo: update comments around path auditors
Augie Fackler <augie@google.com>
parents: 35142
diff changeset
   387
        # detect files in subrepos.
35142
ebabc4a805c4 localrepo: specify optional callback parameter to pathauditor as a keyword
Augie Fackler <augie@google.com>
parents: 34881
diff changeset
   388
        self.auditor = pathutil.pathauditor(
ebabc4a805c4 localrepo: specify optional callback parameter to pathauditor as a keyword
Augie Fackler <augie@google.com>
parents: 34881
diff changeset
   389
            self.root, callback=self._checknested)
35143
ff80efc8f3e4 localrepo: update comments around path auditors
Augie Fackler <augie@google.com>
parents: 35142
diff changeset
   390
        # This is only used by context.basectx.match in order to detect
ff80efc8f3e4 localrepo: update comments around path auditors
Augie Fackler <augie@google.com>
parents: 35142
diff changeset
   391
        # files in subrepos.
35142
ebabc4a805c4 localrepo: specify optional callback parameter to pathauditor as a keyword
Augie Fackler <augie@google.com>
parents: 34881
diff changeset
   392
        self.nofsauditor = pathutil.pathauditor(
ebabc4a805c4 localrepo: specify optional callback parameter to pathauditor as a keyword
Augie Fackler <augie@google.com>
parents: 34881
diff changeset
   393
            self.root, callback=self._checknested, realfs=False, cached=True)
8797
9ed150d2fbd5 repo: set up ui and extensions earlier
Matt Mackall <mpm@selenic.com>
parents: 8796
diff changeset
   394
        self.baseui = baseui
9ed150d2fbd5 repo: set up ui and extensions earlier
Matt Mackall <mpm@selenic.com>
parents: 8796
diff changeset
   395
        self.ui = baseui.copy()
20082
b04cc8651a63 localrepo: prevent to copy repo local config, copy baseui instead
Simon Heimberg <simohe@besonet.ch>
parents: 20033
diff changeset
   396
        self.ui.copy = baseui.copy # prevent copying repo configuration
33647
377e8ddaebef pathauditor: disable cache of audited paths by default (issue5628)
Yuya Nishihara <yuya@tcha.org>
parents: 33556
diff changeset
   397
        self.vfs = vfsmod.vfs(self.path, cacheaudited=True)
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   398
        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
   399
            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
   400
            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
   401
        # 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
   402
        # 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
   403
        # 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
   404
        self._phasedefaults = []
8797
9ed150d2fbd5 repo: set up ui and extensions earlier
Matt Mackall <mpm@selenic.com>
parents: 8796
diff changeset
   405
        try:
31328
42a7195541a1 localrepo: directly use repo.vfs.join
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31292
diff changeset
   406
            self.ui.readconfig(self.vfs.join("hgrc"), self.root)
31009
74af89c66834 localrepo: move extension loading to a separate method
Jun Wu <quark@fb.com>
parents: 30935
diff changeset
   407
            self._loadextensions()
8797
9ed150d2fbd5 repo: set up ui and extensions earlier
Matt Mackall <mpm@selenic.com>
parents: 8796
diff changeset
   408
        except IOError:
9ed150d2fbd5 repo: set up ui and extensions earlier
Matt Mackall <mpm@selenic.com>
parents: 8796
diff changeset
   409
            pass
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
   410
37138
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37123
diff changeset
   411
        if featuresetupfuncs:
19778
55ef79031009 localrepo: make supported features manageable in each repositories individually
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19650
diff changeset
   412
            self.supported = set(self._basesupported) # use private copy
19928
d1ac3790e10a localrepo: invoke only feature setup functions for enabled extensions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19884
diff changeset
   413
            extmods = set(m.__name__ for n, m
d1ac3790e10a localrepo: invoke only feature setup functions for enabled extensions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19884
diff changeset
   414
                          in extensions.extensions(self.ui))
37138
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37123
diff changeset
   415
            for setupfunc in featuresetupfuncs:
19928
d1ac3790e10a localrepo: invoke only feature setup functions for enabled extensions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19884
diff changeset
   416
                if setupfunc.__module__ in extmods:
d1ac3790e10a localrepo: invoke only feature setup functions for enabled extensions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19884
diff changeset
   417
                    setupfunc(self.ui, self.supported)
19778
55ef79031009 localrepo: make supported features manageable in each repositories individually
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19650
diff changeset
   418
        else:
55ef79031009 localrepo: make supported features manageable in each repositories individually
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19650
diff changeset
   419
            self.supported = self._basesupported
31128
95ec3ad62f62 color: initialize color for the localrepo ui
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31074
diff changeset
   420
        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
   421
30818
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30639
diff changeset
   422
        # Add compression engines.
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30639
diff changeset
   423
        for name in util.compengines:
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30639
diff changeset
   424
            engine = util.compengines[name]
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30639
diff changeset
   425
            if engine.revlogheader():
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30639
diff changeset
   426
                self.supported.add('exp-compression-%s' % name)
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30639
diff changeset
   427
17161
be016e96117a localrepo: use file API via vfs while ensuring repository directory
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17160
diff changeset
   428
        if not self.vfs.isdir():
3035
4d0e0f149581 localrepo: move the repo creation code, fail if the repo exists
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3019
diff changeset
   429
            if create:
28164
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
   430
                self.requirements = newreporequirements(self)
28163
5d3495e394d5 localrepo: isolate requirements determination from side effects
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28162
diff changeset
   431
5d3495e394d5 localrepo: isolate requirements determination from side effects
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28162
diff changeset
   432
                if not self.wvfs.exists():
5d3495e394d5 localrepo: isolate requirements determination from side effects
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28162
diff changeset
   433
                    self.wvfs.makedirs()
5d3495e394d5 localrepo: isolate requirements determination from side effects
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28162
diff changeset
   434
                self.vfs.makedir(notindexed=True)
5d3495e394d5 localrepo: isolate requirements determination from side effects
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28162
diff changeset
   435
28164
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
   436
                if 'store' in self.requirements:
28163
5d3495e394d5 localrepo: isolate requirements determination from side effects
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28162
diff changeset
   437
                    self.vfs.mkdir("store")
5d3495e394d5 localrepo: isolate requirements determination from side effects
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28162
diff changeset
   438
5d3495e394d5 localrepo: isolate requirements determination from side effects
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28162
diff changeset
   439
                    # create an invalid changelog
5d3495e394d5 localrepo: isolate requirements determination from side effects
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28162
diff changeset
   440
                    self.vfs.append(
5d3495e394d5 localrepo: isolate requirements determination from side effects
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28162
diff changeset
   441
                        "00changelog.i",
5d3495e394d5 localrepo: isolate requirements determination from side effects
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28162
diff changeset
   442
                        '\0\0\0\2' # represents revlogv2
5d3495e394d5 localrepo: isolate requirements determination from side effects
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28162
diff changeset
   443
                        ' dummy changelog to prevent using the old repo layout'
5d3495e394d5 localrepo: isolate requirements determination from side effects
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28162
diff changeset
   444
                    )
3035
4d0e0f149581 localrepo: move the repo creation code, fail if the repo exists
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3019
diff changeset
   445
            else:
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7633
diff changeset
   446
                raise error.RepoError(_("repository %s not found") % path)
3035
4d0e0f149581 localrepo: move the repo creation code, fail if the repo exists
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3019
diff changeset
   447
        elif create:
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7633
diff changeset
   448
            raise error.RepoError(_("repository %s already exists") % path)
3851
8f18e31c4441 add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3850
diff changeset
   449
        else:
8f18e31c4441 add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3850
diff changeset
   450
            try:
24918
2eac3ae0d088 localrepo: eliminate local requirements var in init
Drew Gottlieb <drgott@google.com>
parents: 24917
diff changeset
   451
                self.requirements = scmutil.readrequires(
2eac3ae0d088 localrepo: eliminate local requirements var in init
Drew Gottlieb <drgott@google.com>
parents: 24917
diff changeset
   452
                        self.vfs, self.supported)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25629
diff changeset
   453
            except IOError as inst:
3851
8f18e31c4441 add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3850
diff changeset
   454
                if inst.errno != errno.ENOENT:
8f18e31c4441 add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3850
diff changeset
   455
                    raise
405
99470ae6b424 Check if repository exists
mpm@selenic.com
parents: 402
diff changeset
   456
33539
460733327640 share: share 'cachevfs' with the source clone (issue5108)
Boris Feld <boris.feld@octobus.net>
parents: 33538
diff changeset
   457
        cachepath = self.vfs.join('cache')
8799
87d1fd40f57e repo: add internal support for sharing store directories
Matt Mackall <mpm@selenic.com>
parents: 8797
diff changeset
   458
        self.sharedpath = self.path
87d1fd40f57e repo: add internal support for sharing store directories
Matt Mackall <mpm@selenic.com>
parents: 8797
diff changeset
   459
        try:
31148
23080c03a604 share: add --relative flag to store a relative path to the source
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 31128
diff changeset
   460
            sharedpath = self.vfs.read("sharedpath").rstrip('\n')
23080c03a604 share: add --relative flag to store a relative path to the source
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 31128
diff changeset
   461
            if 'relshared' in self.requirements:
23080c03a604 share: add --relative flag to store a relative path to the source
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 31128
diff changeset
   462
                sharedpath = self.vfs.join(sharedpath)
31241
0a38a313033e vfs: use 'vfs' module directly in 'mercurial.localrepo'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31219
diff changeset
   463
            vfs = vfsmod.vfs(sharedpath, realpath=True)
33539
460733327640 share: share 'cachevfs' with the source clone (issue5108)
Boris Feld <boris.feld@octobus.net>
parents: 33538
diff changeset
   464
            cachepath = vfs.join('cache')
18946
3d4f41eaae67 localrepo: use vfs instead of "os.path.*" in sharedpath checking
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18945
diff changeset
   465
            s = vfs.base
3d4f41eaae67 localrepo: use vfs instead of "os.path.*" in sharedpath checking
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18945
diff changeset
   466
            if not vfs.exists():
8799
87d1fd40f57e repo: add internal support for sharing store directories
Matt Mackall <mpm@selenic.com>
parents: 8797
diff changeset
   467
                raise error.RepoError(
8908
105343f9f744 Fix warning: Seen unexpected token "%"
Dongsheng Song <dongsheng.song@gmail.com>
parents: 8813
diff changeset
   468
                    _('.hg/sharedpath points to nonexistent directory %s') % s)
8799
87d1fd40f57e repo: add internal support for sharing store directories
Matt Mackall <mpm@selenic.com>
parents: 8797
diff changeset
   469
            self.sharedpath = s
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25629
diff changeset
   470
        except IOError as inst:
8799
87d1fd40f57e repo: add internal support for sharing store directories
Matt Mackall <mpm@selenic.com>
parents: 8797
diff changeset
   471
            if inst.errno != errno.ENOENT:
87d1fd40f57e repo: add internal support for sharing store directories
Matt Mackall <mpm@selenic.com>
parents: 8797
diff changeset
   472
                raise
87d1fd40f57e repo: add internal support for sharing store directories
Matt Mackall <mpm@selenic.com>
parents: 8797
diff changeset
   473
33556
22371eabb3b1 sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33541
diff changeset
   474
        if 'exp-sparse' in self.requirements and not sparse.enabled:
22371eabb3b1 sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33541
diff changeset
   475
            raise error.RepoError(_('repository is using sparse feature but '
22371eabb3b1 sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33541
diff changeset
   476
                                    'sparse is not enabled; enable the '
22371eabb3b1 sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33541
diff changeset
   477
                                    '"sparse" extensions to access'))
22371eabb3b1 sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33541
diff changeset
   478
24918
2eac3ae0d088 localrepo: eliminate local requirements var in init
Drew Gottlieb <drgott@google.com>
parents: 24917
diff changeset
   479
        self.store = store.store(
33647
377e8ddaebef pathauditor: disable cache of audited paths by default (issue5628)
Yuya Nishihara <yuya@tcha.org>
parents: 33556
diff changeset
   480
            self.requirements, self.sharedpath,
377e8ddaebef pathauditor: disable cache of audited paths by default (issue5628)
Yuya Nishihara <yuya@tcha.org>
parents: 33556
diff changeset
   481
            lambda base: vfsmod.vfs(base, cacheaudited=True))
6840
80e51429cb9a introduce store classes
Adrian Buehlmann <adrian@cadifra.com>
parents: 6839
diff changeset
   482
        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
   483
        self.svfs = self.store.vfs
6840
80e51429cb9a introduce store classes
Adrian Buehlmann <adrian@cadifra.com>
parents: 6839
diff changeset
   484
        self.sjoin = self.store.join
17654
1dc37491e9fb localrepo: use "vfs" constructor/field for initialization around "store"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17650
diff changeset
   485
        self.vfs.createmode = self.store.createmode
33647
377e8ddaebef pathauditor: disable cache of audited paths by default (issue5628)
Yuya Nishihara <yuya@tcha.org>
parents: 33556
diff changeset
   486
        self.cachevfs = vfsmod.vfs(cachepath, cacheaudited=True)
33533
4133c0b0fcd7 cachevfs: add a vfs dedicated to cache
Boris Feld <boris.feld@octobus.net>
parents: 33532
diff changeset
   487
        self.cachevfs.createmode = self.store.createmode
33437
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
   488
        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
   489
            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
   490
            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
   491
                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
   492
            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
   493
                self.svfs.audit = self._getsvfsward(self.svfs.audit)
24915
1c40408770f7 localrepo: make _applyrequirements more specific
Drew Gottlieb <drgott@google.com>
parents: 24914
diff changeset
   494
        self._applyopenerreqs()
12295
3388ab21d768 localrepo: factor out requirement application and write
Sune Foldager <cryo@cyanite.org>
parents: 12176
diff changeset
   495
        if create:
3388ab21d768 localrepo: factor out requirement application and write
Sune Foldager <cryo@cyanite.org>
parents: 12176
diff changeset
   496
            self._writerequirements()
3850
a4457828ca1a move code around
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3803
diff changeset
   497
26155
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
   498
        self._dirstatevalidatewarned = False
9146
5614a628d173 localrepo: rename in-memory tag cache instance attributes (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9145
diff changeset
   499
18189
b9026ba002f6 branchmap: enable caching for filtered version too
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18186
diff changeset
   500
        self._branchcaches = {}
24373
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
   501
        self._revbranchcache = None
37140
db90a5793103 localrepo: make filterpats private (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37138
diff changeset
   502
        self._filterpats = {}
5966
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
   503
        self._datafilters = {}
4916
5c5d23d93447 Use a weakref for recursive transactions
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
   504
        self._transref = self._lockref = self._wlockref = None
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
   505
14929
4bf9493e7b07 localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents: 14905
diff changeset
   506
        # 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
   507
        # (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
   508
        #
4bf9493e7b07 localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents: 14905
diff changeset
   509
        # 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
   510
        self._filecache = {}
4bf9493e7b07 localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents: 14905
diff changeset
   511
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
   512
        # 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
   513
        # 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
   514
        # - 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
   515
        # - 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
   516
        # - 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
   517
        # - 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
   518
        # - 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
   519
        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
   520
32833
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32750
diff changeset
   521
        # post-dirstate-status hooks
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32750
diff changeset
   522
        self._postdsstatus = []
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32750
diff changeset
   523
23558
3198aac7a95d namespaces: add bookmarks to the names data structure
Sean Farley <sean.michael.farley@gmail.com>
parents: 23546
diff changeset
   524
        # generic mapping between names and nodes
23561
3c2419e07df5 namespaces: remove weakref; always pass in repo
Ryan McElroy <rmcelroy@fb.com>
parents: 23558
diff changeset
   525
        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
   526
33302
36a415b5a4b2 localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33278
diff changeset
   527
        # Key to signature value.
36a415b5a4b2 localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33278
diff changeset
   528
        self._sparsesignaturecache = {}
36a415b5a4b2 localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33278
diff changeset
   529
        # Signature to cached matcher instance.
36a415b5a4b2 localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33278
diff changeset
   530
        self._sparsematchercache = {}
36a415b5a4b2 localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33278
diff changeset
   531
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   532
    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
   533
        """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
   534
        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
   535
        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
   536
            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
   537
            repo = rref()
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   538
            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
   539
                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
   540
                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
   541
                return
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   542
            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
   543
                return
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   544
            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
   545
                # 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
   546
                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
   547
            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
   548
                msg = 'accessing cache with vfs instead of cachevfs: "%s"'
54b36d3ff7f6 cachevfs: add a devel warning for cache access though 'vfs'
Boris Feld <boris.feld@octobus.net>
parents: 33533
diff changeset
   549
                repo.ui.develwarn(msg % path, stacklevel=2, config="cache-vfs")
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   550
            if path.startswith('journal.'):
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   551
                # 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
   552
                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
   553
                    repo.ui.develwarn('write with no lock: "%s"' % path,
33532
d645fdfb749f vfsward: register 'write with no lock' warnings as 'check-locks' config
Boris Feld <boris.feld@octobus.net>
parents: 33516
diff changeset
   554
                                      stacklevel=2, 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
   555
            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
   556
                # 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
   557
                #
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   558
                # 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
   559
                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
   560
                    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
   561
                        return
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   562
                repo.ui.develwarn('write with no wlock: "%s"' % path,
33532
d645fdfb749f vfsward: register 'write with no lock' warnings as 'check-locks' config
Boris Feld <boris.feld@octobus.net>
parents: 33516
diff changeset
   563
                                  stacklevel=2, 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
   564
            return ret
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   565
        return checkvfs
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
   566
33437
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
   567
    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
   568
        """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
   569
        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
   570
        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
   571
            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
   572
            repo = rref()
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
   573
            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
   574
                return
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
   575
            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
   576
                return
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
   577
            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
   578
                # 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
   579
                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
   580
            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
   581
                repo.ui.develwarn('write with no lock: "%s"' % path,
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
   582
                                  stacklevel=3)
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
   583
            return ret
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
   584
        return checksvfs
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
   585
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   586
    def close(self):
24378
9347c15d8136 revbranchcache: write cache even during read operations
Durham Goode <durham@fb.com>
parents: 24373
diff changeset
   587
        self._writecaches()
9347c15d8136 revbranchcache: write cache even during read operations
Durham Goode <durham@fb.com>
parents: 24373
diff changeset
   588
31009
74af89c66834 localrepo: move extension loading to a separate method
Jun Wu <quark@fb.com>
parents: 30935
diff changeset
   589
    def _loadextensions(self):
74af89c66834 localrepo: move extension loading to a separate method
Jun Wu <quark@fb.com>
parents: 30935
diff changeset
   590
        extensions.loadall(self.ui)
74af89c66834 localrepo: move extension loading to a separate method
Jun Wu <quark@fb.com>
parents: 30935
diff changeset
   591
24378
9347c15d8136 revbranchcache: write cache even during read operations
Durham Goode <durham@fb.com>
parents: 24373
diff changeset
   592
    def _writecaches(self):
9347c15d8136 revbranchcache: write cache even during read operations
Durham Goode <durham@fb.com>
parents: 24373
diff changeset
   593
        if self._revbranchcache:
9347c15d8136 revbranchcache: write cache even during read operations
Durham Goode <durham@fb.com>
parents: 24373
diff changeset
   594
            self._revbranchcache.write()
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   595
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   596
    def _restrictcapabilities(self, caps):
33499
0407a51b9d8c codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents: 33454
diff changeset
   597
        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
   598
            caps = set(caps)
35783
c97639ad6874 bundle2: specify what capabilities will be used for
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35749
diff changeset
   599
            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
   600
                                                              role='client'))
28883
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28876
diff changeset
   601
            caps.add('bundle2=' + urlreq.quote(capsblob))
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   602
        return caps
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   603
24915
1c40408770f7 localrepo: make _applyrequirements more specific
Drew Gottlieb <drgott@google.com>
parents: 24914
diff changeset
   604
    def _applyopenerreqs(self):
1c40408770f7 localrepo: make _applyrequirements more specific
Drew Gottlieb <drgott@google.com>
parents: 24914
diff changeset
   605
        self.svfs.options = dict((r, 1) for r in self.requirements
17137
b090601a80d1 localrepo: make requirements and openerreqs mutable by subclasses
Bryan O'Sullivan <bryano@fb.com>
parents: 17075
diff changeset
   606
                                           if r in self.openerreqs)
25839
1f8287b41935 localrepo: mark format options
Matt Mackall <mpm@selenic.com>
parents: 25764
diff changeset
   607
        # experimental config: format.chunkcachesize
20180
969148b49fc6 revlog: allow tuning of the chunk cache size (via format.chunkcachesize)
Brodie Rao <brodie@sf.io>
parents: 20176
diff changeset
   608
        chunkcachesize = self.ui.configint('format', 'chunkcachesize')
969148b49fc6 revlog: allow tuning of the chunk cache size (via format.chunkcachesize)
Brodie Rao <brodie@sf.io>
parents: 20176
diff changeset
   609
        if chunkcachesize is not None:
23853
0cc663e44258 localrepo: remove all internal uses of localrepo.sopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23852
diff changeset
   610
            self.svfs.options['chunkcachesize'] = chunkcachesize
25839
1f8287b41935 localrepo: mark format options
Matt Mackall <mpm@selenic.com>
parents: 25764
diff changeset
   611
        # experimental config: format.maxchainlen
23256
1c11393d5dfb localrepo: rename revlog.maxchainlen to format.maxchainlen
Augie Fackler <raf@durin42.com>
parents: 23255
diff changeset
   612
        maxchainlen = self.ui.configint('format', 'maxchainlen')
23255
76effa770ff9 revlog: add config variable for limiting delta-chain length
Mateusz Kwapich <mitrandir@fb.com>
parents: 23205
diff changeset
   613
        if maxchainlen is not None:
23853
0cc663e44258 localrepo: remove all internal uses of localrepo.sopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23852
diff changeset
   614
            self.svfs.options['maxchainlen'] = maxchainlen
25839
1f8287b41935 localrepo: mark format options
Matt Mackall <mpm@selenic.com>
parents: 25764
diff changeset
   615
        # experimental config: format.manifestcachesize
24033
ed5e8a9598ce manifest: make lru size configurable
Durham Goode <durham@fb.com>
parents: 23929
diff changeset
   616
        manifestcachesize = self.ui.configint('format', 'manifestcachesize')
ed5e8a9598ce manifest: make lru size configurable
Durham Goode <durham@fb.com>
parents: 23929
diff changeset
   617
        if manifestcachesize is not None:
ed5e8a9598ce manifest: make lru size configurable
Durham Goode <durham@fb.com>
parents: 23929
diff changeset
   618
            self.svfs.options['manifestcachesize'] = manifestcachesize
26118
049005de325e revlog: add an aggressivemergedelta option
Durham Goode <durham@fb.com>
parents: 25878
diff changeset
   619
        # experimental config: format.aggressivemergedeltas
049005de325e revlog: add an aggressivemergedelta option
Durham Goode <durham@fb.com>
parents: 25878
diff changeset
   620
        aggressivemergedeltas = self.ui.configbool('format',
33235
b838e857439d configitems: register the 'format.aggressivemergedeltas' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33207
diff changeset
   621
                                                   'aggressivemergedeltas')
26118
049005de325e revlog: add an aggressivemergedelta option
Durham Goode <durham@fb.com>
parents: 25878
diff changeset
   622
        self.svfs.options['aggressivemergedeltas'] = aggressivemergedeltas
26907
dfab6edb98e3 format: introduce 'format.usegeneraldelta`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26906
diff changeset
   623
        self.svfs.options['lazydeltabase'] = not scmutil.gddeltaconfig(self.ui)
34519
0314e02efa25 configitems: register the 'experimental.maxdeltachainspan' config
Boris Feld <boris.feld@octobus.net>
parents: 34378
diff changeset
   624
        chainspan = self.ui.configbytes('experimental', 'maxdeltachainspan')
33207
895ecec31c70 revlog: add an experimental option to mitigated delta issues (issue5480)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33178
diff changeset
   625
        if 0 <= chainspan:
895ecec31c70 revlog: add an experimental option to mitigated delta issues (issue5480)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33178
diff changeset
   626
            self.svfs.options['maxdeltachainspan'] = chainspan
34303
3c9691728237 revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents: 34115
diff changeset
   627
        mmapindexthreshold = self.ui.configbytes('experimental',
34520
ca5b833ce756 configitems: register the 'experimental.mmapindexthreshold' config
Boris Feld <boris.feld@octobus.net>
parents: 34519
diff changeset
   628
                                                 'mmapindexthreshold')
34303
3c9691728237 revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents: 34115
diff changeset
   629
        if mmapindexthreshold is not None:
3c9691728237 revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents: 34115
diff changeset
   630
            self.svfs.options['mmapindexthreshold'] = mmapindexthreshold
34824
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34711
diff changeset
   631
        withsparseread = self.ui.configbool('experimental', 'sparse-read')
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34711
diff changeset
   632
        srdensitythres = float(self.ui.config('experimental',
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34711
diff changeset
   633
                                              'sparse-read.density-threshold'))
34881
8c9b08a0c48c sparse-read: skip gaps too small to be worth splitting
Paul Morelle <paul.morelle@octobus.net>
parents: 34825
diff changeset
   634
        srmingapsize = self.ui.configbytes('experimental',
8c9b08a0c48c sparse-read: skip gaps too small to be worth splitting
Paul Morelle <paul.morelle@octobus.net>
parents: 34825
diff changeset
   635
                                           'sparse-read.min-gap-size')
34824
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34711
diff changeset
   636
        self.svfs.options['with-sparse-read'] = withsparseread
e2ad93bcc084 revlog: introduce an experimental flag to slice chunks reads when too sparse
Paul Morelle <paul.morelle@octobus.net>
parents: 34711
diff changeset
   637
        self.svfs.options['sparse-read-density-threshold'] = srdensitythres
34881
8c9b08a0c48c sparse-read: skip gaps too small to be worth splitting
Paul Morelle <paul.morelle@octobus.net>
parents: 34825
diff changeset
   638
        self.svfs.options['sparse-read-min-gap-size'] = srmingapsize
12295
3388ab21d768 localrepo: factor out requirement application and write
Sune Foldager <cryo@cyanite.org>
parents: 12176
diff changeset
   639
30818
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30639
diff changeset
   640
        for r in self.requirements:
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30639
diff changeset
   641
            if r.startswith('exp-compression-'):
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30639
diff changeset
   642
                self.svfs.options['compengine'] = r[len('exp-compression-'):]
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30639
diff changeset
   643
32717
19b9fc40cc51 revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32680
diff changeset
   644
        # TODO move "revlogv2" to openerreqs once finalized.
19b9fc40cc51 revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32680
diff changeset
   645
        if REVLOGV2_REQUIREMENT in self.requirements:
19b9fc40cc51 revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32680
diff changeset
   646
            self.svfs.options['revlogv2'] = True
19b9fc40cc51 revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32680
diff changeset
   647
12295
3388ab21d768 localrepo: factor out requirement application and write
Sune Foldager <cryo@cyanite.org>
parents: 12176
diff changeset
   648
    def _writerequirements(self):
24934
5abd0a76bc8f requires: move requires file writing func from localrepo to scmutil
Drew Gottlieb <drgott@google.com>
parents: 24918
diff changeset
   649
        scmutil.writerequires(self.vfs, self.requirements)
12295
3388ab21d768 localrepo: factor out requirement application and write
Sune Foldager <cryo@cyanite.org>
parents: 12176
diff changeset
   650
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
   651
    def _checknested(self, path):
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
   652
        """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
   653
        if not path.startswith(self.root):
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
   654
            return False
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
   655
        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
   656
        normsubpath = util.pconvert(subpath)
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
   657
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
   658
        # 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
   659
        # 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
   660
        #
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
   661
        #   $ 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
   662
        #
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
   663
        # 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
   664
        # parent revision.
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
   665
        #
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
   666
        # 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
   667
        # 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
   668
        # 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
   669
        # 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
   670
        # panics when it sees sub/.hg/.
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
   671
        #
12174
7bccd04292a2 localrepo: check nested repos against working directory
Martin Geisler <mg@lazybytes.net>
parents: 12166
diff changeset
   672
        # 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
   673
        # 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
   674
        # the filesystem *now*.
7bccd04292a2 localrepo: check nested repos against working directory
Martin Geisler <mg@lazybytes.net>
parents: 12166
diff changeset
   675
        ctx = self[None]
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
   676
        parts = util.splitpath(subpath)
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
   677
        while parts:
15722
417127af3996 windows: use normalized path to check repository nesting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15604
diff changeset
   678
            prefix = '/'.join(parts)
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
   679
            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
   680
                if prefix == normsubpath:
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
   681
                    return True
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
   682
                else:
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
   683
                    sub = ctx.sub(prefix)
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
   684
                    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
   685
            else:
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
   686
                parts.pop()
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
   687
        return False
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
   688
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   689
    def peer(self):
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
   690
        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
   691
17993
1a6f8820eb71 clfilter: introduce an "unfiltered" method on localrepo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17922
diff changeset
   692
    def unfiltered(self):
1a6f8820eb71 clfilter: introduce an "unfiltered" method on localrepo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17922
diff changeset
   693
        """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
   694
18644
3e92772d5383 spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents: 18520
diff changeset
   695
        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
   696
        return self
1a6f8820eb71 clfilter: introduce an "unfiltered" method on localrepo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17922
diff changeset
   697
35496
3ad582b2895c repoview: add visibilityexceptions as an optional argument to repo.filtered()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35318
diff changeset
   698
    def filtered(self, name, visibilityexceptions=None):
18100
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18092
diff changeset
   699
        """Return a filtered version of a repository"""
35257
c752fbe228fb repoview: extract a factory function of proxy class
Yuya Nishihara <yuya@tcha.org>
parents: 35256
diff changeset
   700
        cls = repoview.newtype(self.unfiltered().__class__)
35496
3ad582b2895c repoview: add visibilityexceptions as an optional argument to repo.filtered()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35318
diff changeset
   701
        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
   702
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27522
diff changeset
   703
    @repofilecache('bookmarks', 'bookmarks.current')
13355
cce2e7b77e36 bookmarks: move property methods into localrepo
Matt Mackall <mpm@selenic.com>
parents: 13341
diff changeset
   704
    def _bookmarks(self):
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17857
diff changeset
   705
        return bookmarks.bmstore(self)
13355
cce2e7b77e36 bookmarks: move property methods into localrepo
Matt Mackall <mpm@selenic.com>
parents: 13341
diff changeset
   706
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27522
diff changeset
   707
    @property
24947
a02d293a1079 bookmarks: rename bookmarkcurrent to activebookmark (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24946
diff changeset
   708
    def _activebookmark(self):
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27522
diff changeset
   709
        return self._bookmarks.active
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
   710
35318
d13526333835 phases: drop the list with phase of each rev, always comput phase sets
Joerg Sonnenberger <joerg@bec.de>
parents: 35317
diff changeset
   711
    # _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: 35317
diff changeset
   712
    # _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
   713
    # 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
   714
    @storecache('phaseroots', '00changelog.i')
16657
b6081c2c4647 phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents: 16646
diff changeset
   715
    def _phasecache(self):
b6081c2c4647 phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents: 16646
diff changeset
   716
        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
   717
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents: 17013
diff changeset
   718
    @storecache('obsstore')
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents: 17013
diff changeset
   719
    def obsstore(self):
32749
c8177792fef6 obsolete: move obsstore creation logic from localrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32717
diff changeset
   720
        return obsolete.makestore(self.ui, self)
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents: 17013
diff changeset
   721
16198
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16144
diff changeset
   722
    @storecache('00changelog.i')
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8244
diff changeset
   723
    def changelog(self):
32332
0ad0d26ff703 changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32331
diff changeset
   724
        return changelog.changelog(self.svfs,
0ad0d26ff703 changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32331
diff changeset
   725
                                   trypending=txnutil.mayhavepending(self.root))
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8244
diff changeset
   726
30218
1767723f71cf manifest: move manifest creation to a helper function
Durham Goode <durham@fb.com>
parents: 30187
diff changeset
   727
    def _constructmanifest(self):
1767723f71cf manifest: move manifest creation to a helper function
Durham Goode <durham@fb.com>
parents: 30187
diff changeset
   728
        # This is a temporary function while we migrate from manifest to
1767723f71cf manifest: move manifest creation to a helper function
Durham Goode <durham@fb.com>
parents: 30187
diff changeset
   729
        # manifestlog. It allows bundlerepo and unionrepo to intercept the
1767723f71cf manifest: move manifest creation to a helper function
Durham Goode <durham@fb.com>
parents: 30187
diff changeset
   730
        # manifest creation.
30387
2019fbdab075 manifest: delete manifest.manifest class
Durham Goode <durham@fb.com>
parents: 30386
diff changeset
   731
        return manifest.manifestrevlog(self.svfs)
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8244
diff changeset
   732
30219
3c8811efdddc manifest: make manifestlog a storecache
Durham Goode <durham@fb.com>
parents: 30218
diff changeset
   733
    @storecache('00manifest.i')
29836
426d931e5db2 manifest: introduce manifestlog and manifestctx classes
Durham Goode <durham@fb.com>
parents: 29722
diff changeset
   734
    def manifestlog(self):
29837
93b44aa17691 manifest: use property instead of field for manifest revlog storage
Durham Goode <durham@fb.com>
parents: 29836
diff changeset
   735
        return manifest.manifestlog(self.svfs, self)
29836
426d931e5db2 manifest: introduce manifestlog and manifestctx classes
Durham Goode <durham@fb.com>
parents: 29722
diff changeset
   736
18014
a39fe76c4c65 clfilter: ensure that filecache on localrepo is unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18013
diff changeset
   737
    @repofilecache('dirstate')
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8244
diff changeset
   738
    def dirstate(self):
33373
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33336
diff changeset
   739
        sparsematchfn = lambda: sparse.matcher(self)
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33336
diff changeset
   740
26155
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
   741
        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
   742
                                 self._dirstatevalidate, sparsematchfn)
13032
e41e2b79883d dirstate: warn on invalid parents rather than aborting
Matt Mackall <mpm@selenic.com>
parents: 13001
diff changeset
   743
26155
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
   744
    def _dirstatevalidate(self, node):
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
   745
        try:
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
   746
            self.changelog.rev(node)
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
   747
            return node
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
   748
        except error.LookupError:
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
   749
            if not self._dirstatevalidatewarned:
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
   750
                self._dirstatevalidatewarned = True
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
   751
                self.ui.warn(_("warning: ignoring unknown"
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
   752
                               " working parent %s!\n") % short(node))
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
   753
            return nullid
2155
ff255b41b4aa support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2150
diff changeset
   754
36501
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   755
    @repofilecache(narrowspec.FILENAME)
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   756
    def narrowpats(self):
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   757
        """matcher patterns for this repository's narrowspec
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   758
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   759
        A tuple of (includes, excludes).
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   760
        """
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   761
        source = self
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   762
        if self.shared():
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   763
            from . import hg
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   764
            source = hg.sharedreposource(self)
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   765
        return narrowspec.load(source)
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   766
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   767
    @repofilecache(narrowspec.FILENAME)
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   768
    def _narrowmatch(self):
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   769
        if changegroup.NARROW_REQUIREMENT not in self.requirements:
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   770
            return matchmod.always(self.root, '')
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   771
        include, exclude = self.narrowpats
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   772
        return narrowspec.match(self.root, include=include, exclude=exclude)
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   773
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   774
    # TODO(martinvonz): make this property-like instead?
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   775
    def narrowmatch(self):
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   776
        return self._narrowmatch
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   777
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   778
    def setnarrowpats(self, newincludes, newexcludes):
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   779
        target = self
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   780
        if self.shared():
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   781
            from . import hg
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   782
            target = hg.sharedreposource(self)
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   783
        narrowspec.save(target, newincludes, newexcludes)
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   784
        self.invalidate(clearfilecache=True)
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36452
diff changeset
   785
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
   786
    def __getitem__(self, changeid):
32680
a722c8e17363 localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 32514
diff changeset
   787
        if changeid is None:
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
   788
            return context.workingctx(self)
37176
bb47dc2f71a0 context: move reuse of context object to repo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37174
diff changeset
   789
        if isinstance(changeid, context.basectx):
bb47dc2f71a0 context: move reuse of context object to repo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37174
diff changeset
   790
            return changeid
23630
b9af235810cc localrepo.__getitem__: add slicing support
Eric Sumner <ericsumner@fb.com>
parents: 23561
diff changeset
   791
        if isinstance(changeid, slice):
32680
a722c8e17363 localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 32514
diff changeset
   792
            # wdirrev isn't contiguous so the slice shouldn't include it
23630
b9af235810cc localrepo.__getitem__: add slicing support
Eric Sumner <ericsumner@fb.com>
parents: 23561
diff changeset
   793
            return [context.changectx(self, i)
b9af235810cc localrepo.__getitem__: add slicing support
Eric Sumner <ericsumner@fb.com>
parents: 23561
diff changeset
   794
                    for i in xrange(*changeid.indices(len(self)))
b9af235810cc localrepo.__getitem__: add slicing support
Eric Sumner <ericsumner@fb.com>
parents: 23561
diff changeset
   795
                    if i not in self.changelog.filteredrevs]
32680
a722c8e17363 localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 32514
diff changeset
   796
        try:
a722c8e17363 localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 32514
diff changeset
   797
            return context.changectx(self, changeid)
a722c8e17363 localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 32514
diff changeset
   798
        except error.WdirUnsupported:
a722c8e17363 localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 32514
diff changeset
   799
            return context.workingctx(self)
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
   800
9924
ea3acaae25bb localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9820
diff changeset
   801
    def __contains__(self, changeid):
32514
a87dabb053d0 localrepo: document that __contains__() may raise LookupError
Yuya Nishihara <yuya@tcha.org>
parents: 32490
diff changeset
   802
        """True if the given changeid exists
a87dabb053d0 localrepo: document that __contains__() may raise LookupError
Yuya Nishihara <yuya@tcha.org>
parents: 32490
diff changeset
   803
a87dabb053d0 localrepo: document that __contains__() may raise LookupError
Yuya Nishihara <yuya@tcha.org>
parents: 32490
diff changeset
   804
        error.LookupError is raised if an ambiguous node specified.
a87dabb053d0 localrepo: document that __contains__() may raise LookupError
Yuya Nishihara <yuya@tcha.org>
parents: 32490
diff changeset
   805
        """
9924
ea3acaae25bb localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9820
diff changeset
   806
        try:
24320
b9f7f3eeb99c localrepo: extend "changeid in repo" to return True for workingctx revision
Yuya Nishihara <yuya@tcha.org>
parents: 24306
diff changeset
   807
            self[changeid]
b9f7f3eeb99c localrepo: extend "changeid in repo" to return True for workingctx revision
Yuya Nishihara <yuya@tcha.org>
parents: 24306
diff changeset
   808
            return True
9924
ea3acaae25bb localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9820
diff changeset
   809
        except error.RepoLookupError:
ea3acaae25bb localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9820
diff changeset
   810
            return False
ea3acaae25bb localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9820
diff changeset
   811
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
   812
    def __nonzero__(self):
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
   813
        return True
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
   814
31483
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31475
diff changeset
   815
    __bool__ = __nonzero__
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31475
diff changeset
   816
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
   817
    def __len__(self):
35736
29f57ce416ed localrepo: micro-optimize __len__() to bypass repoview
Yuya Nishihara <yuya@tcha.org>
parents: 35726
diff changeset
   818
        # 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
   819
        unfi = self.unfiltered()
29f57ce416ed localrepo: micro-optimize __len__() to bypass repoview
Yuya Nishihara <yuya@tcha.org>
parents: 35726
diff changeset
   820
        return len(unfi.changelog)
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
   821
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
   822
    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
   823
        return iter(self.changelog)
2155
ff255b41b4aa support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2150
diff changeset
   824
15403
e27561eb4a76 localrepo: add revs helper method
Matt Mackall <mpm@selenic.com>
parents: 15381
diff changeset
   825
    def revs(self, expr, *args):
27071
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
   826
        '''Find revisions matching a revset.
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
   827
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
   828
        The revset is specified as a string ``expr`` that may contain
31044
0b8356705de6 revset: split language services to revsetlang module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 31009
diff changeset
   829
        %-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
   830
29417
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29373
diff changeset
   831
        Revset aliases from the configuration are not expanded. To expand
31045
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31044
diff changeset
   832
        user aliases, consider calling ``scmutil.revrange()`` or
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31044
diff changeset
   833
        ``repo.anyrevs([expr], user=True)``.
29417
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29373
diff changeset
   834
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29373
diff changeset
   835
        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
   836
        that contains integer revisions.
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
   837
        '''
31044
0b8356705de6 revset: split language services to revsetlang module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 31009
diff changeset
   838
        expr = revsetlang.formatspec(expr, *args)
15403
e27561eb4a76 localrepo: add revs helper method
Matt Mackall <mpm@selenic.com>
parents: 15381
diff changeset
   839
        m = revset.match(None, expr)
24114
fafd9a1284cf revset: make match function initiate query from full set by default
Yuya Nishihara <yuya@tcha.org>
parents: 24113
diff changeset
   840
        return m(self)
15403
e27561eb4a76 localrepo: add revs helper method
Matt Mackall <mpm@selenic.com>
parents: 15381
diff changeset
   841
14902
96a72cbc6c29 localrepo: add set method to iterate over a given revset
Matt Mackall <mpm@selenic.com>
parents: 14870
diff changeset
   842
    def set(self, expr, *args):
27071
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
   843
        '''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
   844
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
   845
        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
   846
        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
   847
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29373
diff changeset
   848
        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
   849
        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
   850
        '''
15403
e27561eb4a76 localrepo: add revs helper method
Matt Mackall <mpm@selenic.com>
parents: 15381
diff changeset
   851
        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
   852
            yield self[r]
96a72cbc6c29 localrepo: add set method to iterate over a given revset
Matt Mackall <mpm@selenic.com>
parents: 14870
diff changeset
   853
33336
4672db164c98 revset: make repo.anyrevs accept customized alias override (API)
Jun Wu <quark@fb.com>
parents: 33302
diff changeset
   854
    def anyrevs(self, specs, user=False, localalias=None):
31045
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31044
diff changeset
   855
        '''Find revisions matching one of the given revsets.
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31044
diff changeset
   856
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31044
diff changeset
   857
        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
   858
        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
   859
        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
   860
        ``{name: definitionstring}``.
31045
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31044
diff changeset
   861
        '''
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31044
diff changeset
   862
        if user:
33336
4672db164c98 revset: make repo.anyrevs accept customized alias override (API)
Jun Wu <quark@fb.com>
parents: 33302
diff changeset
   863
            m = revset.matchany(self.ui, specs, repo=self,
4672db164c98 revset: make repo.anyrevs accept customized alias override (API)
Jun Wu <quark@fb.com>
parents: 33302
diff changeset
   864
                                localalias=localalias)
31045
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31044
diff changeset
   865
        else:
33336
4672db164c98 revset: make repo.anyrevs accept customized alias override (API)
Jun Wu <quark@fb.com>
parents: 33302
diff changeset
   866
            m = revset.matchany(None, specs, localalias=localalias)
31045
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31044
diff changeset
   867
        return m(self)
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31044
diff changeset
   868
2673
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2661
diff changeset
   869
    def url(self):
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2661
diff changeset
   870
        return 'file:' + self.root
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2661
diff changeset
   871
1718
c1996b84d4f5 make hook code nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1717
diff changeset
   872
    def hook(self, name, throw=False, **args):
21866
a2ca9dcb4b77 localrepo: document localrepo.hook()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21702
diff changeset
   873
        """Call a hook, passing this repo instance.
a2ca9dcb4b77 localrepo: document localrepo.hook()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21702
diff changeset
   874
a2ca9dcb4b77 localrepo: document localrepo.hook()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21702
diff changeset
   875
        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
   876
        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
   877
        replacing code that is expected to call a hook.
a2ca9dcb4b77 localrepo: document localrepo.hook()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21702
diff changeset
   878
        """
4622
fff50306e6dd hooks: separate hook code into a separate module
Matt Mackall <mpm@selenic.com>
parents: 4619
diff changeset
   879
        return hook.hook(self.ui, self, name, throw, **args)
487
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
   880
18013
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
   881
    @filteredpropertycache
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
   882
    def _tagscache(self):
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
   883
        '''Returns a tagscache object that contains various tags related
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
   884
        caches.'''
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
   885
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
   886
        # 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
   887
        # 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
   888
        class tagscache(object):
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
   889
            def __init__(self):
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
   890
                # 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
   891
                # 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
   892
                # '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
   893
                # 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
   894
                # 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
   895
                self.tags = self.tagtypes = None
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
   896
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
   897
                self.nodetagscache = self.tagslist = None
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
   898
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
   899
        cache = tagscache()
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
   900
        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
   901
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
   902
        return cache
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
   903
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
   904
    def tags(self):
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
   905
        '''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
   906
        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
   907
        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
   908
            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
   909
        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
   910
            tags = self._tagscache.tags
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
   911
        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
   912
            try:
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
   913
                # ignore tags to unknown nodes
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
   914
                self.changelog.rev(v)
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
   915
                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
   916
            except (error.LookupError, ValueError):
16371
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
   917
                pass
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
   918
        return t
4210
caff92047e87 Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents: 4178
diff changeset
   919
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
   920
    def _findtags(self):
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
   921
        '''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
   922
        (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
   923
        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
   924
        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
   925
        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
   926
        duration of the localrepo object.'''
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
   927
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
   928
        # 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
   929
        # 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
   930
        # 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
   931
        # 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
   932
        # quo fine?
4210
caff92047e87 Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents: 4178
diff changeset
   933
659
3662e3d6b690 Whitespace cleanup
Matt Mackall <mpm@selenic.com>
parents: 658
diff changeset
   934
31714
c34c170b25f3 tags: only return 'alltags' in 'findglobaltags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31711
diff changeset
   935
        # map tag name to (node, hist)
c34c170b25f3 tags: only return 'alltags' in 'findglobaltags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31711
diff changeset
   936
        alltags = tagsmod.findglobaltags(self.ui, self)
c34c170b25f3 tags: only return 'alltags' in 'findglobaltags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31711
diff changeset
   937
        # map tag name to tag type
c34c170b25f3 tags: only return 'alltags' in 'findglobaltags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31711
diff changeset
   938
        tagtypes = dict((tag, 'global') for tag in alltags)
31711
63d4deda1b31 tags: do not feed dictionaries to 'findglobaltags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31677
diff changeset
   939
10651
5f091fc1bab7 style: use consistent variable names (*mod) with imports which would shadow
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10547
diff changeset
   940
        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
   941
9152
4017291c4c48 tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents: 9151
diff changeset
   942
        # 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
   943
        # 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
   944
        # 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
   945
        # local encoding.
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
   946
        tags = {}
9147
234a230cc33b localrepo: improve readability of _findtags(), readtags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9146
diff changeset
   947
        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
   948
            if node != nullid:
16371
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
   949
                tags[encoding.tolocal(name)] = node
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
   950
        tags['tip'] = self.changelog.tip()
9152
4017291c4c48 tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents: 9151
diff changeset
   951
        tagtypes = dict([(encoding.tolocal(name), value)
4017291c4c48 tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents: 9151
diff changeset
   952
                         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
   953
        return (tags, tagtypes)
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
   954
5657
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
   955
    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
   956
        '''
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
   957
        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
   958
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
   959
        '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
   960
        '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
   961
        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
   962
        '''
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
   963
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
   964
        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
   965
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
   966
    def tagslist(self):
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
   967
        '''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
   968
        if not self._tagscache.tagslist:
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
   969
            l = []
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
   970
            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
   971
                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
   972
            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
   973
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
   974
        return self._tagscache.tagslist
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
   975
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
   976
    def nodetags(self, node):
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
   977
        '''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
   978
        if not self._tagscache.nodetagscache:
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
   979
            nodetagscache = {}
16371
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
   980
            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
   981
                nodetagscache.setdefault(n, []).append(t)
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
   982
            for tags in nodetagscache.itervalues():
11047
c7dbd6c4877a tags: return tags in sorted order
Eric Eisner <ede@mit.edu>
parents: 10970
diff changeset
   983
                tags.sort()
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
   984
            self._tagscache.nodetagscache = nodetagscache
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
   985
        return self._tagscache.nodetagscache.get(node, [])
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
   986
13384
caa561759538 context: add method to return all bookmarks pointing to a node
David Soria Parra <dsp@php.net>
parents: 13365
diff changeset
   987
    def nodebookmarks(self, node):
27166
263db31329a6 localrepo: document nodebookmarks
Augie Fackler <augie@google.com>
parents: 27165
diff changeset
   988
        """return the list of bookmarks pointing to the specified node"""
13384
caa561759538 context: add method to return all bookmarks pointing to a node
David Soria Parra <dsp@php.net>
parents: 13365
diff changeset
   989
        marks = []
caa561759538 context: add method to return all bookmarks pointing to a node
David Soria Parra <dsp@php.net>
parents: 13365
diff changeset
   990
        for bookmark, n in self._bookmarks.iteritems():
caa561759538 context: add method to return all bookmarks pointing to a node
David Soria Parra <dsp@php.net>
parents: 13365
diff changeset
   991
            if n == node:
caa561759538 context: add method to return all bookmarks pointing to a node
David Soria Parra <dsp@php.net>
parents: 13365
diff changeset
   992
                marks.append(bookmark)
caa561759538 context: add method to return all bookmarks pointing to a node
David Soria Parra <dsp@php.net>
parents: 13365
diff changeset
   993
        return sorted(marks)
caa561759538 context: add method to return all bookmarks pointing to a node
David Soria Parra <dsp@php.net>
parents: 13365
diff changeset
   994
12066
d01e28657429 localrepo: introduce method for explicit branch cache update
Georg Brandl <georg@python.org>
parents: 12035
diff changeset
   995
    def branchmap(self):
20245
4edd179fefb8 help: branch names primarily denote the tipmost unclosed branch head
Mads Kiilerich <madski@unity3d.com>
parents: 20226
diff changeset
   996
        '''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
   997
        ordered by increasing revision number'''
18189
b9026ba002f6 branchmap: enable caching for filtered version too
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18186
diff changeset
   998
        branchmap.updatecache(self)
b9026ba002f6 branchmap: enable caching for filtered version too
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18186
diff changeset
   999
        return self._branchcaches[self.filtername]
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
  1000
24373
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
  1001
    @unfilteredmethod
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
  1002
    def revbranchcache(self):
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
  1003
        if not self._revbranchcache:
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
  1004
            self._revbranchcache = branchmap.revbranchcache(self.unfiltered())
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
  1005
        return self._revbranchcache
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
  1006
23775
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  1007
    def branchtip(self, branch, ignoremissing=False):
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  1008
        '''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
  1009
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  1010
        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
  1011
        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
  1012
        (e.g. namespace).
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  1013
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  1014
        '''
20187
4d6d5ef88538 localrepo: refactor repo.branchtip() to use repo.branchmap().branchtip()
Brodie Rao <brodie@sf.io>
parents: 20184
diff changeset
  1015
        try:
4d6d5ef88538 localrepo: refactor repo.branchtip() to use repo.branchmap().branchtip()
Brodie Rao <brodie@sf.io>
parents: 20184
diff changeset
  1016
            return self.branchmap().branchtip(branch)
4d6d5ef88538 localrepo: refactor repo.branchtip() to use repo.branchmap().branchtip()
Brodie Rao <brodie@sf.io>
parents: 20184
diff changeset
  1017
        except KeyError:
23775
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  1018
            if not ignoremissing:
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  1019
                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
  1020
            else:
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
  1021
                pass
16719
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16716
diff changeset
  1022
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
  1023
    def lookup(self, key):
16378
c463f46fe050 localrepo: lookup now goes through context
Matt Mackall <mpm@selenic.com>
parents: 16371
diff changeset
  1024
        return self[key].node()
67
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
  1025
10960
ca739acf1a98 commands: add more robust support for 'hg log -b' (issue2078)
Steve Losh <steve@stevelosh.com>
parents: 10926
diff changeset
  1026
    def lookupbranch(self, key, remote=None):
ca739acf1a98 commands: add more robust support for 'hg log -b' (issue2078)
Steve Losh <steve@stevelosh.com>
parents: 10926
diff changeset
  1027
        repo = remote or self
ca739acf1a98 commands: add more robust support for 'hg log -b' (issue2078)
Steve Losh <steve@stevelosh.com>
parents: 10926
diff changeset
  1028
        if key in repo.branchmap():
ca739acf1a98 commands: add more robust support for 'hg log -b' (issue2078)
Steve Losh <steve@stevelosh.com>
parents: 10926
diff changeset
  1029
            return key
ca739acf1a98 commands: add more robust support for 'hg log -b' (issue2078)
Steve Losh <steve@stevelosh.com>
parents: 10926
diff changeset
  1030
ca739acf1a98 commands: add more robust support for 'hg log -b' (issue2078)
Steve Losh <steve@stevelosh.com>
parents: 10926
diff changeset
  1031
        repo = (remote and remote.local()) and remote or self
ca739acf1a98 commands: add more robust support for 'hg log -b' (issue2078)
Steve Losh <steve@stevelosh.com>
parents: 10926
diff changeset
  1032
        return repo[key].branch()
ca739acf1a98 commands: add more robust support for 'hg log -b' (issue2078)
Steve Losh <steve@stevelosh.com>
parents: 10926
diff changeset
  1033
13723
e615765fdcc7 wireproto: add known([id]) function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13720
diff changeset
  1034
    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
  1035
        cl = self.changelog
b64b6fdc5c9b discovery: properly filter changeset in 'peer.known' (issue4982)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27291
diff changeset
  1036
        nm = cl.nodemap
b64b6fdc5c9b discovery: properly filter changeset in 'peer.known' (issue4982)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27291
diff changeset
  1037
        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
  1038
        result = []
816209eaf963 phases: make secret changeset undiscoverable in all case
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15888
diff changeset
  1039
        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
  1040
            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
  1041
            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
  1042
            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
  1043
        return result
13723
e615765fdcc7 wireproto: add known([id]) function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13720
diff changeset
  1044
926
b765e970c9ff Add a local() method to repository classes
mpm@selenic.com
parents: 923
diff changeset
  1045
    def local(self):
14603
68a43fdd7d80 localrepo: local() returns self
Matt Mackall <mpm@selenic.com>
parents: 14549
diff changeset
  1046
        return self
926
b765e970c9ff Add a local() method to repository classes
mpm@selenic.com
parents: 923
diff changeset
  1047
25623
0bee97fa1fa8 publishing: add helper method to localrepo
Matt Mackall <mpm@selenic.com>
parents: 25290
diff changeset
  1048
    def publishing(self):
25625
ce9e231265c1 publishing: unconditionally trust publishing flag
Matt Mackall <mpm@selenic.com>
parents: 25624
diff changeset
  1049
        # 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
  1050
        # 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
  1051
        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
  1052
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
  1053
    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
  1054
        # 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
  1055
        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
  1056
            return False
25624
f0745da75056 publishing: use new helper method
Matt Mackall <mpm@selenic.com>
parents: 25623
diff changeset
  1057
        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
  1058
            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
  1059
        # 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
  1060
        return not self.filtered('visible').changelog.filteredrevs
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
  1061
23666
965788d9ae09 localrepo: introduce shared method to check if a repository is shared
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23648
diff changeset
  1062
    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
  1063
        '''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
  1064
        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
  1065
            return 'store'
965788d9ae09 localrepo: introduce shared method to check if a repository is shared
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23648
diff changeset
  1066
        return None
965788d9ae09 localrepo: introduce shared method to check if a repository is shared
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23648
diff changeset
  1067
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
  1068
    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
  1069
        return self.vfs.reljoin(self.root, f, *insidef)
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
  1070
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
  1071
    def file(self, f):
1615
83238c1db6de Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1597
diff changeset
  1072
        if f[0] == '/':
83238c1db6de Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1597
diff changeset
  1073
            f = f[1:]
23853
0cc663e44258 localrepo: remove all internal uses of localrepo.sopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23852
diff changeset
  1074
        return filelog.filelog(self.svfs, f)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
  1075
6739
c9fbd6ec3489 context: avoid using None for working parent
Matt Mackall <mpm@selenic.com>
parents: 6736
diff changeset
  1076
    def changectx(self, changeid):
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
  1077
        return self[changeid]
3218
8d4855fd9d7b merge: use new working context object in update
Matt Mackall <mpm@selenic.com>
parents: 3164
diff changeset
  1078
16551
ebf6d38c9063 localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents: 16536
diff changeset
  1079
    def setparents(self, p1, p2=nullid):
32389
9742f937c971 localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32371
diff changeset
  1080
        with self.dirstate.parentchange():
9742f937c971 localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32371
diff changeset
  1081
            copies = self.dirstate.setparents(p1, p2)
9742f937c971 localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32371
diff changeset
  1082
            pctx = self[p1]
9742f937c971 localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32371
diff changeset
  1083
            if copies:
9742f937c971 localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32371
diff changeset
  1084
                # 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: 32371
diff changeset
  1085
                # requires access to parents manifests. Preserve them
9742f937c971 localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32371
diff changeset
  1086
                # only for entries added to first parent.
9742f937c971 localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32371
diff changeset
  1087
                for f in copies:
9742f937c971 localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32371
diff changeset
  1088
                    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: 32371
diff changeset
  1089
                        self.dirstate.copy(copies[f], f)
9742f937c971 localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32371
diff changeset
  1090
            if p2 == nullid:
9742f937c971 localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32371
diff changeset
  1091
                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: 32371
diff changeset
  1092
                    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: 32371
diff changeset
  1093
                        self.dirstate.copy(None, f)
16551
ebf6d38c9063 localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents: 16536
diff changeset
  1094
37174
daef13da66fe context: avoid using a context object as a changeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37140
diff changeset
  1095
    def filectx(self, path, changeid=None, fileid=None, changectx=None):
2564
55e592041076 Add context helper functions to localrepo
Matt Mackall <mpm@selenic.com>
parents: 2491
diff changeset
  1096
        """changeid can be a changeset revision, node, or tag.
55e592041076 Add context helper functions to localrepo
Matt Mackall <mpm@selenic.com>
parents: 2491
diff changeset
  1097
           fileid can be a file revision or node."""
37174
daef13da66fe context: avoid using a context object as a changeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37140
diff changeset
  1098
        return context.filectx(self, path, changeid, fileid,
daef13da66fe context: avoid using a context object as a changeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37140
diff changeset
  1099
                               changectx=changectx)
2564
55e592041076 Add context helper functions to localrepo
Matt Mackall <mpm@selenic.com>
parents: 2491
diff changeset
  1100
627
b6c42714d900 Add locate command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 624
diff changeset
  1101
    def getcwd(self):
870
a82eae840447 Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents: 839
diff changeset
  1102
        return self.dirstate.getcwd()
627
b6c42714d900 Add locate command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 624
diff changeset
  1103
4525
78b6add1f966 Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4516
diff changeset
  1104
    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
  1105
        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
  1106
11698
9df481f8036d localrepo: refactor filter computation
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11669
diff changeset
  1107
    def _loadfilter(self, filter):
37140
db90a5793103 localrepo: make filterpats private (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37138
diff changeset
  1108
        if filter not in self._filterpats:
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
  1109
            l = []
4004
c83c35f2f4e2 unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents: 4003
diff changeset
  1110
            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
  1111
                if cmd == '!':
b71a52f101dc Make it possible to disable filtering for a pattern.
Mads Kiilerich <mads@kiilerich.com>
parents: 7208
diff changeset
  1112
                    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
  1113
                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
  1114
                fn = None
6066
f3a8b5360100 Strip filter name from command before passing to filter function.
Jesse Glick <jesse.glick@sun.com>
parents: 6065
diff changeset
  1115
                params = cmd
5966
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
  1116
                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
  1117
                    if cmd.startswith(name):
5966
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
  1118
                        fn = filterfn
6066
f3a8b5360100 Strip filter name from command before passing to filter function.
Jesse Glick <jesse.glick@sun.com>
parents: 6065
diff changeset
  1119
                        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
  1120
                        break
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
  1121
                if not fn:
37123
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37087
diff changeset
  1122
                    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
  1123
                # Wrap old filters not supporting keyword arguments
36216
646002338365 py3: introduce and use pycompat.getargspec
Augie Fackler <augie@google.com>
parents: 36047
diff changeset
  1124
                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
  1125
                    oldfn = fn
f8ad3b76e923 Provide better context for custom Python encode/decode filters.
Jesse Glick <jesse.glick@sun.com>
parents: 5966
diff changeset
  1126
                    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
  1127
                l.append((mf, fn, params))
37140
db90a5793103 localrepo: make filterpats private (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37138
diff changeset
  1128
            self._filterpats[filter] = l
db90a5793103 localrepo: make filterpats private (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37138
diff changeset
  1129
        return self._filterpats[filter]
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
  1130
12707
2216ab103ea8 localrepo: load filter patterns outside of _filter
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12706
diff changeset
  1131
    def _filter(self, filterpats, filename, data):
2216ab103ea8 localrepo: load filter patterns outside of _filter
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12706
diff changeset
  1132
        for mf, fn, cmd in filterpats:
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
  1133
            if mf(filename):
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9437
diff changeset
  1134
                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
  1135
                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
  1136
                break
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
  1137
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
  1138
        return data
1019
a9cca981c423 Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents: 1013
diff changeset
  1139
18013
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
  1140
    @unfilteredpropertycache
12708
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
  1141
    def _encodefilterpats(self):
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
  1142
        return self._loadfilter('encode')
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
  1143
18013
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
  1144
    @unfilteredpropertycache
12708
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
  1145
    def _decodefilterpats(self):
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
  1146
        return self._loadfilter('decode')
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
  1147
5966
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
  1148
    def adddatafilter(self, name, filter):
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
  1149
        self._datafilters[name] = filter
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
  1150
4004
c83c35f2f4e2 unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents: 4003
diff changeset
  1151
    def wread(self, filename):
31437
9b361478b03a localrepo: use self.wvfs.islink directly
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31427
diff changeset
  1152
        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
  1153
            data = self.wvfs.readlink(filename)
4004
c83c35f2f4e2 unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents: 4003
diff changeset
  1154
        else:
23854
f6070d3a9cb8 localrepo: remove all internal uses of localrepo.wopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23853
diff changeset
  1155
            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
  1156
        return self._filter(self._encodefilterpats, filename, data)
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
  1157
35725
2a7e777c9eed write: add the possibility to pass keyword argument from batchget to vfs
Boris Feld <boris.feld@octobus.net>
parents: 35708
diff changeset
  1158
    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
  1159
        """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
  1160
21b33f0460e0 revert: apply normallookup on reverted file if size isn't changed (issue4583)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24825
diff changeset
  1161
        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
  1162
        """
12708
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
  1163
        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
  1164
        if 'l' in flags:
23854
f6070d3a9cb8 localrepo: remove all internal uses of localrepo.wopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23853
diff changeset
  1165
            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
  1166
        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
  1167
            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
  1168
                            **kwargs)
6877
1d38f3605b20 util: set_flags shouldn't know about repo flag formats
Matt Mackall <mpm@selenic.com>
parents: 6875
diff changeset
  1169
            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
  1170
                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
  1171
            else:
45b678bf3a78 atomicupdate: add an experimental option to use atomictemp when updating
Boris Feld <boris.feld@octobus.net>
parents: 35725
diff changeset
  1172
                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
  1173
        return len(data)
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
  1174
4005
656e06eebda7 replace filehandle version of wwrite with wwritedata
Matt Mackall <mpm@selenic.com>
parents: 4004
diff changeset
  1175
    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
  1176
        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
  1177
23379
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
  1178
    def currenttransaction(self):
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
  1179
        """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
  1180
        if self._transref:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
  1181
            tr = self._transref()
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
  1182
        else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
  1183
            tr = None
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
  1184
8072
ecf7795479d5 transaction: support multiple, separate transactions
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 7948
diff changeset
  1185
        if tr and tr.running():
23379
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
  1186
            return tr
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
  1187
        return None
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
  1188
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
  1189
    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
  1190
        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
  1191
                or self.ui.configbool('devel', 'check-locks')):
29718
41689e293994 develwarn: use the lock helper in local repo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29417
diff changeset
  1192
            if self._currentlock(self._lockref) is None:
30579
f8c9a7d2bbbf localrepo: use ProgrammingError
Jun Wu <quark@fb.com>
parents: 30576
diff changeset
  1193
                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
  1194
        tr = self.currenttransaction()
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
  1195
        if tr is not None:
36827
aff5996f3043 transaction: add a name and a __repr__ implementation (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 36583
diff changeset
  1196
            return tr.nest(name=desc)
1806
a2c69737e65e Automatic nesting into running transactions in the same repository.
mason@suse.com
parents: 1802
diff changeset
  1197
5865
e7127f669edb transactions: don't show a backtrace when journal exists
Matt Mackall <mpm@selenic.com>
parents: 5814
diff changeset
  1198
        # 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
  1199
        if self.svfs.exists("journal"):
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  1200
            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
  1201
                _("abandoned transaction found"),
3b4c75690206 journal: set Abort hint when failing due to an abandoned transaction
Johan Bjork <jbjoerk@gmail.com>
parents: 21237
diff changeset
  1202
                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
  1203
25267
69c5cab0b893 transaction: separate calculating TXNID from creating transaction object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25219
diff changeset
  1204
        idbase = "%.40f#%f" % (random.random(), time.time())
31529
f42ec07db6a9 localrepo: use node.hex instead of awkward .encode('latin1')
Augie Fackler <augie@google.com>
parents: 31517
diff changeset
  1205
        ha = hex(hashlib.sha1(idbase).digest())
31515
590319c07259 localrepo: ensure transaction id is fully bytes on py3
Augie Fackler <augie@google.com>
parents: 31483
diff changeset
  1206
        txnid = 'TXN:' + ha
25268
a973b050621d localrepo: pass hook argument txnid to pretxnopen hooks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25267
diff changeset
  1207
        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
  1208
16236
97efd26eb957 localrepo: refactor retrieving of journal/undo files paths
Idan Kamara <idankk86@gmail.com>
parents: 16208
diff changeset
  1209
        self._writejournal(desc)
18952
8086b530e2ac localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18951
diff changeset
  1210
        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
  1211
        if report:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
  1212
            rp = report
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
  1213
        else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
  1214
            rp = self.ui.warn
23852
99e125626352 localrepo: remove all internal uses of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23775
diff changeset
  1215
        vfsmap = {'plain': self.vfs} # 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
  1216
        # 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
  1217
        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
  1218
        # 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
  1219
        #
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  1220
        # 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
  1221
        # 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
  1222
        # 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
  1223
        # 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
  1224
        # 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
  1225
        # 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
  1226
        #
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  1227
        # 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
  1228
        # 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
  1229
        # 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
  1230
        # 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
  1231
        # 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
  1232
        #
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  1233
        # 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
  1234
        # 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
  1235
        #
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  1236
        # 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
  1237
        # 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
  1238
        # 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
  1239
        #     ``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
  1240
        # 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
  1241
        # 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
  1242
        # 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
  1243
        #
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  1244
        #     <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
  1245
        #
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
  1246
        # 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
  1247
        #   "-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
  1248
        #   "+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
  1249
        #   "-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
  1250
        #   "+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
  1251
        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
  1252
        # experimental config: experimental.hook-track-tags
33499
0407a51b9d8c codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents: 33454
diff changeset
  1253
        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
  1254
        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
  1255
            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
  1256
            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
  1257
                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
  1258
                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
  1259
                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
  1260
                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
  1261
                # 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
  1262
                # 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
  1263
                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
  1264
                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
  1265
                    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
  1266
                    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
  1267
                                  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
  1268
                        # 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
  1269
                        # 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
  1270
                        # 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
  1271
                        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
  1272
        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
  1273
            """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
  1274
            # 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
  1275
            # 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
  1276
            #
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  1277
            # 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
  1278
            # 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
  1279
            # 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
  1280
            #
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  1281
            # 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
  1282
            # 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
  1283
            # 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
  1284
            #
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  1285
            # 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
  1286
            # 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
  1287
            #
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
  1288
            # 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
  1289
            # 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
  1290
            tracktags(tr2)
34709
c212947273a7 bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
  1291
            repo = reporef()
35196
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35184
diff changeset
  1292
            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: 35184
diff changeset
  1293
                scmutil.enforcesinglehead(repo, tr2, desc)
34709
c212947273a7 bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
  1294
            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
  1295
                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
  1296
                    args = tr.hookargs.copy()
c212947273a7 bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
  1297
                    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
  1298
                    repo.hook('pretxnclose-bookmark', throw=True,
c212947273a7 bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
  1299
                              txnname=desc,
c212947273a7 bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
  1300
                              **pycompat.strkwargs(args))
34711
f6d17075608f phase: add a dedicated pretxnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34710
diff changeset
  1301
            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
  1302
                cl = repo.unfiltered().changelog
f6d17075608f phase: add a dedicated pretxnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34710
diff changeset
  1303
                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
  1304
                    args = tr.hookargs.copy()
f6d17075608f phase: add a dedicated pretxnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34710
diff changeset
  1305
                    node = hex(cl.node(rev))
f6d17075608f phase: add a dedicated pretxnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34710
diff changeset
  1306
                    args.update(phases.preparehookargs(node, old, new))
f6d17075608f phase: add a dedicated pretxnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34710
diff changeset
  1307
                    repo.hook('pretxnclose-phase', throw=True, txnname=desc,
f6d17075608f phase: add a dedicated pretxnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34710
diff changeset
  1308
                              **pycompat.strkwargs(args))
34709
c212947273a7 bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
  1309
c212947273a7 bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
  1310
            repo.hook('pretxnclose', throw=True,
c212947273a7 bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
  1311
                      txnname=desc, **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
  1312
        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
  1313
            repo = reporef()
8f2ff40fe9c9 localrepo: execute appropriate actions for dirstate at releasing transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26499
diff changeset
  1314
            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
  1315
                # 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
  1316
                # 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
  1317
                # 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
  1318
                # 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
  1319
                # 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
  1320
                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
  1321
            else:
8f2ff40fe9c9 localrepo: execute appropriate actions for dirstate at releasing transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26499
diff changeset
  1322
                # 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
  1323
                # out) in this transaction
33440
ec306bc6915b dirstate: update backup functions to take full backup filename
Adam Simpkins <simpkins@fb.com>
parents: 33437
diff changeset
  1324
                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
  1325
26831
0a7610758c42 localrepo: discard objects in _filecache at transaction failure (issue4876)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26781
diff changeset
  1326
                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
  1327
25667
a69bb29b9638 localrepo: kill off sopener (API)
Siddharth Agarwal <sid0@fb.com>
parents: 25660
diff changeset
  1328
        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
  1329
                                     "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
  1330
                                     "undo",
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  1331
                                     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
  1332
                                     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
  1333
                                     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
  1334
                                     releasefn=releasefn,
36827
aff5996f3043 transaction: add a name and a __repr__ implementation (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 36583
diff changeset
  1335
                                     checkambigfiles=_cachedfiles,
aff5996f3043 transaction: add a name and a __repr__ implementation (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 36583
diff changeset
  1336
                                     name=desc)
35317
137a08d82232 transaction: build changes['revs'] as range instead of a set
Joerg Sonnenberger <joerg@bec.de>
parents: 35257
diff changeset
  1337
        tr.changes['revs'] = xrange(0, 0)
33251
a5cb2e4460de transaction: track new obsmarkers in the 'changes' mapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33247
diff changeset
  1338
        tr.changes['obsmarkers'] = set()
33451
e44d54260c32 phases: track phase movements in 'advanceboundary'
Boris Feld <boris.feld@octobus.net>
parents: 33440
diff changeset
  1339
        tr.changes['phases'] = {}
33516
f9e6e43c7987 bookmark: track bookmark changes at the transaction level
Boris Feld <boris.feld@octobus.net>
parents: 33499
diff changeset
  1340
        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
  1341
25267
69c5cab0b893 transaction: separate calculating TXNID from creating transaction object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25219
diff changeset
  1342
        tr.hookargs['txnid'] = txnid
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
  1343
        # 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
  1344
        # 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
  1345
        # 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
  1346
        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
  1347
        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
  1348
            """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
  1349
            """
27907
e219dbfd0342 localrepo: don't reference transaction from hook closure (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27846
diff changeset
  1350
            # 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
  1351
            # 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
  1352
            # 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
  1353
            # fixes the function accumulation.
e219dbfd0342 localrepo: don't reference transaction from hook closure (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27846
diff changeset
  1354
            hookargs = tr2.hookargs
e219dbfd0342 localrepo: don't reference transaction from hook closure (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27846
diff changeset
  1355
34708
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  1356
            def hookfunc():
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  1357
                repo = reporef()
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  1358
                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
  1359
                    bmchanges = sorted(tr.changes['bookmarks'].items())
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  1360
                    for name, (old, new) in bmchanges:
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  1361
                        args = tr.hookargs.copy()
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  1362
                        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
  1363
                        repo.hook('txnclose-bookmark', throw=False,
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  1364
                                  txnname=desc, **pycompat.strkwargs(args))
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  1365
34710
cdf833d7de98 phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34709
diff changeset
  1366
                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
  1367
                    cl = repo.unfiltered().changelog
cdf833d7de98 phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34709
diff changeset
  1368
                    phasemv = sorted(tr.changes['phases'].items())
cdf833d7de98 phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34709
diff changeset
  1369
                    for rev, (old, new) in phasemv:
cdf833d7de98 phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34709
diff changeset
  1370
                        args = tr.hookargs.copy()
cdf833d7de98 phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34709
diff changeset
  1371
                        node = hex(cl.node(rev))
cdf833d7de98 phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34709
diff changeset
  1372
                        args.update(phases.preparehookargs(node, old, new))
cdf833d7de98 phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34709
diff changeset
  1373
                        repo.hook('txnclose-phase', throw=False, txnname=desc,
cdf833d7de98 phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34709
diff changeset
  1374
                                  **pycompat.strkwargs(args))
cdf833d7de98 phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34709
diff changeset
  1375
34708
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  1376
                repo.hook('txnclose', throw=False, txnname=desc,
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  1377
                          **pycompat.strkwargs(hookargs))
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
  1378
            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
  1379
        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
  1380
        # 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
  1381
        # 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
  1382
        # 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
  1383
        # callbacks run.
3a3b59bbe7ce localrepo: run cache-warming transaction callback before report callback
Martin von Zweigbergk <martinvonz@google.com>
parents: 35736
diff changeset
  1384
        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
  1385
        def txnaborthook(tr2):
7d0421de8de3 hooks: add a 'txnabort' hook
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24784
diff changeset
  1386
            """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
  1387
            """
7d0421de8de3 hooks: add a 'txnabort' hook
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24784
diff changeset
  1388
            reporef().hook('txnabort', throw=False, txnname=desc,
35880
b43b314cc46a localrepo: pass transaction kwargs as strings, not bytes
Augie Fackler <augie@google.com>
parents: 35879
diff changeset
  1389
                           **pycompat.strkwargs(tr2.hookargs))
24792
7d0421de8de3 hooks: add a 'txnabort' hook
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24784
diff changeset
  1390
        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
  1391
        # 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
  1392
        # 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
  1393
        tr.addpostclose('refresh-filecachestats', self._refreshfilecachestats)
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  1394
        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
  1395
        scmutil.registersummarycallback(self, tr, desc)
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  1396
        return tr
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  1397
16236
97efd26eb957 localrepo: refactor retrieving of journal/undo files paths
Idan Kamara <idankk86@gmail.com>
parents: 16208
diff changeset
  1398
    def _journalfiles(self):
18952
8086b530e2ac localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18951
diff changeset
  1399
        return ((self.svfs, 'journal'),
8086b530e2ac localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18951
diff changeset
  1400
                (self.vfs, 'journal.dirstate'),
8086b530e2ac localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18951
diff changeset
  1401
                (self.vfs, 'journal.branch'),
8086b530e2ac localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18951
diff changeset
  1402
                (self.vfs, 'journal.desc'),
8086b530e2ac localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18951
diff changeset
  1403
                (self.vfs, 'journal.bookmarks'),
8086b530e2ac localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18951
diff changeset
  1404
                (self.svfs, 'journal.phaseroots'))
16236
97efd26eb957 localrepo: refactor retrieving of journal/undo files paths
Idan Kamara <idankk86@gmail.com>
parents: 16208
diff changeset
  1405
97efd26eb957 localrepo: refactor retrieving of journal/undo files paths
Idan Kamara <idankk86@gmail.com>
parents: 16208
diff changeset
  1406
    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
  1407
        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
  1408
32490
b647b923486f transaction: run _writejournal unfiltered
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32420
diff changeset
  1409
    @unfilteredmethod
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  1410
    def _writejournal(self, desc):
33440
ec306bc6915b dirstate: update backup functions to take full backup filename
Adam Simpkins <simpkins@fb.com>
parents: 33437
diff changeset
  1411
        self.dirstate.savebackup(None, 'journal.dirstate')
23852
99e125626352 localrepo: remove all internal uses of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23775
diff changeset
  1412
        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
  1413
                          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
  1414
        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
  1415
                          "%d\n%s\n" % (len(self), desc))
23852
99e125626352 localrepo: remove all internal uses of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23775
diff changeset
  1416
        self.vfs.write("journal.bookmarks",
99e125626352 localrepo: remove all internal uses of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23775
diff changeset
  1417
                          self.vfs.tryread("bookmarks"))
23853
0cc663e44258 localrepo: remove all internal uses of localrepo.sopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23852
diff changeset
  1418
        self.svfs.write("journal.phaseroots",
0cc663e44258 localrepo: remove all internal uses of localrepo.sopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23852
diff changeset
  1419
                           self.svfs.tryread("phaseroots"))
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  1420
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
  1421
    def recover(self):
27846
63821023ea79 with: use context manager in localrepo recover
Bryan O'Sullivan <bryano@fb.com>
parents: 27698
diff changeset
  1422
        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
  1423
            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
  1424
                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
  1425
                vfsmap = {'': self.svfs,
23852
99e125626352 localrepo: remove all internal uses of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23775
diff changeset
  1426
                          'plain': self.vfs,}
23853
0cc663e44258 localrepo: remove all internal uses of localrepo.sopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23852
diff changeset
  1427
                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
  1428
                                     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
  1429
                                     checkambigfiles=_cachedfiles)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  1430
                self.invalidate()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  1431
                return True
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  1432
            else:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  1433
                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
  1434
                return False
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
  1435
15183
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15131
diff changeset
  1436
    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
  1437
        wlock = lock = dsguard = None
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  1438
        try:
1712
21dcf38e5d7d Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents: 1709
diff changeset
  1439
            wlock = self.wlock()
4438
3900f684a150 Fix hg import --exact bug that hangs hg on failure.
Eric Hopper <hopper@omnifarious.org>
parents: 4417
diff changeset
  1440
            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
  1441
            if self.svfs.exists("undo"):
30501
77cd647b04ac localrepo: refer to dirstateguard by its new name
Augie Fackler <augie@google.com>
parents: 30387
diff changeset
  1442
                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
  1443
e077ce385609 localrepo: restore dirstate to one before rollbacking if not parent-gone
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26587
diff changeset
  1444
                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
  1445
            else:
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  1446
                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
  1447
                return 1
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  1448
        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
  1449
            release(dsguard, lock, wlock)
162
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 161
diff changeset
  1450
18016
2a393df0f5cc clfilter: rename `unfilteredmeth` to `unfilteredmethod`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18014
diff changeset
  1451
    @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
  1452
    def _rollback(self, dryrun, force, dsguard):
15130
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  1453
        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
  1454
        try:
23852
99e125626352 localrepo: remove all internal uses of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23775
diff changeset
  1455
            args = self.vfs.read('undo.desc').splitlines()
15130
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  1456
            (oldlen, desc, detail) = (int(args[0]), args[1], None)
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  1457
            if len(args) >= 3:
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  1458
                detail = args[2]
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  1459
            oldtip = oldlen - 1
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  1460
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  1461
            if detail and ui.verbose:
32913
05c213cd8ab8 py3: use '%d' instead of '%s' for integers
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32889
diff changeset
  1462
                msg = (_('repository tip rolled back to revision %d'
15130
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  1463
                         ' (undo %s: %s)\n')
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  1464
                       % (oldtip, desc, detail))
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  1465
            else:
32913
05c213cd8ab8 py3: use '%d' instead of '%s' for integers
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32889
diff changeset
  1466
                msg = (_('repository tip rolled back to revision %d'
15130
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  1467
                         ' (undo %s)\n')
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  1468
                       % (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
  1469
        except IOError:
15130
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  1470
            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
  1471
            desc = None
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15131
diff changeset
  1472
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15131
diff changeset
  1473
        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
  1474
            raise error.Abort(
15183
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15131
diff changeset
  1475
                _('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
  1476
                  '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
  1477
15130
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
  1478
        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
  1479
        if dryrun:
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
  1480
            return 0
15131
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  1481
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  1482
        parents = self.dirstate.parents()
18310
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  1483
        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
  1484
        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
  1485
        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
  1486
                             checkambigfiles=_cachedfiles)
18947
9b82f93e3a7a localrepo: use "vfs.exists()" instead of "os.path.exists()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18946
diff changeset
  1487
        if self.vfs.exists('undo.bookmarks'):
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
  1488
            self.vfs.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
  1489
        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
  1490
            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
  1491
        self.invalidate()
15131
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  1492
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  1493
        parentgone = (parents[0] not in self.changelog.nodemap or
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  1494
                      parents[1] not in self.changelog.nodemap)
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  1495
        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
  1496
            # 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
  1497
            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
  1498
33440
ec306bc6915b dirstate: update backup functions to take full backup filename
Adam Simpkins <simpkins@fb.com>
parents: 33437
diff changeset
  1499
            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
  1500
            try:
23852
99e125626352 localrepo: remove all internal uses of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23775
diff changeset
  1501
                branch = self.vfs.read('undo.branch')
17360
935831597e16 rollback: write dirstate branch with correct encoding
Sune Foldager <cryo@cyanite.org>
parents: 17324
diff changeset
  1502
                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
  1503
            except IOError:
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  1504
                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
  1505
                          'current branch is still \'%s\'\n')
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  1506
                        % self.dirstate.branch())
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  1507
27167
3fe8cb40c9c5 commands: inline definition of localrepo.parents() and drop the method (API)
Augie Fackler <augie@google.com>
parents: 27166
diff changeset
  1508
            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
  1509
            if len(parents) > 1:
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  1510
                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
  1511
                            'revisions %d and %d\n') % parents)
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  1512
            else:
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
  1513
                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
  1514
                            'revision %d\n') % parents)
26989
a65ea44f163e localrepo: switch to mergestate.clean()
Siddharth Agarwal <sid0@fb.com>
parents: 26907
diff changeset
  1515
            mergemod.mergestate.clean(self, self['.'].node())
24784
59406b8b1303 rollback: clear resolve state (issue4593)
Matt Mackall <mpm@selenic.com>
parents: 24750
diff changeset
  1516
17013
c8eda7bbdcab strip: incrementally update the branchheads cache after a strip
Joshua Redstone <joshua.redstone@fb.com>
parents: 17012
diff changeset
  1517
        # 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
  1518
        # 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
  1519
        # invalidated.
15604
b8d8599410da rollback: always call destroyed() (regression from 1.9)
Greg Ward <greg-hg@gerg.ca>
parents: 15381
diff changeset
  1520
        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
  1521
        return 0
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
  1522
32371
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32354
diff changeset
  1523
    def _buildcacheupdater(self, newtransaction):
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32354
diff changeset
  1524
        """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: 32354
diff changeset
  1525
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32354
diff changeset
  1526
        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: 32354
diff changeset
  1527
        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: 32354
diff changeset
  1528
        method.
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32354
diff changeset
  1529
        """
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32354
diff changeset
  1530
        # 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: 32354
diff changeset
  1531
        reporef = weakref.ref(self)
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32354
diff changeset
  1532
        def updater(tr):
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32354
diff changeset
  1533
            repo = reporef()
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32354
diff changeset
  1534
            repo.updatecaches(tr)
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32354
diff changeset
  1535
        return updater
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32354
diff changeset
  1536
32303
604d65e2c0b2 caches: introduce a function to warm cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32302
diff changeset
  1537
    @unfilteredmethod
36958
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36827
diff changeset
  1538
    def updatecaches(self, tr=None, full=False):
32304
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32303
diff changeset
  1539
        """warm appropriate caches
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32303
diff changeset
  1540
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32303
diff changeset
  1541
        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: 32303
diff changeset
  1542
        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: 32303
diff changeset
  1543
        update caches relevant to the changes in that transaction.
36958
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36827
diff changeset
  1544
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36827
diff changeset
  1545
        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: 36827
diff changeset
  1546
        up-to-date data. Even the ones usually loaded more lazily.
32304
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32303
diff changeset
  1547
        """
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32303
diff changeset
  1548
        if tr is not None and tr.hookargs.get('source') == 'strip':
32303
604d65e2c0b2 caches: introduce a function to warm cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32302
diff changeset
  1549
            # 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: 32302
diff changeset
  1550
            # 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: 32302
diff changeset
  1551
            return
604d65e2c0b2 caches: introduce a function to warm cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32302
diff changeset
  1552
32304
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32303
diff changeset
  1553
        if tr is None or tr.changes['revs']:
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32303
diff changeset
  1554
            # updating the unfiltered branchmap should refresh all the others,
32307
c2380b448265 caches: move the 'updating the branch cache' message in 'updatecaches'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32306
diff changeset
  1555
            self.ui.debug('updating the branch cache\n')
32303
604d65e2c0b2 caches: introduce a function to warm cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32302
diff changeset
  1556
            branchmap.updatecache(self.filtered('served'))
604d65e2c0b2 caches: introduce a function to warm cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32302
diff changeset
  1557
36958
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36827
diff changeset
  1558
        if full:
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36827
diff changeset
  1559
            rbc = self.revbranchcache()
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36827
diff changeset
  1560
            for r in self.changelog:
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36827
diff changeset
  1561
                rbc.branchinfo(r)
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36827
diff changeset
  1562
            rbc.write()
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36827
diff changeset
  1563
10547
bae9bb09166b strip: invalidate all caches after stripping (fixes issue1951)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10522
diff changeset
  1564
    def invalidatecaches(self):
15988
827e0126738d localrepo: delete _phaserev when invalidating caches
Idan Kamara <idankk86@gmail.com>
parents: 15987
diff changeset
  1565
18013
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
  1566
        if '_tagscache' in vars(self):
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
  1567
            # can't use delattr on proxy
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
  1568
            del self.__dict__['_tagscache']
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
  1569
18189
b9026ba002f6 branchmap: enable caching for filtered version too
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18186
diff changeset
  1570
        self.unfiltered()._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
  1571
        self.invalidatevolatilesets()
33302
36a415b5a4b2 localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33278
diff changeset
  1572
        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
  1573
312262ebc223 cache: group obscache and revsfiltercache invalidation in a single function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18101
diff changeset
  1574
    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
  1575
        self.filteredrevcache.clear()
17469
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17434
diff changeset
  1576
        obsolete.clearobscaches(self)
1784
2e0a288ca93e revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1782
diff changeset
  1577
14930
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  1578
    def invalidatedirstate(self):
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  1579
        '''Invalidates the dirstate, causing the next call to dirstate
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  1580
        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
  1581
        rereading it if it has.
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  1582
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  1583
        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
  1584
        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
  1585
        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
  1586
        known good state).'''
18013
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
  1587
        if hasunfilteredcache(self, 'dirstate'):
16200
9d4a2942a732 dirstate: add filecache support
Idan Kamara <idankk86@gmail.com>
parents: 16198
diff changeset
  1588
            for k in self.dirstate._filecache:
9d4a2942a732 dirstate: add filecache support
Idan Kamara <idankk86@gmail.com>
parents: 16198
diff changeset
  1589
                try:
9d4a2942a732 dirstate: add filecache support
Idan Kamara <idankk86@gmail.com>
parents: 16198
diff changeset
  1590
                    delattr(self.dirstate, k)
9d4a2942a732 dirstate: add filecache support
Idan Kamara <idankk86@gmail.com>
parents: 16198
diff changeset
  1591
                except AttributeError:
9d4a2942a732 dirstate: add filecache support
Idan Kamara <idankk86@gmail.com>
parents: 16198
diff changeset
  1592
                    pass
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
  1593
            delattr(self.unfiltered(), 'dirstate')
14930
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  1594
26831
0a7610758c42 localrepo: discard objects in _filecache at transaction failure (issue4876)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26781
diff changeset
  1595
    def invalidate(self, clearfilecache=False):
29922
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29887
diff changeset
  1596
        '''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: 29887
diff changeset
  1597
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29887
diff changeset
  1598
        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: 29887
diff changeset
  1599
        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: 29887
diff changeset
  1600
        (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: 29887
diff changeset
  1601
        redundant one doesn't).
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29887
diff changeset
  1602
        '''
18644
3e92772d5383 spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents: 18520
diff changeset
  1603
        unfiltered = self.unfiltered() # all file caches are stored unfiltered
31517
2244fb3eee49 localrepo: forcibly copy list of filecache keys
Augie Fackler <augie@google.com>
parents: 31516
diff changeset
  1604
        for k in list(self._filecache.keys()):
14935
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
  1605
            # dirstate is invalidated separately in invalidatedirstate()
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
  1606
            if k == 'dirstate':
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
  1607
                continue
33732
01a1c4e66816 repo: skip invalidation of changelog if it has 'delayed' changes (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33729
diff changeset
  1608
            if (k == 'changelog' and
01a1c4e66816 repo: skip invalidation of changelog if it has 'delayed' changes (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33729
diff changeset
  1609
                self.currenttransaction() and
01a1c4e66816 repo: skip invalidation of changelog if it has 'delayed' changes (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33729
diff changeset
  1610
                self.changelog._delayed):
01a1c4e66816 repo: skip invalidation of changelog if it has 'delayed' changes (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33729
diff changeset
  1611
                # 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: 33729
diff changeset
  1612
                # want to lose them.
01a1c4e66816 repo: skip invalidation of changelog if it has 'delayed' changes (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33729
diff changeset
  1613
                # 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: 33729
diff changeset
  1614
                continue
14935
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
  1615
26831
0a7610758c42 localrepo: discard objects in _filecache at transaction failure (issue4876)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26781
diff changeset
  1616
            if clearfilecache:
0a7610758c42 localrepo: discard objects in _filecache at transaction failure (issue4876)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26781
diff changeset
  1617
                del self._filecache[k]
14935
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
  1618
            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
  1619
                delattr(unfiltered, k)
14935
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
  1620
            except AttributeError:
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
  1621
                pass
10547
bae9bb09166b strip: invalidate all caches after stripping (fixes issue1951)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10522
diff changeset
  1622
        self.invalidatecaches()
29922
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29887
diff changeset
  1623
        if not self.currenttransaction():
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29887
diff changeset
  1624
            # 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: 29887
diff changeset
  1625
            # 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: 29887
diff changeset
  1626
            # changes detectable, and abort if changed.
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29887
diff changeset
  1627
            self.store.invalidatecaches()
10547
bae9bb09166b strip: invalidate all caches after stripping (fixes issue1951)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10522
diff changeset
  1628
20627
a42ea6d209e6 localrepo: add hook point to invalidate everything on each command-server run
Yuya Nishihara <yuya@tcha.org>
parents: 20567
diff changeset
  1629
    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
  1630
        '''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
  1631
        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
  1632
        # 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
  1633
        self.invalidate()
a42ea6d209e6 localrepo: add hook point to invalidate everything on each command-server run
Yuya Nishihara <yuya@tcha.org>
parents: 20567
diff changeset
  1634
        self.invalidatedirstate()
a42ea6d209e6 localrepo: add hook point to invalidate everything on each command-server run
Yuya Nishihara <yuya@tcha.org>
parents: 20567
diff changeset
  1635
29924
e35a83cedde1 localrepo: make _refreshfilecachestats unfiltered method to refresh correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29922
diff changeset
  1636
    @unfilteredmethod
26251
5c0f5db65c6b localrepo: refresh filecache stats only if transaction finished successfully
Yuya Nishihara <yuya@tcha.org>
parents: 26250
diff changeset
  1637
    def _refreshfilecachestats(self, tr):
26250
bc1f8a79b4e4 localrepo: move closure of lock release to class
Yuya Nishihara <yuya@tcha.org>
parents: 26155
diff changeset
  1638
        """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
  1639
        for k, ce in self._filecache.items():
35879
9dad46c23185 localrepo: consistently use native str when __dict__ is involved
Augie Fackler <augie@google.com>
parents: 35785
diff changeset
  1640
            k = pycompat.sysstr(k)
9dad46c23185 localrepo: consistently use native str when __dict__ is involved
Augie Fackler <augie@google.com>
parents: 35785
diff changeset
  1641
            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
  1642
                continue
bc1f8a79b4e4 localrepo: move closure of lock release to class
Yuya Nishihara <yuya@tcha.org>
parents: 26155
diff changeset
  1643
            ce.refresh()
bc1f8a79b4e4 localrepo: move closure of lock release to class
Yuya Nishihara <yuya@tcha.org>
parents: 26155
diff changeset
  1644
26439
b50f5beadf3e localrepo: allow creating inherited locks
Siddharth Agarwal <sid0@fb.com>
parents: 26409
diff changeset
  1645
    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
  1646
              inheritchecker=None, parentenvvar=None):
26439
b50f5beadf3e localrepo: allow creating inherited locks
Siddharth Agarwal <sid0@fb.com>
parents: 26409
diff changeset
  1647
        parentlock = None
26472
406a654b41cb localrepo: add a note about parentenvvar
Siddharth Agarwal <sid0@fb.com>
parents: 26449
diff changeset
  1648
        # 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
  1649
        # determine whether it can be inherited
26439
b50f5beadf3e localrepo: allow creating inherited locks
Siddharth Agarwal <sid0@fb.com>
parents: 26409
diff changeset
  1650
        if parentenvvar is not None:
30639
ad15646dc61c py3: replace os.environ with encoding.environ (part 1 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30579
diff changeset
  1651
            parentlock = encoding.environ.get(parentenvvar)
35218
1b758105b5c7 lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents: 35217
diff changeset
  1652
1b758105b5c7 lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents: 35217
diff changeset
  1653
        timeout = 0
35219
9153871d50e0 lock: allow to configure when the lock messages are displayed
Boris Feld <boris.feld@octobus.net>
parents: 35218
diff changeset
  1654
        warntimeout = 0
35218
1b758105b5c7 lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents: 35217
diff changeset
  1655
        if wait:
1b758105b5c7 lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents: 35217
diff changeset
  1656
            timeout = self.ui.configint("ui", "timeout")
35219
9153871d50e0 lock: allow to configure when the lock messages are displayed
Boris Feld <boris.feld@octobus.net>
parents: 35218
diff changeset
  1657
            warntimeout = self.ui.configint("ui", "timeout.warn")
35218
1b758105b5c7 lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents: 35217
diff changeset
  1658
35219
9153871d50e0 lock: allow to configure when the lock messages are displayed
Boris Feld <boris.feld@octobus.net>
parents: 35218
diff changeset
  1659
        l = lockmod.trylock(self.ui, vfs, lockname, timeout, warntimeout,
35218
1b758105b5c7 lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents: 35217
diff changeset
  1660
                            releasefn=releasefn,
1b758105b5c7 lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents: 35217
diff changeset
  1661
                            acquirefn=acquirefn, desc=desc,
1b758105b5c7 lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents: 35217
diff changeset
  1662
                            inheritchecker=inheritchecker,
1b758105b5c7 lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents: 35217
diff changeset
  1663
                            parentlock=parentlock)
1751
e9bf415a8ecb localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1747
diff changeset
  1664
        return l
e9bf415a8ecb localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1747
diff changeset
  1665
15587
809d5d30e377 localrepo: rename _postrelease to _afterlock
Matt Mackall <mpm@selenic.com>
parents: 15586
diff changeset
  1666
    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
  1667
        """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
  1668
24821
57f1dbc99631 afterlock: add the callback to the top level lock (issue4608)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24799
diff changeset
  1669
        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
  1670
        (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
  1671
        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
  1672
            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
  1673
            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
  1674
                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
  1675
                break
57f1dbc99631 afterlock: add the callback to the top level lock (issue4608)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24799
diff changeset
  1676
        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
  1677
            callback()
15583
926a06f7a353 lock: add mechanism to register post release callback
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15486
diff changeset
  1678
4914
9a2a73ea6135 repo locks: use True/False
Matt Mackall <mpm@selenic.com>
parents: 4913
diff changeset
  1679
    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
  1680
        '''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
  1681
        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
  1682
        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
  1683
e0c810d0ab69 lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24745
diff changeset
  1684
        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
  1685
        'wlock' first to avoid a dead-lock hazard.'''
29718
41689e293994 develwarn: use the lock helper in local repo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29417
diff changeset
  1686
        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
  1687
        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
  1688
            l.lock()
a26d33749bd8 made repo locks recursive and deprecate refcounting based lock releasing
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8072
diff changeset
  1689
            return l
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4916
diff changeset
  1690
26251
5c0f5db65c6b localrepo: refresh filecache stats only if transaction finished successfully
Yuya Nishihara <yuya@tcha.org>
parents: 26250
diff changeset
  1691
        l = self._lock(self.svfs, "lock", wait, None,
13391
d00bbff8600e fncachestore: defer updating the fncache file to a single file open
Adrian Buehlmann <adrian@cadifra.com>
parents: 13390
diff changeset
  1692
                       self.invalidate, _('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
  1693
        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
  1694
        return l
1751
e9bf415a8ecb localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1747
diff changeset
  1695
26499
e72b62b154b0 localrepo: prevent wlock from being inherited when a transaction is running
Siddharth Agarwal <sid0@fb.com>
parents: 26489
diff changeset
  1696
    def _wlockchecktransaction(self):
e72b62b154b0 localrepo: prevent wlock from being inherited when a transaction is running
Siddharth Agarwal <sid0@fb.com>
parents: 26489
diff changeset
  1697
        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
  1698
            raise error.LockInheritanceContractViolation(
e72b62b154b0 localrepo: prevent wlock from being inherited when a transaction is running
Siddharth Agarwal <sid0@fb.com>
parents: 26489
diff changeset
  1699
                '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
  1700
4914
9a2a73ea6135 repo locks: use True/False
Matt Mackall <mpm@selenic.com>
parents: 4913
diff changeset
  1701
    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
  1702
        '''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
  1703
        .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
  1704
e0c810d0ab69 lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24745
diff changeset
  1705
        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
  1706
e0c810d0ab69 lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24745
diff changeset
  1707
        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
  1708
        '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
  1709
        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
  1710
        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
  1711
            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
  1712
            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
  1713
26781
1aee2ab0f902 spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents: 26767
diff changeset
  1714
        # 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
  1715
        # 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
  1716
        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
  1717
                     or self.ui.configbool('devel', 'check-locks')):
29718
41689e293994 develwarn: use the lock helper in local repo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29417
diff changeset
  1718
            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
  1719
                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
  1720
14930
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  1721
        def unlock():
22404
12bc7f06fc41 dirstate: add begin/endparentchange to dirstate
Durham Goode <durham@fb.com>
parents: 22362
diff changeset
  1722
            if self.dirstate.pendingparentchange():
12bc7f06fc41 dirstate: add begin/endparentchange to dirstate
Durham Goode <durham@fb.com>
parents: 22362
diff changeset
  1723
                self.dirstate.invalidate()
12bc7f06fc41 dirstate: add begin/endparentchange to dirstate
Durham Goode <durham@fb.com>
parents: 22362
diff changeset
  1724
            else:
26748
5ba0a99ff27f dirstate: make dirstate.write() callers pass transaction object to it
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26741
diff changeset
  1725
                self.dirstate.write(None)
22404
12bc7f06fc41 dirstate: add begin/endparentchange to dirstate
Durham Goode <durham@fb.com>
parents: 22362
diff changeset
  1726
18318
948f495fb230 localrepo: drop unnecessary check on wlock unlock
Idan Kamara <idankk86@gmail.com>
parents: 18314
diff changeset
  1727
            self._filecache['dirstate'].refresh()
14930
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  1728
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
  1729
        l = self._lock(self.vfs, "wlock", wait, unlock,
14930
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
  1730
                       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
  1731
                       self.origroot,
e72b62b154b0 localrepo: prevent wlock from being inherited when a transaction is running
Siddharth Agarwal <sid0@fb.com>
parents: 26489
diff changeset
  1732
                       inheritchecker=self._wlockchecktransaction,
e72b62b154b0 localrepo: prevent wlock from being inherited when a transaction is running
Siddharth Agarwal <sid0@fb.com>
parents: 26489
diff changeset
  1733
                       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
  1734
        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
  1735
        return l
1531
2ba8bf7defda add localrepo.wlock for protecting the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1516
diff changeset
  1736
26488
df2dc5141721 localrepo: add a way to get the current lock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26475
diff changeset
  1737
    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
  1738
        """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
  1739
        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
  1740
            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
  1741
        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
  1742
        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
  1743
            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
  1744
        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
  1745
26489
2a3fc0272e3f localrepo: add a way to get the current wlock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26488
diff changeset
  1746
    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
  1747
        """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
  1748
        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
  1749
8401
ca7dc47eecc6 filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents: 8400
diff changeset
  1750
    def _filecommit(self, fctx, manifest1, manifest2, linkrev, tr, changelist):
3292
764688cf51e5 merge: remember rename copies and parents properly on commit
Matt Mackall <mpm@selenic.com>
parents: 3241
diff changeset
  1751
        """
3294
a2d93b186a0e commit: unify file-level commit code
Matt Mackall <mpm@selenic.com>
parents: 3293
diff changeset
  1752
        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
  1753
        """
3292
764688cf51e5 merge: remember rename copies and parents properly on commit
Matt Mackall <mpm@selenic.com>
parents: 3241
diff changeset
  1754
8244
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
  1755
        fname = fctx.path()
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
  1756
        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
  1757
        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
  1758
        if isinstance(fctx, context.filectx):
03163826b4e6 localrepo: reuse commit of parent filectx entries without rehashing
Mads Kiilerich <madski@unity3d.com>
parents: 24388
diff changeset
  1759
            node = fctx.filenode()
03163826b4e6 localrepo: reuse commit of parent filectx entries without rehashing
Mads Kiilerich <madski@unity3d.com>
parents: 24388
diff changeset
  1760
            if node in [fparent1, fparent2]:
03163826b4e6 localrepo: reuse commit of parent filectx entries without rehashing
Mads Kiilerich <madski@unity3d.com>
parents: 24388
diff changeset
  1761
                self.ui.debug('reusing %s filelog entry\n' % fname)
29181
dae38633eba8 localrepo: prevent executable-bit only changes from being lost on amend
Mateusz Kwapich <mitrandir@fb.com>
parents: 28883
diff changeset
  1762
                if manifest1.flags(fname) != fctx.flags():
dae38633eba8 localrepo: prevent executable-bit only changes from being lost on amend
Mateusz Kwapich <mitrandir@fb.com>
parents: 28883
diff changeset
  1763
                    changelist.append(fname)
24394
03163826b4e6 localrepo: reuse commit of parent filectx entries without rehashing
Mads Kiilerich <madski@unity3d.com>
parents: 24388
diff changeset
  1764
                return node
1716
ef8cd889a78b Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents: 1713
diff changeset
  1765
24394
03163826b4e6 localrepo: reuse commit of parent filectx entries without rehashing
Mads Kiilerich <madski@unity3d.com>
parents: 24388
diff changeset
  1766
        flog = self.file(fname)
3292
764688cf51e5 merge: remember rename copies and parents properly on commit
Matt Mackall <mpm@selenic.com>
parents: 3241
diff changeset
  1767
        meta = {}
8244
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
  1768
        copy = fctx.renamed()
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
  1769
        if copy and copy[0] != 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
  1770
            # 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
  1771
            # 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
  1772
            # 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
  1773
            # 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
  1774
            # 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
  1775
            #
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
  1776
            # 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
  1777
            #   \       /     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
  1778
            #    \- 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
  1779
            #                      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
  1780
            #                      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
  1781
            #
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
  1782
            # 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
  1783
            #
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
  1784
            # 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
  1785
            #   \       /     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
  1786
            #    \- 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
  1787
            #
6874
8dc21876261e commit: simplify file copy logic
Matt Mackall <mpm@selenic.com>
parents: 6680
diff changeset
  1788
8244
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
  1789
            cfname = copy[0]
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
  1790
            crev = manifest1.get(cfname)
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
  1791
            newfparent = fparent2
6874
8dc21876261e commit: simplify file copy logic
Matt Mackall <mpm@selenic.com>
parents: 6680
diff changeset
  1792
8dc21876261e commit: simplify file copy logic
Matt Mackall <mpm@selenic.com>
parents: 6680
diff changeset
  1793
            if manifest2: # branch merge
8244
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
  1794
                if fparent2 == nullid or crev is None: # copied on remote side
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
  1795
                    if cfname in manifest2:
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
  1796
                        crev = manifest2[cfname]
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
  1797
                        newfparent = fparent1
6874
8dc21876261e commit: simplify file copy logic
Matt Mackall <mpm@selenic.com>
parents: 6680
diff changeset
  1798
23929
a43fdf33a6be commit: remove reverse search for copy source when not in parent (issue4476)
Ryan McElroy <rmcelroy@fb.com>
parents: 23917
diff changeset
  1799
            # 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
  1800
            # 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
  1801
            # 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
  1802
            # 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
  1803
            # 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
  1804
            # 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
  1805
            # 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
  1806
            # behavior in this circumstance.
6875
0d714a48ab53 add a fix for issue 1175
Matt Mackall <mpm@selenic.com>
parents: 6874
diff changeset
  1807
13000
417f3c27983b commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents: 12899
diff changeset
  1808
            if crev:
417f3c27983b commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents: 12899
diff changeset
  1809
                self.ui.debug(" %s: copy %s:%s\n" % (fname, cfname, hex(crev)))
417f3c27983b commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents: 12899
diff changeset
  1810
                meta["copy"] = cfname
417f3c27983b commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents: 12899
diff changeset
  1811
                meta["copyrev"] = hex(crev)
417f3c27983b commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents: 12899
diff changeset
  1812
                fparent1, fparent2 = nullid, newfparent
417f3c27983b commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents: 12899
diff changeset
  1813
            else:
417f3c27983b commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents: 12899
diff changeset
  1814
                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
  1815
                               "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
  1816
20556
db0740a487ab localrepo: commit: avoid calling expensive ancestor function when p1 is nullrev
Mads Kiilerich <madski@unity3d.com>
parents: 20469
diff changeset
  1817
        elif fparent1 == nullid:
db0740a487ab localrepo: commit: avoid calling expensive ancestor function when p1 is nullrev
Mads Kiilerich <madski@unity3d.com>
parents: 20469
diff changeset
  1818
            fparent1, fparent2 = fparent2, nullid
8244
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
  1819
        elif fparent2 != nullid:
1716
ef8cd889a78b Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents: 1713
diff changeset
  1820
            # 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
  1821
            fparentancestors = flog.commonancestorsheads(fparent1, fparent2)
20987
298c9f346dde commit: use revlog.commonancestors instead of .ancestor
Mads Kiilerich <madski@unity3d.com>
parents: 20975
diff changeset
  1822
            if fparent1 in fparentancestors:
8244
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
  1823
                fparent1, fparent2 = fparent2, nullid
20987
298c9f346dde commit: use revlog.commonancestors instead of .ancestor
Mads Kiilerich <madski@unity3d.com>
parents: 20975
diff changeset
  1824
            elif fparent2 in fparentancestors:
8244
99d7e2db8da8 localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents: 8239
diff changeset
  1825
                fparent2 = nullid
1716
ef8cd889a78b Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents: 1713
diff changeset
  1826
8401
ca7dc47eecc6 filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents: 8400
diff changeset
  1827
        # is the file changed?
24394
03163826b4e6 localrepo: reuse commit of parent filectx entries without rehashing
Mads Kiilerich <madski@unity3d.com>
parents: 24388
diff changeset
  1828
        text = fctx.data()
8401
ca7dc47eecc6 filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents: 8400
diff changeset
  1829
        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
  1830
            changelist.append(fname)
ca7dc47eecc6 filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents: 8400
diff changeset
  1831
            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
  1832
        # 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
  1833
        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
  1834
            changelist.append(fname)
ca7dc47eecc6 filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents: 8400
diff changeset
  1835
ca7dc47eecc6 filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents: 8400
diff changeset
  1836
        return fparent1
1716
ef8cd889a78b Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents: 1713
diff changeset
  1837
28813
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  1838
    def checkcommitpatterns(self, wctx, vdirs, match, status, fail):
30342
318a24b52eeb spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents: 30286
diff changeset
  1839
        """check for commit arguments that aren't committable"""
28814
1f65f291a5b7 localrepo: drop force check from checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28813
diff changeset
  1840
        if match.isexact() or match.prefix():
28813
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  1841
            matched = set(status.modified + status.added + status.removed)
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  1842
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  1843
            for f in match.files():
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  1844
                f = self.dirstate.normalize(f)
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  1845
                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
  1846
                    continue
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  1847
                if f in status.deleted:
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  1848
                    fail(f, _('file not found!'))
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  1849
                if f in vdirs: # visited directory
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  1850
                    d = f + '/'
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  1851
                    for mf in matched:
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  1852
                        if mf.startswith(d):
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  1853
                            break
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  1854
                    else:
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  1855
                        fail(f, _("no match under directory!"))
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  1856
                elif f not in self.dirstate:
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  1857
                    fail(f, _("file not tracked!"))
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  1858
18016
2a393df0f5cc clfilter: rename `unfilteredmeth` to `unfilteredmethod`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18014
diff changeset
  1859
    @unfilteredmethod
8706
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8705
diff changeset
  1860
    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
  1861
               editor=False, extra=None):
8515
865e08a7d6b0 localrepo: update commit*() docstrings
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8503
diff changeset
  1862
        """Add a new revision to current repository.
865e08a7d6b0 localrepo: update commit*() docstrings
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8503
diff changeset
  1863
8706
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8705
diff changeset
  1864
        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
  1865
        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
  1866
        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
  1867
        """
26322
2cd19782d2d4 commit: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26321
diff changeset
  1868
        if extra is None:
2cd19782d2d4 commit: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26321
diff changeset
  1869
            extra = {}
8709
b9e0ddb04c5c commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents: 8707
diff changeset
  1870
8715
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
  1871
        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
  1872
            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
  1873
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
  1874
        if not match:
10651
5f091fc1bab7 style: use consistent variable names (*mod) with imports which would shadow
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10547
diff changeset
  1875
            match = matchmod.always(self.root, '')
8715
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
  1876
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
  1877
        if not force:
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
  1878
            vdirs = []
19138
e579687cb5d8 localrepo.commit: hook into match.explicitdir
Siddharth Agarwal <sid0@fb.com>
parents: 19097
diff changeset
  1879
            match.explicitdir = vdirs.append
8715
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
  1880
            match.bad = fail
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
  1881
26998
4414d500604f localrepo: put bookmark move following commit in one transaction
Laurent Charignon <lcharignon@fb.com>
parents: 26996
diff changeset
  1882
        wlock = lock = tr = None
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  1883
        try:
26998
4414d500604f localrepo: put bookmark move following commit in one transaction
Laurent Charignon <lcharignon@fb.com>
parents: 26996
diff changeset
  1884
            wlock = self.wlock()
27291
a18328aad48c commit: make commit acquire store lock before processing for consistency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27278
diff changeset
  1885
            lock = self.lock() # for recent changelog (see issue4368)
a18328aad48c commit: make commit acquire store lock before processing for consistency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27278
diff changeset
  1886
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
  1887
            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
  1888
            merge = len(wctx.parents()) > 1
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
  1889
32352
0d6b3572ad92 match: remove ispartial()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32332
diff changeset
  1890
            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
  1891
                raise error.Abort(_('cannot partially commit a merge '
8397
613ac2856535 remove deprecated rawcommit
Matt Mackall <mpm@selenic.com>
parents: 8395
diff changeset
  1892
                                   '(do not specify files or patterns)'))
6706
716a1296e182 localrepo: replace dirstate by workingfilectx in filecommit()
Patrick Mezard <pmezard@gmail.com>
parents: 6705
diff changeset
  1893
22928
5e5d297ccbd0 localrepo: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22910
diff changeset
  1894
            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
  1895
            if force:
22928
5e5d297ccbd0 localrepo: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22910
diff changeset
  1896
                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
  1897
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
  1898
            # check subrepos
36047
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35936
diff changeset
  1899
            subs, commitsubs, newstate = subrepoutil.precommit(
34977
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34881
diff changeset
  1900
                self.ui, wctx, status, match, force=force)
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
  1901
8709
b9e0ddb04c5c commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents: 8707
diff changeset
  1902
            # make sure all explicit patterns are matched
28813
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  1903
            if not force:
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
  1904
                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
  1905
23710
745e3b485632 context: add workingcommitctx for exact context to be committed
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23667
diff changeset
  1906
            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
  1907
                                            text, user, date, extra)
18659
b946470efed9 localrepo: create context used for actual commit earlier
David Schleimer <dschleimer@fb.com>
parents: 18644
diff changeset
  1908
25840
25897d778738 commit: mark internal-only option
Matt Mackall <mpm@selenic.com>
parents: 25839
diff changeset
  1909
            # 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
  1910
            allowemptycommit = (wctx.branch() != wctx.p1().branch()
25018
93e015a3d1ea commit: add ui.allowemptycommit config option
Durham Goode <durham@fb.com>
parents: 25017
diff changeset
  1911
                                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
  1912
                                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
  1913
            if not allowemptycommit:
8404
a2bc39ade36b commit: move 'nothing changed' test into commit()
Matt Mackall <mpm@selenic.com>
parents: 8403
diff changeset
  1914
                return None
a2bc39ade36b commit: move 'nothing changed' test into commit()
Matt Mackall <mpm@selenic.com>
parents: 8403
diff changeset
  1915
18660
7e6946ed5756 localrepo: use workingctx for validation in commit
David Schleimer <dschleimer@fb.com>
parents: 18659
diff changeset
  1916
            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
  1917
                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
  1918
26996
bf3eec62212f localrepo.commit: switch to mergestate.read()
Siddharth Agarwal <sid0@fb.com>
parents: 26989
diff changeset
  1919
            ms = mergemod.mergestate.read(self)
30505
a90867a22daf localrepo: refer to checkunresolved by its new name
Augie Fackler <augie@google.com>
parents: 30501
diff changeset
  1920
            mergeutil.checkunresolved(ms)
8496
a21605de1509 commit: move editor outside transaction
Matt Mackall <mpm@selenic.com>
parents: 8481
diff changeset
  1921
a21605de1509 commit: move editor outside transaction
Matt Mackall <mpm@selenic.com>
parents: 8481
diff changeset
  1922
            if editor:
8994
4a1187d3cb00 commit: report modified subrepos in commit editor
Matt Mackall <mpm@selenic.com>
parents: 8954
diff changeset
  1923
                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
  1924
            edited = (text != cctx._text)
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
  1925
20765
f042d4b263f4 localrepo: save manually edited commit message as soon as possible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20332
diff changeset
  1926
            # 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
  1927
            # (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
  1928
            # 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
  1929
            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
  1930
16073
b254f827b7a6 subrepo: rewrite handling of subrepo state at commit (issue2403)
Matt Mackall <mpm@selenic.com>
parents: 16030
diff changeset
  1931
            # 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
  1932
            if subs:
b254f827b7a6 subrepo: rewrite handling of subrepo state at commit (issue2403)
Matt Mackall <mpm@selenic.com>
parents: 16030
diff changeset
  1933
                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
  1934
                    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
  1935
                    self.ui.status(_('committing subrepository %s\n') %
36047
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35936
diff changeset
  1936
                                   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
  1937
                    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
  1938
                    newstate[s] = (newstate[s][0], sr)
36047
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35936
diff changeset
  1939
                subrepoutil.writestate(self, newstate)
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
  1940
10970
3213e8947975 localrepo.commit: use explicit variables, avoid creating new contexts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10969
diff changeset
  1941
            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
  1942
            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
  1943
            try:
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
  1944
                self.hook("precommit", throw=True, parent1=hookp1,
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
  1945
                          parent2=hookp2)
26998
4414d500604f localrepo: put bookmark move following commit in one transaction
Laurent Charignon <lcharignon@fb.com>
parents: 26996
diff changeset
  1946
                tr = self.transaction('commit')
9935
48b81d9bca8d commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents: 9934
diff changeset
  1947
                ret = self.commitctx(cctx, True)
16705
c2d9ef43ff6c check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents: 16699
diff changeset
  1948
            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
  1949
                if edited:
48b81d9bca8d commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents: 9934
diff changeset
  1950
                    self.ui.write(
48b81d9bca8d commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents: 9934
diff changeset
  1951
                        _('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
  1952
                raise
13357
b67867940bd1 bookmarks: move commit action into core
Matt Mackall <mpm@selenic.com>
parents: 13356
diff changeset
  1953
            # update bookmarks, dirstate and mergestate
16706
a270ec977ba6 bookmarks: delete divergent bookmarks on merge
David Soria Parra <dsp@php.net>
parents: 16705
diff changeset
  1954
            bookmarks.update(self, [p1, p2], ret)
18661
4fb92f14a97a commit: factor out post-commit cleanup into workingctx
David Schleimer <dschleimer@fb.com>
parents: 18660
diff changeset
  1955
            cctx.markcommitted(ret)
8503
90f86a5330bb commit: tidy up mergestate slightly
Matt Mackall <mpm@selenic.com>
parents: 8502
diff changeset
  1956
            ms.reset()
26998
4414d500604f localrepo: put bookmark move following commit in one transaction
Laurent Charignon <lcharignon@fb.com>
parents: 26996
diff changeset
  1957
            tr.close()
4414d500604f localrepo: put bookmark move following commit in one transaction
Laurent Charignon <lcharignon@fb.com>
parents: 26996
diff changeset
  1958
6710
0aa91f69a4c4 localrepo: extract _commitctx() from commit()
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  1959
        finally:
26998
4414d500604f localrepo: put bookmark move following commit in one transaction
Laurent Charignon <lcharignon@fb.com>
parents: 26996
diff changeset
  1960
            lockmod.release(tr, lock, wlock)
6710
0aa91f69a4c4 localrepo: extract _commitctx() from commit()
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  1961
16680
d0e419b0f7de tag: run commit hook when lock is released (issue3344)
Mads Kiilerich <mads@kiilerich.com>
parents: 16679
diff changeset
  1962
        def commithook(node=hex(ret), parent1=hookp1, parent2=hookp2):
23129
eb315418224c hook: protect commit hooks against stripping of temporary commit (issue4422)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23126
diff changeset
  1963
            # 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
  1964
            # 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
  1965
            if self.changelog.hasnode(ret):
23129
eb315418224c hook: protect commit hooks against stripping of temporary commit (issue4422)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23126
diff changeset
  1966
                self.hook("commit", node=node, parent1=parent1,
eb315418224c hook: protect commit hooks against stripping of temporary commit (issue4422)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23126
diff changeset
  1967
                          parent2=parent2)
16680
d0e419b0f7de tag: run commit hook when lock is released (issue3344)
Mads Kiilerich <mads@kiilerich.com>
parents: 16679
diff changeset
  1968
        self._afterlock(commithook)
10492
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10435
diff changeset
  1969
        return ret
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10435
diff changeset
  1970
18016
2a393df0f5cc clfilter: rename `unfilteredmeth` to `unfilteredmethod`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18014
diff changeset
  1971
    @unfilteredmethod
8496
a21605de1509 commit: move editor outside transaction
Matt Mackall <mpm@selenic.com>
parents: 8481
diff changeset
  1972
    def commitctx(self, ctx, error=False):
7077
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7072
diff changeset
  1973
        """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
  1974
        Revision information is passed via the context argument.
7077
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7072
diff changeset
  1975
        """
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6712
diff changeset
  1976
22908
71570f310417 commit: remove dead initialization of 'lock'
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22907
diff changeset
  1977
        tr = None
8414
2348ce25849b commitctx: use contexts more fully
Matt Mackall <mpm@selenic.com>
parents: 8412
diff changeset
  1978
        p1, p2 = ctx.p1(), ctx.p2()
8412
2bf4f380f6ab commitctx: eliminate some variables
Matt Mackall <mpm@selenic.com>
parents: 8411
diff changeset
  1979
        user = ctx.user()
990
5007e0bdeed2 Fix long-standing excessive file merges
mpm@selenic.com
parents: 981
diff changeset
  1980
8411
4d5916358abd commit: move lots of commitctx outside of the repo lock
Matt Mackall <mpm@selenic.com>
parents: 8410
diff changeset
  1981
        lock = self.lock()
4d5916358abd commit: move lots of commitctx outside of the repo lock
Matt Mackall <mpm@selenic.com>
parents: 8410
diff changeset
  1982
        try:
10881
a685011ed38e localrepo: add desc parameter to transaction
Steve Borho <steve@borho.org>
parents: 10877
diff changeset
  1983
            tr = self.transaction("commit")
4970
30d4d8985dd8 transactions: avoid late tear-down (issue641)
Matt Mackall <mpm@selenic.com>
parents: 4917
diff changeset
  1984
            trp = weakref.proxy(tr)
151
1f6c61a60586 Bail on attempts to do an empty commit
mpm@selenic.com
parents: 149
diff changeset
  1985
30571
46d2c8b23c33 localrepo: make it possible to reuse manifest when commiting context
Mateusz Kwapich <mitrandir@fb.com>
parents: 30505
diff changeset
  1986
            if ctx.manifestnode():
46d2c8b23c33 localrepo: make it possible to reuse manifest when commiting context
Mateusz Kwapich <mitrandir@fb.com>
parents: 30505
diff changeset
  1987
                # reuse an existing manifest revision
46d2c8b23c33 localrepo: make it possible to reuse manifest when commiting context
Mateusz Kwapich <mitrandir@fb.com>
parents: 30505
diff changeset
  1988
                mn = ctx.manifestnode()
46d2c8b23c33 localrepo: make it possible to reuse manifest when commiting context
Mateusz Kwapich <mitrandir@fb.com>
parents: 30505
diff changeset
  1989
                files = ctx.files()
46d2c8b23c33 localrepo: make it possible to reuse manifest when commiting context
Mateusz Kwapich <mitrandir@fb.com>
parents: 30505
diff changeset
  1990
            elif ctx.files():
30355
fa54f7ade491 manifest: remove manifest.add and add memmfctx.write
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
  1991
                m1ctx = p1.manifestctx()
fa54f7ade491 manifest: remove manifest.add and add memmfctx.write
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
  1992
                m2ctx = p2.manifestctx()
fa54f7ade491 manifest: remove manifest.add and add memmfctx.write
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
  1993
                mctx = m1ctx.copy()
fa54f7ade491 manifest: remove manifest.add and add memmfctx.write
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
  1994
fa54f7ade491 manifest: remove manifest.add and add memmfctx.write
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
  1995
                m = mctx.read()
fa54f7ade491 manifest: remove manifest.add and add memmfctx.write
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
  1996
                m1 = m1ctx.read()
fa54f7ade491 manifest: remove manifest.add and add memmfctx.write
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
  1997
                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
  1998
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  1999
                # 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
  2000
                added = []
14162
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2001
                changed = []
22907
a337f4b9b99d commit: reduce scope of 'removed' variable
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22852
diff changeset
  2002
                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
  2003
                linkrev = len(self)
23749
a387b0390082 localrepo: show headline notes in commitctx before showing filenames
Mads Kiilerich <madski@unity3d.com>
parents: 23714
diff changeset
  2004
                self.ui.note(_("committing files:\n"))
14162
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2005
                for f in sorted(ctx.modified() + ctx.added()):
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2006
                    self.ui.note(f + "\n")
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2007
                    try:
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2008
                        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
  2009
                        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
  2010
                            removed.append(f)
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 22201
diff changeset
  2011
                        else:
22910
4f2a5c7cdf78 commit: update file nodeid and flags in the same place
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22909
diff changeset
  2012
                            added.append(f)
4f2a5c7cdf78 commit: update file nodeid and flags in the same place
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22909
diff changeset
  2013
                            m[f] = self._filecommit(fctx, m1, m2, linkrev,
4f2a5c7cdf78 commit: update file nodeid and flags in the same place
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22909
diff changeset
  2014
                                                    trp, changed)
22942
03602f76deee manifest: rename ambiguously-named set to setflag
Augie Fackler <raf@durin42.com>
parents: 22928
diff changeset
  2015
                            m.setflag(f, fctx.flags())
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25629
diff changeset
  2016
                    except OSError as inst:
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  2017
                        self.ui.warn(_("trouble committing %s!\n") % f)
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  2018
                        raise
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25629
diff changeset
  2019
                    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
  2020
                        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
  2021
                        if error or errcode and errcode != errno.ENOENT:
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2022
                            self.ui.warn(_("trouble committing %s!\n") % f)
22296
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 22201
diff changeset
  2023
                        raise
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
  2024
14162
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2025
                # update manifest
23749
a387b0390082 localrepo: show headline notes in commitctx before showing filenames
Mads Kiilerich <madski@unity3d.com>
parents: 23714
diff changeset
  2026
                self.ui.note(_("committing manifest\n"))
14162
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2027
                removed = [f for f in sorted(removed) if f in m1 or f in m2]
22909
4545c5b53013 commit: use separate variable for p1 manifest and new manifest
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22908
diff changeset
  2028
                drop = [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
  2029
                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
  2030
                    del m[f]
30355
fa54f7ade491 manifest: remove manifest.add and add memmfctx.write
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
  2031
                mn = mctx.write(trp, linkrev,
fa54f7ade491 manifest: remove manifest.add and add memmfctx.write
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
  2032
                                p1.manifestnode(), p2.manifestnode(),
fa54f7ade491 manifest: remove manifest.add and add memmfctx.write
Durham Goode <durham@fb.com>
parents: 30342
diff changeset
  2033
                                added, drop)
14162
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2034
                files = changed + removed
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2035
            else:
301725c3df9a localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14155
diff changeset
  2036
                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
  2037
                files = []
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
  2038
8499
fb9b83df45f3 commit: move description trimming into changelog
Matt Mackall <mpm@selenic.com>
parents: 8498
diff changeset
  2039
            # update changelog
23749
a387b0390082 localrepo: show headline notes in commitctx before showing filenames
Mads Kiilerich <madski@unity3d.com>
parents: 23714
diff changeset
  2040
            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
  2041
            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
  2042
            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
  2043
                                   trp, p1.node(), p2.node(),
8412
2bf4f380f6ab commitctx: eliminate some variables
Matt Mackall <mpm@selenic.com>
parents: 8411
diff changeset
  2044
                                   user, ctx.date(), ctx.extra().copy())
10492
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10435
diff changeset
  2045
            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
  2046
            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
  2047
                      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
  2048
            # set the new commit is proper phase
36047
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35936
diff changeset
  2049
            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
  2050
            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
  2051
                # 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
  2052
                # 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
  2053
                # 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
  2054
                #
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
  2055
                # 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
  2056
                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
  2057
            tr.close()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  2058
            return n
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
  2059
        finally:
11230
5116a077c3da make transactions work on non-refcounted python implementations
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 11228
diff changeset
  2060
            if tr:
5116a077c3da make transactions work on non-refcounted python implementations
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 11228
diff changeset
  2061
                tr.release()
8405
7cbf8fcd2453 commit: push repo lock down into _commitctx
Matt Mackall <mpm@selenic.com>
parents: 8404
diff changeset
  2062
            lock.release()
660
2c83350784c3 Move commit hook after commit completes
Matt Mackall <mpm@selenic.com>
parents: 659
diff changeset
  2063
18016
2a393df0f5cc clfilter: rename `unfilteredmeth` to `unfilteredmethod`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18014
diff changeset
  2064
    @unfilteredmethod
18310
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  2065
    def destroying(self):
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  2066
        '''Inform the repository that nodes are about to be destroyed.
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  2067
        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
  2068
        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
  2069
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  2070
        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
  2071
        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
  2072
        destroyed is imminent, the repo will be invalidated causing those
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  2073
        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
  2074
        completely.
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  2075
        '''
18312
7331ee72f99c localrepo: write the phasecache when destroying nodes
Idan Kamara <idankk86@gmail.com>
parents: 18311
diff changeset
  2076
        # 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
  2077
        # 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
  2078
        # causing those changes to disappear.
7331ee72f99c localrepo: write the phasecache when destroying nodes
Idan Kamara <idankk86@gmail.com>
parents: 18311
diff changeset
  2079
        if '_phasecache' in vars(self):
7331ee72f99c localrepo: write the phasecache when destroying nodes
Idan Kamara <idankk86@gmail.com>
parents: 18311
diff changeset
  2080
            self._phasecache.write()
7331ee72f99c localrepo: write the phasecache when destroying nodes
Idan Kamara <idankk86@gmail.com>
parents: 18311
diff changeset
  2081
18310
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
  2082
    @unfilteredmethod
18395
904b7109938e destroyed: drop complex branchcache rebuilt logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18394
diff changeset
  2083
    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
  2084
        '''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
  2085
        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
  2086
        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
  2087
        '''
18221
082d6929fd4d localrepo: filter unknown nodes from the phasecache on destroyed
Idan Kamara <idankk86@gmail.com>
parents: 18219
diff changeset
  2088
        # When one tries to:
082d6929fd4d localrepo: filter unknown nodes from the phasecache on destroyed
Idan Kamara <idankk86@gmail.com>
parents: 18219
diff changeset
  2089
        # 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
  2090
        # 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
  2091
        #
082d6929fd4d localrepo: filter unknown nodes from the phasecache on destroyed
Idan Kamara <idankk86@gmail.com>
parents: 18219
diff changeset
  2092
        # 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
  2093
        # 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
  2094
        # 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
  2095
        # 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
  2096
        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
  2097
        self._phasecache.write()
18221
082d6929fd4d localrepo: filter unknown nodes from the phasecache on destroyed
Idan Kamara <idankk86@gmail.com>
parents: 18219
diff changeset
  2098
32304
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32303
diff changeset
  2099
        # refresh all repository caches
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32303
diff changeset
  2100
        self.updatecaches()
18223
6d6d0248530b destroyed: filter unknown before computing branchcache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18222
diff changeset
  2101
9151
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
  2102
        # 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
  2103
        # 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
  2104
        # 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
  2105
        # guarantees that "cachetip == currenttip" (comparing both rev
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
  2106
        # 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
  2107
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
  2108
        # 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
  2109
        # 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
  2110
        # 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
  2111
        # 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
  2112
        self.invalidate()
17324
9f94358f9f93 localrepo: clear the filecache on _rollback() and destroyed()
Idan Kamara <idankk86@gmail.com>
parents: 17306
diff changeset
  2113
6769
97c12b1ed1e0 status: use contexts
Matt Mackall <mpm@selenic.com>
parents: 6764
diff changeset
  2114
    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
  2115
               ignored=False, clean=False, unknown=False,
441a74b8def1 status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12162
diff changeset
  2116
               listsubrepos=False):
21596
83bbfb23cb24 localrepo: replace status method with a shim
Sean Farley <sean.michael.farley@gmail.com>
parents: 21591
diff changeset
  2117
        '''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
  2118
        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
  2119
                                  listsubrepos)
2661
5c10b7ed3411 status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2621
diff changeset
  2120
32833
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32750
diff changeset
  2121
    def addpostdsstatus(self, ps):
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32750
diff changeset
  2122
        """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: 32750
diff changeset
  2123
        fixups happen.
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32750
diff changeset
  2124
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32750
diff changeset
  2125
        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: 32750
diff changeset
  2126
        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: 32750
diff changeset
  2127
        couldn't be grabbed.
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32750
diff changeset
  2128
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32750
diff changeset
  2129
        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: 32750
diff changeset
  2130
        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: 32750
diff changeset
  2131
        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: 32750
diff changeset
  2132
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32750
diff changeset
  2133
        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: 32750
diff changeset
  2134
        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: 32750
diff changeset
  2135
        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: 32750
diff changeset
  2136
        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: 32750
diff changeset
  2137
        """
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32750
diff changeset
  2138
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32750
diff changeset
  2139
        # 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: 32750
diff changeset
  2140
        # 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: 32750
diff changeset
  2141
        self._postdsstatus.append(ps)
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32750
diff changeset
  2142
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32750
diff changeset
  2143
    def postdsstatus(self):
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32750
diff changeset
  2144
        """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: 32750
diff changeset
  2145
        return self._postdsstatus
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32750
diff changeset
  2146
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32750
diff changeset
  2147
    def clearpostdsstatus(self):
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32750
diff changeset
  2148
        """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: 32750
diff changeset
  2149
        del self._postdsstatus[:]
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32750
diff changeset
  2150
8796
2bcef677a6c3 localrepo: remove 'closed' argument to heads(...) function
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 8731
diff changeset
  2151
    def heads(self, start=None):
30907
1791be8a95c5 localrepo: avoid unnecessary conversion from node to rev
Stanislau Hlebik <stash@fb.com>
parents: 30818
diff changeset
  2152
        if start is None:
30934
6037caa6a2f3 localrepo: cache self.changelog in local variable
Stanislau Hlebik <stash@fb.com>
parents: 30907
diff changeset
  2153
            cl = self.changelog
30935
72f25e17af9d localrepo: avoid unnecessary sorting
Stanislau Hlebik <stash@fb.com>
parents: 30934
diff changeset
  2154
            headrevs = reversed(cl.headrevs())
30934
6037caa6a2f3 localrepo: cache self.changelog in local variable
Stanislau Hlebik <stash@fb.com>
parents: 30907
diff changeset
  2155
            return [cl.node(rev) for rev in headrevs]
30907
1791be8a95c5 localrepo: avoid unnecessary conversion from node to rev
Stanislau Hlebik <stash@fb.com>
parents: 30818
diff changeset
  2156
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
  2157
        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
  2158
        # 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
  2159
        return sorted(heads, key=self.changelog.rev, reverse=True)
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
  2160
8694
ca8d05e1f1d1 localrepo: set heads and branchheads to be closed=False by default
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 8680
diff changeset
  2161
    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
  2162
        '''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
  2163
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
  2164
        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
  2165
        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
  2166
        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
  2167
        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
  2168
        '''
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
  2169
        if branch is None:
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
  2170
            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
  2171
        branches = self.branchmap()
4648
8e503fa54d2d Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents: 4635
diff changeset
  2172
        if branch not in branches:
8e503fa54d2d Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents: 4635
diff changeset
  2173
            return []
7654
816b708f23af store all heads of a branch in the branch cache
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7644
diff changeset
  2174
        # 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
  2175
        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
  2176
        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
  2177
            # 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
  2178
            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
  2179
            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
  2180
        return bheads
4648
8e503fa54d2d Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents: 4635
diff changeset
  2181
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2182
    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
  2183
        if not nodes:
83238c1db6de Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1597
diff changeset
  2184
            nodes = [self.changelog.tip()]
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2185
        b = []
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2186
        for n in nodes:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2187
            t = n
14494
1ffeeb91c55d check-code: flag 0/1 used as constant Boolean expression
Martin Geisler <mg@lazybytes.net>
parents: 14482
diff changeset
  2188
            while True:
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2189
                p = self.changelog.parents(n)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2190
                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
  2191
                    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
  2192
                    break
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2193
                n = p[0]
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2194
        return b
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2195
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2196
    def between(self, pairs):
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2197
        r = []
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2198
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2199
        for top, bottom in pairs:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2200
            n, l, i = top, [], 0
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2201
            f = 1
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2202
7708
a32847fa0df0 wire protocol: avoid infinite loop (issue1483)
Matt Mackall <mpm@selenic.com>
parents: 7564
diff changeset
  2203
            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
  2204
                p = self.changelog.parents(n)[0]
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2205
                if i == f:
575
7f5ce4bbdd7b More whitespace cleanups
mpm@selenic.com
parents: 566
diff changeset
  2206
                    l.append(n)
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2207
                    f = f * 2
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2208
                n = p
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2209
                i += 1
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2210
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2211
            r.append(l)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2212
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2213
        return r
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
  2214
20924
e10000369b47 push: pass a `pushoperation` object to localrepo.checkpush
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20884
diff changeset
  2215
    def checkpush(self, pushop):
13327
dc11e30b48a3 mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents: 13272
diff changeset
  2216
        """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
  2217
        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
  2218
        command.
dc11e30b48a3 mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents: 13272
diff changeset
  2219
        """
dc11e30b48a3 mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents: 13272
diff changeset
  2220
21043
6c383c871fdb localrepo: introduce "prepushoutgoinghooks" to extend outgoing check easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20987
diff changeset
  2221
    @unfilteredpropertycache
6c383c871fdb localrepo: introduce "prepushoutgoinghooks" to extend outgoing check easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20987
diff changeset
  2222
    def prepushoutgoinghooks(self):
28876
79b8f052ee51 localrepo: refactor prepushoutgoinghook to take a pushop
Mads Kiilerich <madski@unity3d.com>
parents: 28814
diff changeset
  2223
        """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
  2224
        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
  2225
        """
6c383c871fdb localrepo: introduce "prepushoutgoinghooks" to extend outgoing check easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20987
diff changeset
  2226
        return util.hooks()
6c383c871fdb localrepo: introduce "prepushoutgoinghooks" to extend outgoing check easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20987
diff changeset
  2227
11368
b9eb005c54ad pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents: 11303
diff changeset
  2228
    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
  2229
        try:
24824
0325c0da05df pushkey: use hook arguments from transaction when one exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24821
diff changeset
  2230
            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
  2231
            hookargs = {}
0325c0da05df pushkey: use hook arguments from transaction when one exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24821
diff changeset
  2232
            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
  2233
                hookargs.update(tr.hookargs)
36430
7b86aa31b004 py3: fix handling of keyword arguments at more places
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36404
diff changeset
  2234
            hookargs = pycompat.strkwargs(hookargs)
7b86aa31b004 py3: fix handling of keyword arguments at more places
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36404
diff changeset
  2235
            hookargs[r'namespace'] = namespace
7b86aa31b004 py3: fix handling of keyword arguments at more places
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36404
diff changeset
  2236
            hookargs[r'key'] = key
7b86aa31b004 py3: fix handling of keyword arguments at more places
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36404
diff changeset
  2237
            hookargs[r'old'] = old
7b86aa31b004 py3: fix handling of keyword arguments at more places
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36404
diff changeset
  2238
            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
  2239
            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
  2240
        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
  2241
            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
  2242
            if exc.hint:
53a65929ef1f pushkey: gracefully handle prepushkey hook failure (issue4455)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23129
diff changeset
  2243
                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
  2244
            return False
17293
d3f84ccc5495 pushkey: add more verbose debug output regarding pushkey
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17252
diff changeset
  2245
        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
  2246
        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
  2247
        def runhook():
915ac9403e13 pushkey: run hook after the lock release
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23630
diff changeset
  2248
            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
  2249
                      ret=ret)
915ac9403e13 pushkey: run hook after the lock release
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23630
diff changeset
  2250
        self._afterlock(runhook)
14102
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
  2251
        return ret
11368
b9eb005c54ad pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents: 11303
diff changeset
  2252
b9eb005c54ad pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents: 11303
diff changeset
  2253
    def listkeys(self, namespace):
14102
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
  2254
        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
  2255
        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
  2256
        values = pushkey.list(self, namespace)
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
  2257
        self.hook('listkeys', namespace=namespace, values=values)
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
  2258
        return values
11368
b9eb005c54ad pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents: 11303
diff changeset
  2259
14048
58e58406ed19 wireproto: add test for new optional arg missing on server
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14036
diff changeset
  2260
    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
  2261
        '''used to test argument passing over the wire'''
36583
06f59bdde626 py3: use pycompat.bytestr() to convert None to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36501
diff changeset
  2262
        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: 36501
diff changeset
  2263
                                   pycompat.bytestr(four),
06f59bdde626 py3: use pycompat.bytestr() to convert None to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36501
diff changeset
  2264
                                   pycompat.bytestr(five))
11368
b9eb005c54ad pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents: 11303
diff changeset
  2265
14529
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
  2266
    def savecommitmessage(self, text):
23852
99e125626352 localrepo: remove all internal uses of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23775
diff changeset
  2267
        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
  2268
        try:
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
  2269
            fp.write(text)
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
  2270
        finally:
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
  2271
            fp.close()
18054
b35e3364f94a check-code: there must also be whitespace between ')' and operator
Mads Kiilerich <madski@unity3d.com>
parents: 18044
diff changeset
  2272
        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
  2273
1806
a2c69737e65e Automatic nesting into running transactions in the same repository.
mason@suse.com
parents: 1802
diff changeset
  2274
# 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
  2275
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
  2276
    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
  2277
    def a():
18952
8086b530e2ac localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18951
diff changeset
  2278
        for vfs, src, dest in renamefiles:
31556
66c3ae6d886c localrepo: use tryunlink
Ryan McElroy <rmcelroy@fb.com>
parents: 31542
diff changeset
  2279
            # 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: 31542
diff changeset
  2280
            # leaving both src and dest on disk. delete dest to make sure
66c3ae6d886c localrepo: use tryunlink
Ryan McElroy <rmcelroy@fb.com>
parents: 31542
diff changeset
  2281
            # the rename couldn't be such a no-op.
66c3ae6d886c localrepo: use tryunlink
Ryan McElroy <rmcelroy@fb.com>
parents: 31542
diff changeset
  2282
            vfs.tryunlink(dest)
31219
dd2364f5180a localrepo: handle rename with hardlinks properly
Jun Wu <quark@fb.com>
parents: 31158
diff changeset
  2283
            try:
18952
8086b530e2ac localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18951
diff changeset
  2284
                vfs.rename(src, dest)
16441
9dd10a574af2 localrepo: do not complain about missing journal files
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 16426
diff changeset
  2285
            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
  2286
                pass
1806
a2c69737e65e Automatic nesting into running transactions in the same repository.
mason@suse.com
parents: 1802
diff changeset
  2287
    return a
a2c69737e65e Automatic nesting into running transactions in the same repository.
mason@suse.com
parents: 1802
diff changeset
  2288
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  2289
def undoname(fn):
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  2290
    base, name = os.path.split(fn)
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  2291
    assert name.startswith('journal')
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  2292
    return os.path.join(base, name.replace('journal', 'undo', 1))
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
  2293
2740
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
  2294
def instance(ui, path, create):
14825
de9eb6b1da4f util: rename the util.localpath that uses url to urllocalpath (issue2875)
Mads Kiilerich <mads@kiilerich.com>
parents: 14756
diff changeset
  2295
    return localrepository(ui, util.urllocalpath(path), create)
3223
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3164
diff changeset
  2296
2740
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
  2297
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
  2298
    return True
28164
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  2299
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  2300
def newreporequirements(repo):
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  2301
    """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
  2302
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  2303
    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
  2304
    new repositories.
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  2305
    """
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  2306
    ui = repo.ui
32331
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32307
diff changeset
  2307
    requirements = {'revlogv1'}
33247
4d5d493ea54a configitems: register the 'format.usestore' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33245
diff changeset
  2308
    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
  2309
        requirements.add('store')
33245
28e8983d9ed7 configitems: register the 'format.usefncache' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33237
diff changeset
  2310
        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
  2311
            requirements.add('fncache')
33237
7043e67cc9b2 configitems: register the 'format.dotencode' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33235
diff changeset
  2312
            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
  2313
                requirements.add('dotencode')
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  2314
33499
0407a51b9d8c codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents: 33454
diff changeset
  2315
    compengine = ui.config('experimental', 'format.compression')
30818
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30639
diff changeset
  2316
    if compengine not in util.compengines:
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30639
diff changeset
  2317
        raise error.Abort(_('compression engine %s defined by '
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30639
diff changeset
  2318
                            'experimental.format.compression not available') %
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30639
diff changeset
  2319
                          compengine,
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30639
diff changeset
  2320
                          hint=_('run "hg debuginstall" to list available '
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30639
diff changeset
  2321
                                 'compression engines'))
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30639
diff changeset
  2322
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30639
diff changeset
  2323
    # zlib is the historical default and doesn't need an explicit requirement.
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30639
diff changeset
  2324
    if compengine != 'zlib':
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30639
diff changeset
  2325
        requirements.add('exp-compression-%s' % compengine)
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30639
diff changeset
  2326
28164
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  2327
    if scmutil.gdinitconfig(ui):
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  2328
        requirements.add('generaldelta')
33499
0407a51b9d8c codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents: 33454
diff changeset
  2329
    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
  2330
        requirements.add('treemanifest')
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  2331
32717
19b9fc40cc51 revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32680
diff changeset
  2332
    revlogv2 = ui.config('experimental', 'revlogv2')
19b9fc40cc51 revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32680
diff changeset
  2333
    if revlogv2 == 'enable-unstable-format-and-corrupt-my-data':
19b9fc40cc51 revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32680
diff changeset
  2334
        requirements.remove('revlogv1')
19b9fc40cc51 revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32680
diff changeset
  2335
        # generaldelta is implied by revlogv2.
19b9fc40cc51 revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32680
diff changeset
  2336
        requirements.discard('generaldelta')
19b9fc40cc51 revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32680
diff changeset
  2337
        requirements.add(REVLOGV2_REQUIREMENT)
19b9fc40cc51 revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32680
diff changeset
  2338
28164
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
  2339
    return requirements